vos fixtures en 30 sec avec loopback fixtures

32
Vos fixtures en 30 sec avec loopback- fixtures Samy Ghribi Meetup Loopback #2 - 28 juin 2016

Upload: samy-ghribi

Post on 11-Feb-2017

283 views

Category:

Internet


3 download

TRANSCRIPT

Page 1: Vos fixtures en 30 sec avec loopback fixtures

Vos fixtures en 30 sec avec

loopback-fixtures

Samy GhribiMeetup Loopback #2 - 28 juin 2016

Page 2: Vos fixtures en 30 sec avec loopback fixtures

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 😃)

Page 3: Vos fixtures en 30 sec avec loopback fixtures

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

Page 4: Vos fixtures en 30 sec avec loopback fixtures
Page 5: Vos fixtures en 30 sec avec loopback fixtures

Tada !

Page 6: Vos fixtures en 30 sec avec loopback fixtures

ClientMoi

Page 7: Vos fixtures en 30 sec avec loopback fixtures

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 !

Page 8: Vos fixtures en 30 sec avec loopback fixtures

Prenons un exemple !

Page 9: Vos fixtures en 30 sec avec loopback fixtures

Modèle "User”

NomEmailDate de naissance

{ "name": "User", "properties": { "name": { "type": "string" }, "email": { "type": "string" }, "birthDate": { "type": "date" } }}

Page 10: Vos fixtures en 30 sec avec loopback fixtures

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

Page 11: Vos fixtures en 30 sec avec loopback fixtures

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);

Page 12: Vos fixtures en 30 sec avec loopback fixtures

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

Page 13: Vos fixtures en 30 sec avec loopback fixtures

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”

Page 14: Vos fixtures en 30 sec avec loopback fixtures

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]] });}

Page 15: Vos fixtures en 30 sec avec loopback fixtures

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 !

Page 16: Vos fixtures en 30 sec avec loopback fixtures

loopback-fixtures

Page 17: Vos fixtures en 30 sec avec loopback fixtures

“loopback-fixtures”, késako ?

Composant loopbackModule NPMInspiré de “nelmio/alice” de PHP

Page 18: Vos fixtures en 30 sec avec loopback fixtures

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

Page 19: Vos fixtures en 30 sec avec loopback 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

Page 20: Vos fixtures en 30 sec avec loopback fixtures

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

Page 21: Vos fixtures en 30 sec avec loopback fixtures

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

Page 22: Vos fixtures en 30 sec avec loopback fixtures

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

Page 23: Vos fixtures en 30 sec avec loopback fixtures

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

Page 24: Vos fixtures en 30 sec avec loopback fixtures

En dernier recours…

User: user_samy: name: "Jean Michel" weight: "(function() { return Math.random()*100;})()" fixture/data/data.yml

Vraiment en dernier recours !

Page 25: Vos fixtures en 30 sec avec loopback fixtures

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

Page 26: Vos fixtures en 30 sec avec loopback fixtures

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

Page 27: Vos fixtures en 30 sec avec loopback fixtures

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

Page 28: Vos fixtures en 30 sec avec loopback fixtures

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]

Page 29: Vos fixtures en 30 sec avec loopback fixtures

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

Page 30: Vos fixtures en 30 sec avec loopback fixtures

ClientMoi

Page 31: Vos fixtures en 30 sec avec loopback fixtures
Page 32: Vos fixtures en 30 sec avec loopback fixtures

Questions ?npm install loopback-

fixtures(github.com/sghribi/loopback-fixtures)

Samy Ghribi