Vos fixtures en 30 sec avec
loopback-fixtures
Samy GhribiMeetup Loopback #2 - 28 juin 2016
loopback.getCurrentContext().get(‘CurrentUser’)
Samy Ghribi (GitHub : @sghribi)Je suis développeur à Theodo
Je viens du monde du PHP, Symfony2 (soyez gentils 😃)
J’ai découvert Loopback le mois dernier (idem 😃)
Je veux pouvoir visualiser l’historique des investissements
sur les 5 dernières années
ClientÇa marche !
On va te faire un joli graphique:)
Moi
Tada !
ClientMoi
Mon problème
● Jeux de données pour tester
● Jeux de données initiales nécessaires au fonctionnement de mon application
● Données aléatoires ?● Simple et rapide !
Prenons un exemple !
Modèle "User”
NomEmailDate de naissance
{ "name": "User", "properties": { "name": { "type": "string" }, "email": { "type": "string" }, "birthDate": { "type": "date" } }}
La méthode "à la main”var users = [{
"name”: "Jean Michel”,"email”:
"[email protected]”,"birthDate”: new Date(1990,
1, 1)},{
"name”: "Anne Delarue”,"email”:
"[email protected]”,"birthDate”: new Date(1985,
3, 1)}, // Etc ...];app.models.User.create(users, done);
Sympa, mais pas plus de 10...
et fastidieuse
La méthode "programmatique”var users = [];
for (var i = 1; i <= 10; i++) { users.push({ "name": "User n°"+i, "email": "email"+i+"@gmail.com", "birthDate": new Date(1990, i, 1) });}
app.models.User.create(users, done);
La méthode "programmatique”name email birthdate
User n°1 [email protected] ‘1990-01-01’
User n°2 [email protected] ‘1990-02-01’
User n°3 [email protected] ‘1990-03-01’
User n°4 [email protected] ‘1990-04-01’
… … …
var users = [];
for (var i = 1; i <= 10; i++) { users.push({ "name": "User n°"+i, "email": "email"+i+"@gmail.com", "birthDate": new Date(1990, i, 1) });}
Tant que ça reste simple, ça va
Et maintenant avec deux modèles ?
{ "name": "User", "properties": { // name, email, birthDate }, "relations": { "group": { "type": "belongsTo", "model": "Group", "foreignKey": "groupId" } }}
“User”
{ "name": "Group", "properties": { "name": { "type": "string" } }, "relations": { "users": { "type": "hasMany", "model": "User", "foreignKey": "groupId" } }}
“Group”
Et maintenant avec deux modèles ?var users = [];var groups = [];
for (var i = 1; i <= 10; i++) { users.push({ "name": "User n°"+i, "email": "email"+i+"@gmail.com", "birthDate": new Date(1990, i, 1) });}
for (var i = 0; i < 5; i++) { groups.push({ “name”: “Group”+(2*i), “users”: [users[2*i], users[2*i+1]] });}
Et maintenant avec deux modèles ?var users = [];var groups = [];
for (var i = 1; i <= 10; i++) { users.push({ "name": "User n°"+i, "email": "email"+i+"@gmail.com", "birthDate": new Date(1990, i, 1) });}
for (var i = 0; i < 5; i++) { groups.push({ “name”: “Group”+(2*i), “users”: [users[2*i], users[2*i+1]] });}
Ça commence à devenir le bazar !
loopback-fixtures
“loopback-fixtures”, késako ?
Composant loopbackModule NPMInspiré de “nelmio/alice” de PHP
Comment on l’utilise ?
npm install loopback-fixtures --save
{ // Some other stuff... "loopback-fixtures": {}} server/component-
config.json
1.Installation module
2.Activation du composant
Group: group{1..3}: name: "Groupe n°{@} depuis les fixtures"
User: user{1..10}: name: "User n°{@} : {{name.lastName}}" groupId: @group.* email: "{{internet.email}}" birthDate: "{{date.past}}"
fixture/data/data.yml
3.Définition de vos fixtures
Chargement de données
Group: group{1..3}: name: "Groupe n°{@} depuis les fixtures"
User: user{1..10}: name: "User n°{@} : {{name.lastName}}" groupId: @group.* email: "{{internet.email}}" birthDate: "{{date.past}}"
fixture/data/data.yml
Se base sur le modèle de données Loopback
Fichier YAML
Chargement de données
User: user_alice: name: "Alice" email: "[email protected]" birthDate: "1993-06-24"
user_bob: name: "Bob" email: "[email protected]" birthDate: "1993-06-24"
fixture/data/data.yml
Nom du modèle
Identifiant unique
Données
Gammes d’objetsUser: user_{1..500}: name: "User n°{@}" email: "user{@}@gmail.com" birthDate: "1993-06-24"
fixture/data/data.yml
identifier{1...n} : réplique n fois la ligne"aaa{@}bbb" : {@} renvoie l’indice de l’itération
courante
Gammes d’objets
User: user_{1..500}: name: "User n°{@}" email: "user{@}@gmail.com" birthDate: "1993-06-24"
fixture/data/data.yml
User: user_1: name: "User n°1" email: "[email protected]" birthDate: "1993-06-24"
user_2: name: "User n°2" email: "[email protected]" birthDate: "1993-06-24"
# … 500 fois au total
fixture/data/data.yml
Données aléatoires
User: user_{1..500}: name: "{{name.firstName}} {{name.lastName}}" email: "{{internet.email}}" birthDate: "{{date.past}}"
fixture/data/data.yml
Intégration de faker.js
En dernier recours…
User: user_samy: name: "Jean Michel" weight: "(function() { return Math.random()*100;})()" fixture/data/data.yml
Vraiment en dernier recours !
Références entre modèles (simple)Group: group_jaune: name: "Les jaunes"
User: samy: name: "Samy" groupId: @group_jaune
fixture/data/data.yml
group_jaune doit être défini avant son utilisation
Références entre modèles (wildcard)Group: group_jaune: name: "Les jaunes" group_bleu: name: "Les bleus" les_rouges: name: "Les rouges"
User: samy: name: "Samy" groupId: @group_.*
fixture/data/data.yml
Sélection aléatoire parmi les références qui matchent
Exemple : @group_.*➔ group_jaune match OK
➔ group_bleu match OK
➔ les_rouges match KO
⇒ group_jaune ou group_bleu
Bilan
Group: group{1..8}: name: "Groupe n°{@} depuis les fixtures"
User: user{1..100}: name: "User n°{@} : {{name.lastName}}" groupId: @group.* email: "{{internet.email}}" birthDate: "{{date.past}}"
fixture/data/data.yml
Usages
{ // other stuff... "loopback-fixtures": { "autoLoad": true }}
server/component-config.json
Chargement au démarrage
app.loadFixtures()
Depuis Loopback (promesse)
./node_modules/loopback-fixtures/load-fixtures.js
Depuis le shell
Autres cas d’usages : migrations, tests fonctionnels [, etc]
Quelques options
"autoLoad": true/false : chargement au démarrage de l’appli ?
"append": true/false : ajoute et/ou efface les données ?
"fixturePath": "/fixtures/data" : dossier de fixtures
ClientMoi
Questions ?npm install loopback-
fixtures(github.com/sghribi/loopback-fixtures)
Samy Ghribi