ember-data-factory-guy 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +30 -11
- data/bower.json +1 -1
- data/dist/amd/factory-guy.js +103 -56
- data/dist/ember-data-factory-guy.js +103 -56
- 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.js +46 -12
- data/src/factory_guy_test_mixin.js +35 -6
- data/src/store.js +20 -36
- data/tests/active_model_adapter_factory_test.js +17 -5
- data/tests/factory_guy_test.js +0 -1
- data/tests/factory_guy_test_mixin_test.js +16 -0
- data/tests/rest_adapter_factory_test.js +20 -12
- data/vendor/assets/javascripts/ember_data_factory_guy.js +103 -56
- metadata +2 -2
@@ -1 +1 @@
|
|
1
|
-
var Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};var MissingSequenceError=function(message){this.toString=function(){return message}};if(FactoryGuy!==undefined){FactoryGuy.sequence=Sequence;FactoryGuy.missingSequenceError=MissingSequenceError}var ModelDefinition=function(model,config){var sequences={};var traits={};var defaultAttributes={};var namedModels={};var modelId=1;var sequenceName=null;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.nextId=function(){return modelId++};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,traitArgs){var traitsObj={};traitArgs.forEach(function(trait){$.extend(traitsObj,traits[trait])});var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,traitsObj,opts);for(var attribute in fixture){if(Ember.typeOf(fixture[attribute])=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}else if(Ember.typeOf(fixture[attribute])=="object"){if(FactoryGuy.getStore()){if(FactoryGuy.isAttributeRelationship(this.model,attribute)){fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}else{fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}}if(!fixture.id){fixture.id=this.nextId()}return fixture};this.buildList=function(name,number,traits,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts,traits))}return arr};this.reset=function(){modelId=1;for(var name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseTraits=function(object){if(!object){return}traits=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(Ember.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;parseTraits(config.traits);delete config.traits;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};if(FactoryGuy!==undefined){FactoryGuy.modelDefiniton=ModelDefinition}var FactoryGuy={modelDefinitions:{},define:function(model,config){if(this.modelDefinitions[model]){this.modelDefinitions[model].merge(config)}else{this.modelDefinitions[model]=new ModelDefinition(model,config)}},setStore:function(store){Ember.assert("FactoryGuy#setStore needs a valid store instance.You passed in ["+store+"]",store instanceof DS.Store);this.store=store},getStore:function(){return this.store},isAttributeRelationship:function(typeName,attribute){if(!this.store){console.log("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures");return true}var model=this.store.modelFor(typeName);return!!model.typeForRelationship(attribute)},make:function(){Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures",this.store);return this.store.makeFixture.apply(this.store,arguments)},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)}}},belongsTo:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},association:function(fixtureName,opts){console.log("DEPRECATION Warning: use FactoryGuy.belongsTo instead");return this.belongsTo(fixtureName,opts)},hasMany:function(fixtureName,number,opts){return function(){return FactoryGuy.buildList(fixtureName,number,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName:function(name){for(var model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(){var args=Array.prototype.slice.call(arguments);var opts={};var name=args.shift();if(!name){throw new Error("Build needs a factory name to build")}if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts,traits)},buildList:function(){var args=Array.prototype.slice.call(arguments);var name=args.shift();var number=args.shift();if(!name||!number){throw new Error("buildList needs a name and a number ( at least ) to build with")}var opts={};if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,traits,opts)},resetModels:function(store){for(var 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){console.log("resetModels",e)}}},pushFixture:function(modelClass,fixture){var index;if(!modelClass.FIXTURES){modelClass.FIXTURES=[]}index=this.indexOfFixture(modelClass.FIXTURES,fixture);if(index>-1){modelClass.FIXTURES.splice(index,1)}modelClass.FIXTURES.push(fixture);return fixture},indexOfFixture:function(fixtures,fixture){var index=-1,id=fixture.id+"";Ember.A(fixtures).find(function(r,i){if(""+Ember.get(r,"id")===id){index=i;return true}else{return false}});return index},clear:function(opts){if(!opts){this.modelDefinitions={}}}};(function(){DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(){var store=this;var fixture=FactoryGuy.build.apply(FactoryGuy,arguments);var name=arguments[0];var modelName=FactoryGuy.lookupModelForFixtureName(name);var modelType=store.modelFor(modelName);if(this.usingFixtureAdapter()){this.setAssociationsForFixtureAdapter(modelType,modelName,fixture);return FactoryGuy.pushFixture(modelType,fixture)}else{return store.makeModel(modelType,fixture)}},makeModel:function(modelType,fixture){var store=this,modelName=store.modelFor(modelType).typeKey,model;Em.run(function(){store.findEmbeddedAssociationsForRESTAdapter(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(){var arr=[];var number=arguments[1];for(var i=0;i<number;i++){arr.push(this.makeFixture.apply(this,arguments))}return arr},setAssociationsForFixtureAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="hasMany"){var hasManyRelation=fixture[relationship.key];if(hasManyRelation){$.each(fixture[relationship.key],function(index,object){var id=object;if(Ember.typeOf(object)=="object"){id=object.id;hasManyRelation[index]=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)}}})},findEmbeddedAssociationsForRESTAdapter:function(modelType,fixture){var store=this;Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(Ember.typeOf(belongsToRecord)=="object"){store.findEmbeddedAssociationsForRESTAdapter(relationship.type,belongsToRecord);belongsToRecord=store.push(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord}}if(relationship.kind=="hasMany"){var hasManyRecords=fixture[relationship.key];if(Ember.typeOf(hasManyRecords)=="array"){if(Ember.typeOf(hasManyRecords[0])=="object"){var records=Em.A();hasManyRecords.map(function(object){store.findEmbeddedAssociationsForRESTAdapter(relationship.type,object);var record=store.push(relationship.type,object);records.push(record);return record});fixture[relationship.key]=records}}}})},setAssociationsForRESTAdapter:function(modelType,modelName,model){var self=this;Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="hasMany"){var children=model.get(name)||[];children.forEach(function(child){var belongsToName=self.findRelationshipName("belongsTo",child.constructor,model);if(belongsToName){child.set(belongsToName,model)}})}})},findRelationshipName:function(kind,belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(relationship,name){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(relationship,name){if(relationship.kind=="hasMany"&&childModelType==relationship.type){relationshipName=relationship.key}});return relationshipName},pushPayload:function(type,payload){if(this.usingFixtureAdapter()){var model=this.modelFor(type);FactoryGuy.pushFixture(model,payload)}else{this._super(type,payload)}}})})();var FactoryGuyTestMixin=Em.Mixin.create({setup:function(app){this.set("container",app.__container__);FactoryGuy.setStore(this.getStore());return this},useFixtureAdapter:function(app){app.ApplicationAdapter=DS.FixtureAdapter;this.getStore().adapterFor("application").simulateRemoteResponse=false},usingActiveModelSerializer:function(type){var store=this.getStore();var modelType=store.modelFor(type);var serializer=store.serializerFor(modelType.typeKey);return serializer instanceof DS.ActiveModelSerializer},find:function(type,id){return this.getStore().find(type,id)},make:function(){var store=this.getStore();return store.makeFixture.apply(store,arguments)},getStore:function(){return this.get("container").lookup("store:main")},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)},buildURL:function(typeName,id){var type=this.getStore().modelFor(typeName);return this.getStore().adapterFor(type).buildURL(type.typeKey,id)},handleFindMany:function(){var store=this.getStore();store.makeList.apply(store,arguments);var name=arguments[0];var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson={};responseJson[modelName]=[];var url=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson,{type:"GET"})},handleCreate:function(modelName,options){var opts=options===undefined?{}:options;var succeed=opts.succeed===undefined?true:opts.succeed;var match=opts.match||{};var returnArgs=opts.returns||{};var url=this.buildURL(modelName);var definition=FactoryGuy.modelDefinitions[modelName];var httpOptions={type:"POST"};if(opts.match){var expectedRequest={};var record=this.getStore().createRecord(modelName,match);expectedRequest[modelName]=record.serialize();httpOptions.data=JSON.stringify(expectedRequest)}var modelType=this.getStore().modelFor(modelName);var responseJson={};if(succeed){responseJson[modelName]=$.extend({id:definition.nextId()},match,returnArgs);Ember.get(modelType,"relationshipsByName").forEach(function(relationship){if(relationship.kind=="belongsTo"){delete responseJson[modelName][relationship.key]}})}else{httpOptions.status=500}this.stubEndpointForHttpRequest(url,responseJson,httpOptions)},handleUpdate:function(){var args=Array.prototype.slice.call(arguments);Ember.assert("To handleUpdate pass in a model instance or a type and an id",args.length>0);var succeed=true;if(typeof args[args.length-1]=="boolean"){args.pop();succeed=false}Ember.assert("To handleUpdate pass in a model instance or a type and an id",args.length>0);var type,id;if(args[0]instanceof DS.Model){var model=args[0];type=model.constructor.typeKey;id=model.id}else if(typeof args[0]=="string"&&typeof parseInt(args[1])=="number"){type=args[0];id=args[1]}Ember.assert("To handleUpdate pass in a model instance or a type and an id",type&&id);this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"PUT",status:succeed?200:500})},handleDelete:function(type,id,succeed){succeed=succeed===undefined?true:succeed;this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"DELETE",status:succeed?200:500})},teardown:function(){FactoryGuy.resetModels(this.getStore());$.mockjax.clear()}});if(FactoryGuy!==undefined){FactoryGuy.testMixin=FactoryGuyTestMixin}
|
1
|
+
var Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};var MissingSequenceError=function(message){this.toString=function(){return message}};if(FactoryGuy!==undefined){FactoryGuy.sequence=Sequence;FactoryGuy.missingSequenceError=MissingSequenceError}var ModelDefinition=function(model,config){var sequences={};var traits={};var defaultAttributes={};var namedModels={};var modelId=1;var sequenceName=null;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.nextId=function(){return modelId++};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,traitArgs){var traitsObj={};traitArgs.forEach(function(trait){$.extend(traitsObj,traits[trait])});var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,traitsObj,opts);for(var attribute in fixture){if(Ember.typeOf(fixture[attribute])=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}else if(Ember.typeOf(fixture[attribute])=="object"){if(FactoryGuy.getStore()){if(FactoryGuy.isAttributeRelationship(this.model,attribute)){fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}else{fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}}if(!fixture.id){fixture.id=this.nextId()}return fixture};this.buildList=function(name,number,traits,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts,traits))}return arr};this.reset=function(){modelId=1;for(var name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseTraits=function(object){if(!object){return}traits=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(Ember.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;parseTraits(config.traits);delete config.traits;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};if(FactoryGuy!==undefined){FactoryGuy.modelDefiniton=ModelDefinition}var FactoryGuy={modelDefinitions:{},define:function(model,config){if(this.modelDefinitions[model]){this.modelDefinitions[model].merge(config)}else{this.modelDefinitions[model]=new ModelDefinition(model,config)}},setStore:function(store){Ember.assert("FactoryGuy#setStore needs a valid store instance.You passed in ["+store+"]",store instanceof DS.Store);this.store=store},getStore:function(){return this.store},isAttributeRelationship:function(typeName,attribute){if(!this.store){Ember.debug("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures");return true}var model=this.store.modelFor(typeName);return!!model.typeForRelationship(attribute)},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)}}},belongsTo:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},association:function(fixtureName,opts){Ember.deprecate("DEPRECATION Warning: use FactoryGuy.belongsTo instead");return this.belongsTo(fixtureName,opts)},hasMany:function(fixtureName,number,opts){return function(){return FactoryGuy.buildList(fixtureName,number,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName:function(name){for(var model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(){var args=Array.prototype.slice.call(arguments);var opts={};var name=args.shift();if(!name){throw new Error("Build needs a factory name to build")}if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts,traits)},buildList:function(){var args=Array.prototype.slice.call(arguments);var name=args.shift();var number=args.shift();if(!name||!number){throw new Error("buildList needs a name and a number ( at least ) to build with")}var opts={};if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,traits,opts)},make:function(){var store=this.store;Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures",store);var fixture=this.build.apply(this,arguments);var name=arguments[0];var modelName=this.lookupModelForFixtureName(name);var modelType=store.modelFor(modelName);if(store.usingFixtureAdapter()){store.setAssociationsForFixtureAdapter(modelType,modelName,fixture);return this.pushFixture(modelType,fixture)}else{return store.makeModel(modelType,fixture)}},makeList:function(){Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures",this.store);var arr=[];var args=Array.prototype.slice.call(arguments);Ember.assert("makeList needs at least 2 arguments, a name and a number",args.length>=2);var number=args.splice(1,1)[0];Ember.assert("Second argument to makeList should be a number (of fixtures to make.)",typeof number=="number");for(var i=0;i<number;i++){arr.push(this.make.apply(this,args))}return arr},resetModels:function(store){for(var 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){console.log("resetModels",e)}}},pushFixture:function(modelClass,fixture){var index;if(!modelClass.FIXTURES){modelClass.FIXTURES=[]}index=this.indexOfFixture(modelClass.FIXTURES,fixture);if(index>-1){modelClass.FIXTURES.splice(index,1)}modelClass.FIXTURES.push(fixture);return fixture},indexOfFixture:function(fixtures,fixture){var index=-1,id=fixture.id+"";Ember.A(fixtures).find(function(r,i){if(""+Ember.get(r,"id")===id){index=i;return true}else{return false}});return index},clear:function(opts){if(!opts){this.modelDefinitions={}}}};(function(){DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(){Ember.deprecate("DEPRECATION Warning: use FactoryGuy.make instead");FactoryGuy.make.call(FactoryGuy,arguments)},makeList:function(){Ember.deprecate("DEPRECATION Warning: use FactoryGuy.makeList instead");FactoryGuy.makeList.call(FactoryGuy,arguments)},makeModel:function(modelType,fixture){var store=this,modelName=store.modelFor(modelType).typeKey,model;Em.run(function(){store.findEmbeddedAssociationsForRESTAdapter(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},setAssociationsForFixtureAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="hasMany"){var hasManyRelation=fixture[relationship.key];if(hasManyRelation){$.each(fixture[relationship.key],function(index,object){var id=object;if(Ember.typeOf(object)=="object"){id=object.id;hasManyRelation[index]=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)}}})},findEmbeddedAssociationsForRESTAdapter:function(modelType,fixture){var store=this;Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(Ember.typeOf(belongsToRecord)=="object"){store.findEmbeddedAssociationsForRESTAdapter(relationship.type,belongsToRecord);belongsToRecord=store.push(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord}}if(relationship.kind=="hasMany"){var hasManyRecords=fixture[relationship.key];if(Ember.typeOf(hasManyRecords)=="array"){if(Ember.typeOf(hasManyRecords[0])=="object"){var records=Em.A();hasManyRecords.map(function(object){store.findEmbeddedAssociationsForRESTAdapter(relationship.type,object);var record=store.push(relationship.type,object);records.push(record);return record});fixture[relationship.key]=records}}}})},setAssociationsForRESTAdapter:function(modelType,modelName,model){var self=this;Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="hasMany"){var children=model.get(name)||[];children.forEach(function(child){var belongsToName=self.findRelationshipName("belongsTo",child.constructor,model);if(belongsToName){child.set(belongsToName,model)}})}})},findRelationshipName:function(kind,belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(relationship,name){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(relationship,name){if(relationship.kind=="hasMany"&&childModelType==relationship.type){relationshipName=relationship.key}});return relationshipName},pushPayload:function(type,payload){if(this.usingFixtureAdapter()){var model=this.modelFor(type);FactoryGuy.pushFixture(model,payload)}else{this._super(type,payload)}}})})();var FactoryGuyTestMixin=Em.Mixin.create({setup:function(app){this.set("container",app.__container__);FactoryGuy.setStore(this.getStore());return this},useFixtureAdapter:function(app){app.ApplicationAdapter=DS.FixtureAdapter;this.getStore().adapterFor("application").simulateRemoteResponse=false},usingActiveModelSerializer:function(type){var store=this.getStore();var modelType=store.modelFor(type);var serializer=store.serializerFor(modelType.typeKey);return serializer instanceof DS.ActiveModelSerializer},find:function(type,id){return this.getStore().find(type,id)},make:function(){return FactoryGuy.make.apply(FactoryGuy,arguments)},getStore:function(){return this.get("container").lookup("store:main")},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.urlParams){request.urlParams=options.urlParams}if(options.data){request.data=options.data}$.mockjax(request)},buildURL:function(typeName,id){var type=this.getStore().modelFor(typeName);return this.getStore().adapterFor(type).buildURL(type.typeKey,id)},handleFindMany:function(){FactoryGuy.makeList.apply(FactoryGuy,arguments);var name=arguments[0];var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson={};responseJson[modelName]=[];var url=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson)},handleFindQuery:function(modelName,searchParams,json){var responseJson={};responseJson[modelName.pluralize()]=json;var url=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson,{urlParams:searchParams})},handleCreate:function(modelName,options){var opts=options===undefined?{}:options;var succeed=opts.succeed===undefined?true:opts.succeed;var match=opts.match||{};var returnArgs=opts.returns||{};var url=this.buildURL(modelName);var definition=FactoryGuy.modelDefinitions[modelName];var httpOptions={type:"POST"};if(opts.match){var expectedRequest={};var record=this.getStore().createRecord(modelName,match);expectedRequest[modelName]=record.serialize();httpOptions.data=JSON.stringify(expectedRequest)}var modelType=this.getStore().modelFor(modelName);var responseJson={};if(succeed){responseJson[modelName]=$.extend({id:definition.nextId()},match,returnArgs);Ember.get(modelType,"relationshipsByName").forEach(function(relationship){if(relationship.kind=="belongsTo"){delete responseJson[modelName][relationship.key]}})}else{httpOptions.status=500}this.stubEndpointForHttpRequest(url,responseJson,httpOptions)},handleUpdate:function(){var args=Array.prototype.slice.call(arguments);Ember.assert("To handleUpdate pass in a model instance or a type and an id",args.length>0);var succeed=true;if(typeof args[args.length-1]=="boolean"){args.pop();succeed=false}Ember.assert("To handleUpdate pass in a model instance or a type and an id",args.length>0);var type,id;if(args[0]instanceof DS.Model){var model=args[0];type=model.constructor.typeKey;id=model.id}else if(typeof args[0]=="string"&&typeof parseInt(args[1])=="number"){type=args[0];id=args[1]}Ember.assert("To handleUpdate pass in a model instance or a type and an id",type&&id);this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"PUT",status:succeed?200:500})},handleDelete:function(type,id,succeed){succeed=succeed===undefined?true:succeed;this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"DELETE",status:succeed?200:500})},teardown:function(){FactoryGuy.resetModels(this.getStore());$.mockjax.clear()}});if(FactoryGuy!==undefined){FactoryGuy.testMixin=FactoryGuyTestMixin}
|
@@ -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.9.
|
4
|
+
s.version = "0.9.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
data/src/factory_guy.js
CHANGED
@@ -71,18 +71,6 @@ var FactoryGuy = {
|
|
71
71
|
var model = this.store.modelFor(typeName);
|
72
72
|
return !!model.typeForRelationship(attribute);
|
73
73
|
},
|
74
|
-
/**
|
75
|
-
Make new fixture and save to store. Proxy to store#makeFixture method
|
76
|
-
|
77
|
-
@param {String} name fixture name
|
78
|
-
@param {String} trait optional trait names ( one or more )
|
79
|
-
@param {Object} opts optional fixture options that will override default fixture values
|
80
|
-
@returns {Object|DS.Model} json or record depending on the adapter type
|
81
|
-
*/
|
82
|
-
make: function() {
|
83
|
-
Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures", this.store);
|
84
|
-
return this.store.makeFixture.apply(this.store,arguments);
|
85
|
-
},
|
86
74
|
/**
|
87
75
|
Used in model definitions to declare use of a sequence. For example:
|
88
76
|
|
@@ -277,7 +265,53 @@ var FactoryGuy = {
|
|
277
265
|
}
|
278
266
|
return definition.buildList(name, number, traits, opts);
|
279
267
|
},
|
268
|
+
/**
|
269
|
+
Make new fixture and save to store.
|
280
270
|
|
271
|
+
@param {String} name fixture name
|
272
|
+
@param {String} trait optional trait names ( one or more )
|
273
|
+
@param {Object} options optional fixture options that will override default fixture values
|
274
|
+
@returns {Object|DS.Model} json or record depending on the adapter type
|
275
|
+
*/
|
276
|
+
make: function() {
|
277
|
+
var store = this.store;
|
278
|
+
Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures", store);
|
279
|
+
|
280
|
+
var fixture = this.build.apply(this, arguments);
|
281
|
+
var name = arguments[0];
|
282
|
+
var modelName = this.lookupModelForFixtureName(name);
|
283
|
+
var modelType = store.modelFor(modelName);
|
284
|
+
|
285
|
+
if (store.usingFixtureAdapter()) {
|
286
|
+
store.setAssociationsForFixtureAdapter(modelType, modelName, fixture);
|
287
|
+
return this.pushFixture(modelType, fixture);
|
288
|
+
} else {
|
289
|
+
return store.makeModel(modelType, fixture);
|
290
|
+
}
|
291
|
+
},
|
292
|
+
/**
|
293
|
+
Make a list of Fixtures
|
294
|
+
|
295
|
+
@param {String} name name of fixture
|
296
|
+
@param {Number} number number to create
|
297
|
+
@param {String} trait optional trait names ( one or more )
|
298
|
+
@param {Object} options optional fixture options that will override default fixture values
|
299
|
+
@returns {Array} list of json fixtures or records depending on the adapter type
|
300
|
+
*/
|
301
|
+
makeList: function() {
|
302
|
+
Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures", this.store);
|
303
|
+
|
304
|
+
var arr = [];
|
305
|
+
var args = Array.prototype.slice.call(arguments);
|
306
|
+
Ember.assert("makeList needs at least 2 arguments, a name and a number",args.length >= 2);
|
307
|
+
var number = args.splice(1,1)[0];
|
308
|
+
Ember.assert("Second argument to makeList should be a number (of fixtures to make.)",typeof number == 'number');
|
309
|
+
|
310
|
+
for (var i = 0; i < number; i++) {
|
311
|
+
arr.push(this.make.apply(this, args));
|
312
|
+
}
|
313
|
+
return arr;
|
314
|
+
},
|
281
315
|
/**
|
282
316
|
Clear model instances from FIXTURES array, and from store cache.
|
283
317
|
Reset the id sequence for the models back to zero.
|
@@ -30,11 +30,10 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
30
30
|
return this.getStore().find(type, id);
|
31
31
|
},
|
32
32
|
/**
|
33
|
-
Make new fixture and save to store. Proxy to
|
33
|
+
Make new fixture and save to store. Proxy to FactoryGuy#make method
|
34
34
|
*/
|
35
35
|
make: function () {
|
36
|
-
|
37
|
-
return store.makeFixture.apply(store, arguments);
|
36
|
+
return FactoryGuy.make.apply(FactoryGuy, arguments);
|
38
37
|
},
|
39
38
|
getStore: function () {
|
40
39
|
return this.get('container').lookup('store:main');
|
@@ -55,6 +54,9 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
55
54
|
type: options.type || 'GET',
|
56
55
|
status: options.status || 200
|
57
56
|
};
|
57
|
+
if (options.urlParams) {
|
58
|
+
request.urlParams = options.urlParams;
|
59
|
+
}
|
58
60
|
if (options.data) {
|
59
61
|
request.data = options.data;
|
60
62
|
}
|
@@ -81,9 +83,8 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
81
83
|
@param {Object} opts optional fixture options
|
82
84
|
*/
|
83
85
|
handleFindMany: function () {
|
84
|
-
var store = this.getStore();
|
85
86
|
// make the records and load them in the store
|
86
|
-
|
87
|
+
FactoryGuy.makeList.apply(FactoryGuy, arguments);
|
87
88
|
var name = arguments[0];
|
88
89
|
var modelName = FactoryGuy.lookupModelForFixtureName(name);
|
89
90
|
var responseJson = {};
|
@@ -91,7 +92,35 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
91
92
|
var url = this.buildURL(modelName);
|
92
93
|
// mock the ajax call, but return nothing, since the records will be
|
93
94
|
// retrieved from the store where they were just loaded above
|
94
|
-
this.stubEndpointForHttpRequest(url, responseJson
|
95
|
+
this.stubEndpointForHttpRequest(url, responseJson);
|
96
|
+
},
|
97
|
+
/**
|
98
|
+
Handling ajax GET for finding all records for a type of model with query parameters.
|
99
|
+
|
100
|
+
```js
|
101
|
+
// First build json for the instances you want 'returned' in your query.
|
102
|
+
var usersJson = FactoryGuy.buildList('user', 2);
|
103
|
+
|
104
|
+
// Pass in the parameters you will search on ( in this case 'name' and 'age' ) as an array,
|
105
|
+
// in the second argument.
|
106
|
+
testHelper.handleFindQuery('user', ['name', 'age'], usersJson);
|
107
|
+
|
108
|
+
store.findQuery('user', {name:'Bob', age: 10}}).then(function(userInstances){
|
109
|
+
/// userInstances were created from the usersJson that you passed in
|
110
|
+
})
|
111
|
+
```
|
112
|
+
|
113
|
+
The model instances will be created from the json you have passed in.
|
114
|
+
|
115
|
+
@param {String} modelName name of the mode like 'user' for User model type
|
116
|
+
@param {String} searchParams the parameters that will be queried
|
117
|
+
@param {Object} json fixture json used to build the resulting modelType instances
|
118
|
+
*/
|
119
|
+
handleFindQuery: function (modelName, searchParams, json) {
|
120
|
+
var responseJson = {};
|
121
|
+
responseJson[modelName.pluralize()] = json;
|
122
|
+
var url = this.buildURL(modelName);
|
123
|
+
this.stubEndpointForHttpRequest(url, responseJson, {urlParams: searchParams});
|
95
124
|
},
|
96
125
|
/**
|
97
126
|
Handling ajax POST ( create record ) for a model. You can mock
|
data/src/store.js
CHANGED
@@ -8,30 +8,30 @@
|
|
8
8
|
return adapter instanceof DS.FixtureAdapter;
|
9
9
|
},
|
10
10
|
/**
|
11
|
-
|
12
|
-
will push to FIXTURE array, otherwise will use push method on adapter to load
|
13
|
-
the record into the store
|
14
|
-
|
15
|
-
@param {String} name fixture name
|
16
|
-
@param {String} trait optional trait names ( one or more )
|
17
|
-
@param {Object} opts optional fixture options that will override default fixture values
|
18
|
-
@returns {Object|DS.Model} json or record depending on the adapter type
|
11
|
+
Deprecated in favor of FactoryGuy.make
|
19
12
|
*/
|
20
13
|
makeFixture: function () {
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
return store.makeModel(modelType, fixture);
|
31
|
-
}
|
14
|
+
Ember.deprecate('DEPRECATION Warning: use FactoryGuy.make instead');
|
15
|
+
FactoryGuy.make.call(FactoryGuy, arguments)
|
16
|
+
},
|
17
|
+
/**
|
18
|
+
Deprecated in favor of FactoryGuy.makeList
|
19
|
+
*/
|
20
|
+
makeList: function () {
|
21
|
+
Ember.deprecate('DEPRECATION Warning: use FactoryGuy.makeList instead');
|
22
|
+
FactoryGuy.makeList.call(FactoryGuy, arguments)
|
32
23
|
},
|
24
|
+
/**
|
25
|
+
* Most of the work of making the model from the json fixture is going on here.
|
26
|
+
* @param modelType
|
27
|
+
* @param fixture
|
28
|
+
* @returns {*}
|
29
|
+
*/
|
33
30
|
makeModel: function (modelType, fixture) {
|
34
|
-
var store = this,
|
31
|
+
var store = this,
|
32
|
+
modelName = store.modelFor(modelType).typeKey,
|
33
|
+
model;
|
34
|
+
|
35
35
|
Em.run(function () {
|
36
36
|
store.findEmbeddedAssociationsForRESTAdapter(modelType, fixture);
|
37
37
|
if (fixture.type) {
|
@@ -45,22 +45,6 @@
|
|
45
45
|
});
|
46
46
|
return model;
|
47
47
|
},
|
48
|
-
/**
|
49
|
-
Make a list of Fixtures
|
50
|
-
|
51
|
-
@param {String} name name of fixture
|
52
|
-
@param {Number} number number to create
|
53
|
-
@param {Object} options fixture options
|
54
|
-
@returns {Array} list of json fixtures or records depending on the adapter type
|
55
|
-
*/
|
56
|
-
makeList: function () {
|
57
|
-
var arr = [];
|
58
|
-
var number = arguments[1];
|
59
|
-
for (var i = 0; i < number; i++) {
|
60
|
-
arr.push(this.makeFixture.apply(this, arguments));
|
61
|
-
}
|
62
|
-
return arr;
|
63
|
-
},
|
64
48
|
/**
|
65
49
|
Set the hasMany and belongsTo associations for FixtureAdapter.
|
66
50
|
|
@@ -5,7 +5,7 @@ module('FactoryGuy with ActiveModelAdapter', {
|
|
5
5
|
setup: function() {
|
6
6
|
testHelper = TestHelper.setup(DS.ActiveModelAdapter);
|
7
7
|
store = testHelper.getStore();
|
8
|
-
make = function() {return
|
8
|
+
make = function() {return FactoryGuy.make.apply(FactoryGuy,arguments)}
|
9
9
|
},
|
10
10
|
teardown: function() {
|
11
11
|
testHelper.teardown();
|
@@ -35,11 +35,11 @@ test("#resetModels clears the store of models, and resets the model definition",
|
|
35
35
|
});
|
36
36
|
|
37
37
|
|
38
|
-
module('
|
38
|
+
module('#make with ActiveModelAdapter', {
|
39
39
|
setup: function() {
|
40
40
|
testHelper = TestHelper.setup(DS.ActiveModelAdapter);
|
41
41
|
store = testHelper.getStore();
|
42
|
-
make = function() {return
|
42
|
+
make = function() {return FactoryGuy.make.apply(FactoryGuy,arguments)}
|
43
43
|
},
|
44
44
|
teardown: function() {
|
45
45
|
Em.run(function() { testHelper.teardown(); });
|
@@ -287,7 +287,7 @@ test("with (nested json fixture) belongsTo has a hasMany association which has a
|
|
287
287
|
});
|
288
288
|
|
289
289
|
|
290
|
-
module('
|
290
|
+
module('#makeList with ActiveModelAdapter', {
|
291
291
|
setup: function() {
|
292
292
|
testHelper = TestHelper.setup(DS.ActiveModelAdapter);
|
293
293
|
store = testHelper.getStore();
|
@@ -299,7 +299,7 @@ module('DS.Store#makeList with ActiveModelAdapter', {
|
|
299
299
|
|
300
300
|
|
301
301
|
test("creates list of DS.Model instances", function() {
|
302
|
-
var users =
|
302
|
+
var users = FactoryGuy.makeList('user', 2);
|
303
303
|
equal(users.length, 2);
|
304
304
|
ok(users[0] instanceof DS.Model == true);
|
305
305
|
|
@@ -308,3 +308,15 @@ test("creates list of DS.Model instances", function() {
|
|
308
308
|
ok(storeUsers[1] == users[1]);
|
309
309
|
});
|
310
310
|
|
311
|
+
test("handles trait arguments", function() {
|
312
|
+
var users = FactoryGuy.makeList('user', 2, 'with_hats');
|
313
|
+
equal(users.length, 2);
|
314
|
+
equal(users[0].get('hats.length') == 2, true);
|
315
|
+
});
|
316
|
+
|
317
|
+
test("handles traits and optional fixture arguments", function() {
|
318
|
+
var users = FactoryGuy.makeList('user', 2, 'with_hats', {name: 'Bob'});
|
319
|
+
equal(users[0].get('name'), 'Bob');
|
320
|
+
equal(users[0].get('hats.length') == 2, true);
|
321
|
+
});
|
322
|
+
|
data/tests/factory_guy_test.js
CHANGED
@@ -242,7 +242,6 @@ module('FactoryGuy with DS.FixtureAdapter', {
|
|
242
242
|
|
243
243
|
|
244
244
|
asyncTest("#make loads the fixture in the store and returns an object", function() {
|
245
|
-
FactoryGuy.setStore(store);
|
246
245
|
var user = FactoryGuy.make('user');
|
247
246
|
ok(user instanceof Object )
|
248
247
|
store.find('user', user.id).then(function(u){
|
@@ -54,6 +54,20 @@ asyncTest("#handleCreate the basic", function() {
|
|
54
54
|
});
|
55
55
|
|
56
56
|
|
57
|
+
/////// handleFindQuery //////////
|
58
|
+
|
59
|
+
asyncTest("#handleFindQuery", function() {
|
60
|
+
var users = FactoryGuy.buildList('user', 2);
|
61
|
+
testHelper.handleFindQuery('user', ['name'], users);
|
62
|
+
|
63
|
+
store.findQuery('user', {name: 'Bob'}).then(function (users) {
|
64
|
+
equal(users.get('length'), 2)
|
65
|
+
equal(users.get('firstObject.name'), 'User1')
|
66
|
+
equal(users.get('lastObject.name'), 'User2')
|
67
|
+
start();
|
68
|
+
})
|
69
|
+
});
|
70
|
+
|
57
71
|
|
58
72
|
/////// handleFindMany //////////
|
59
73
|
|
@@ -376,3 +390,5 @@ asyncTest("#handleDelete failure case", function() {
|
|
376
390
|
}
|
377
391
|
);
|
378
392
|
});
|
393
|
+
|
394
|
+
|
@@ -4,7 +4,7 @@ module('FactoryGuy with DS.RESTAdapter', {
|
|
4
4
|
setup: function() {
|
5
5
|
testHelper = TestHelper.setup(DS.RESTAdapter);
|
6
6
|
store = testHelper.getStore();
|
7
|
-
make = function() {return
|
7
|
+
make = function() {return FactoryGuy.make.apply(FactoryGuy,arguments)}
|
8
8
|
},
|
9
9
|
teardown: function() {
|
10
10
|
Em.run(function() { testHelper.teardown(); });
|
@@ -34,11 +34,11 @@ test("#resetModels clears the store of models, and resets the model definition",
|
|
34
34
|
});
|
35
35
|
|
36
36
|
|
37
|
-
module('
|
37
|
+
module('#make with RestAdapter', {
|
38
38
|
setup: function() {
|
39
39
|
testHelper = TestHelper.setup(DS.RESTAdapter);
|
40
40
|
store = testHelper.getStore();
|
41
|
-
make = function() {return
|
41
|
+
make = function() {return FactoryGuy.make.apply(FactoryGuy,arguments)}
|
42
42
|
},
|
43
43
|
teardown: function() {
|
44
44
|
Em.run(function() { testHelper.teardown(); });
|
@@ -279,7 +279,7 @@ test("with (nested json fixture) belongsTo has a hasMany association which has a
|
|
279
279
|
});
|
280
280
|
|
281
281
|
|
282
|
-
module('
|
282
|
+
module('#makeList with DS.RESTAdapter', {
|
283
283
|
setup: function() {
|
284
284
|
testHelper = TestHelper.setup(DS.RESTAdapter);
|
285
285
|
store = testHelper.getStore();
|
@@ -291,16 +291,24 @@ module('DS.Store#makeList with DS.RESTAdapter', {
|
|
291
291
|
|
292
292
|
|
293
293
|
test("creates list of DS.Model instances", function() {
|
294
|
-
var users =
|
295
|
-
|
294
|
+
var users = FactoryGuy.makeList('user', 2);
|
295
|
+
equal(users.length, 2);
|
296
296
|
ok(users[0] instanceof DS.Model == true);
|
297
|
-
});
|
298
|
-
|
299
|
-
|
300
|
-
test("creates records in the store", function() {
|
301
|
-
var users = store.makeList('user', 2);
|
302
297
|
|
303
298
|
var storeUsers = store.all('user').get('content');
|
304
299
|
ok(storeUsers[0] == users[0]);
|
305
300
|
ok(storeUsers[1] == users[1]);
|
306
|
-
});
|
301
|
+
});
|
302
|
+
|
303
|
+
test("handles accept traits", function() {
|
304
|
+
var users = FactoryGuy.makeList('user', 2, 'with_hats');
|
305
|
+
equal(users.length, 2);
|
306
|
+
equal(users[0].get('hats.length') == 2, true);
|
307
|
+
});
|
308
|
+
|
309
|
+
test("handles accept traits and optional fixture arguments", function() {
|
310
|
+
var users = FactoryGuy.makeList('user', 2, 'with_hats', {name: 'Bob'});
|
311
|
+
equal(users[0].get('name'), 'Bob');
|
312
|
+
equal(users[0].get('hats.length') == 2, true);
|
313
|
+
});
|
314
|
+
|
@@ -242,25 +242,13 @@ var FactoryGuy = {
|
|
242
242
|
*/
|
243
243
|
isAttributeRelationship: function(typeName, attribute) {
|
244
244
|
if (!this.store) {
|
245
|
-
|
245
|
+
Ember.debug("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures")
|
246
246
|
// The legacy value was true.
|
247
247
|
return true;
|
248
248
|
}
|
249
249
|
var model = this.store.modelFor(typeName);
|
250
250
|
return !!model.typeForRelationship(attribute);
|
251
251
|
},
|
252
|
-
/**
|
253
|
-
Make new fixture and save to store. Proxy to store#makeFixture method
|
254
|
-
|
255
|
-
@param {String} name fixture name
|
256
|
-
@param {String} trait optional trait names ( one or more )
|
257
|
-
@param {Object} opts optional fixture options that will override default fixture values
|
258
|
-
@returns {Object|DS.Model} json or record depending on the adapter type
|
259
|
-
*/
|
260
|
-
make: function() {
|
261
|
-
Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures", this.store);
|
262
|
-
return this.store.makeFixture.apply(this.store,arguments);
|
263
|
-
},
|
264
252
|
/**
|
265
253
|
Used in model definitions to declare use of a sequence. For example:
|
266
254
|
|
@@ -328,7 +316,7 @@ var FactoryGuy = {
|
|
328
316
|
};
|
329
317
|
},
|
330
318
|
association: function (fixtureName, opts) {
|
331
|
-
|
319
|
+
Ember.deprecate('DEPRECATION Warning: use FactoryGuy.belongsTo instead');
|
332
320
|
return this.belongsTo(fixtureName, opts);
|
333
321
|
},
|
334
322
|
/**
|
@@ -455,7 +443,53 @@ var FactoryGuy = {
|
|
455
443
|
}
|
456
444
|
return definition.buildList(name, number, traits, opts);
|
457
445
|
},
|
446
|
+
/**
|
447
|
+
Make new fixture and save to store.
|
448
|
+
|
449
|
+
@param {String} name fixture name
|
450
|
+
@param {String} trait optional trait names ( one or more )
|
451
|
+
@param {Object} options optional fixture options that will override default fixture values
|
452
|
+
@returns {Object|DS.Model} json or record depending on the adapter type
|
453
|
+
*/
|
454
|
+
make: function() {
|
455
|
+
var store = this.store;
|
456
|
+
Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures", store);
|
457
|
+
|
458
|
+
var fixture = this.build.apply(this, arguments);
|
459
|
+
var name = arguments[0];
|
460
|
+
var modelName = this.lookupModelForFixtureName(name);
|
461
|
+
var modelType = store.modelFor(modelName);
|
462
|
+
|
463
|
+
if (store.usingFixtureAdapter()) {
|
464
|
+
store.setAssociationsForFixtureAdapter(modelType, modelName, fixture);
|
465
|
+
return this.pushFixture(modelType, fixture);
|
466
|
+
} else {
|
467
|
+
return store.makeModel(modelType, fixture);
|
468
|
+
}
|
469
|
+
},
|
470
|
+
/**
|
471
|
+
Make a list of Fixtures
|
458
472
|
|
473
|
+
@param {String} name name of fixture
|
474
|
+
@param {Number} number number to create
|
475
|
+
@param {String} trait optional trait names ( one or more )
|
476
|
+
@param {Object} options optional fixture options that will override default fixture values
|
477
|
+
@returns {Array} list of json fixtures or records depending on the adapter type
|
478
|
+
*/
|
479
|
+
makeList: function() {
|
480
|
+
Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures", this.store);
|
481
|
+
|
482
|
+
var arr = [];
|
483
|
+
var args = Array.prototype.slice.call(arguments);
|
484
|
+
Ember.assert("makeList needs at least 2 arguments, a name and a number",args.length >= 2);
|
485
|
+
var number = args.splice(1,1)[0];
|
486
|
+
Ember.assert("Second argument to makeList should be a number (of fixtures to make.)",typeof number == 'number');
|
487
|
+
|
488
|
+
for (var i = 0; i < number; i++) {
|
489
|
+
arr.push(this.make.apply(this, args));
|
490
|
+
}
|
491
|
+
return arr;
|
492
|
+
},
|
459
493
|
/**
|
460
494
|
Clear model instances from FIXTURES array, and from store cache.
|
461
495
|
Reset the id sequence for the models back to zero.
|
@@ -543,30 +577,30 @@ var FactoryGuy = {
|
|
543
577
|
return adapter instanceof DS.FixtureAdapter;
|
544
578
|
},
|
545
579
|
/**
|
546
|
-
|
547
|
-
will push to FIXTURE array, otherwise will use push method on adapter to load
|
548
|
-
the record into the store
|
549
|
-
|
550
|
-
@param {String} name fixture name
|
551
|
-
@param {String} trait optional trait names ( one or more )
|
552
|
-
@param {Object} opts optional fixture options that will override default fixture values
|
553
|
-
@returns {Object|DS.Model} json or record depending on the adapter type
|
580
|
+
Deprecated in favor of FactoryGuy.make
|
554
581
|
*/
|
555
582
|
makeFixture: function () {
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
return store.makeModel(modelType, fixture);
|
566
|
-
}
|
583
|
+
Ember.deprecate('DEPRECATION Warning: use FactoryGuy.make instead');
|
584
|
+
FactoryGuy.make.call(FactoryGuy, arguments)
|
585
|
+
},
|
586
|
+
/**
|
587
|
+
Deprecated in favor of FactoryGuy.makeList
|
588
|
+
*/
|
589
|
+
makeList: function () {
|
590
|
+
Ember.deprecate('DEPRECATION Warning: use FactoryGuy.makeList instead');
|
591
|
+
FactoryGuy.makeList.call(FactoryGuy, arguments)
|
567
592
|
},
|
593
|
+
/**
|
594
|
+
* Most of the work of making the model from the json fixture is going on here.
|
595
|
+
* @param modelType
|
596
|
+
* @param fixture
|
597
|
+
* @returns {*}
|
598
|
+
*/
|
568
599
|
makeModel: function (modelType, fixture) {
|
569
|
-
var store = this,
|
600
|
+
var store = this,
|
601
|
+
modelName = store.modelFor(modelType).typeKey,
|
602
|
+
model;
|
603
|
+
|
570
604
|
Em.run(function () {
|
571
605
|
store.findEmbeddedAssociationsForRESTAdapter(modelType, fixture);
|
572
606
|
if (fixture.type) {
|
@@ -580,22 +614,6 @@ var FactoryGuy = {
|
|
580
614
|
});
|
581
615
|
return model;
|
582
616
|
},
|
583
|
-
/**
|
584
|
-
Make a list of Fixtures
|
585
|
-
|
586
|
-
@param {String} name name of fixture
|
587
|
-
@param {Number} number number to create
|
588
|
-
@param {Object} options fixture options
|
589
|
-
@returns {Array} list of json fixtures or records depending on the adapter type
|
590
|
-
*/
|
591
|
-
makeList: function () {
|
592
|
-
var arr = [];
|
593
|
-
var number = arguments[1];
|
594
|
-
for (var i = 0; i < number; i++) {
|
595
|
-
arr.push(this.makeFixture.apply(this, arguments));
|
596
|
-
}
|
597
|
-
return arr;
|
598
|
-
},
|
599
617
|
/**
|
600
618
|
Set the hasMany and belongsTo associations for FixtureAdapter.
|
601
619
|
|
@@ -812,11 +830,10 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
812
830
|
return this.getStore().find(type, id);
|
813
831
|
},
|
814
832
|
/**
|
815
|
-
Make new fixture and save to store. Proxy to
|
833
|
+
Make new fixture and save to store. Proxy to FactoryGuy#make method
|
816
834
|
*/
|
817
835
|
make: function () {
|
818
|
-
|
819
|
-
return store.makeFixture.apply(store, arguments);
|
836
|
+
return FactoryGuy.make.apply(FactoryGuy, arguments);
|
820
837
|
},
|
821
838
|
getStore: function () {
|
822
839
|
return this.get('container').lookup('store:main');
|
@@ -837,6 +854,9 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
837
854
|
type: options.type || 'GET',
|
838
855
|
status: options.status || 200
|
839
856
|
};
|
857
|
+
if (options.urlParams) {
|
858
|
+
request.urlParams = options.urlParams;
|
859
|
+
}
|
840
860
|
if (options.data) {
|
841
861
|
request.data = options.data;
|
842
862
|
}
|
@@ -863,9 +883,8 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
863
883
|
@param {Object} opts optional fixture options
|
864
884
|
*/
|
865
885
|
handleFindMany: function () {
|
866
|
-
var store = this.getStore();
|
867
886
|
// make the records and load them in the store
|
868
|
-
|
887
|
+
FactoryGuy.makeList.apply(FactoryGuy, arguments);
|
869
888
|
var name = arguments[0];
|
870
889
|
var modelName = FactoryGuy.lookupModelForFixtureName(name);
|
871
890
|
var responseJson = {};
|
@@ -873,7 +892,35 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
873
892
|
var url = this.buildURL(modelName);
|
874
893
|
// mock the ajax call, but return nothing, since the records will be
|
875
894
|
// retrieved from the store where they were just loaded above
|
876
|
-
this.stubEndpointForHttpRequest(url, responseJson
|
895
|
+
this.stubEndpointForHttpRequest(url, responseJson);
|
896
|
+
},
|
897
|
+
/**
|
898
|
+
Handling ajax GET for finding all records for a type of model with query parameters.
|
899
|
+
|
900
|
+
```js
|
901
|
+
// First build json for the instances you want 'returned' in your query.
|
902
|
+
var usersJson = FactoryGuy.buildList('user', 2);
|
903
|
+
|
904
|
+
// Pass in the parameters you will search on ( in this case 'name' and 'age' ) as an array,
|
905
|
+
// in the second argument.
|
906
|
+
testHelper.handleFindQuery('user', ['name', 'age'], usersJson);
|
907
|
+
|
908
|
+
store.findQuery('user', {name:'Bob', age: 10}}).then(function(userInstances){
|
909
|
+
/// userInstances were created from the usersJson that you passed in
|
910
|
+
})
|
911
|
+
```
|
912
|
+
|
913
|
+
The model instances will be created from the json you have passed in.
|
914
|
+
|
915
|
+
@param {String} modelName name of the mode like 'user' for User model type
|
916
|
+
@param {String} searchParams the parameters that will be queried
|
917
|
+
@param {Object} json fixture json used to build the resulting modelType instances
|
918
|
+
*/
|
919
|
+
handleFindQuery: function (modelName, searchParams, json) {
|
920
|
+
var responseJson = {};
|
921
|
+
responseJson[modelName.pluralize()] = json;
|
922
|
+
var url = this.buildURL(modelName);
|
923
|
+
this.stubEndpointForHttpRequest(url, responseJson, {urlParams: searchParams});
|
877
924
|
},
|
878
925
|
/**
|
879
926
|
Handling ajax POST ( create record ) for a model. You can mock
|