-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Structure du talk #7
Comments
Point du 10/02/2022choix / décisions
cas typiques qu'on aimerait couvrir
TODO
|
STRATÉGIE DE MIGRATION:
|
Remboursement de la couverture fonctionnelle - EtapesExecution de test E2E
docker-compose up -d
open http://localhost:8080
. ./env-vars-testing.sh
export MONGODB_PORT=27117
export MONGODB_DATABASE=openwhyd_test
npm start
. ./env-vars-testing.sh
export MONGODB_PORT=27117
export MONGODB_DATABASE=openwhyd_test
npm run test-reset && npm run test:integration Next steps / TODO
|
Montrer lors de la conf l'intérêt de faire des tests FIRST ! Repartir du test |
Montrer l'évolution de la couverture du code liée aux fonctionnalités autour du concept de post, après le remboursement de la dette (test de controller post)
Les 2 commandes produisent un rapport qui peuvent être comparé |
Pour s'assurer d'être iso par rapport à la persistence d'un post, lancer les tests avec une approche approval testing basé sur des dumps de la db
(les tests approval lancent le serveur et nettoient la DB programmatiquement) |
Pour visualiser directement le coverage dans vscode:
|
11 marsRappel de strat
TODO
Modélisation domaineJordan nous présente la ré-application de ce qu'on avait montré en live-stream:
Elements de story-telling
Topo sur sessions effectuées jusque là
|
Matin du mercredi 23 mars
|
Cf #7 (comment) and #17 (comment). ## Comment tester ```sh docker-compose up -d mongo npm run test:approval source ./env-vars-testing-local.sh npm run test:integration:post ```
Mardi 29 Mars (journée)
Matin
Aprem
|
Jeudi 7 Avril (aprem, Julien + Adrien)Objectif: finir déroullé ? (cf #19)
|
Vendredi 8 AvrilRépétition avec Julien et Jordan => branche |
Jeudi 13 AvrilRépétition pendant SHODAY. => branche: https://github.com/openwhyd/openwhyd-solo/tree/migration-2022-04-13-shoday Anti-sèche
|
Vendredi 15 AvrilJe viens de créer deux snippets avec l'extension Snippet - Visual Studio Marketplace: TODO
=> branche: migration-2022-04-15 |
See #559 and openwhyd/openwhyd-solo#7. Co-authored-by: Jordan NOURRY <[email protected]> Co-authored-by: Julien Topçu <[email protected]>
Pour référence, voici:
|
See #559 and openwhyd/openwhyd-solo#7. Video recording of the Devoxx talk in which we performed that migration: [Architecturoplastie hexagonale d’un backend Node.js (Jordan Nourry, Adrien Joly, Julien Topçu) - YouTube](https://www.youtube.com/watch?v=r2XMwAUqZBA) Co-authored-by: Jordan NOURRY <[email protected]> Co-authored-by: Julien Topçu <[email protected]>
Update suite à la répète de Lundi:
Note: je n'ai pas modifié le tag |
Notes de 2ème répète:
diff --git a/app/controllers/api/post.js b/app/controllers/api/post.js
index 3728376..e32f36d 100644
--- a/app/controllers/api/post.js
+++ b/app/controllers/api/post.js
@@ -63,6 +63,7 @@ exports.actions = {
uId: httpParams.uId,
uNm: httpParams.uNm,
text: httpParams.text || '',
+ pl: extractPlaylistRequest(httpParams),
// fields that will be ignored by rePost():
name: httpParams.name,
eId: httpParams.eId,
@@ -105,23 +106,18 @@ exports.actions = {
}
}
- const playlistRequest = extractPlaylistRequest(httpParams);
-
- if (needToCreatePlaylist(playlistRequest)) {
+ if (needToCreatePlaylist(postQuery.pl)) {
const playlist = await features.createPlaylist(
httpParams.uId,
- playlistRequest.name
+ postQuery.pl.name
);
if (playlist) {
- postQuery.pl = { id: playlist.id, name: playlistRequest.name };
+ postQuery.pl.id = playlist.id;
// console.log('playlist was created', q.pl);
}
} else {
- postQuery.pl = {
- id: parseInt(playlistRequest.id),
- name: playlistRequest.name,
- };
- if (isNaN(playlistRequest.id)) delete postQuery.pl; //q.pl = null;
+ postQuery.pl.id = parseInt(postQuery.pl.id);
+ if (isNaN(postQuery.pl.id)) delete postQuery.pl; //q.pl = null;
}
actualInsert(); |
Déroulé du talk
0. Prérequis
Liens de référence:
Étapes de préparation pré-live-coding:
Mettre VSCode en thème "fond clair".
Installer Snippet - Visual Studio Marketplace pour VSCode.
Créer snippet "
basic functional test
" avec Snippet - Visual Studio Marketplace:contenu du snippet
Préparer l'environnement de live coding, dans le terminal de VSCode:
1. Faire une démo d'OpenWhyd
Adrien
app.route
, notamment lesapi
-->subdir
-->controllers/api/post.js
--> fonction intéressante: insertion d'un morceau de musique. (post Controller sur la méthodeinsert
)Objectifs:
Donc => Migration in situ
2. Préparation du terrain opératoire: Biopsies Clean Codiennes
But : Y voir plus claire sur la code base
But caché (intention) : Montrer la fragilité de la code base
insert
decontrollers/api/post
npm run test:integration:post # avant, on lançait le serveur, puis: $ npm run test:integration
controllers/api/post
,p
puisuId
uNm
de l'objetq
dansinsert
. Et expliquer qu'on est en train de changer la structure en base de données.(redémarrer serveur puis)Réexécuter les tests d'intégration et montrer que les messages d'erreurs ne permettent pas de voir ce qu'on a cassé3. Ajout des approval tests
When posting a track
approval.tests.js
et expliquer le test correspondant4. Amener plus de lisibilité dans le code
Lisibilité
Adrien:
insert
jusqu'àprocess playlist
en expliquant le codeinsert
a beaucoup de responsabilité => décider que la partiecreatePlaylist
est déjà un scope suffisant à refactorerJordan:
Extraction deextractPlaylistRequest
postRequest.pl = extractPlaylistRequest(...)
et dire que ça pourrait être fait directement à l'initialisation depostQuery
.undefined
parextractPlaylistRequest(...)
needToCreatePlaylist
dans le ifcreatePlaylist
plus explicite ?Adrien:
createPlaylist()
actualInsert()
superfluDiagnostic
createPlaylist
?userModel.createPlaylist()
5. Modéliser le domaine
domain
api
. Le domaine doit dépendre que des objets du domaine, mais il n'y pas de typage fort en JS.CreatePlaylist
dansapi.ts
Playlist
danstypes.ts
Promise(createPlaylist)
pour bien détourer la déclaration de la fonctioncreatePlaylist
CreatePlaylist
via JSDoc puis activer la vérification avects-check
playlist
et les warnings de "compilation" si on fait unplaylist.toto
createPlaylist
dansfeatures.js
dans le domaine.ts-check
dansfeatures
6. Extraire la logique métier de la couche de persistence
userModel.createPlaylist()
pour caractériser le métier qu'on veut migrer.test/functional/playlist.functional.test.js
) pour figer les comportements que l'on a compris et expliquer qu'on ne s'appuie pas sur les Approvals, car le domaine est testé en isolation pure.basic functional test
(clic droit + "insert snippet") et expliquer les testsuserModel
dansfeatures.createPlaylist()
en la commentantuserModel.createPlaylist()
et écrire un "algo" dansfeatures
spi.ts
UserRepository
.getUserById
qui retourne une Promise de Usertypes.ts
features a maintenant besoin d'une instance de UserRepository. Comme on ne veut pas se coupler avec le repository, on crée une factory
createFeatures` pour d'injecter une instance.userRepository
de la factoryuserRepository.getUserbyId
danscreatePlaylist
userModel
et expliquer la logique de création d'un id de playlist, la copier-coller dans features et la nettoyer.insertPlaylist
dans la SPI dans leUserRepository
features
createFeatures
userRepository
et la typer avec la SPI. Générer le squelette au moyen de l'IDE.$ npx mocha test/functional/playlist.functional.test.js
)7. Recabler le domaine avec la persistance
infrastructure
avecUserCollection.js
UserCollection
avec la SPI et générer le squeletteUserCollection
UserCollection.getUserById()
UserDocument
dansinfrastructure/type.ts
, typer le retour de la requête mongo dansgetUserbyId
et tenter de retourner leuserDocument
.mapToUser
et expliquer le rôle de l'anti-corruption layerinsertPlaylist
Jordan reprend la main du copilote.
fetch
et lesave
dansuserModel
git cherry-pick migrate-db # --> commit: 96d94f5ee3e5d4488615ca054a45b34c8e742a9a
Si le cherry-pick ne passe pas, vider l'index de git
14. Relancer les approvals
8. Découplage du controller
post
en expliquant qu'on sort du fichier les instanciations. Commenter les require defeatures
etuserCollection
features
à la stack d'appel deinsert
jusqu'àApplication.js
subdir.js
en montrantapp.route
attachLegacyRoutesFromFile
9. Décommisionnement des Approval tests (optionnel)
Aller dans les tests d'intégration de post et de l'infra mongo
TODO:
The text was updated successfully, but these errors were encountered: