ember-data-factory-guy 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/src/store.js ADDED
@@ -0,0 +1,142 @@
1
+ DS.Store.reopen({
2
+
3
+ usingFixtureAdapter: function() {
4
+ var adapter = this.adapterFor('application');
5
+ return adapter instanceof DS.FixtureAdapter
6
+ },
7
+
8
+ /**
9
+ Make new fixture and save to store. If the store is using FixtureAdapter,
10
+ will push to FIXTURE array, otherwise will use push method on adapter.
11
+
12
+ @param name
13
+ @param options
14
+ @returns {*}
15
+ */
16
+ makeFixture: function (name, options) {
17
+ var modelName = FactoryGuy.lookupModelForName(name);
18
+ var fixture = FactoryGuy.build(name, options);
19
+ var modelType = this.modelFor(modelName);
20
+
21
+ if (this.usingFixtureAdapter()) {
22
+ this.setBelongsToFixturesAssociation(modelType, modelName, fixture);
23
+ return FactoryGuy.pushFixture(modelType, fixture);
24
+ } else {
25
+ var self = this;
26
+ var model;
27
+ Em.run( function() {
28
+ model = self.push(modelName, fixture);
29
+ self.setBelongsToRestAssociation(modelType, modelName, model);
30
+ });
31
+ return model;
32
+ }
33
+ },
34
+
35
+ /**
36
+ Trying to set the belongsTo association for FixtureAdapter,
37
+ with models that have a hasMany association.
38
+
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.
42
+
43
+ @param name
44
+ @param model
45
+ */
46
+ setBelongsToFixturesAssociation: function (modelType, modelName, parentFixture) {
47
+ var store = this;
48
+ var adapter = this.adapterFor('application');
49
+ var relationShips = Ember.get(modelType, 'relationshipNames');
50
+ if (relationShips.hasMany) {
51
+ relationShips.hasMany.forEach(function (relationship) {
52
+ var hasManyModel = store.modelFor(Em.String.singularize(relationship));
53
+ if (parentFixture[relationship]) {
54
+ parentFixture[relationship].forEach(function(id) {
55
+ var hasManyfixtures = adapter.fixturesForType(hasManyModel);
56
+ var fixture = adapter.findFixtureById(hasManyfixtures, id);
57
+ fixture[modelName] = parentFixture.id;
58
+ })
59
+ }
60
+ })
61
+ }
62
+ },
63
+
64
+ /**
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
75
+ */
76
+ setBelongsToRestAssociation: function (modelType, modelName, parent) {
77
+ var relationShips = Ember.get(modelType, 'relationshipNames');
78
+
79
+ if (relationShips.hasMany) {
80
+ relationShips.hasMany.forEach(function (name) {
81
+ var children = parent.get(name);
82
+ if (children.get('length') > 0) {
83
+ children.forEach(function(child) {
84
+ child.set(modelName, parent)
85
+ })
86
+ }
87
+ })
88
+ }
89
+ },
90
+
91
+ /**
92
+ Adding a pushPayload for FixtureAdapter, but using the original with
93
+ other adapters that support pushPayload.
94
+
95
+ @param type
96
+ @param payload
97
+ */
98
+ pushPayload: function (type, payload) {
99
+ if (this.usingFixtureAdapter()) {
100
+ var model = this.modelFor(modelName);
101
+ FactoryGuy.pushFixture(model, payload);
102
+ } else {
103
+ this._super(type, payload);
104
+ }
105
+ }
106
+ });
107
+
108
+
109
+ DS.FixtureAdapter.reopen({
110
+
111
+ /**
112
+ Overriding createRecord in FixtureAdapter to add the record
113
+ created to the hashMany records for all of the records that
114
+ this one belongsTo.
115
+
116
+ @method createRecord
117
+ @param {DS.Store} store
118
+ @param {subclass of DS.Model} type
119
+ @param {DS.Model} record
120
+ @return {Promise} promise
121
+ */
122
+ createRecord: function(store, type, record) {
123
+ var promise = this._super(store, type, record);
124
+
125
+ promise.then( function() {
126
+ var hasManyName = Ember.String.pluralize(type.typeKey);
127
+ var relationShips = Ember.get(type, 'relationshipNames');
128
+ if (relationShips.belongsTo) {
129
+ // console.log('record',record+'', type.typeKey, hasManyName);
130
+ // relationShips.belongsTo.forEach(function (relationship) {
131
+ // console.log(relationship, record.get(relationship)+'')
132
+ // var belongsToRecord = record.get(relationship);
133
+ // console.log(relationshipForType)
134
+ // belongsToRecord.get(hasManyName).addObject(record);
135
+ // })
136
+ }
137
+ })
138
+ return promise;
139
+ }
140
+
141
+ })
142
+
@@ -0,0 +1,63 @@
1
+ var testHelper;
2
+ var store;
3
+
4
+ module('FactoryGuy with ActiveModelAdapter', {
5
+ setup: function() {
6
+ testHelper = TestHelper.setup(DS.ActiveModelAdapter);
7
+ store = testHelper.getStore();
8
+ },
9
+ teardown: function() {
10
+ Em.run(function() { testHelper.teardown(); });
11
+ }
12
+ });
13
+
14
+
15
+ test("#resetModels clears the store of models, and resets the model ids", function() {
16
+ var project = store.makeFixture('project');
17
+ var user = store.makeFixture('user', {projects: [project.id]});
18
+
19
+ FactoryGuy.resetModels(store);
20
+
21
+ equal(store.all('user').get('content.length'),0)
22
+ equal(store.all('project').get('content.length'),0)
23
+
24
+ deepEqual(FactoryGuy.modelIds, {});
25
+ });
26
+
27
+
28
+ module('DS.Store#makeFixture with ActiveModelAdapter', {
29
+ setup: function() {
30
+ testHelper = TestHelper.setup(DS.ActiveModelAdapter);
31
+ store = testHelper.getStore();
32
+ },
33
+ teardown: function() {
34
+ Em.run(function() { testHelper.teardown(); });
35
+ }
36
+ });
37
+
38
+
39
+ asyncTest("creates records in the store", function() {
40
+ var user = store.makeFixture('user');
41
+
42
+ store.find('user', user.id).then ( function(store_user) {
43
+ deepEqual(store_user.toJSON(), user.toJSON());
44
+ start();
45
+ });
46
+ });
47
+
48
+ test("supports hasMany associations", function() {
49
+ var p1 = store.makeFixture('project');
50
+ var p2 = store.makeFixture('project');
51
+ var user = store.makeFixture('user', {projects: [p1.id, p2.id]})
52
+
53
+ equal(user.get('projects.length'), 2);
54
+ })
55
+
56
+
57
+ test("when hasMany associations assigned, belongTo parent is assigned", function() {
58
+ var p1 = store.makeFixture('project');
59
+ var user = store.makeFixture('user', {projects: [p1.id]})
60
+
61
+ deepEqual(p1.get('user').toJSON(), user.toJSON());
62
+ })
63
+
File without changes
@@ -0,0 +1,134 @@
1
+ window.testHelper;
2
+ var store;
3
+
4
+ module('FactoryGuy with DS.FixtureAdapter', {
5
+ setup: function() {
6
+ testHelper = TestHelper.setup(DS.FixtureAdapter);
7
+ store = testHelper.getStore();
8
+ },
9
+ teardown: function() {
10
+ Em.run(function() { testHelper.teardown(); });
11
+ }
12
+ });
13
+
14
+
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
+ test("#pushFixture adds fixture to Fixture array on model", function() {
50
+ var fixtureJson = FactoryGuy.build('user');
51
+ FactoryGuy.pushFixture(User, fixtureJson);
52
+ equal(User.FIXTURES.length, 1);
53
+
54
+ var fixtureJson2 = FactoryGuy.build('user');
55
+ FactoryGuy.pushFixture(User, fixtureJson2);
56
+ equal(User.FIXTURES.length, 2);
57
+ });
58
+
59
+
60
+ asyncTest("can change fixture attributes after creation", function() {
61
+ var user = store.makeFixture('user');
62
+ user.name = "new name";
63
+
64
+ store.find('user', 1).then( function(user) {
65
+ equal(user.get('name'), "new name", "changes local attributes");
66
+ start();
67
+ });
68
+ });
69
+
70
+
71
+ test("#resetModels clears the store of models, clears the FIXTURES arrays for each model and resets the model ids", function() {
72
+ var project = store.makeFixture('project');
73
+ var user = store.makeFixture('user', {projects: [project.id]});
74
+
75
+ FactoryGuy.resetModels(store);
76
+
77
+ equal(User.FIXTURES.length, 0);
78
+ equal(Project.FIXTURES.length, 0);
79
+
80
+ equal(store.all('user').get('content.length'),0)
81
+ equal(store.all('project').get('content.length'),0)
82
+
83
+ deepEqual(FactoryGuy.modelIds, {});
84
+ });
85
+
86
+
87
+ module('DS.Store with DS.FixtureAdapter', {
88
+ setup: function() {
89
+ testHelper = TestHelper.setup(DS.FixtureAdapter);
90
+ store = testHelper.getStore();
91
+ },
92
+ teardown: function() {
93
+ Em.run(function() { testHelper.teardown(); });
94
+ }
95
+ });
96
+
97
+
98
+ test("#makeFixture builds and pushes fixture into the store", function() {
99
+ var json = store.makeFixture('user');
100
+ equal(User.FIXTURES.length, 1);
101
+ equal(User.FIXTURES[0], json);
102
+ });
103
+
104
+
105
+ asyncTest("#makeFixture sets hasMany associations on fixtures", function() {
106
+ var p1 = store.makeFixture('project');
107
+ // second project not added on purpose to make sure only one is
108
+ // assigned in hasMany
109
+ store.makeFixture('project');
110
+ var user = store.makeFixture('user', {projects: [p1.id]})
111
+
112
+ store.find('user', 1).then ( function(user) {
113
+ user.get('projects').then( function(projects) {
114
+ equal(projects.get('length'), 1, "adds hasMany records");
115
+ equal(projects.get('firstObject.user.id'), 1, "sets belongsTo record");
116
+ start();
117
+ })
118
+ })
119
+ })
120
+
121
+ asyncTest("#createRecord adds belongsTo associations to hasMany array", function() {
122
+ var user = store.makeFixture('user');
123
+
124
+ store.find('user', user.id).then(function(user){
125
+
126
+ var projectJson = {title:'project', user: user};
127
+
128
+ store.createRecord('project', projectJson).save()
129
+ .then( function() {
130
+ equal(user.get('projects.length'), 1);
131
+ start();
132
+ });
133
+ })
134
+ })
data/tests/index.html ADDED
@@ -0,0 +1,38 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta charset='UTF-8' />
5
+ <meta http-equiv='content-type' content='text/html; charset=utf-8' />
6
+
7
+ <title>jQuery.simpleFAQ QUnit Test Runner</title>
8
+
9
+ <link rel="stylesheet" type="text/css" href="../bower_components/qunit/qunit/qunit.css">
10
+ <!-- add any external libraries your code needs -->
11
+ <script src='../bower_components/jquery/jquery.js'></script>
12
+ <script src='../bower_components/handlebars/handlebars.js'></script>
13
+ <script src='../bower_components/ember/ember.js'></script>
14
+ <script src='../bower_components/ember-data/ember-data.js'></script>
15
+
16
+ <script src='../dist/ember-data-factory-guy.js'></script>
17
+ <script src='../src/has_many.js'></script>
18
+
19
+ <!-- your tests, any and all to run with the given fixtures below -->
20
+ <script src='../tests/test_setup.js'></script>
21
+ <script src='../tests/support/test_helper.js'></script>
22
+
23
+ <script src="../bower_components/qunit/qunit/qunit.js"></script>
24
+
25
+ </head>
26
+ <body>
27
+ <div id="qunit"></div> <!-- QUnit fills this with results, etc -->
28
+ <script src='active_model_adapter_factory_test.js'></script>
29
+ <script src='fixture_adapter_factory_test.js'></script>
30
+ <script src='rest_adapter_factory_test.js'></script>
31
+ <script src='store_test.js'></script>
32
+ <div id='qunit-fixture'>
33
+
34
+ <!-- any HTML you want to be present in each test (will be reset for each test) -->
35
+
36
+ </div>
37
+ </body>
38
+ </html>
@@ -0,0 +1,61 @@
1
+ var testHelper;
2
+ var store;
3
+
4
+ module('FactoryGuy with DS.RESTAdapter', {
5
+ setup: function() {
6
+ testHelper = TestHelper.setup(DS.RESTAdapter);
7
+ store = testHelper.getStore();
8
+ },
9
+ teardown: function() {
10
+ Em.run(function() { testHelper.teardown(); });
11
+ }
12
+ });
13
+
14
+
15
+ test("#resetModels clears the store of models, and resets the model ids", function() {
16
+ var project = store.makeFixture('project');
17
+ var user = store.makeFixture('user', {projects: [project.id]});
18
+
19
+ FactoryGuy.resetModels(store);
20
+
21
+ equal(store.all('user').get('content.length'),0)
22
+ equal(store.all('project').get('content.length'),0)
23
+
24
+ deepEqual(FactoryGuy.modelIds, {});
25
+ });
26
+
27
+
28
+ module('DS.Store#makeFixture with RestAdapter', {
29
+ setup: function() {
30
+ testHelper = TestHelper.setup(DS.RESTAdapter);
31
+ store = testHelper.getStore();
32
+ },
33
+ teardown: function() {
34
+ Em.run(function() { testHelper.teardown(); });
35
+ }
36
+ });
37
+
38
+ asyncTest("creates records in the store", function() {
39
+ var user = store.makeFixture('user');
40
+
41
+ store.find('user', user.id).then ( function(store_user) {
42
+ deepEqual(store_user.toJSON(), user.toJSON());
43
+ start()
44
+ });
45
+ });
46
+
47
+ test("supports hasMany associations", function() {
48
+ var p1 = store.makeFixture('project');
49
+ var p2 = store.makeFixture('project');
50
+ var user = store.makeFixture('user', {projects: [p1.id, p2.id]})
51
+
52
+ equal(user.get('projects.length'), 2);
53
+ });
54
+
55
+
56
+ test("when hasMany associations assigned, belongTo parent is assigned", function() {
57
+ var p1 = store.makeFixture('project');
58
+ var user = store.makeFixture('user', {projects: [p1.id]})
59
+
60
+ deepEqual(p1.get('user').toJSON(), user.toJSON());
61
+ });
@@ -0,0 +1,35 @@
1
+ var container;
2
+
3
+ module('DS.Store#usingFixtureAdapter', {
4
+ setup: function() {
5
+ container = new Ember.Container();
6
+ },
7
+ teardown: function() {}
8
+ });
9
+
10
+ var getStore = function(adapter) {
11
+ container.register("store:main", DS.Store.extend({adapter: adapter}));
12
+ return container.lookup("store:main");
13
+ }
14
+
15
+ test("with DS.FixtureAdapter", function() {
16
+ var adapter = DS.FixtureAdapter
17
+ equal(getStore(adapter).usingFixtureAdapter(), true );
18
+ });
19
+
20
+ test("when extending DS.FixtureAdapter", function() {
21
+ var adapter = DS.FixtureAdapter.extend({});
22
+ equal(getStore(adapter).usingFixtureAdapter(), true );
23
+ });
24
+
25
+ test("with DS.RESTAdapter", function() {
26
+ var adapter = DS.RESTAdapter
27
+ equal(getStore(adapter).usingFixtureAdapter(), false );
28
+ });
29
+
30
+ test("with DS.ActiveModelAdapter", function() {
31
+ var adapter = DS.ActiveModelAdapter
32
+ equal(getStore(adapter).usingFixtureAdapter(), false );
33
+ });
34
+
35
+