ember-data-factory-guy 0.2.0 → 0.2.1

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