ember-data-factory-guy 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/bower.json +1 -1
- data/dist/ember-data-factory-guy.js +56 -49
- data/dist/ember-data-factory-guy.min.js +1 -1
- data/ember-data-factory-guy.gemspec +1 -1
- data/package.json +1 -1
- data/src/factory_guy_test_mixin.js +9 -2
- data/src/store.js +47 -48
- data/tests/active_model_adapter_factory_test.js +17 -5
- data/tests/fixture_adapter_factory_test.js +25 -2
- data/tests/rest_adapter_factory_test.js +18 -6
- data/tests/support/factories/property_factory.js +5 -0
- data/tests/support/models/company.js +1 -1
- data/tests/support/models/property.js +5 -0
- data/tests/support/models/user.js +3 -2
- data/tests/support/test_helper.js +1 -0
- data/tests/test_setup.js +14 -3
- data/vendor/assets/javascripts/ember_data_factory_guy.js +56 -49
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 723e4f4e01224440a3e7cd0712f0db55a470ba1c
|
4
|
+
data.tar.gz: 280d62404418dfdafbf9b3c32ca5854e94522bce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e048aefde5b3bad5d160ea20781bfe83a9a8324df0b25990dec2d74a1a1b91e95dcd402a12bddc0c479fc20285df24d71e8783c9872889408abd2040f5e4383
|
7
|
+
data.tar.gz: 6a46a70429e37ff619f4427ff90c2cbdc7820bf4ea62926b797cb729cd2a2e07428738d511308e6246a632f63b463f1fc8bb78de36d7d75a07b296d3f3abfa54
|
data/.gitignore
CHANGED
data/bower.json
CHANGED
@@ -381,12 +381,6 @@ DS.Store.reopen({
|
|
381
381
|
return adapter instanceof DS.FixtureAdapter;
|
382
382
|
},
|
383
383
|
|
384
|
-
usingActiveModelSerializer: function () {
|
385
|
-
var adapter = this.adapterFor('application');
|
386
|
-
console.log('adapter.defaultSerializer', adapter.defaultSerializer)
|
387
|
-
return adapter.defaultSerializer == 'active-model';
|
388
|
-
},
|
389
|
-
|
390
384
|
/**
|
391
385
|
Make new fixture and save to store. If the store is using FixtureAdapter,
|
392
386
|
will push to FIXTURE array, otherwise will use push method on adapter.
|
@@ -560,11 +554,17 @@ DS.Store.reopen({
|
|
560
554
|
child.constructor,
|
561
555
|
model
|
562
556
|
);
|
563
|
-
|
564
|
-
|
565
|
-
|
557
|
+
var hasManyName = self.findRelationshipName(
|
558
|
+
'hasMany',
|
559
|
+
child.constructor,
|
560
|
+
model
|
561
|
+
);
|
562
|
+
var inverseName = (relationship.options && relationship.options.inverse)
|
566
563
|
if (belongsToName) {
|
567
|
-
child.set(belongsToName, model);
|
564
|
+
child.set(belongsToName || inverseName, model);
|
565
|
+
} else if (hasManyName) {
|
566
|
+
relation = child.get(hasManyName || inverseName) || [];
|
567
|
+
relation.pushObject(model)
|
568
568
|
}
|
569
569
|
})
|
570
570
|
}
|
@@ -577,7 +577,7 @@ DS.Store.reopen({
|
|
577
577
|
'hasMany',
|
578
578
|
belongsToRecord.constructor,
|
579
579
|
model
|
580
|
-
)
|
580
|
+
);
|
581
581
|
if (hasManyName) {
|
582
582
|
belongsToRecord.get(hasManyName).addObject(model);
|
583
583
|
return;
|
@@ -586,7 +586,7 @@ DS.Store.reopen({
|
|
586
586
|
'belongsTo',
|
587
587
|
belongsToRecord.constructor,
|
588
588
|
model
|
589
|
-
)
|
589
|
+
);
|
590
590
|
// Guard against a situation where a model can belong to itself.
|
591
591
|
// Do not want to set the belongsTo on this case.
|
592
592
|
if (oneToOneName && !(belongsToRecord.constructor == model.constructor)) {
|
@@ -632,26 +632,6 @@ DS.Store.reopen({
|
|
632
632
|
return relationshipName;
|
633
633
|
},
|
634
634
|
|
635
|
-
// /**
|
636
|
-
// Adding the ability to check the serializer and convert the json before
|
637
|
-
// it's pushed. For the ActiveModelSerializer, the attributes should be snake case,
|
638
|
-
// for example.
|
639
|
-
//
|
640
|
-
// @method push
|
641
|
-
// @param {String or subclass of DS.Model} type
|
642
|
-
// @param {Object} data
|
643
|
-
// @return {DS.Model} the record that was created or updated.
|
644
|
-
// */
|
645
|
-
// push: function(type, data, _partial) {
|
646
|
-
// var type = this.modelFor(type);
|
647
|
-
// var serializer = this.serializerFor(type.typeKey);
|
648
|
-
// console.log('serializer',serializer, serializer+'')
|
649
|
-
//// if (this.usingActiveModelSerializer()) {
|
650
|
-
//// var model = this.modelFor(modelName);
|
651
|
-
//// FactoryGuy.pushFixture(model, payload);
|
652
|
-
//// }
|
653
|
-
// this._super(type, data, _partial);
|
654
|
-
// },
|
655
635
|
|
656
636
|
/**
|
657
637
|
Adding a pushPayload for FixtureAdapter, but using the original with
|
@@ -714,27 +694,47 @@ DS.FixtureAdapter.reopen({
|
|
714
694
|
*/
|
715
695
|
createRecord: function (store, type, record) {
|
716
696
|
var promise = this._super(store, type, record);
|
717
|
-
|
718
697
|
promise.then(function () {
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
698
|
+
Em.RSVP.Promise.resolve(Ember.get(type, 'relationshipNames')).then(function (relationShips){
|
699
|
+
if (relationShips.belongsTo) {
|
700
|
+
relationShips.belongsTo.forEach(function (relationship) {
|
701
|
+
Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){
|
702
|
+
if (belongsToRecord) {
|
703
|
+
var hasManyName = store.findRelationshipName(
|
704
|
+
'hasMany',
|
705
|
+
belongsToRecord.constructor,
|
706
|
+
record
|
707
|
+
);
|
708
|
+
Ember.RSVP.resolve(belongsToRecord.get(hasManyName)).then (function(relationship){
|
709
|
+
relationship.addObject(record);
|
710
|
+
});
|
711
|
+
}
|
712
|
+
});
|
713
|
+
});
|
714
|
+
}
|
715
|
+
if (relationShips.hasMany) {
|
716
|
+
relationShips.hasMany.forEach(function (relationship) {
|
717
|
+
Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){
|
718
|
+
if (belongsToRecord && belongsToRecord.get('length') > 0) {
|
719
|
+
var hasManyName = store.findRelationshipName(
|
720
|
+
'hasMany',
|
721
|
+
belongsToRecord.constructor,
|
722
|
+
record
|
723
|
+
);
|
724
|
+
belongsToRecord.forEach(function (child){
|
725
|
+
child.get(hasManyName).addObject(record)
|
726
|
+
});
|
727
|
+
}
|
728
|
+
});
|
729
|
+
})
|
730
|
+
}
|
731
|
+
});
|
733
732
|
});
|
734
733
|
|
735
734
|
return promise;
|
736
735
|
}
|
737
736
|
})
|
737
|
+
|
738
738
|
FactoryGuyTestMixin = Em.Mixin.create({
|
739
739
|
|
740
740
|
// Pass in the app root, which typically is App.
|
@@ -770,6 +770,13 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
770
770
|
return this.getStore().find(type, id);
|
771
771
|
},
|
772
772
|
|
773
|
+
/**
|
774
|
+
Proxy to store's makeFixture method
|
775
|
+
|
776
|
+
@param {String} name name of fixture
|
777
|
+
@param {Object} options fixture options
|
778
|
+
@returns {Object|DS.Model} json or record depending on the adapter type
|
779
|
+
*/
|
773
780
|
make: function (name, opts) {
|
774
781
|
return this.getStore().makeFixture(name, opts);
|
775
782
|
},
|
@@ -811,9 +818,9 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
811
818
|
},
|
812
819
|
|
813
820
|
/**
|
814
|
-
Build the json used for creating record
|
821
|
+
Build the json used for creating or finding a record.
|
815
822
|
|
816
|
-
@param {String} name of the fixture ( or model ) to create
|
823
|
+
@param {String} name of the fixture ( or model ) to create/find
|
817
824
|
@param {Object} opts fixture options
|
818
825
|
*/
|
819
826
|
buildAjaxHttpResponse: function (name, opts) {
|
@@ -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(name,sequenceFn){if(sequenceFn){if(!sequences[name]){sequences[name]=new Sequence(sequenceFn)}}var sequence=sequences[name];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(nameOrFunction){var sortaRandomName=Math.floor((1+Math.random())*65536).toString(16)+Date.now();return function(){if(Em.typeOf(nameOrFunction)=="function"){return this.generate(sortaRandomName,nameOrFunction)}else{return this.generate(nameOrFunction)}}},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},usingActiveModelSerializer:function(){var adapter=this.adapterFor("application");console.log("adapter.defaultSerializer",adapter.defaultSerializer);return adapter.defaultSerializer=="active-model"},makeFixture:function(name,options){var store=this;var modelName=FactoryGuy.lookupModelForFixtureName(name);var fixture=FactoryGuy.build(name,options);var modelType=store.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();modelType=store.modelFor(modelName)}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){var belongsToName=self.findRelationshipName("belongsTo",child.constructor,model);if(relationship.options&&relationship.options.inverse){belongsToName=relationship.options.inverse}if(belongsToName){child.set(belongsToName,model)}})}if(relationship.kind=="belongsTo"){var belongsToRecord=model.get(name);if(belongsToRecord){var setAssociations=function(){var hasManyName=self.findRelationshipName("hasMany",belongsToRecord.constructor,model);if(hasManyName){belongsToRecord.get(hasManyName).addObject(model);return}var oneToOneName=self.findRelationshipName("belongsTo",belongsToRecord.constructor,model);if(oneToOneName&&!(belongsToRecord.constructor==model.constructor)){belongsToRecord.set(oneToOneName,model)}};if(belongsToRecord.then){belongsToRecord.then(function(record){belongsToRecord=record;setAssociations()})}else{setAssociations()}}}})},findRelationshipName:function(kind,belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind==kind&&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.findRelationshipName("hasMany",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},usingActiveModelSerializer:function(type){var store=this.getStore();var type=store.modelFor(type);var serializer=store.serializerFor(type.typeKey);return serializer instanceof DS.ActiveModelSerializer},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)},buildAjaxHttpResponse:function(name,opts){var fixture=FactoryGuy.build(name,opts);var modelName=FactoryGuy.lookupModelForFixtureName(name);if(this.usingActiveModelSerializer(modelName)){this.toSnakeCase(fixture)}var hash={};hash[modelName]=fixture;return hash},toSnakeCase:function(fixture){for(key in fixture){if(key!=Em.String.decamelize(key)){var value=fixture[key];delete fixture[key];fixture[Em.String.decamelize(key)]=value}}},handleFind:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var id=responseJson[modelName].id;var url="/"+Em.String.pluralize(modelName)+"/"+id;this.stubEndpointForHttpRequest(url,responseJson,{type:"GET",status:status||200});return responseJson},handleCreate:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var url="/"+Em.String.pluralize(modelName);this.stubEndpointForHttpRequest(url,responseJson,{type:"POST",status:status||200});return responseJson},handleUpdate:function(root,id,status){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"PUT",status:status||200})},handleDelete:function(root,id,status){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"DELETE",status:status||200})},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(name,sequenceFn){if(sequenceFn){if(!sequences[name]){sequences[name]=new Sequence(sequenceFn)}}var sequence=sequences[name];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(nameOrFunction){var sortaRandomName=Math.floor((1+Math.random())*65536).toString(16)+Date.now();return function(){if(Em.typeOf(nameOrFunction)=="function"){return this.generate(sortaRandomName,nameOrFunction)}else{return this.generate(nameOrFunction)}}},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 store=this;var modelName=FactoryGuy.lookupModelForFixtureName(name);var fixture=FactoryGuy.build(name,options);var modelType=store.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();modelType=store.modelFor(modelName)}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){var belongsToName=self.findRelationshipName("belongsTo",child.constructor,model);var hasManyName=self.findRelationshipName("hasMany",child.constructor,model);var inverseName=relationship.options&&relationship.options.inverse;if(belongsToName){child.set(belongsToName||inverseName,model)}else if(hasManyName){relation=child.get(hasManyName||inverseName)||[];relation.pushObject(model)}})}if(relationship.kind=="belongsTo"){var belongsToRecord=model.get(name);if(belongsToRecord){var setAssociations=function(){var hasManyName=self.findRelationshipName("hasMany",belongsToRecord.constructor,model);if(hasManyName){belongsToRecord.get(hasManyName).addObject(model);return}var oneToOneName=self.findRelationshipName("belongsTo",belongsToRecord.constructor,model);if(oneToOneName&&!(belongsToRecord.constructor==model.constructor)){belongsToRecord.set(oneToOneName,model)}};if(belongsToRecord.then){belongsToRecord.then(function(record){belongsToRecord=record;setAssociations()})}else{setAssociations()}}}})},findRelationshipName:function(kind,belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(name,relationship){if(relationship.kind==kind&&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(){Em.RSVP.Promise.resolve(Ember.get(type,"relationshipNames")).then(function(relationShips){if(relationShips.belongsTo){relationShips.belongsTo.forEach(function(relationship){Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){if(belongsToRecord){var hasManyName=store.findRelationshipName("hasMany",belongsToRecord.constructor,record);Ember.RSVP.resolve(belongsToRecord.get(hasManyName)).then(function(relationship){relationship.addObject(record)})}})})}if(relationShips.hasMany){relationShips.hasMany.forEach(function(relationship){Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){if(belongsToRecord&&belongsToRecord.get("length")>0){var hasManyName=store.findRelationshipName("hasMany",belongsToRecord.constructor,record);belongsToRecord.forEach(function(child){child.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},usingActiveModelSerializer:function(type){var store=this.getStore();var type=store.modelFor(type);var serializer=store.serializerFor(type.typeKey);return serializer instanceof DS.ActiveModelSerializer},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)},buildAjaxHttpResponse:function(name,opts){var fixture=FactoryGuy.build(name,opts);var modelName=FactoryGuy.lookupModelForFixtureName(name);if(this.usingActiveModelSerializer(modelName)){this.toSnakeCase(fixture)}var hash={};hash[modelName]=fixture;return hash},toSnakeCase:function(fixture){for(key in fixture){if(key!=Em.String.decamelize(key)){var value=fixture[key];delete fixture[key];fixture[Em.String.decamelize(key)]=value}}},handleFind:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var id=responseJson[modelName].id;var url="/"+Em.String.pluralize(modelName)+"/"+id;this.stubEndpointForHttpRequest(url,responseJson,{type:"GET",status:status||200});return responseJson},handleCreate:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var url="/"+Em.String.pluralize(modelName);this.stubEndpointForHttpRequest(url,responseJson,{type:"POST",status:status||200});return responseJson},handleUpdate:function(root,id,status){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"PUT",status:status||200})},handleDelete:function(root,id,status){this.stubEndpointForHttpRequest("/"+Em.String.pluralize(root)+"/"+id,{},{type:"DELETE",status:status||200})},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.4.
|
4
|
+
s.version = "0.4.2"
|
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
@@ -33,6 +33,13 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
33
33
|
return this.getStore().find(type, id);
|
34
34
|
},
|
35
35
|
|
36
|
+
/**
|
37
|
+
Proxy to store's makeFixture method
|
38
|
+
|
39
|
+
@param {String} name name of fixture
|
40
|
+
@param {Object} options fixture options
|
41
|
+
@returns {Object|DS.Model} json or record depending on the adapter type
|
42
|
+
*/
|
36
43
|
make: function (name, opts) {
|
37
44
|
return this.getStore().makeFixture(name, opts);
|
38
45
|
},
|
@@ -74,9 +81,9 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
74
81
|
},
|
75
82
|
|
76
83
|
/**
|
77
|
-
Build the json used for creating record
|
84
|
+
Build the json used for creating or finding a record.
|
78
85
|
|
79
|
-
@param {String} name of the fixture ( or model ) to create
|
86
|
+
@param {String} name of the fixture ( or model ) to create/find
|
80
87
|
@param {Object} opts fixture options
|
81
88
|
*/
|
82
89
|
buildAjaxHttpResponse: function (name, opts) {
|
data/src/store.js
CHANGED
@@ -7,12 +7,6 @@ DS.Store.reopen({
|
|
7
7
|
return adapter instanceof DS.FixtureAdapter;
|
8
8
|
},
|
9
9
|
|
10
|
-
usingActiveModelSerializer: function () {
|
11
|
-
var adapter = this.adapterFor('application');
|
12
|
-
console.log('adapter.defaultSerializer', adapter.defaultSerializer)
|
13
|
-
return adapter.defaultSerializer == 'active-model';
|
14
|
-
},
|
15
|
-
|
16
10
|
/**
|
17
11
|
Make new fixture and save to store. If the store is using FixtureAdapter,
|
18
12
|
will push to FIXTURE array, otherwise will use push method on adapter.
|
@@ -186,11 +180,17 @@ DS.Store.reopen({
|
|
186
180
|
child.constructor,
|
187
181
|
model
|
188
182
|
);
|
189
|
-
|
190
|
-
|
191
|
-
|
183
|
+
var hasManyName = self.findRelationshipName(
|
184
|
+
'hasMany',
|
185
|
+
child.constructor,
|
186
|
+
model
|
187
|
+
);
|
188
|
+
var inverseName = (relationship.options && relationship.options.inverse)
|
192
189
|
if (belongsToName) {
|
193
|
-
child.set(belongsToName, model);
|
190
|
+
child.set(belongsToName || inverseName, model);
|
191
|
+
} else if (hasManyName) {
|
192
|
+
relation = child.get(hasManyName || inverseName) || [];
|
193
|
+
relation.pushObject(model)
|
194
194
|
}
|
195
195
|
})
|
196
196
|
}
|
@@ -203,7 +203,7 @@ DS.Store.reopen({
|
|
203
203
|
'hasMany',
|
204
204
|
belongsToRecord.constructor,
|
205
205
|
model
|
206
|
-
)
|
206
|
+
);
|
207
207
|
if (hasManyName) {
|
208
208
|
belongsToRecord.get(hasManyName).addObject(model);
|
209
209
|
return;
|
@@ -212,7 +212,7 @@ DS.Store.reopen({
|
|
212
212
|
'belongsTo',
|
213
213
|
belongsToRecord.constructor,
|
214
214
|
model
|
215
|
-
)
|
215
|
+
);
|
216
216
|
// Guard against a situation where a model can belong to itself.
|
217
217
|
// Do not want to set the belongsTo on this case.
|
218
218
|
if (oneToOneName && !(belongsToRecord.constructor == model.constructor)) {
|
@@ -258,26 +258,6 @@ DS.Store.reopen({
|
|
258
258
|
return relationshipName;
|
259
259
|
},
|
260
260
|
|
261
|
-
// /**
|
262
|
-
// Adding the ability to check the serializer and convert the json before
|
263
|
-
// it's pushed. For the ActiveModelSerializer, the attributes should be snake case,
|
264
|
-
// for example.
|
265
|
-
//
|
266
|
-
// @method push
|
267
|
-
// @param {String or subclass of DS.Model} type
|
268
|
-
// @param {Object} data
|
269
|
-
// @return {DS.Model} the record that was created or updated.
|
270
|
-
// */
|
271
|
-
// push: function(type, data, _partial) {
|
272
|
-
// var type = this.modelFor(type);
|
273
|
-
// var serializer = this.serializerFor(type.typeKey);
|
274
|
-
// console.log('serializer',serializer, serializer+'')
|
275
|
-
//// if (this.usingActiveModelSerializer()) {
|
276
|
-
//// var model = this.modelFor(modelName);
|
277
|
-
//// FactoryGuy.pushFixture(model, payload);
|
278
|
-
//// }
|
279
|
-
// this._super(type, data, _partial);
|
280
|
-
// },
|
281
261
|
|
282
262
|
/**
|
283
263
|
Adding a pushPayload for FixtureAdapter, but using the original with
|
@@ -340,24 +320,43 @@ DS.FixtureAdapter.reopen({
|
|
340
320
|
*/
|
341
321
|
createRecord: function (store, type, record) {
|
342
322
|
var promise = this._super(store, type, record);
|
343
|
-
|
344
323
|
promise.then(function () {
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
324
|
+
Em.RSVP.Promise.resolve(Ember.get(type, 'relationshipNames')).then(function (relationShips){
|
325
|
+
if (relationShips.belongsTo) {
|
326
|
+
relationShips.belongsTo.forEach(function (relationship) {
|
327
|
+
Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){
|
328
|
+
if (belongsToRecord) {
|
329
|
+
var hasManyName = store.findRelationshipName(
|
330
|
+
'hasMany',
|
331
|
+
belongsToRecord.constructor,
|
332
|
+
record
|
333
|
+
);
|
334
|
+
Ember.RSVP.resolve(belongsToRecord.get(hasManyName)).then (function(relationship){
|
335
|
+
relationship.addObject(record);
|
336
|
+
});
|
337
|
+
}
|
338
|
+
});
|
339
|
+
});
|
340
|
+
}
|
341
|
+
if (relationShips.hasMany) {
|
342
|
+
relationShips.hasMany.forEach(function (relationship) {
|
343
|
+
Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){
|
344
|
+
if (belongsToRecord && belongsToRecord.get('length') > 0) {
|
345
|
+
var hasManyName = store.findRelationshipName(
|
346
|
+
'hasMany',
|
347
|
+
belongsToRecord.constructor,
|
348
|
+
record
|
349
|
+
);
|
350
|
+
belongsToRecord.forEach(function (child){
|
351
|
+
child.get(hasManyName).addObject(record)
|
352
|
+
});
|
353
|
+
}
|
354
|
+
});
|
355
|
+
})
|
356
|
+
}
|
357
|
+
});
|
359
358
|
});
|
360
359
|
|
361
360
|
return promise;
|
362
361
|
}
|
363
|
-
})
|
362
|
+
})
|
@@ -134,6 +134,18 @@ test("when belongTo parent is assigned, parent adds to polymorphic hasMany recor
|
|
134
134
|
});
|
135
135
|
|
136
136
|
|
137
|
+
asyncTest("when async hasMany relationship is assigned, model relationship is synced on both sides", function() {
|
138
|
+
var property = store.makeFixture('property');
|
139
|
+
var user1 = store.makeFixture('user', {properties: [property]});
|
140
|
+
var user2 = store.makeFixture('user', {properties: [property]});
|
141
|
+
|
142
|
+
equal(property.get('owners.length'), 2);
|
143
|
+
deepEqual(property.get('owners.firstObject').toJSON(), user1.toJSON());
|
144
|
+
deepEqual(property.get('owners.lastObject').toJSON(), user2.toJSON());
|
145
|
+
start();
|
146
|
+
});
|
147
|
+
|
148
|
+
|
137
149
|
asyncTest("when async belongsTo parent is assigned, parent adds to hasMany records", function() {
|
138
150
|
var company = store.makeFixture('company');
|
139
151
|
var user1 = store.makeFixture('user', {company: company});
|
@@ -178,13 +190,13 @@ test("when belongTo parent is assigned, parent adds to belongsTo record", functi
|
|
178
190
|
test("belongsTo associations defined as attributes in fixture", function() {
|
179
191
|
var project = store.makeFixture('project_with_user');
|
180
192
|
equal(project.get('user') instanceof User, true)
|
181
|
-
deepEqual(project.get('user').toJSON(),{name: 'User1', company: null})
|
193
|
+
deepEqual(project.get('user').toJSON(),{name: 'User1', company: null, properties: []})
|
182
194
|
|
183
195
|
var project = store.makeFixture('project_with_dude');
|
184
|
-
deepEqual(project.get('user').toJSON(),{name: 'Dude', company: null})
|
196
|
+
deepEqual(project.get('user').toJSON(),{name: 'Dude', company: null, properties: []})
|
185
197
|
|
186
198
|
var project = store.makeFixture('project_with_admin');
|
187
|
-
deepEqual(project.get('user').toJSON(),{name: 'Admin', company: null})
|
199
|
+
deepEqual(project.get('user').toJSON(),{name: 'Admin', company: null, properties: []})
|
188
200
|
});
|
189
201
|
|
190
202
|
|
@@ -227,7 +239,7 @@ module('DS.Store with ActiveModelAdapter', {
|
|
227
239
|
});
|
228
240
|
|
229
241
|
|
230
|
-
asyncTest("#createRecord with mockjax handles model's camelCase attributes", function() {
|
242
|
+
asyncTest("#createRecord (with mockjax) handles model's camelCase attributes", function() {
|
231
243
|
testHelper.handleCreate('profile', {camelCaseDescription: 'description'})
|
232
244
|
|
233
245
|
store.createRecord('profile').save().then(function(profile) {
|
@@ -237,7 +249,7 @@ asyncTest("#createRecord with mockjax handles model's camelCase attributes", fun
|
|
237
249
|
});
|
238
250
|
|
239
251
|
|
240
|
-
asyncTest("#find with
|
252
|
+
asyncTest("#find (with mockajax) handles model's camelCase attributes", function() {
|
241
253
|
var responseJson = testHelper.handleFind('profile', {camelCaseDescription: 'description'})
|
242
254
|
var id = responseJson.profile.id
|
243
255
|
|
@@ -138,9 +138,32 @@ asyncTest("#createRecord adds belongsTo association to records it hasMany of", f
|
|
138
138
|
var projectJson = {title:'project', user: user};
|
139
139
|
|
140
140
|
store.createRecord('project', projectJson).save()
|
141
|
-
.then( function() {
|
142
|
-
|
141
|
+
.then( function(project) {
|
142
|
+
return Ember.RSVP.all([project.get('user'), user.get('projects')]);
|
143
|
+
}).then( function(promises) {
|
144
|
+
var projectUser = promises[0], projects = promises[1];
|
145
|
+
equal(projectUser.get('id'), user.get('id'));
|
146
|
+
equal(projects.get('length'), 1);
|
143
147
|
start();
|
144
148
|
});
|
145
149
|
})
|
146
150
|
})
|
151
|
+
|
152
|
+
asyncTest("#createRecord adds hasMany association to records it hasMany of ", function() {
|
153
|
+
var usersJson = store.makeList('user', 3);
|
154
|
+
|
155
|
+
Em.RSVP.all([store.find('user', usersJson[0].id),store.find('user', usersJson[1].id),store.find('user', usersJson[2].id)]).then(function(users) {
|
156
|
+
|
157
|
+
var propertyJson = {name:'beach front property'};
|
158
|
+
|
159
|
+
property = store.createRecord('property', propertyJson);
|
160
|
+
property.get('owners').then(function(owners){
|
161
|
+
owners.addObjects(users);
|
162
|
+
}).then( function() {
|
163
|
+
return property.get('owners');
|
164
|
+
}).then( function(users) {
|
165
|
+
equal(users.get('length'), usersJson.length);
|
166
|
+
start();
|
167
|
+
});
|
168
|
+
})
|
169
|
+
})
|
@@ -129,10 +129,22 @@ test("when belongTo parent is assigned, parent adds to polymorphic hasMany recor
|
|
129
129
|
});
|
130
130
|
|
131
131
|
|
132
|
+
asyncTest("when async hasMany relationship is assigned, model relationship is synced on both sides", function() {
|
133
|
+
var property = store.makeFixture('property');
|
134
|
+
var user1 = store.makeFixture('user', {properties: [property]});
|
135
|
+
var user2 = store.makeFixture('user', {properties: [property]});
|
136
|
+
|
137
|
+
equal(property.get('owners.length'), 2);
|
138
|
+
deepEqual(property.get('owners.firstObject').toJSON(), user1.toJSON());
|
139
|
+
deepEqual(property.get('owners.lastObject').toJSON(), user2.toJSON());
|
140
|
+
start();
|
141
|
+
});
|
142
|
+
|
143
|
+
|
132
144
|
asyncTest("when async belongsTo parent is assigned, parent adds to hasMany records", function() {
|
133
|
-
var
|
134
|
-
var
|
135
|
-
var
|
145
|
+
var user1 = store.makeFixture('user');
|
146
|
+
var user2 = store.makeFixture('user');
|
147
|
+
var company = store.makeFixture('company', {users: [user1, user2]});
|
136
148
|
|
137
149
|
equal(company.get('users.length'), 2);
|
138
150
|
deepEqual(company.get('users.firstObject').toJSON(), user1.toJSON());
|
@@ -173,13 +185,13 @@ test("when belongTo parent is assigned, parent adds to belongsTo record", functi
|
|
173
185
|
test("belongsTo associations defined as attributes in fixture", function() {
|
174
186
|
var project = store.makeFixture('project_with_user');
|
175
187
|
equal(project.get('user') instanceof User, true)
|
176
|
-
deepEqual(project.get('user').toJSON(),{name: 'User1', company: null})
|
188
|
+
deepEqual(project.get('user').toJSON(),{name: 'User1', company: null, properties: []})
|
177
189
|
|
178
190
|
var project = store.makeFixture('project_with_dude');
|
179
|
-
deepEqual(project.get('user').toJSON(),{name: 'Dude', company: null})
|
191
|
+
deepEqual(project.get('user').toJSON(),{name: 'Dude', company: null, properties: []})
|
180
192
|
|
181
193
|
var project = store.makeFixture('project_with_admin');
|
182
|
-
deepEqual(project.get('user').toJSON(),{name: 'Admin', company: null})
|
194
|
+
deepEqual(project.get('user').toJSON(),{name: 'Admin', company: null, properties: []})
|
183
195
|
});
|
184
196
|
|
185
197
|
|
@@ -1,7 +1,8 @@
|
|
1
1
|
User = DS.Model.extend({
|
2
2
|
name: DS.attr('string'),
|
3
|
-
company: DS.belongsTo('company', {async: true}),
|
4
|
-
|
3
|
+
company: DS.belongsTo('company', {async: true, inverse: 'users'}),
|
4
|
+
properties: DS.hasMany('property', {async: true, inverse: 'owners'}),
|
5
|
+
projects: DS.hasMany('project'),
|
5
6
|
hats: DS.hasMany('hat', {polymorphic: true})
|
6
7
|
});
|
7
8
|
|
@@ -18,6 +18,7 @@ TestHelper = Ember.Object.createWithMixins(FactoryGuyTestMixin,{
|
|
18
18
|
container.register("model:user", User);
|
19
19
|
container.register("model:profile", Profile);
|
20
20
|
container.register("model:company", Company);
|
21
|
+
container.register("model:property", Property);
|
21
22
|
container.register("model:project", Project);
|
22
23
|
container.register("store:main", DS.Store.extend({adapter: adapter}));
|
23
24
|
if (adapter == DS.ActiveModelAdapter) {
|
data/tests/test_setup.js
CHANGED
@@ -45,6 +45,11 @@ FactoryGuy.define('project', {
|
|
45
45
|
user: FactoryGuy.association('admin')
|
46
46
|
}
|
47
47
|
});
|
48
|
+
FactoryGuy.define('property', {
|
49
|
+
default: {
|
50
|
+
name: 'Silly property'
|
51
|
+
}
|
52
|
+
})
|
48
53
|
FactoryGuy.define('user', {
|
49
54
|
// default values for 'user' attributes
|
50
55
|
default: {
|
@@ -58,7 +63,7 @@ FactoryGuy.define('user', {
|
|
58
63
|
Company = DS.Model.extend({
|
59
64
|
name: DS.attr('string'),
|
60
65
|
profile: DS.belongsTo('profile'),
|
61
|
-
users: DS.hasMany('user', {async: true})
|
66
|
+
users: DS.hasMany('user', {async: true, inverse: 'company'})
|
62
67
|
});
|
63
68
|
|
64
69
|
Hat = DS.Model.extend({
|
@@ -94,10 +99,16 @@ Project = DS.Model.extend({
|
|
94
99
|
children: DS.hasMany('project', {inverse: 'parent'})
|
95
100
|
});
|
96
101
|
|
97
|
-
|
102
|
+
Property = DS.Model.extend({
|
98
103
|
name: DS.attr('string'),
|
99
104
|
company: DS.belongsTo('company', {async: true}),
|
100
|
-
|
105
|
+
owners: DS.hasMany('user', {async: true, inverse: 'properties'})
|
106
|
+
});
|
107
|
+
User = DS.Model.extend({
|
108
|
+
name: DS.attr('string'),
|
109
|
+
company: DS.belongsTo('company', {async: true, inverse: 'users'}),
|
110
|
+
properties: DS.hasMany('property', {async: true, inverse: 'owners'}),
|
111
|
+
projects: DS.hasMany('project'),
|
101
112
|
hats: DS.hasMany('hat', {polymorphic: true})
|
102
113
|
});
|
103
114
|
|
@@ -381,12 +381,6 @@ DS.Store.reopen({
|
|
381
381
|
return adapter instanceof DS.FixtureAdapter;
|
382
382
|
},
|
383
383
|
|
384
|
-
usingActiveModelSerializer: function () {
|
385
|
-
var adapter = this.adapterFor('application');
|
386
|
-
console.log('adapter.defaultSerializer', adapter.defaultSerializer)
|
387
|
-
return adapter.defaultSerializer == 'active-model';
|
388
|
-
},
|
389
|
-
|
390
384
|
/**
|
391
385
|
Make new fixture and save to store. If the store is using FixtureAdapter,
|
392
386
|
will push to FIXTURE array, otherwise will use push method on adapter.
|
@@ -560,11 +554,17 @@ DS.Store.reopen({
|
|
560
554
|
child.constructor,
|
561
555
|
model
|
562
556
|
);
|
563
|
-
|
564
|
-
|
565
|
-
|
557
|
+
var hasManyName = self.findRelationshipName(
|
558
|
+
'hasMany',
|
559
|
+
child.constructor,
|
560
|
+
model
|
561
|
+
);
|
562
|
+
var inverseName = (relationship.options && relationship.options.inverse)
|
566
563
|
if (belongsToName) {
|
567
|
-
child.set(belongsToName, model);
|
564
|
+
child.set(belongsToName || inverseName, model);
|
565
|
+
} else if (hasManyName) {
|
566
|
+
relation = child.get(hasManyName || inverseName) || [];
|
567
|
+
relation.pushObject(model)
|
568
568
|
}
|
569
569
|
})
|
570
570
|
}
|
@@ -577,7 +577,7 @@ DS.Store.reopen({
|
|
577
577
|
'hasMany',
|
578
578
|
belongsToRecord.constructor,
|
579
579
|
model
|
580
|
-
)
|
580
|
+
);
|
581
581
|
if (hasManyName) {
|
582
582
|
belongsToRecord.get(hasManyName).addObject(model);
|
583
583
|
return;
|
@@ -586,7 +586,7 @@ DS.Store.reopen({
|
|
586
586
|
'belongsTo',
|
587
587
|
belongsToRecord.constructor,
|
588
588
|
model
|
589
|
-
)
|
589
|
+
);
|
590
590
|
// Guard against a situation where a model can belong to itself.
|
591
591
|
// Do not want to set the belongsTo on this case.
|
592
592
|
if (oneToOneName && !(belongsToRecord.constructor == model.constructor)) {
|
@@ -632,26 +632,6 @@ DS.Store.reopen({
|
|
632
632
|
return relationshipName;
|
633
633
|
},
|
634
634
|
|
635
|
-
// /**
|
636
|
-
// Adding the ability to check the serializer and convert the json before
|
637
|
-
// it's pushed. For the ActiveModelSerializer, the attributes should be snake case,
|
638
|
-
// for example.
|
639
|
-
//
|
640
|
-
// @method push
|
641
|
-
// @param {String or subclass of DS.Model} type
|
642
|
-
// @param {Object} data
|
643
|
-
// @return {DS.Model} the record that was created or updated.
|
644
|
-
// */
|
645
|
-
// push: function(type, data, _partial) {
|
646
|
-
// var type = this.modelFor(type);
|
647
|
-
// var serializer = this.serializerFor(type.typeKey);
|
648
|
-
// console.log('serializer',serializer, serializer+'')
|
649
|
-
//// if (this.usingActiveModelSerializer()) {
|
650
|
-
//// var model = this.modelFor(modelName);
|
651
|
-
//// FactoryGuy.pushFixture(model, payload);
|
652
|
-
//// }
|
653
|
-
// this._super(type, data, _partial);
|
654
|
-
// },
|
655
635
|
|
656
636
|
/**
|
657
637
|
Adding a pushPayload for FixtureAdapter, but using the original with
|
@@ -714,27 +694,47 @@ DS.FixtureAdapter.reopen({
|
|
714
694
|
*/
|
715
695
|
createRecord: function (store, type, record) {
|
716
696
|
var promise = this._super(store, type, record);
|
717
|
-
|
718
697
|
promise.then(function () {
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
698
|
+
Em.RSVP.Promise.resolve(Ember.get(type, 'relationshipNames')).then(function (relationShips){
|
699
|
+
if (relationShips.belongsTo) {
|
700
|
+
relationShips.belongsTo.forEach(function (relationship) {
|
701
|
+
Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){
|
702
|
+
if (belongsToRecord) {
|
703
|
+
var hasManyName = store.findRelationshipName(
|
704
|
+
'hasMany',
|
705
|
+
belongsToRecord.constructor,
|
706
|
+
record
|
707
|
+
);
|
708
|
+
Ember.RSVP.resolve(belongsToRecord.get(hasManyName)).then (function(relationship){
|
709
|
+
relationship.addObject(record);
|
710
|
+
});
|
711
|
+
}
|
712
|
+
});
|
713
|
+
});
|
714
|
+
}
|
715
|
+
if (relationShips.hasMany) {
|
716
|
+
relationShips.hasMany.forEach(function (relationship) {
|
717
|
+
Em.RSVP.Promise.resolve(record.get(relationship)).then(function(belongsToRecord){
|
718
|
+
if (belongsToRecord && belongsToRecord.get('length') > 0) {
|
719
|
+
var hasManyName = store.findRelationshipName(
|
720
|
+
'hasMany',
|
721
|
+
belongsToRecord.constructor,
|
722
|
+
record
|
723
|
+
);
|
724
|
+
belongsToRecord.forEach(function (child){
|
725
|
+
child.get(hasManyName).addObject(record)
|
726
|
+
});
|
727
|
+
}
|
728
|
+
});
|
729
|
+
})
|
730
|
+
}
|
731
|
+
});
|
733
732
|
});
|
734
733
|
|
735
734
|
return promise;
|
736
735
|
}
|
737
736
|
})
|
737
|
+
|
738
738
|
FactoryGuyTestMixin = Em.Mixin.create({
|
739
739
|
|
740
740
|
// Pass in the app root, which typically is App.
|
@@ -770,6 +770,13 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
770
770
|
return this.getStore().find(type, id);
|
771
771
|
},
|
772
772
|
|
773
|
+
/**
|
774
|
+
Proxy to store's makeFixture method
|
775
|
+
|
776
|
+
@param {String} name name of fixture
|
777
|
+
@param {Object} options fixture options
|
778
|
+
@returns {Object|DS.Model} json or record depending on the adapter type
|
779
|
+
*/
|
773
780
|
make: function (name, opts) {
|
774
781
|
return this.getStore().makeFixture(name, opts);
|
775
782
|
},
|
@@ -811,9 +818,9 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
811
818
|
},
|
812
819
|
|
813
820
|
/**
|
814
|
-
Build the json used for creating record
|
821
|
+
Build the json used for creating or finding a record.
|
815
822
|
|
816
|
-
@param {String} name of the fixture ( or model ) to create
|
823
|
+
@param {String} name of the fixture ( or model ) to create/find
|
817
824
|
@param {Object} opts fixture options
|
818
825
|
*/
|
819
826
|
buildAjaxHttpResponse: function (name, opts) {
|
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.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Sudol
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-07-
|
12
|
+
date: 2014-07-16 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Easily create Fixtures for Ember Data
|
15
15
|
email:
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- tests/support/factories/material_factory.js
|
48
48
|
- tests/support/factories/profile_factory.js
|
49
49
|
- tests/support/factories/project_factory.js
|
50
|
+
- tests/support/factories/property_factory.js
|
50
51
|
- tests/support/factories/user_factory.js
|
51
52
|
- tests/support/libs/mockjax.js
|
52
53
|
- tests/support/libs/sinon.js
|
@@ -55,6 +56,7 @@ files:
|
|
55
56
|
- tests/support/models/material.js
|
56
57
|
- tests/support/models/profile.js
|
57
58
|
- tests/support/models/project.js
|
59
|
+
- tests/support/models/property.js
|
58
60
|
- tests/support/models/user.js
|
59
61
|
- tests/support/test_helper.js
|
60
62
|
- tests/test_setup.js
|