vos fixtures en 30 sec avec loopback fixtures

Post on 11-Feb-2017

283 Views

Category:

Internet

3 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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”:

"jean.michel@gmail.com”,"birthDate”: new Date(1990,

1, 1)},{

"name”: "Anne Delarue”,"email”:

"delarue.anne@hotmail.fr”,"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 email1@gmail.com ‘1990-01-01’

User n°2 email2@gmail.com ‘1990-02-01’

User n°3 email3@gmail.com ‘1990-03-01’

User n°4 email4@gmail.com ‘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: "alice@gmail.com" birthDate: "1993-06-24"

user_bob: name: "Bob" email: "bob@gmail.com" 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: "user1@gmail.com" birthDate: "1993-06-24"

user_2: name: "User n°2" email: "user2@gmail.com" 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

top related