ember-data-factory-guy 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +29 -12
- data/bower.json +1 -1
- data/dist/ember-data-factory-guy.js +48 -13
- data/dist/ember-data-factory-guy.min.js +1 -1
- data/ember-data-factory-guy.gemspec +1 -1
- data/package.json +1 -1
- data/src/factory_guy_test_mixin.js +13 -1
- data/src/store.js +35 -12
- data/tests/fixture_adapter_factory_test.js +19 -4
- data/vendor/assets/javascripts/ember_data_factory_guy.js +48 -13
- metadata +2 -2
data/README.md
CHANGED
@@ -52,8 +52,10 @@ NOTE: The benefit of using FactoryGuy is that you can run your tests with the
|
|
52
52
|
default adapter that your application's store normally uses. In other words:
|
53
53
|
You do not have to use the DS.FixtureAdapter. But if you do choose to use the Fixture adapter,
|
54
54
|
which does not run any faster, and does not handle associations as elegantly
|
55
|
-
( and in some cases not at all ),
|
56
|
-
|
55
|
+
( and in some cases not at all ), you may run into problems with accessing associations.
|
56
|
+
|
57
|
+
Error: Assertion Failed: You looked up the 'projects' relationship on '<User:ember379:1>' but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async (`DS.hasMany({ async: true })`)
|
58
|
+
|
57
59
|
If you do get these types of errors try requiring the factory_guy_has_many.js file
|
58
60
|
( located in dist dir and vendor dir ) AFTER you require ember-data,
|
59
61
|
but BEFORE you require your models.
|
@@ -134,7 +136,7 @@ but BEFORE you require your models.
|
|
134
136
|
store.makeFixture('user'); // user.FIXTURES = [{id: 1, name: 'User1', type: 'normal'}]
|
135
137
|
store.makeFixture('user', {name: 'bob'}); // user.FIXTURES = [{id: 2, name: 'bob', type: 'normal'}]
|
136
138
|
store.makeFixture('admin'); // user.FIXTURES = [{id: 3, name: 'Admin', type: 'superuser'}]
|
137
|
-
store.makeFixture('admin', name: 'Fred'); // user.FIXTURES = [{id: 4, name: 'Fred', type: 'superuser'}]
|
139
|
+
store.makeFixture('admin', {name: 'Fred'}); // user.FIXTURES = [{id: 4, name: 'Fred', type: 'superuser'}]
|
138
140
|
|
139
141
|
|
140
142
|
// Use store.find to get the model instance ( Remember this is the Fixture adapter, if
|
@@ -146,15 +148,17 @@ but BEFORE you require your models.
|
|
146
148
|
});
|
147
149
|
|
148
150
|
// and to setup associations ...
|
149
|
-
var
|
150
|
-
var
|
151
|
-
|
152
|
-
|
153
|
-
var
|
151
|
+
var projectJson = store.makeFixture('project');
|
152
|
+
var userJson = store.makeFixture('user', projects: [project.id]);
|
153
|
+
// OR
|
154
|
+
var userJson = store.makeFixture('user');
|
155
|
+
var projectJson = store.makeFixture('project', user: userJson.id);
|
154
156
|
|
155
|
-
//
|
157
|
+
// will give you the same result, but with fixture adapter all associations
|
158
|
+
// are treated as async ( by factory_guy_has_many.js fix ), so it's
|
156
159
|
// a bit clunky to get this associated data. When using DS.FixtureAdapter
|
157
|
-
// in view specs though, this clunk is dealt with for you.
|
160
|
+
// in view specs though, this clunk is dealt with for you. But remember,
|
161
|
+
// you don't have to use the Fixture adapter.
|
158
162
|
store.find('user', 1).then(function(user) {
|
159
163
|
user.get('name') == 'My name';
|
160
164
|
user.get('projects').then(function(projects) {
|
@@ -162,6 +166,8 @@ but BEFORE you require your models.
|
|
162
166
|
});
|
163
167
|
});
|
164
168
|
|
169
|
+
// and for lists
|
170
|
+
var users = store.makeList('user', 2, projects: [project.id]);
|
165
171
|
|
166
172
|
//////////////////////////////////////////////////////////////////
|
167
173
|
//
|
@@ -184,12 +190,16 @@ but BEFORE you require your models.
|
|
184
190
|
// and to setup associations ...
|
185
191
|
|
186
192
|
var project = store.makeFixture('project');
|
187
|
-
var user = store.makeFixture('user', projects: [project
|
193
|
+
var user = store.makeFixture('user', projects: [project]);
|
194
|
+
// OR
|
195
|
+
var user = store.makeFixture('user');
|
196
|
+
var project = store.makeFixture('project', user: user);
|
188
197
|
|
198
|
+
// will get you the same results
|
189
199
|
user.get('projects.length') == 1;
|
190
200
|
user.get('projects.firstObject.user') == user;
|
191
201
|
|
192
|
-
// and to create lists
|
202
|
+
// and to create lists ( of 3 users in this case )
|
193
203
|
var users = store.makeList('user', 3);
|
194
204
|
|
195
205
|
```
|
@@ -215,6 +225,7 @@ var testHelper, store;
|
|
215
225
|
module('User Model', {
|
216
226
|
setup: function() {
|
217
227
|
testHelper = TestHelper.setup(App);
|
228
|
+
store = testHelper.getStore();
|
218
229
|
},
|
219
230
|
teardown: function() {
|
220
231
|
Em.run(function() { testHelper.teardown(); });
|
@@ -244,3 +255,9 @@ test("make a user using your applications default adapter", function() {
|
|
244
255
|
|
245
256
|
|
246
257
|
```
|
258
|
+
|
259
|
+
|
260
|
+
Further Extra Goodies
|
261
|
+
=====================
|
262
|
+
|
263
|
+
mockjax
|
data/bower.json
CHANGED
@@ -401,22 +401,33 @@ DS.Store.reopen({
|
|
401
401
|
@param {String} modelName model name like 'user'
|
402
402
|
@param {Object} parentFixture parent to assign as belongTo
|
403
403
|
*/
|
404
|
-
setBelongsToFixturesAdapter: function
|
405
|
-
var
|
404
|
+
setBelongsToFixturesAdapter: function(modelType, modelName, fixture) {
|
405
|
+
var self = this;
|
406
406
|
var adapter = this.adapterFor('application');
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
parentFixture[relationship].forEach(function (id) {
|
413
|
-
var hasManyfixtures = adapter.fixturesForType(hasManyModel);
|
407
|
+
Ember.get(modelType, 'relationshipsByName').forEach(function (name, relationship) {
|
408
|
+
if (relationship.kind == 'hasMany') {
|
409
|
+
if (fixture[relationship.key]) {
|
410
|
+
fixture[relationship.key].forEach(function(id) {
|
411
|
+
var hasManyfixtures = adapter.fixturesForType(relationship.type);
|
414
412
|
var fixture = adapter.findFixtureById(hasManyfixtures, id);
|
415
|
-
fixture[modelName] =
|
413
|
+
fixture[modelName] = fixture.id;
|
416
414
|
})
|
417
415
|
}
|
418
|
-
}
|
419
|
-
|
416
|
+
}
|
417
|
+
|
418
|
+
if (relationship.kind == 'belongsTo') {
|
419
|
+
var belongsToRecord = fixture[relationship.key];
|
420
|
+
if (belongsToRecord) {
|
421
|
+
var hasManyName = self.findHasManyRelationshipName2(relationship.type, relationship.parentType);
|
422
|
+
var belongsToFixtures = adapter.fixturesForType(relationship.type);
|
423
|
+
var belongsTofixture = adapter.findFixtureById(belongsToFixtures, fixture[relationship.key]);
|
424
|
+
if (!belongsTofixture[hasManyName]) {
|
425
|
+
belongsTofixture[hasManyName] = []
|
426
|
+
}
|
427
|
+
belongsTofixture[hasManyName].push(fixture.id);
|
428
|
+
}
|
429
|
+
}
|
430
|
+
})
|
420
431
|
},
|
421
432
|
|
422
433
|
/**
|
@@ -454,6 +465,18 @@ DS.Store.reopen({
|
|
454
465
|
})
|
455
466
|
},
|
456
467
|
|
468
|
+
findHasManyRelationshipName2: function (belongToModel, childModel) {
|
469
|
+
var relationshipName;
|
470
|
+
Ember.get(belongToModel, 'relationshipsByName').forEach(
|
471
|
+
function (name, relationship) {
|
472
|
+
if (relationship.kind == 'hasMany' &&
|
473
|
+
relationship.type == childModel) {
|
474
|
+
relationshipName = relationship.key;
|
475
|
+
}
|
476
|
+
}
|
477
|
+
)
|
478
|
+
return relationshipName;
|
479
|
+
},
|
457
480
|
findHasManyRelationshipName: function (belongToModel, childModel) {
|
458
481
|
var relationshipName;
|
459
482
|
Ember.get(belongToModel.constructor, 'relationshipsByName').forEach(
|
@@ -559,7 +582,7 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
559
582
|
},
|
560
583
|
|
561
584
|
/**
|
562
|
-
|
585
|
+
Proxy to store's find method
|
563
586
|
|
564
587
|
@param {String or subclass of DS.Model} type
|
565
588
|
@param {Object|String|Integer|null} id
|
@@ -638,12 +661,24 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
638
661
|
return hash;
|
639
662
|
},
|
640
663
|
|
664
|
+
/**
|
665
|
+
Handling ajax PUT ( update record ) for a model type
|
666
|
+
|
667
|
+
@param {String} root modelType like 'user' for User
|
668
|
+
@param {String} id id of record to update
|
669
|
+
*/
|
641
670
|
handleUpdate: function (root, id) {
|
642
671
|
this.stubEndpointForHttpRequest(
|
643
672
|
"/" + Em.String.pluralize(root) + "/" + id, {}, {type: 'PUT'}
|
644
673
|
)
|
645
674
|
},
|
646
675
|
|
676
|
+
/**
|
677
|
+
Handling ajax DELETE ( delete record ) for a model type
|
678
|
+
|
679
|
+
@param {String} root modelType like 'user' for User
|
680
|
+
@param {String} id id of record to update
|
681
|
+
*/
|
647
682
|
handleDelete: function (root, id) {
|
648
683
|
this.stubEndpointForHttpRequest(
|
649
684
|
"/" + Em.String.pluralize(root) + "/" + id, {}, {type: 'DELETE'}
|
@@ -1 +1 @@
|
|
1
|
-
Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};function MissingSequenceError(message){this.toString=function(){return message}}ModelDefinition=function(model,config){var sequences={};var defaultAttributes={};var namedModels={};var modelId=1;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.merge=function(config){};this.generate=function(sequenceName){var sequence=sequences[sequenceName];if(!sequence){throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+model+"' definition")}return sequence.next()};this.build=function(name,opts){var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,opts);for(attribute in fixture){if(typeof fixture[attribute]=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}}if(!fixture.id){fixture.id=modelId++}return fixture};this.buildList=function(name,number,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts))}return arr};this.reset=function(){modelId=1;for(name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(typeof sequenceFn!="function"){throw new Error("Problem with ["+sequenceName+"] sequence definition. Sequences must be functions")}object[sequenceName]=new Sequence(sequenceFn)}sequences=object};var parseConfig=function(config){parseSequences(config.sequences);delete config.sequences;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};FactoryGuy={modelDefinitions:{},define:function(model,config){if(this.modelDefinitions[model]){this.modelDefinitions[model].merge(config)}else{this.modelDefinitions[model]=new ModelDefinition(model,config)}},generate:function(sequenceName){return function(){return this.generate(sequenceName)}},lookupModelForName:function(name){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition.model}}},lookupDefinitionForName:function(name){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(name,opts){var definition=this.lookupDefinitionForName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts)},buildList:function(name,number,opts){var definition=this.lookupDefinitionForName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,opts)},resetModels:function(store){var typeMaps=store.typeMaps;for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];definition.reset();try{var modelType=store.modelFor(definition.model);if(store.usingFixtureAdapter()){modelType.FIXTURES=[]}store.unloadAll(modelType)}catch(e){}}},pushFixture:function(modelClass,fixture){if(!modelClass["FIXTURES"]){modelClass["FIXTURES"]=[]}modelClass["FIXTURES"].push(fixture);return fixture},clear:function(opts){if(!opts){this.modelDefinitions={};return}}};DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(name,options){var modelName=FactoryGuy.lookupModelForName(name);var fixture=FactoryGuy.build(name,options);var modelType=this.modelFor(modelName);if(this.usingFixtureAdapter()){this.setBelongsToFixturesAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{var self=this;var model;Em.run(function(){model=self.push(modelName,fixture);self.setBelongsToRESTAdapter(modelType,modelName,model)});return model}},makeList:function(name,number,options){var arr=[];for(var i=0;i<number;i++){arr.push(this.makeFixture(name,options))}return arr},setBelongsToFixturesAdapter:function(modelType,modelName,
|
1
|
+
Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};function MissingSequenceError(message){this.toString=function(){return message}}ModelDefinition=function(model,config){var sequences={};var defaultAttributes={};var namedModels={};var modelId=1;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.merge=function(config){};this.generate=function(sequenceName){var sequence=sequences[sequenceName];if(!sequence){throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+model+"' definition")}return sequence.next()};this.build=function(name,opts){var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,opts);for(attribute in fixture){if(typeof fixture[attribute]=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}}if(!fixture.id){fixture.id=modelId++}return fixture};this.buildList=function(name,number,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts))}return arr};this.reset=function(){modelId=1;for(name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(typeof sequenceFn!="function"){throw new Error("Problem with ["+sequenceName+"] sequence definition. Sequences must be functions")}object[sequenceName]=new Sequence(sequenceFn)}sequences=object};var parseConfig=function(config){parseSequences(config.sequences);delete config.sequences;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};FactoryGuy={modelDefinitions:{},define:function(model,config){if(this.modelDefinitions[model]){this.modelDefinitions[model].merge(config)}else{this.modelDefinitions[model]=new ModelDefinition(model,config)}},generate:function(sequenceName){return function(){return this.generate(sequenceName)}},lookupModelForName:function(name){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition.model}}},lookupDefinitionForName:function(name){for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(name,opts){var definition=this.lookupDefinitionForName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts)},buildList:function(name,number,opts){var definition=this.lookupDefinitionForName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,opts)},resetModels:function(store){var typeMaps=store.typeMaps;for(model in this.modelDefinitions){var definition=this.modelDefinitions[model];definition.reset();try{var modelType=store.modelFor(definition.model);if(store.usingFixtureAdapter()){modelType.FIXTURES=[]}store.unloadAll(modelType)}catch(e){}}},pushFixture:function(modelClass,fixture){if(!modelClass["FIXTURES"]){modelClass["FIXTURES"]=[]}modelClass["FIXTURES"].push(fixture);return fixture},clear:function(opts){if(!opts){this.modelDefinitions={};return}}};DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(name,options){var modelName=FactoryGuy.lookupModelForName(name);var fixture=FactoryGuy.build(name,options);var modelType=this.modelFor(modelName);if(this.usingFixtureAdapter()){this.setBelongsToFixturesAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{var self=this;var model;Em.run(function(){model=self.push(modelName,fixture);self.setBelongsToRESTAdapter(modelType,modelName,model)});return model}},makeList:function(name,number,options){var arr=[];for(var i=0;i<number;i++){arr.push(this.makeFixture(name,options))}return arr},setBelongsToFixturesAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){if(fixture[relationship.key]){fixture[relationship.key].forEach(function(id){var hasManyfixtures=adapter.fixturesForType(relationship.type);var fixture=adapter.findFixtureById(hasManyfixtures,id);fixture[modelName]=fixture.id})}}if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(belongsToRecord){var hasManyName=self.findHasManyRelationshipName2(relationship.type,relationship.parentType);var belongsToFixtures=adapter.fixturesForType(relationship.type);var belongsTofixture=adapter.findFixtureById(belongsToFixtures,fixture[relationship.key]);if(!belongsTofixture[hasManyName]){belongsTofixture[hasManyName]=[]}belongsTofixture[hasManyName].push(fixture.id)}}})},setBelongsToRESTAdapter:function(modelType,modelName,model){var self=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"){var children=model.get(name)||[];children.forEach(function(child){child.set(modelName,model)})}if(relationship.kind=="belongsTo"){var belongsToRecord=model.get(name);if(belongsToRecord){var hasManyName=self.findHasManyRelationshipName(belongsToRecord,model);belongsToRecord.get(hasManyName).addObject(model)}}})},findHasManyRelationshipName2:function(belongToModel,childModel){var relationshipName;Ember.get(belongToModel,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"&&relationship.type==childModel){relationshipName=relationship.key}});return relationshipName},findHasManyRelationshipName:function(belongToModel,childModel){var relationshipName;Ember.get(belongToModel.constructor,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"&&relationship.type==childModel.constructor){relationshipName=relationship.key}});return relationshipName},pushPayload:function(type,payload){if(this.usingFixtureAdapter()){var model=this.modelFor(modelName);FactoryGuy.pushFixture(model,payload)}else{this._super(type,payload)}}});DS.FixtureAdapter.reopen({createRecord:function(store,type,record){var promise=this._super(store,type,record);promise.then(function(){var relationShips=Ember.get(type,"relationshipNames");if(relationShips.belongsTo){relationShips.belongsTo.forEach(function(relationship){var belongsToRecord=record.get(relationship);if(belongsToRecord){var hasManyName=store.findHasManyRelationshipName(belongsToRecord,record);belongsToRecord.get(hasManyName).addObject(record)}})}});return promise}});FactoryGuyTestMixin=Em.Mixin.create({setup:function(app){this.set("container",app.__container__);return this},useFixtureAdapter:function(app){app.ApplicationAdapter=DS.FixtureAdapter;this.getStore().adapterFor("application").simulateRemoteResponse=false},find:function(type,id){return this.getStore().find(type,id)},make:function(name,opts){return this.getStore().makeFixture(name,opts)},getStore:function(){return this.get("container").lookup("store:main")},pushPayload:function(type,hash){return this.getStore().pushPayload(type,hash)},pushRecord:function(type,hash){return this.getStore().push(type,hash)},stubEndpointForHttpRequest:function(url,json,options){options=options||{};var request={url:url,dataType:"json",responseText:json,type:options.type||"GET",status:options.status||200};if(options.data){request.data=options.data}$.mockjax(request)},handleCreate:function(name,opts){var model=FactoryGuy.lookupModelForName(name);this.stubEndpointForHttpRequest("/"+Em.String.pluralize(model),this.buildAjaxCreateResponse(name,opts),{type:"POST"})},buildAjaxCreateResponse:function(name,opts){var fixture=FactoryGuy.build(name,opts);var model=FactoryGuy.lookupModelForName(name);var hash={};hash[model]=fixture;return hash},handleUpdate:function(root,id){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"PUT"})},handleDelete:function(root,id){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"DELETE"})},teardown:function(){FactoryGuy.resetModels(this.getStore())}});
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = "ember-data-factory-guy"
|
4
|
-
s.version = "0.2.
|
4
|
+
s.version = "0.2.1"
|
5
5
|
s.platform = Gem::Platform::RUBY
|
6
6
|
s.authors = ["Daniel Sudol", "Alex Opak"]
|
7
7
|
s.email = ["dansudol@yahoo.com", "opak.alexandr@gmail.com"]
|
data/package.json
CHANGED
@@ -12,7 +12,7 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
12
12
|
},
|
13
13
|
|
14
14
|
/**
|
15
|
-
|
15
|
+
Proxy to store's find method
|
16
16
|
|
17
17
|
@param {String or subclass of DS.Model} type
|
18
18
|
@param {Object|String|Integer|null} id
|
@@ -91,12 +91,24 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
91
91
|
return hash;
|
92
92
|
},
|
93
93
|
|
94
|
+
/**
|
95
|
+
Handling ajax PUT ( update record ) for a model type
|
96
|
+
|
97
|
+
@param {String} root modelType like 'user' for User
|
98
|
+
@param {String} id id of record to update
|
99
|
+
*/
|
94
100
|
handleUpdate: function (root, id) {
|
95
101
|
this.stubEndpointForHttpRequest(
|
96
102
|
"/" + Em.String.pluralize(root) + "/" + id, {}, {type: 'PUT'}
|
97
103
|
)
|
98
104
|
},
|
99
105
|
|
106
|
+
/**
|
107
|
+
Handling ajax DELETE ( delete record ) for a model type
|
108
|
+
|
109
|
+
@param {String} root modelType like 'user' for User
|
110
|
+
@param {String} id id of record to update
|
111
|
+
*/
|
100
112
|
handleDelete: function (root, id) {
|
101
113
|
this.stubEndpointForHttpRequest(
|
102
114
|
"/" + Em.String.pluralize(root) + "/" + id, {}, {type: 'DELETE'}
|
data/src/store.js
CHANGED
@@ -62,22 +62,33 @@ DS.Store.reopen({
|
|
62
62
|
@param {String} modelName model name like 'user'
|
63
63
|
@param {Object} parentFixture parent to assign as belongTo
|
64
64
|
*/
|
65
|
-
setBelongsToFixturesAdapter: function
|
66
|
-
var
|
65
|
+
setBelongsToFixturesAdapter: function(modelType, modelName, fixture) {
|
66
|
+
var self = this;
|
67
67
|
var adapter = this.adapterFor('application');
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
parentFixture[relationship].forEach(function (id) {
|
74
|
-
var hasManyfixtures = adapter.fixturesForType(hasManyModel);
|
68
|
+
Ember.get(modelType, 'relationshipsByName').forEach(function (name, relationship) {
|
69
|
+
if (relationship.kind == 'hasMany') {
|
70
|
+
if (fixture[relationship.key]) {
|
71
|
+
fixture[relationship.key].forEach(function(id) {
|
72
|
+
var hasManyfixtures = adapter.fixturesForType(relationship.type);
|
75
73
|
var fixture = adapter.findFixtureById(hasManyfixtures, id);
|
76
|
-
fixture[modelName] =
|
74
|
+
fixture[modelName] = fixture.id;
|
77
75
|
})
|
78
76
|
}
|
79
|
-
}
|
80
|
-
|
77
|
+
}
|
78
|
+
|
79
|
+
if (relationship.kind == 'belongsTo') {
|
80
|
+
var belongsToRecord = fixture[relationship.key];
|
81
|
+
if (belongsToRecord) {
|
82
|
+
var hasManyName = self.findHasManyRelationshipName2(relationship.type, relationship.parentType);
|
83
|
+
var belongsToFixtures = adapter.fixturesForType(relationship.type);
|
84
|
+
var belongsTofixture = adapter.findFixtureById(belongsToFixtures, fixture[relationship.key]);
|
85
|
+
if (!belongsTofixture[hasManyName]) {
|
86
|
+
belongsTofixture[hasManyName] = []
|
87
|
+
}
|
88
|
+
belongsTofixture[hasManyName].push(fixture.id);
|
89
|
+
}
|
90
|
+
}
|
91
|
+
})
|
81
92
|
},
|
82
93
|
|
83
94
|
/**
|
@@ -115,6 +126,18 @@ DS.Store.reopen({
|
|
115
126
|
})
|
116
127
|
},
|
117
128
|
|
129
|
+
findHasManyRelationshipName2: function (belongToModel, childModel) {
|
130
|
+
var relationshipName;
|
131
|
+
Ember.get(belongToModel, 'relationshipsByName').forEach(
|
132
|
+
function (name, relationship) {
|
133
|
+
if (relationship.kind == 'hasMany' &&
|
134
|
+
relationship.type == childModel) {
|
135
|
+
relationshipName = relationship.key;
|
136
|
+
}
|
137
|
+
}
|
138
|
+
)
|
139
|
+
return relationshipName;
|
140
|
+
},
|
118
141
|
findHasManyRelationshipName: function (belongToModel, childModel) {
|
119
142
|
var relationshipName;
|
120
143
|
Ember.get(belongToModel.constructor, 'relationshipsByName').forEach(
|
@@ -76,23 +76,38 @@ test("#makeFixture builds and pushes fixture into the models FIXTURE array", fun
|
|
76
76
|
});
|
77
77
|
|
78
78
|
|
79
|
-
asyncTest("#makeFixture sets hasMany associations
|
79
|
+
asyncTest("#makeFixture sets belongsTo on hasMany associations", function() {
|
80
80
|
var p1 = store.makeFixture('project');
|
81
81
|
// second project not added on purpose to make sure only one is
|
82
82
|
// assigned in hasMany
|
83
83
|
store.makeFixture('project');
|
84
84
|
var user = store.makeFixture('user', {projects: [p1.id]})
|
85
85
|
|
86
|
-
store.find('user', 1).then
|
86
|
+
store.find('user', 1).then( function(user) {
|
87
87
|
user.get('projects').then( function(projects) {
|
88
88
|
equal(projects.get('length'), 1, "adds hasMany records");
|
89
|
-
equal(projects.get('firstObject.user.id'),
|
89
|
+
equal(projects.get('firstObject.user.id'), user.id, "sets belongsTo record");
|
90
90
|
start();
|
91
91
|
})
|
92
92
|
})
|
93
93
|
})
|
94
94
|
|
95
|
-
|
95
|
+
|
96
|
+
asyncTest("#makeFixture adds record to hasMany association array for which it belongsTo", function() {
|
97
|
+
var userJson = store.makeFixture('user');
|
98
|
+
var projectJson = store.makeFixture('project', {user: userJson.id});
|
99
|
+
|
100
|
+
store.find('user', userJson.id).then( function(user) {
|
101
|
+
user.get('projects').then( function(projects) {
|
102
|
+
equal(projects.get('length'), 1, "adds hasMany records");
|
103
|
+
equal(projects.get('firstObject.user.id'), user.id, "sets belongsTo record");
|
104
|
+
start();
|
105
|
+
})
|
106
|
+
})
|
107
|
+
})
|
108
|
+
|
109
|
+
|
110
|
+
asyncTest("#createRecord adds belongsTo association to records it hasMany of", function() {
|
96
111
|
var user = store.makeFixture('user');
|
97
112
|
|
98
113
|
store.find('user', user.id).then(function(user) {
|
@@ -401,22 +401,33 @@ DS.Store.reopen({
|
|
401
401
|
@param {String} modelName model name like 'user'
|
402
402
|
@param {Object} parentFixture parent to assign as belongTo
|
403
403
|
*/
|
404
|
-
setBelongsToFixturesAdapter: function
|
405
|
-
var
|
404
|
+
setBelongsToFixturesAdapter: function(modelType, modelName, fixture) {
|
405
|
+
var self = this;
|
406
406
|
var adapter = this.adapterFor('application');
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
parentFixture[relationship].forEach(function (id) {
|
413
|
-
var hasManyfixtures = adapter.fixturesForType(hasManyModel);
|
407
|
+
Ember.get(modelType, 'relationshipsByName').forEach(function (name, relationship) {
|
408
|
+
if (relationship.kind == 'hasMany') {
|
409
|
+
if (fixture[relationship.key]) {
|
410
|
+
fixture[relationship.key].forEach(function(id) {
|
411
|
+
var hasManyfixtures = adapter.fixturesForType(relationship.type);
|
414
412
|
var fixture = adapter.findFixtureById(hasManyfixtures, id);
|
415
|
-
fixture[modelName] =
|
413
|
+
fixture[modelName] = fixture.id;
|
416
414
|
})
|
417
415
|
}
|
418
|
-
}
|
419
|
-
|
416
|
+
}
|
417
|
+
|
418
|
+
if (relationship.kind == 'belongsTo') {
|
419
|
+
var belongsToRecord = fixture[relationship.key];
|
420
|
+
if (belongsToRecord) {
|
421
|
+
var hasManyName = self.findHasManyRelationshipName2(relationship.type, relationship.parentType);
|
422
|
+
var belongsToFixtures = adapter.fixturesForType(relationship.type);
|
423
|
+
var belongsTofixture = adapter.findFixtureById(belongsToFixtures, fixture[relationship.key]);
|
424
|
+
if (!belongsTofixture[hasManyName]) {
|
425
|
+
belongsTofixture[hasManyName] = []
|
426
|
+
}
|
427
|
+
belongsTofixture[hasManyName].push(fixture.id);
|
428
|
+
}
|
429
|
+
}
|
430
|
+
})
|
420
431
|
},
|
421
432
|
|
422
433
|
/**
|
@@ -454,6 +465,18 @@ DS.Store.reopen({
|
|
454
465
|
})
|
455
466
|
},
|
456
467
|
|
468
|
+
findHasManyRelationshipName2: function (belongToModel, childModel) {
|
469
|
+
var relationshipName;
|
470
|
+
Ember.get(belongToModel, 'relationshipsByName').forEach(
|
471
|
+
function (name, relationship) {
|
472
|
+
if (relationship.kind == 'hasMany' &&
|
473
|
+
relationship.type == childModel) {
|
474
|
+
relationshipName = relationship.key;
|
475
|
+
}
|
476
|
+
}
|
477
|
+
)
|
478
|
+
return relationshipName;
|
479
|
+
},
|
457
480
|
findHasManyRelationshipName: function (belongToModel, childModel) {
|
458
481
|
var relationshipName;
|
459
482
|
Ember.get(belongToModel.constructor, 'relationshipsByName').forEach(
|
@@ -559,7 +582,7 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
559
582
|
},
|
560
583
|
|
561
584
|
/**
|
562
|
-
|
585
|
+
Proxy to store's find method
|
563
586
|
|
564
587
|
@param {String or subclass of DS.Model} type
|
565
588
|
@param {Object|String|Integer|null} id
|
@@ -638,12 +661,24 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
638
661
|
return hash;
|
639
662
|
},
|
640
663
|
|
664
|
+
/**
|
665
|
+
Handling ajax PUT ( update record ) for a model type
|
666
|
+
|
667
|
+
@param {String} root modelType like 'user' for User
|
668
|
+
@param {String} id id of record to update
|
669
|
+
*/
|
641
670
|
handleUpdate: function (root, id) {
|
642
671
|
this.stubEndpointForHttpRequest(
|
643
672
|
"/" + Em.String.pluralize(root) + "/" + id, {}, {type: 'PUT'}
|
644
673
|
)
|
645
674
|
},
|
646
675
|
|
676
|
+
/**
|
677
|
+
Handling ajax DELETE ( delete record ) for a model type
|
678
|
+
|
679
|
+
@param {String} root modelType like 'user' for User
|
680
|
+
@param {String} id id of record to update
|
681
|
+
*/
|
647
682
|
handleDelete: function (root, id) {
|
648
683
|
this.stubEndpointForHttpRequest(
|
649
684
|
"/" + Em.String.pluralize(root) + "/" + id, {}, {type: 'DELETE'}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ember-data-factory-guy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-05-
|
13
|
+
date: 2014-05-10 00:00:00.000000000 +03:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
description: Easily create Fixtures for Ember Data
|