ember-data-factory-guy 0.3.4 → 0.3.5
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 +11 -6
- data/bower.json +1 -1
- data/dist/ember-data-factory-guy.js +11 -1
- 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/store.js +11 -1
- data/tests/active_model_adapter_factory_test.js +33 -8
- data/tests/rest_adapter_factory_test.js +33 -8
- data/tests/support/factories/company_factory.js +5 -0
- data/tests/support/models/company.js +4 -0
- data/tests/support/models/user.js +1 -0
- data/tests/support/test_helper.js +1 -0
- data/tests/test_setup.js +11 -0
- data/vendor/assets/javascripts/ember_data_factory_guy.js +11 -1
- metadata +4 -2
data/README.md
CHANGED
@@ -142,10 +142,10 @@ Let's say you have a few models like these:
|
|
142
142
|
FactoryGuy.define('hat', {
|
143
143
|
default: {},
|
144
144
|
small_hat: {
|
145
|
-
type: '
|
145
|
+
type: 'SmallHat'
|
146
146
|
},
|
147
147
|
big_hat: {
|
148
|
-
type: '
|
148
|
+
type: 'BigHat'
|
149
149
|
}
|
150
150
|
})
|
151
151
|
```
|
@@ -207,7 +207,7 @@ var user = store.makeFixture('admin'); // user.toJSON() = {id: 5, name: 'Admin',
|
|
207
207
|
var user = store.makeFixture('admin', {name: 'Fred'}); // user.toJSON() = {id: 6, name: 'Fred', type: 'superuser'}
|
208
208
|
```
|
209
209
|
|
210
|
-
######
|
210
|
+
###### Associations
|
211
211
|
|
212
212
|
``` javascript
|
213
213
|
// setting models on the hasMany association
|
@@ -224,7 +224,7 @@ var project = store.makeFixture('project', {user: user});
|
|
224
224
|
// user.get('projects.firstObject.user') == user;
|
225
225
|
```
|
226
226
|
|
227
|
-
######
|
227
|
+
###### Polymorphic hasMany associations
|
228
228
|
|
229
229
|
```javascript
|
230
230
|
// setting polymorphic models on the (polymorphic) hasMany association
|
@@ -240,12 +240,17 @@ var user = store.makeFixture('user', {hats: [sh, bh]})
|
|
240
240
|
// setting belongTo association on polymorphic model
|
241
241
|
var user = store.makeFixture('user');
|
242
242
|
store.makeFixture('big_hat', {user: user});
|
243
|
-
|
243
|
+
store.makeFixture('small_hat', {user: user});
|
244
|
+
|
245
|
+
// will get you the same results, since FactoryGuy makes sure the associations
|
246
|
+
// are created in both directions, even for polymorphic associations.
|
247
|
+
// user.get('hats.length') == 2;
|
244
248
|
// (user.get('hats.firstObject') instanceof BigHat) == true
|
249
|
+
// (user.get('hats.lastObject') instanceof SmallHat) == true
|
245
250
|
|
246
251
|
```
|
247
252
|
|
248
|
-
######
|
253
|
+
###### Create lists
|
249
254
|
|
250
255
|
```javascript
|
251
256
|
var users = store.makeList('user', 3);
|
data/bower.json
CHANGED
@@ -535,7 +535,7 @@ DS.Store.reopen({
|
|
535
535
|
|
536
536
|
if (relationship.kind == 'belongsTo') {
|
537
537
|
var belongsToRecord = model.get(name);
|
538
|
-
|
538
|
+
var setAssociation = function() {
|
539
539
|
var hasManyName = self.findHasManyRelationshipName(
|
540
540
|
belongsToRecord.constructor,
|
541
541
|
model
|
@@ -544,6 +544,16 @@ DS.Store.reopen({
|
|
544
544
|
belongsToRecord.get(hasManyName).addObject(model);
|
545
545
|
}
|
546
546
|
}
|
547
|
+
if (belongsToRecord) {
|
548
|
+
if (belongsToRecord.then) {
|
549
|
+
belongsToRecord.then(function(record) {
|
550
|
+
belongsToRecord = record;
|
551
|
+
setAssociation();
|
552
|
+
})
|
553
|
+
} else {
|
554
|
+
setAssociation();
|
555
|
+
}
|
556
|
+
}
|
547
557
|
}
|
548
558
|
})
|
549
559
|
},
|
@@ -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(Ember.typeOf(fixture[attribute])=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}else if(Ember.typeOf(fixture[attribute])=="object"){fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}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)}},association:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName: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.lookupDefinitionForFixtureName(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.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,opts)},resetModels:function(store){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={}}}};DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(name,options){var modelName=FactoryGuy.lookupModelForFixtureName(name);var fixture=FactoryGuy.build(name,options);var modelType=this.modelFor(modelName);if(this.usingFixtureAdapter()){this.setAssociationsForFixtureAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{var store=this;var model;Em.run(function(){store.findEmbeddedBelongsToAssociationsForRESTAdapter(modelType,fixture);if(fixture.type){modelName=fixture.type.underscore()}model=store.push(modelName,fixture);store.setAssociationsForRESTAdapter(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},setAssociationsForFixtureAdapter: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){if(typeof belongsToRecord=="object"){FactoryGuy.pushFixture(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord.id}var hasManyName=self.findHasManyRelationshipNameForFixtureAdapter(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)}}})},findEmbeddedBelongsToAssociationsForRESTAdapter:function(modelType,fixture){var store=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(Ember.typeOf(belongsToRecord)=="object"){belongsToRecord=store.push(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord}}})},setAssociationsForRESTAdapter: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);
|
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(Ember.typeOf(fixture[attribute])=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}else if(Ember.typeOf(fixture[attribute])=="object"){fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}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)}},association:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName: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.lookupDefinitionForFixtureName(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.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,opts)},resetModels:function(store){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={}}}};DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(name,options){var modelName=FactoryGuy.lookupModelForFixtureName(name);var fixture=FactoryGuy.build(name,options);var modelType=this.modelFor(modelName);if(this.usingFixtureAdapter()){this.setAssociationsForFixtureAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{var store=this;var model;Em.run(function(){store.findEmbeddedBelongsToAssociationsForRESTAdapter(modelType,fixture);if(fixture.type){modelName=fixture.type.underscore()}model=store.push(modelName,fixture);store.setAssociationsForRESTAdapter(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},setAssociationsForFixtureAdapter: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){if(typeof belongsToRecord=="object"){FactoryGuy.pushFixture(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord.id}var hasManyName=self.findHasManyRelationshipNameForFixtureAdapter(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)}}})},findEmbeddedBelongsToAssociationsForRESTAdapter:function(modelType,fixture){var store=this;Ember.get(modelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(Ember.typeOf(belongsToRecord)=="object"){belongsToRecord=store.push(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord}}})},setAssociationsForRESTAdapter: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);var setAssociation=function(){var hasManyName=self.findHasManyRelationshipName(belongsToRecord.constructor,model);if(hasManyName){belongsToRecord.get(hasManyName).addObject(model)}};if(belongsToRecord){if(belongsToRecord.then){belongsToRecord.then(function(record){belongsToRecord=record;setAssociation()})}else{setAssociation()}}}})},findHasManyRelationshipName:function(belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"&&childModel instanceof relationship.type){relationshipName=relationship.key}});return relationshipName},findHasManyRelationshipNameForFixtureAdapter:function(belongToModelType,childModelType){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind=="hasMany"&&childModelType==relationship.type){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.constructor,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.lookupModelForFixtureName(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.lookupModelForFixtureName(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.3.
|
4
|
+
s.version = "0.3.5"
|
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
data/src/store.js
CHANGED
@@ -177,7 +177,7 @@ DS.Store.reopen({
|
|
177
177
|
|
178
178
|
if (relationship.kind == 'belongsTo') {
|
179
179
|
var belongsToRecord = model.get(name);
|
180
|
-
|
180
|
+
var setAssociation = function() {
|
181
181
|
var hasManyName = self.findHasManyRelationshipName(
|
182
182
|
belongsToRecord.constructor,
|
183
183
|
model
|
@@ -186,6 +186,16 @@ DS.Store.reopen({
|
|
186
186
|
belongsToRecord.get(hasManyName).addObject(model);
|
187
187
|
}
|
188
188
|
}
|
189
|
+
if (belongsToRecord) {
|
190
|
+
if (belongsToRecord.then) {
|
191
|
+
belongsToRecord.then(function(record) {
|
192
|
+
belongsToRecord = record;
|
193
|
+
setAssociation();
|
194
|
+
})
|
195
|
+
} else {
|
196
|
+
setAssociation();
|
197
|
+
}
|
198
|
+
}
|
189
199
|
}
|
190
200
|
})
|
191
201
|
},
|
@@ -95,32 +95,57 @@ test("when belongTo parent is assigned, parent adds to polymorphic hasMany recor
|
|
95
95
|
|
96
96
|
|
97
97
|
test("when hasMany associations assigned, belongTo parent is assigned", function() {
|
98
|
-
var
|
99
|
-
var user = store.makeFixture('user', {projects: [
|
98
|
+
var project = store.makeFixture('project');
|
99
|
+
var user = store.makeFixture('user', {projects: [project]})
|
100
|
+
|
101
|
+
deepEqual(project.get('user'), user);
|
102
|
+
});
|
103
|
+
|
104
|
+
|
105
|
+
asyncTest("when asnyc hasMany associations assigned, belongTo parent is assigned", function() {
|
106
|
+
var user = store.makeFixture('user');
|
107
|
+
var company = store.makeFixture('company', {users: [user]});
|
100
108
|
|
101
|
-
|
109
|
+
user.get('company').then(function(c){
|
110
|
+
equal(c, company);
|
111
|
+
start();
|
112
|
+
})
|
102
113
|
});
|
103
114
|
|
104
115
|
|
105
116
|
test("when belongTo parent is assigned, parent adds to hasMany records", function() {
|
106
117
|
var user = store.makeFixture('user');
|
107
|
-
store.makeFixture('project', {user: user});
|
108
|
-
store.makeFixture('project', {user: user});
|
118
|
+
var project1 = store.makeFixture('project', {user: user});
|
119
|
+
var project2 = store.makeFixture('project', {user: user});
|
109
120
|
|
110
121
|
equal(user.get('projects.length'), 2);
|
122
|
+
equal(user.get('projects.firstObject'), project1);
|
123
|
+
equal(user.get('projects.lastObject'), project2);
|
124
|
+
});
|
125
|
+
|
126
|
+
|
127
|
+
asyncTest("when async belongsTo parent is assigned, parent adds to hasMany records", function() {
|
128
|
+
var company = store.makeFixture('company');
|
129
|
+
var user1 = store.makeFixture('user', {company: company});
|
130
|
+
var user2 = store.makeFixture('user', {company: company});
|
131
|
+
|
132
|
+
equal(company.get('users.length'), 2);
|
133
|
+
equal(company.get('users.firstObject'), user1);
|
134
|
+
equal(company.get('users.lastObject'), user2);
|
135
|
+
start();
|
111
136
|
});
|
112
137
|
|
113
138
|
|
114
139
|
test("belongsTo associations defined as attributes in fixture", function() {
|
115
140
|
var project = store.makeFixture('project_with_user');
|
116
141
|
equal(project.get('user') instanceof User, true)
|
117
|
-
deepEqual(project.get('user').toJSON(),{name: 'User1'})
|
142
|
+
deepEqual(project.get('user').toJSON(),{name: 'User1', company: null})
|
118
143
|
|
119
144
|
var project = store.makeFixture('project_with_dude');
|
120
|
-
deepEqual(project.get('user').toJSON(),{name: 'Dude'})
|
145
|
+
deepEqual(project.get('user').toJSON(),{name: 'Dude', company: null})
|
121
146
|
|
122
147
|
var project = store.makeFixture('project_with_admin');
|
123
|
-
deepEqual(project.get('user').toJSON(),{name: 'Admin'})
|
148
|
+
deepEqual(project.get('user').toJSON(),{name: 'Admin', company: null})
|
124
149
|
})
|
125
150
|
|
126
151
|
|
@@ -104,32 +104,57 @@ test("when belongTo parent is assigned, parent adds to polymorphic hasMany recor
|
|
104
104
|
|
105
105
|
|
106
106
|
test("when hasMany associations assigned, belongTo parent is assigned", function() {
|
107
|
-
var
|
108
|
-
var user = store.makeFixture('user', {projects: [
|
107
|
+
var project = store.makeFixture('project');
|
108
|
+
var user = store.makeFixture('user', {projects: [project]})
|
109
|
+
|
110
|
+
deepEqual(project.get('user'), user);
|
111
|
+
});
|
112
|
+
|
113
|
+
|
114
|
+
asyncTest("when asnyc hasMany associations assigned, belongTo parent is assigned", function() {
|
115
|
+
var user = store.makeFixture('user');
|
116
|
+
var company = store.makeFixture('company', {users: [user]});
|
109
117
|
|
110
|
-
|
118
|
+
user.get('company').then(function(c){
|
119
|
+
equal(c, company)
|
120
|
+
start()
|
121
|
+
})
|
111
122
|
});
|
112
123
|
|
113
124
|
|
114
125
|
test("when belongTo parent is assigned, parent adds to hasMany records", function() {
|
115
126
|
var user = store.makeFixture('user');
|
116
|
-
store.makeFixture('project', {user: user});
|
117
|
-
store.makeFixture('project', {user: user});
|
127
|
+
var project1 = store.makeFixture('project', {user: user});
|
128
|
+
var project2 = store.makeFixture('project', {user: user});
|
118
129
|
|
119
130
|
equal(user.get('projects.length'), 2);
|
131
|
+
equal(user.get('projects.firstObject'), project1)
|
132
|
+
equal(user.get('projects.lastObject'), project2)
|
133
|
+
});
|
134
|
+
|
135
|
+
|
136
|
+
asyncTest("when async belongsTo parent is assigned, parent adds to hasMany records", function() {
|
137
|
+
var company = store.makeFixture('company');
|
138
|
+
var user1 = store.makeFixture('user', {company: company});
|
139
|
+
var user2 = store.makeFixture('user', {company: company});
|
140
|
+
|
141
|
+
equal(company.get('users.length'), 2);
|
142
|
+
equal(company.get('users.firstObject'), user1)
|
143
|
+
equal(company.get('users.lastObject'), user2)
|
144
|
+
start()
|
120
145
|
});
|
121
146
|
|
122
147
|
|
123
148
|
test("belongsTo associations defined as attributes in fixture", function() {
|
124
149
|
var project = store.makeFixture('project_with_user');
|
125
150
|
equal(project.get('user') instanceof User, true)
|
126
|
-
deepEqual(project.get('user').toJSON(),{name: 'User1'})
|
151
|
+
deepEqual(project.get('user').toJSON(),{name: 'User1', company: null})
|
127
152
|
|
128
153
|
var project = store.makeFixture('project_with_dude');
|
129
|
-
deepEqual(project.get('user').toJSON(),{name: 'Dude'})
|
154
|
+
deepEqual(project.get('user').toJSON(),{name: 'Dude', company: null})
|
130
155
|
|
131
156
|
var project = store.makeFixture('project_with_admin');
|
132
|
-
deepEqual(project.get('user').toJSON(),{name: 'Admin'})
|
157
|
+
deepEqual(project.get('user').toJSON(),{name: 'Admin', company: null})
|
133
158
|
})
|
134
159
|
|
135
160
|
module('DS.Store#makeList with DS.RESTAdapter', {
|
@@ -13,6 +13,7 @@ TestHelper = Ember.Object.createWithMixins(FactoryGuyTestMixin,{
|
|
13
13
|
container.register("model:small_hat", SmallHat);
|
14
14
|
container.register("model:big_hat", BigHat);
|
15
15
|
container.register("model:user", User);
|
16
|
+
container.register("model:company", Company);
|
16
17
|
container.register("model:project", Project);
|
17
18
|
container.register("store:main", DS.Store.extend({adapter: adapter}));
|
18
19
|
container.register("serializer:-default", DS.RESTSerializer);
|
data/tests/test_setup.js
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
FactoryGuy.define('company', {
|
2
|
+
default: {
|
3
|
+
name: 'Silly corp'
|
4
|
+
}
|
5
|
+
})
|
1
6
|
FactoryGuy.define('hat', {
|
2
7
|
default: {},
|
3
8
|
small_hat: {
|
@@ -34,6 +39,11 @@ FactoryGuy.define('user', {
|
|
34
39
|
name: 'Admin'
|
35
40
|
}
|
36
41
|
});
|
42
|
+
Company = DS.Model.extend({
|
43
|
+
name: DS.attr('string'),
|
44
|
+
users: DS.hasMany('user', {async: true})
|
45
|
+
})
|
46
|
+
|
37
47
|
Hat = DS.Model.extend({
|
38
48
|
type: DS.attr('string'),
|
39
49
|
user: DS.belongsTo('user'),
|
@@ -52,6 +62,7 @@ Project = DS.Model.extend({
|
|
52
62
|
|
53
63
|
User = DS.Model.extend({
|
54
64
|
name: DS.attr('string'),
|
65
|
+
company: DS.belongsTo('company', {async: true}),
|
55
66
|
projects: DS.hasMany('project'),
|
56
67
|
hats: DS.hasMany('hat', {polymorphic: true})
|
57
68
|
})
|
@@ -535,7 +535,7 @@ DS.Store.reopen({
|
|
535
535
|
|
536
536
|
if (relationship.kind == 'belongsTo') {
|
537
537
|
var belongsToRecord = model.get(name);
|
538
|
-
|
538
|
+
var setAssociation = function() {
|
539
539
|
var hasManyName = self.findHasManyRelationshipName(
|
540
540
|
belongsToRecord.constructor,
|
541
541
|
model
|
@@ -544,6 +544,16 @@ DS.Store.reopen({
|
|
544
544
|
belongsToRecord.get(hasManyName).addObject(model);
|
545
545
|
}
|
546
546
|
}
|
547
|
+
if (belongsToRecord) {
|
548
|
+
if (belongsToRecord.then) {
|
549
|
+
belongsToRecord.then(function(record) {
|
550
|
+
belongsToRecord = record;
|
551
|
+
setAssociation();
|
552
|
+
})
|
553
|
+
} else {
|
554
|
+
setAssociation();
|
555
|
+
}
|
556
|
+
}
|
547
557
|
}
|
548
558
|
})
|
549
559
|
},
|
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.3.
|
4
|
+
version: 0.3.5
|
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-29 00:00:00.000000000 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
description: Easily create Fixtures for Ember Data
|
@@ -44,10 +44,12 @@ files:
|
|
44
44
|
- tests/index.html
|
45
45
|
- tests/rest_adapter_factory_test.js
|
46
46
|
- tests/store_test.js
|
47
|
+
- tests/support/factories/company_factory.js
|
47
48
|
- tests/support/factories/hat_factory.js
|
48
49
|
- tests/support/factories/project_factory.js
|
49
50
|
- tests/support/factories/user_factory.js
|
50
51
|
- tests/support/libs/sinon.js
|
52
|
+
- tests/support/models/company.js
|
51
53
|
- tests/support/models/hat.js
|
52
54
|
- tests/support/models/project.js
|
53
55
|
- tests/support/models/user.js
|