git diff origin/develop -- reducers/authentication.test.jse67067aa7) pointent vers le fork MaurerAnton/projectforge (branche draft43npm). Les liens vers l'ancien code (SHA 9ed5fbe0f) pointent vers le dépôt principal micromata/projectforge (develop).
unknown action → unknown action returns current state. Description explicite : « le réducteur ne connaît pas cette action → il retourne l'état actuel sans modification ». L'ancien test ne précisait pas ce qu'il vérifiait.
Modification de l'état d'entrée : l'ancien test vérifiait { loading: true, loggedIn: false }, le nouveau vérifie { loading: false, user: { name: 'test' } }. Un état d'utilisateur connecté a été choisi pour s'assurer que user n'est pas réinitialisé lors d'une action inconnue — ce qui garantit la pureté de la fonction [Redux reducers].
Formatage : l'ancien appel était sur 3 lignes, le nouveau tient sur une seule ligne. Uniquement du style.
Object.freeze(state) [MDN] — protection contre la mutation : si le réducteur modifiait l'état transmis (violant le principe de pureté), le test échouerait avec une erreur.
describe('handles USER_LOGIN_BEGIN') → describe('USER_LOGIN_BEGIN'). Le mot handles a été retiré — dans le nouveau style, chaque describe nomme l'action littéralement. [nouveau fichier]⚡
2 des 3 tests supprimés.
« fresh state » — vérifiait la transition de { loading: false, error: null, ... } vers { loading: true, error: null, ... }. [ligne 34]
« error state » — vérifiait la transition de { loading: false, error: exampleError, ... } vers { loading: true, error: null, ... }. [ligne 53]
Les deux tests vérifiaient la même chose : error est réinitialisé à null, loading passe à true. La différence résidait dans l'error initial (null vs chaîne). C'était redondant — un seul test couvre les deux cas.
« loggedIn state » — entrée : { loading: false, error: null, loggedIn: false } — identique à « fresh state ». Probablement une coquille (il aurait dû y avoir loggedIn: true). [ligne 72]
Un seul nouveau test : 'resets to loading with null user' [nouveau fichier]⚡
{ loading: false, error: 'some error', user: { name: 'old' } }{ loading: true, error: null, user: null }user est réinitialisé à null (plus strict que loggedIn: false — nettoyage complet)error est effacé, loading passe à true — comme dans les anciens testsloggedIn: false par user: null est la différence clé de la structure de l'étatAncien test « loading state » — SANS PAYLOAD.
Appelait { type: 'USER_LOGIN_SUCCESS' } sans troisième argument (payload). L'ancien réducteur supposément ne faisait que définir loggedIn: true et loading: false — les données utilisateur n'étaient pas conservées.
Suppression du test « weird state » : { loading: false, error: exampleError, loggedIn: true } — combinaison absurde : une erreur existe alors que l'utilisateur est connecté. [ligne 115]
Nouveau test — avec un payload réel :
Pourquoi exactement ces champs : le réducteur dans authentication.js:18-27 attend un payload avec quatre champs — chacun est écrit directement dans l'état :
| Champ du payload | → Champ de l'état | Ligne | Utilité |
|---|---|---|---|
payload.user | → state.user | L23 | objet utilisateur (nom, admin ?) |
payload.version | → state.version | L24 | version de la build |
payload.buildTimestamp | → state.buildTimestamp | L25 | date de compilation |
payload.alertMessage | → state.alertMessage | L26 | message système (MOTD) |
L'ancien test ne transmettait aucun payload — il ne vérifiait donc aucun de ces champs. Le nouveau test valide la correspondance complète.
loggedIn: true → user: { name: 'testuser' }. Les composants vérifient state.user !== null au lieu de state.loggedIn === true — dans le cadre de la migration vers les react-redux hooks.
Changements analogues : handles USER_LOGIN_FAILURE → USER_LOGIN_FAILURE, suppression de « weird state », un seul test au lieu de deux.
Nouvelle description : 'sets error and clears user/loading' — explicite sur le comportement : l'erreur est conservée, l'utilisateur est réinitialisé, le spinner est retiré.
loggedIn: false → user: null. Le champ user passe à null en cas d'erreur. C'est plus strict que loggedIn: false : l'ancienne approche conservait les données utilisateur dans l'état (elle indiquait simplement qu'il n'était plus connecté), la nouvelle les supprime complètement. Correspond à case USER_LOGIN_FAILURE: user: null.
Formatage du payload : { error: exampleError } sur une seule ligne au lieu de trois. Uniquement du style.
describe('handles USER_LOGOUT') (lignes 178–216)Supprimé en entier (2 tests, ~40 lignes).
Il vérifiait que USER_LOGOUT réinitialisait { loggedIn: true } en { loggedIn: false } et effaçait l'erreur.
Raisons de la suppression :
USER_LOGOUT n'existe plus — elle n'est plus exportée depuis authentication.js (seuls USER_LOGIN_BEGIN, USER_LOGIN_FAILURE, USER_LOGIN_SUCCESS sont importés).USER_LOGOUT est absent du switch du réducteur [seulement 3 cases].USER_LOGIN_BEGIN — les deux réinitialisent l'état.USER_LOGOUT depuis une exportation inexistante — le test était cassé.Historique : USER_LOGOUT a été supprimé des sources dans le commit 7c60c2fbb (2019-07-13, « implemented logout check ») — des actions/authentication.js et du réducteur. Mais le test n'a pas été mis à jour — il a continué à importer et tester USER_LOGOUT pendant encore 7 ans. Dans le nouveau réducteur, la déconnexion n'est plus qu'un simple USER_LOGIN_BEGIN (réinitialisation vers l'état de chargement).
(state, action) → nouvel état. Aucun effet de bord, aucune mutation. Object.freeze(state) dans le test garantit ce principe : si le réducteur modifie accidentellement l'état transmis, le test échouera. [Documentation Redux]{ loading, error, loggedIn }. Nouveau : { loading, error, user }. loggedIn: boolean indiquait simplement « oui/non ». user: object|null fournit l'objet utilisateur complet (id, nom, locale, ...) — les composants via useSelector(state => state.authentication.user) récupèrent directement toutes les données.Object.freeze(state); reducer(state, action); — si le réducteur tente de modifier l'état (au lieu d'en créer un nouveau), JavaScript lèvera une erreur en mode strict. C'est une vérification de la pureté de la fonction. [MDN]| Aspect | Ancien fichier (216 lignes) | Nouveau fichier (98 lignes) |
|---|---|---|
| Structure de l'état | { loading, error, loggedIn } |
{ loading, error, user } |
| État initial | Codé en dur dans le test, loading: false |
Constante, identique au réducteur, loading: true |
Nombre de describe |
5 (avec le préfixe handles) |
3 (sans préfixe) |
| Nombre de tests | 9 | 4 |
| USER_LOGIN_BEGIN | 3 tests (fresh, error, loggedIn — redondants) | 1 test (resets to loading) |
| USER_LOGIN_SUCCESS | 2 tests — sans payload | 1 test — avec payload (user, version, etc.) |
| USER_LOGIN_FAILURE | 2 tests (loading, weird) | 1 test (sets error) |
| USER_LOGOUT | 2 tests | Supprimé en entier — l'action n'existe plus |
| Description de l'action inconnue | 'unknown action' — peu clair |
'unknown action returns current state' — explicite |
describe avec 1 test chacun — chaque action est testée une seule fois avec des données d'entrée représentatives. Inutile de tester « état vierge », « avec erreur » et « connecté » pour chaque action.USER_LOGIN_BEGIN (les deux réinitialisent l'état). L'action n'existe plus dans le réducteur.user, version, buildTimestamp, alertMessage), le nouveau valide tous les champs.loggedIn: boolean a été remplacé par user: object|null dans le cadre de la migration connect() → useSelector [react-redux hooks].⚡ — lien vers le code dans la branche draft43npm sur le fork, qui n'a pas été fusionnée dans develop. Le code peut ne pas être accessible sur GitHub tant que la PR n'est pas fusionnée.
1.
initialStateextrait dans une constante.Ancienne version : objet codé en dur dans le test
it('initial state')sous la forme{ loading: false, error: null, loggedIn: false }.Nouvelle version : constante
initialState, qui en plus correspond exactement àinitialStatedéfini dans le réducteur [reducers/authentication.js:3].2.
loading: false→loading: true.Ancien init :
loading: false— l'utilisateur n'est pas connecté, le spinner ne tourne pas.Nouvel init :
loading: true— au chargement de l'application,loadUserStatus()est appelé immédiatement pour vérifier la session. L'état initial devient « recherche de l'utilisateur ». Cette modification vient du réducteur commit 8b3b44be7 (2020-03-18).3.
loggedIn: false→user: null. CHANGEMENT MAJEUR DE LA STRUCTURE DE L'ÉTAT (STATE SHAPE).{ loading: boolean, error: string|null, loggedIn: boolean }
{ loading: boolean, error: string|null, user: object|null }
loggedIn: trueaprès connexion → désormaisuser: { name: 'test', ... }loggedIn: falseavant connexion → désormaisuser: nulluser !== nullau lieu deloggedIn === trueconnect()→useSelector[react-redux hooks]