ember-data-factory-guy 0.2.0 → 0.2.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/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
|