ember-data-factory-guy 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+