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 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: 'small_hat'
145
+ type: 'SmallHat'
146
146
  },
147
147
  big_hat: {
148
- type: 'big_hat'
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
- ###### associations
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
- ###### polymorphic hasMany associations
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
- // user.get('hats.length') == 1;
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
- ###### create lists
253
+ ###### Create lists
249
254
 
250
255
  ```javascript
251
256
  var users = store.makeList('user', 3);
data/bower.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
@@ -535,7 +535,7 @@ DS.Store.reopen({
535
535
 
536
536
  if (relationship.kind == 'belongsTo') {
537
537
  var belongsToRecord = model.get(name);
538
- if (belongsToRecord) {
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);if(belongsToRecord){var hasManyName=self.findHasManyRelationshipName(belongsToRecord.constructor,model);if(hasManyName){belongsToRecord.get(hasManyName).addObject(model)}}}})},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
+ 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"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.3.4",
3
+ "version": "0.3.5",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
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
- if (belongsToRecord) {
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 p1 = store.makeFixture('project');
99
- var user = store.makeFixture('user', {projects: [p1]})
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
- deepEqual(p1.get('user').toJSON(), user.toJSON());
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 p1 = store.makeFixture('project');
108
- var user = store.makeFixture('user', {projects: [p1]})
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
- deepEqual(p1.get('user').toJSON(), user.toJSON());
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', {
@@ -0,0 +1,5 @@
1
+ FactoryGuy.define('company', {
2
+ default: {
3
+ name: 'Silly corp'
4
+ }
5
+ })
@@ -0,0 +1,4 @@
1
+ Company = DS.Model.extend({
2
+ name: DS.attr('string'),
3
+ users: DS.hasMany('user', {async: true})
4
+ })
@@ -1,5 +1,6 @@
1
1
  User = DS.Model.extend({
2
2
  name: DS.attr('string'),
3
+ company: DS.belongsTo('company', {async: true}),
3
4
  projects: DS.hasMany('project'),
4
5
  hats: DS.hasMany('hat', {polymorphic: true})
5
6
  })
@@ -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
- if (belongsToRecord) {
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
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-24 00:00:00.000000000 +03:00
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