From 4499debac3a88c5ba47656a99353acbc41e54161 Mon Sep 17 00:00:00 2001
From: bertrand <bpinel@ippon.fr>
Date: Tue, 18 Apr 2017 20:56:35 +0200
Subject: [PATCH] Add Bottle in relationship with rack

---
 app/controllers/racks.js         |  8 +++++++-
 app/models/bottle.js             | 12 ++++++++++++
 app/models/rack.js               |  1 +
 app/routes/racks.js              |  3 +--
 mirage/config.js                 | 26 +++++++++++---------------
 mirage/factories/bottle.js       | 22 ++++++++++++++++++++++
 mirage/models/bottle.js          |  5 +++++
 mirage/models/rack.js            |  3 ++-
 mirage/scenarios/default.js      | 20 +++++++++++++++++---
 tests/unit/models/bottle-test.js | 12 ++++++++++++
 10 files changed, 90 insertions(+), 22 deletions(-)
 create mode 100644 app/models/bottle.js
 create mode 100644 mirage/factories/bottle.js
 create mode 100644 mirage/models/bottle.js
 create mode 100644 tests/unit/models/bottle-test.js

diff --git a/app/controllers/racks.js b/app/controllers/racks.js
index c37c502..e6dca9e 100644
--- a/app/controllers/racks.js
+++ b/app/controllers/racks.js
@@ -1,11 +1,13 @@
 import Ember from 'ember';
+
+// app/controllers/rack.js
 export default Ember.Controller.extend({
 
 rackTableColumns: Ember.computed(function() {
  var col = Ember.A([
     Ember.Object.create({
       propertyName: "name",
-      title: "Name"
+      title: "Name",
     }),
     Ember.Object.create({
      propertyName: 'nbColumns',
@@ -15,6 +17,10 @@ rackTableColumns: Ember.computed(function() {
      propertyName: 'nbRows',
      title: 'Nombre de lignes',
     }),
+    Ember.Object.create({
+     propertyName: 'capacity',
+     title: 'Capacité total',
+    }),
     Ember.Object.create({
        "template": "customcell/imagecell",
       title: 'Image',
diff --git a/app/models/bottle.js b/app/models/bottle.js
new file mode 100644
index 0000000..d38a3e3
--- /dev/null
+++ b/app/models/bottle.js
@@ -0,0 +1,12 @@
+import Ember from 'ember';
+import DS from 'ember-data';
+
+export default DS.Model.extend({
+   name: DS.attr('string'),
+   createdAt: DS.attr('date', {defaultValue() { return new Date(); }}),
+   yrow: DS.attr('number'),
+   xcolumn: DS.attr('number'),
+   flipped: DS.attr('boolean', {defaultValue: false}),
+
+   rack: DS.belongsTo('rack')
+});
diff --git a/app/models/rack.js b/app/models/rack.js
index 42a99fc..f192f22 100644
--- a/app/models/rack.js
+++ b/app/models/rack.js
@@ -10,4 +10,5 @@ export default DS.Model.extend({
    capacity: Ember.computed('nbColumns', 'nbRows', function() {
       return this.get('nbColumns')*this.get('nbRows'); }),
 
+   bottles : DS.hasMany('bottle')
 });
diff --git a/app/routes/racks.js b/app/routes/racks.js
index 4db1385..9daacc8 100644
--- a/app/routes/racks.js
+++ b/app/routes/racks.js
@@ -2,6 +2,5 @@ import Ember from 'ember';
 
 export default Ember.Route.extend({
    model() {
-      return this.store.findAll('rack');
- }
+      return this.store.findAll('rack', {include: 'bottles'});   }
 });
diff --git a/mirage/config.js b/mirage/config.js
index 360d837..8ac7894 100644
--- a/mirage/config.js
+++ b/mirage/config.js
@@ -1,21 +1,17 @@
 export default function() {
-  // this.urlPrefix = '';    // make this `http://localhost:8080`, for example, if your API is on a different server
-  // this.namespace = '';    // make this `api`, for example, if your API is namespaced
-  // this.timing = 400;      // delay for each request, automatically set to 0 during testing
-  /*
-    Shorthand cheatsheet:
 
-    this.get('/posts');
-    this.post('/posts');
-    this.get('/posts/:id');
-    this.put('/posts/:id'); // or this.patch
-    this.del('/posts/:id');
-
-    http://www.ember-cli-mirage.com/docs/v0.2.x/shorthands/
-  */
   this.namespace = 'api';
 
-this.get('/racks',  function(schema) {
-   return schema.racks.all();
+   this.get('/racks',  function(schema) {
+      return schema.racks.all();
+   });
+   this.get('/racks/:id',  (schema, request) => {
+     return schema.racks.find(request.params.id);
+   });
+   this.get('/bottles',  function(schema) {
+      return schema.bottles.all();
+   });
+   this.get('/bottles/:id', (schema, request) => {
+     return schema.bottles.find(request.params.id);
    });
 }
diff --git a/mirage/factories/bottle.js b/mirage/factories/bottle.js
new file mode 100644
index 0000000..6da8d5f
--- /dev/null
+++ b/mirage/factories/bottle.js
@@ -0,0 +1,22 @@
+import { Factory, faker } from 'ember-cli-mirage';
+
+export default Factory.extend({
+   name: faker.list.cycle('Château Beychevelle',
+    'Ribera del Duero',
+    'Clos Fourtet St.-Emilion',
+    'Romanée Conti',
+    'Chambolle Musigny Guillon',
+    'Tenet Syrah Columbia Valley',
+    'Oddero Barolo',
+    'Gigondas Lavau',
+    'Duorum Douro',
+    'Philippe Alliet Chinon',
+    'Orin Swift Machete',
+    'Château Lagrezette',
+    'Château Puech Haut',
+    'Château Haut Bellevue'),
+   createdAt() { return new Date(); },
+   yrow() { return faker.random.number({min:1, max:3}); },
+   xcolumn() { return faker.random.number({min:3, max:20}); },
+   flipped() { return faker.random.boolean; }
+});
diff --git a/mirage/models/bottle.js b/mirage/models/bottle.js
new file mode 100644
index 0000000..00373b2
--- /dev/null
+++ b/mirage/models/bottle.js
@@ -0,0 +1,5 @@
+import { Model, belongsTo } from 'ember-cli-mirage';
+
+export default Model.extend({
+  rack: belongsTo()
+});
diff --git a/mirage/models/rack.js b/mirage/models/rack.js
index 1486a72..c10654f 100644
--- a/mirage/models/rack.js
+++ b/mirage/models/rack.js
@@ -1,4 +1,5 @@
-import { Model } from 'ember-cli-mirage';
+import { Model, hasMany } from 'ember-cli-mirage';
 
 export default Model.extend({
+   bottles: hasMany()
 });
diff --git a/mirage/scenarios/default.js b/mirage/scenarios/default.js
index c2c2a85..b2d4ebc 100644
--- a/mirage/scenarios/default.js
+++ b/mirage/scenarios/default.js
@@ -1,12 +1,26 @@
 export default function(server) {
-
   /*
     Seed your development database using your factories.
     This data will not be loaded in your tests.
 
     Make sure to define a factory for each model you want to create.
   */
+  let numberOfRacks = 4;
+  let numberOfBottles = 0;
 
-  // server.createList('post', 10);
-  server.createList('rack', 32);
+  let racks = server.createList('rack', numberOfRacks);
+  for (let i=0; i<numberOfRacks; i++) {
+     for (let col=0; col < racks[i].nbColumns; col++) {
+        for (let lig=0; lig < racks[i].nbRows; lig++) {
+           if (random(0,10)<5) {
+             server.create('bottle', { yrow: lig, xcolumn: col, rack: racks[i] });
+             numberOfBottles++;
+          }
+       }
+     }
+   }
+   console.log(numberOfBottles+" bottles created in "+numberOfRacks+" racks");
+  function random(min, max) {
+    return Math.floor(Math.random() * (max - min)) + min;
+  }
 }
diff --git a/tests/unit/models/bottle-test.js b/tests/unit/models/bottle-test.js
new file mode 100644
index 0000000..9e8407d
--- /dev/null
+++ b/tests/unit/models/bottle-test.js
@@ -0,0 +1,12 @@
+import { moduleForModel, test } from 'ember-qunit';
+
+moduleForModel('bottle', 'Unit | Model | bottle', {
+  // Specify the other units that are required for this test.
+  needs: []
+});
+
+test('it exists', function(assert) {
+  let model = this.subject();
+  // let store = this.store();
+  assert.ok(!!model);
+});
-- 
GitLab