ember-data-factory-guy 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,6 @@
1
- FactoryGuyHelperMixin = Em.Mixin.create({
1
+ FactoryGuyTestMixin = Em.Mixin.create({
2
2
 
3
+ // Pass in the app root, which typically is App.
3
4
  setup: function(app) {
4
5
  this.set('container', app.__container__);
5
6
  return this;
@@ -0,0 +1,98 @@
1
+ ModelDefinition = function (model, config) {
2
+ var sequences = {};
3
+ var defaultAttributes = {};
4
+ var namedModels = {};
5
+ var modelId = 1;
6
+ this.model = model;
7
+
8
+ /**
9
+ @param name model name like 'user' or named type like 'admin'
10
+ @return boolean true if name is this definitions model or this definition
11
+ contains a named model with that name
12
+ */
13
+ this.matchesName = function (name) {
14
+ return model == name || namedModels[name];
15
+ }
16
+
17
+ this.merge = function (config) {
18
+ }
19
+
20
+ /**
21
+ @param sequenceName
22
+ @returns output of sequence function
23
+ */
24
+ this.generate = function (sequenceName) {
25
+ if (!sequences[sequenceName]) {
26
+ throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+ model+"' definition")
27
+ }
28
+ return sequences[sequenceName].next();
29
+ }
30
+
31
+ this.build = function (name, opts) {
32
+ var modelAttributes = namedModels[name] || {};
33
+ var fixture = $.extend({}, defaultAttributes, modelAttributes, opts);
34
+ for (attr in fixture) {
35
+ if (typeof fixture[attr] == 'function') {
36
+ fixture[attr] = fixture[attr].call(this)
37
+ }
38
+ }
39
+ if (!fixture.id) {
40
+ fixture.id = modelId++;
41
+ }
42
+ return fixture;
43
+ }
44
+
45
+ /**
46
+ Build a list of fixtures
47
+
48
+ @param name model name or named model type
49
+ @param number of fixtures to build
50
+ @param opts attribute options
51
+ @returns array of fixtures
52
+ */
53
+ this.buildList = function (name, number, opts) {
54
+ var arr = [];
55
+ for (var i = 0; i < number; i++) {
56
+ arr.push(this.build(name, opts))
57
+ }
58
+ return arr;
59
+ }
60
+
61
+ this.reset = function () {
62
+ modelId = 1;
63
+ }
64
+
65
+ var parseDefault = function (object) {
66
+ if (!object) {
67
+ return
68
+ }
69
+ defaultAttributes = object;
70
+ }
71
+
72
+ var parseSequences = function (object) {
73
+ if (!object) {
74
+ return
75
+ }
76
+ for (sequenceName in object) {
77
+ var sequenceFn = object[sequenceName];
78
+ if (typeof sequenceFn != 'function') {
79
+ throw new Error('Problem with [' + sequenceName + '] sequence definition. Sequences must be functions')
80
+ }
81
+ object[sequenceName] = new Sequence(sequenceFn);
82
+ }
83
+ sequences = object;
84
+ }
85
+
86
+ var parseConfig = function (config) {
87
+ parseSequences(config.sequences);
88
+ delete config.sequences;
89
+
90
+ parseDefault(config.default);
91
+ delete config.default;
92
+
93
+ namedModels = config;
94
+ }
95
+
96
+ // initialize
97
+ parseConfig(config);
98
+ }
data/src/sequence.js ADDED
@@ -0,0 +1,16 @@
1
+ Sequence = function (fn) {
2
+ var index = 1;
3
+ var fn = fn;
4
+
5
+ this.next = function () {
6
+ return fn.call(this, index++);
7
+ }
8
+
9
+ this.reset = function () {
10
+ index = 1;
11
+ }
12
+ }
13
+
14
+ function MissingSequenceError(message) {
15
+ this.toString = function() { return message }
16
+ }
data/src/store.js CHANGED
@@ -9,9 +9,9 @@ DS.Store.reopen({
9
9
  Make new fixture and save to store. If the store is using FixtureAdapter,
10
10
  will push to FIXTURE array, otherwise will use push method on adapter.
11
11
 
12
- @param name
13
- @param options
14
- @returns {*}
12
+ @param name name of fixture
13
+ @param options fixture options
14
+ @returns json or record
15
15
  */
16
16
  makeFixture: function (name, options) {
17
17
  var modelName = FactoryGuy.lookupModelForName(name);
@@ -19,31 +19,48 @@ DS.Store.reopen({
19
19
  var modelType = this.modelFor(modelName);
20
20
 
21
21
  if (this.usingFixtureAdapter()) {
22
- this.setBelongsToFixturesAssociation(modelType, modelName, fixture);
22
+ this.setBelongsToFixturesAdapter(modelType, modelName, fixture);
23
23
  return FactoryGuy.pushFixture(modelType, fixture);
24
24
  } else {
25
25
  var self = this;
26
26
  var model;
27
27
  Em.run( function() {
28
28
  model = self.push(modelName, fixture);
29
- self.setBelongsToRestAssociation(modelType, modelName, model);
29
+ self.setBelongsToRESTAdapter(modelType, modelName, model);
30
30
  });
31
31
  return model;
32
32
  }
33
33
  },
34
34
 
35
35
  /**
36
- Trying to set the belongsTo association for FixtureAdapter,
36
+ Make a list of Fixtures
37
+
38
+ @param name name of fixture
39
+ @param number number of fixtures
40
+ @param options fixture options
41
+ @returns list of json fixtures or records depending on the adapter type
42
+ */
43
+ makeList: function (name, number, options) {
44
+ var arr = [];
45
+ for (var i = 0; i < number; i++) {
46
+ arr.push(this.makeFixture(name, options))
47
+ }
48
+ return arr;
49
+ },
50
+
51
+ /**
52
+ Set the belongsTo association for FixtureAdapter,
37
53
  with models that have a hasMany association.
38
54
 
39
- For example if a client hasMany projects, then set the client.id
40
- on each project that the client hasMany of, so that the project
41
- now has the belongsTo client association setup.
55
+ For example if a user hasMany projects, then set the user.id
56
+ on each project that the user hasMany of, so that the project
57
+ now has the belongsTo user association setup.
42
58
 
43
- @param name
44
- @param model
59
+ @param modelType model type like App.User
60
+ @param modelName model name like 'user'
61
+ @param parentFixture parent to assign as belongTo
45
62
  */
46
- setBelongsToFixturesAssociation: function (modelType, modelName, parentFixture) {
63
+ setBelongsToFixturesAdapter: function (modelType, modelName, parentFixture) {
47
64
  var store = this;
48
65
  var adapter = this.adapterFor('application');
49
66
  var relationShips = Ember.get(modelType, 'relationshipNames');
@@ -62,18 +79,18 @@ DS.Store.reopen({
62
79
  },
63
80
 
64
81
  /**
65
- * Trying to set the belongsTo association for the rest type models
66
- * with a hasMany association
67
- *
68
- * For example if a client hasMany projects, then set the client
69
- * on each project that the client hasMany of, so that the project
70
- * now has the belongsTo client association setup
71
- *
72
- * @param modelType
73
- * @param modelName
74
- * @param parent model to check for hasMany
82
+ Set the belongsTo association for the REST type models
83
+ with a hasMany association
84
+
85
+ For example if a user hasMany projects, then set the user
86
+ on each project that the user hasMany of, so that the project
87
+ now has the belongsTo user association setup
88
+
89
+ @param modelType model type like 'App.User'
90
+ @param modelName model name like 'user'
91
+ @param parent model to check for hasMany
75
92
  */
76
- setBelongsToRestAssociation: function (modelType, modelName, parent) {
93
+ setBelongsToRESTAdapter: function (modelType, modelName, parent) {
77
94
  var relationShips = Ember.get(modelType, 'relationshipNames');
78
95
 
79
96
  if (relationShips.hasMany) {
@@ -1,5 +1,4 @@
1
- var testHelper;
2
- var store;
1
+ var testHelper, store;
3
2
 
4
3
  module('FactoryGuy with ActiveModelAdapter', {
5
4
  setup: function() {
@@ -12,16 +11,25 @@ module('FactoryGuy with ActiveModelAdapter', {
12
11
  });
13
12
 
14
13
 
15
- test("#resetModels clears the store of models, and resets the model ids", function() {
14
+ test("#resetModels clears the store of models, and resets the model definition", function() {
16
15
  var project = store.makeFixture('project');
17
16
  var user = store.makeFixture('user', {projects: [project.id]});
18
17
 
18
+ for (model in FactoryGuy.modelDefinitions) {
19
+ var definition = FactoryGuy.modelDefinitions[model];
20
+ sinon.spy(definition, 'reset');
21
+ }
22
+
19
23
  FactoryGuy.resetModels(store);
20
24
 
21
25
  equal(store.all('user').get('content.length'),0)
22
26
  equal(store.all('project').get('content.length'),0)
23
27
 
24
- deepEqual(FactoryGuy.modelIds, {});
28
+ for (model in FactoryGuy.modelDefinitions) {
29
+ var definition = FactoryGuy.modelDefinitions[model];
30
+ ok(definition.reset.calledOnce);
31
+ definition.reset.restore();
32
+ }
25
33
  });
26
34
 
27
35
 
@@ -36,7 +44,13 @@ module('DS.Store#makeFixture with ActiveModelAdapter', {
36
44
  });
37
45
 
38
46
 
39
- asyncTest("creates records in the store", function() {
47
+ test("creates DS.Model instance", function() {
48
+ var user = store.makeFixture('user');
49
+ equal(user instanceof DS.Model, true);
50
+ });
51
+
52
+
53
+ asyncTest("creates record in the store", function() {
40
54
  var user = store.makeFixture('user');
41
55
 
42
56
  store.find('user', user.id).then ( function(store_user) {
@@ -61,3 +75,29 @@ test("when hasMany associations assigned, belongTo parent is assigned", function
61
75
  deepEqual(p1.get('user').toJSON(), user.toJSON());
62
76
  })
63
77
 
78
+
79
+ module('DS.Store#makeList with ActiveModelAdapter', {
80
+ setup: function() {
81
+ testHelper = TestHelper.setup(DS.ActiveModelAdapter);
82
+ store = testHelper.getStore();
83
+ },
84
+ teardown: function() {
85
+ Em.run(function() { testHelper.teardown(); });
86
+ }
87
+ });
88
+
89
+
90
+ test("creates list of DS.Model instances", function() {
91
+ var users = store.makeList('user', 2);
92
+ equal(users.length, 2);
93
+ equal(users[0] instanceof DS.Model, true);
94
+ });
95
+
96
+
97
+ test("creates records in the store", function() {
98
+ var users = store.makeList('user', 2);
99
+
100
+ var storeUsers = store.all('user').get('content');
101
+ deepEqual(storeUsers[0].toJSON(), users[0].toJSON());
102
+ deepEqual(storeUsers[1].toJSON(), users[1].toJSON());
103
+ });
@@ -0,0 +1,93 @@
1
+ Person = DS.Model.extend({
2
+ type: DS.attr('string'),
3
+ name: DS.attr('string')
4
+ })
5
+
6
+ var testHelper, store;
7
+
8
+ module('FactoryGuy', {
9
+ setup: function() {
10
+ testHelper = TestHelper.setup(DS.FixtureAdapter);
11
+ store = testHelper.getStore();
12
+ },
13
+ teardown: function() {
14
+ Em.run(function() { testHelper.teardown(); });
15
+ }
16
+ });
17
+
18
+
19
+ test("Using sequences in definitions", function() {
20
+ FactoryGuy.define('person', {
21
+ sequences: {
22
+ personName: function(num) {
23
+ return 'person #' + num;
24
+ },
25
+ personType: function(num) {
26
+ return 'person type #' + num;
27
+ }
28
+ },
29
+ default: {
30
+ type: 'normal',
31
+ name: FactoryGuy.generate('personName')
32
+ },
33
+ dude: {
34
+ type: FactoryGuy.generate('personType')
35
+ },
36
+ bro: {
37
+ type: FactoryGuy.generate('broType')
38
+ }
39
+ });
40
+
41
+ var json = FactoryGuy.build('person');
42
+ deepEqual(json, {id: 1, name: 'person #1', type: 'normal'}, 'in default attributes');
43
+
44
+ var json = FactoryGuy.build('dude');
45
+ deepEqual(json, {id: 2, name: 'person #2', type: 'person type #1'}, 'in named attributes');
46
+
47
+ throws( function() {
48
+ FactoryGuy.build('bro')
49
+ }, MissingSequenceError,
50
+ "throws error when sequence name not found"
51
+ )
52
+ });
53
+
54
+
55
+ test("#build creates default json for model", function() {
56
+ var json = FactoryGuy.build('user');
57
+ deepEqual(json, {id: 1, name: 'User1'});
58
+ });
59
+
60
+
61
+ test("#build can override default model attributes", function() {
62
+ var json = FactoryGuy.build('user',{name: 'bob'});
63
+ deepEqual(json, {id: 1, name: 'bob'});
64
+ });
65
+
66
+
67
+ test("#build can have named model definition with custom attributes", function() {
68
+ var json = FactoryGuy.build('admin')
69
+ deepEqual(json, {id: 1, name: 'Admin'});
70
+ });
71
+
72
+
73
+ test("#build can override named model attributes", function() {
74
+ var json = FactoryGuy.build('admin', {name: 'AdminGuy'})
75
+ deepEqual(json, {id: 1, name: 'AdminGuy'});
76
+ });
77
+
78
+
79
+ test("#build similar model type ids are created sequentially", function() {
80
+ var user1 = FactoryGuy.build('user');
81
+ var user2 = FactoryGuy.build('user');
82
+ var project = FactoryGuy.build('project');
83
+ equal(user1.id, 1);
84
+ equal(user2.id, 2);
85
+ equal(project.id, 1);
86
+ });
87
+
88
+
89
+ test("#buildList creates list of fixtures", function() {
90
+ var userList = FactoryGuy.buildList('user', 2);
91
+ deepEqual(userList[0], {id: 1, name: 'User1'});
92
+ deepEqual(userList[1], {id: 2, name: 'User1'});
93
+ });
@@ -1,5 +1,4 @@
1
- window.testHelper;
2
- var store;
1
+ var testHelper, store;
3
2
 
4
3
  module('FactoryGuy with DS.FixtureAdapter', {
5
4
  setup: function() {
@@ -12,40 +11,6 @@ module('FactoryGuy with DS.FixtureAdapter', {
12
11
  });
13
12
 
14
13
 
15
- test("#build creates default json for model", function() {
16
- var json = FactoryGuy.build('user');
17
- deepEqual(json, {id: 1, name: 'User1'});
18
- });
19
-
20
-
21
- test("#build can override default model attributes", function() {
22
- var json = FactoryGuy.build('user',{name: 'bob'});
23
- deepEqual(json, {id: 1, name: 'bob'});
24
- });
25
-
26
-
27
- test("#build can have named model definition with custom attributes", function() {
28
- var json = FactoryGuy.build('admin')
29
- deepEqual(json, {id: 1, name: 'Admin'});
30
- });
31
-
32
-
33
- test("#build can override named model attributes", function() {
34
- var json = FactoryGuy.build('admin', {name: 'AdminGuy'})
35
- deepEqual(json, {id: 1, name: 'AdminGuy'});
36
- });
37
-
38
-
39
- test("#build similar model type ids are created sequentially", function() {
40
- var user1 = FactoryGuy.build('user');
41
- var user2 = FactoryGuy.build('user');
42
- var project = FactoryGuy.build('project');
43
- equal(user1.id, 1);
44
- equal(user2.id, 2);
45
- equal(project.id, 1);
46
- });
47
-
48
-
49
14
  test("#pushFixture adds fixture to Fixture array on model", function() {
50
15
  var fixtureJson = FactoryGuy.build('user');
51
16
  FactoryGuy.pushFixture(User, fixtureJson);
@@ -68,19 +33,28 @@ asyncTest("can change fixture attributes after creation", function() {
68
33
  });
69
34
 
70
35
 
71
- test("#resetModels clears the store of models, clears the FIXTURES arrays for each model and resets the model ids", function() {
36
+ test("#resetModels clears the store of models, clears the FIXTURES arrays for each model and resets the model definition", function() {
72
37
  var project = store.makeFixture('project');
73
38
  var user = store.makeFixture('user', {projects: [project.id]});
74
39
 
40
+ for (model in FactoryGuy.modelDefinitions) {
41
+ var definition = FactoryGuy.modelDefinitions[model];
42
+ sinon.spy(definition, 'reset');
43
+ }
44
+
75
45
  FactoryGuy.resetModels(store);
76
46
 
77
47
  equal(User.FIXTURES.length, 0);
78
48
  equal(Project.FIXTURES.length, 0);
79
49
 
80
- equal(store.all('user').get('content.length'),0)
81
- equal(store.all('project').get('content.length'),0)
50
+ equal(store.all('user').get('content.length'), 0)
51
+ equal(store.all('project').get('content.length'), 0)
82
52
 
83
- deepEqual(FactoryGuy.modelIds, {});
53
+ for (model in FactoryGuy.modelDefinitions) {
54
+ var definition = FactoryGuy.modelDefinitions[model];
55
+ ok(definition.reset.calledOnce);
56
+ definition.reset.restore();
57
+ }
84
58
  });
85
59
 
86
60