ember-data-factory-guy 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
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