ember-data-factory-guy 0.7.3 → 0.7.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gruntfile.js +4 -2
- data/README.md +59 -12
- data/bower.json +3 -2
- data/dist/ember-data-factory-guy.js +826 -97
- 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 +11 -10
- data/src/factory_guy_test_mixin.js +91 -62
- data/src/store.js +33 -26
- data/tests/active_model_adapter_factory_test.js +38 -54
- data/tests/factory_guy_test.js +4 -4
- data/tests/factory_guy_test_mixin_test.js +217 -22
- data/tests/index.html +4 -4
- data/tests/rest_adapter_factory_test.js +38 -39
- data/tests/support/factories/hat_factory.js +8 -0
- data/tests/support/factories/outfit_factory.js +8 -0
- data/tests/support/factories/profile_factory.js +5 -0
- data/tests/support/factories/project_factory.js +2 -0
- data/tests/support/factories/user_factory.js +43 -29
- data/tests/support/models/hat.js +1 -0
- data/tests/support/models/outfit.js +4 -0
- data/tests/support/models/user.js +1 -0
- data/tests/support/test_helper.js +4 -192
- data/tests/test_setup.js +74 -29
- data/vendor/assets/javascripts/ember_data_factory_guy.js +826 -97
- metadata +4 -2
@@ -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 traits={};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,traitArgs){var traitsObj={};traitArgs.forEach(function(trait){$.extend(traitsObj,traits[trait])});var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,traitsObj,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,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(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)};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)}}},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(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(model in this.modelDefinitions){var definition=this.modelDefinitions[model];definition.reset();try{var modelType=store.modelFor(definition.model);if(store.usingFixtureAdapter()){modelType.FIXTURES=[]}Ember.run(function(){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.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(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(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){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(modelName);FactoryGuy.pushFixture(model,payload)}else{this._super(type,payload)}}});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}}},buildURL:function(type,id){return this.getStore().adapterFor("application").buildURL(type,id)},handleSideloadFind:function(modelName,json,sideload){var id=json.id;var url=this.buildURL(modelName,id);var responseJson={};responseJson[modelName]=json;$.extend(responseJson,sideload);this.stubEndpointForHttpRequest(url,responseJson,{type:"GET",status:status||200})},handleFind:function(name,opts,status){var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson=this.buildAjaxHttpResponse(name,opts);var id=responseJson[modelName].id;var url=this.buildURL(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=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson,{type:"POST",status:status||200});return responseJson},handleUpdate:function(type,id,status){this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"PUT",status:status||200})},handleDelete:function(type,id,status){this.stubEndpointForHttpRequest(this.buildURL(type,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 traits={};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,traitArgs){var traitsObj={};traitArgs.forEach(function(trait){$.extend(traitsObj,traits[trait])});var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,traitsObj,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,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(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)};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)}}},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(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(model in this.modelDefinitions){var definition=this.modelDefinitions[model];definition.reset();try{var modelType=store.modelFor(definition.model);if(store.usingFixtureAdapter()){modelType.FIXTURES=[]}Ember.run(function(){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(){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(modelName);FactoryGuy.pushFixture(model,payload)}else{this._super(type,payload)}}});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(modelName,fixture){if(this.usingActiveModelSerializer(modelName)){this.toSnakeCase(fixture)}var hash={};hash[modelName]=fixture;return hash},_collectArgs:function(args,fromMethod){var args=Array.prototype.slice.call(arguments);var name=args.shift();if(!name){throw new Error(fromMethod+" needs a factory name to build")}var succeed=true;if(Ember.typeOf(args[args.length-1])=="boolean"){succeed=args.pop()}var opts={};if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;return{name:name,traits:traits,opts:opts,succeed:succeed}},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}}},buildURL:function(type,id){return this.getStore().adapterFor("application").buildURL(type,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(){var args=Array.prototype.slice.call(arguments);var succeed=true;if(Ember.typeOf(args[args.length-1])=="boolean"){succeed=args.pop()}var name=args[0];var modelName=FactoryGuy.lookupModelForFixtureName(name);var url=this.buildURL(modelName);var responseJson={};var httpOptions={type:"POST"};if(succeed){var store=this.getStore();var model=store.makeFixture.apply(store,args);responseJson[modelName]=model}else{httpOptions.status=500}this.stubEndpointForHttpRequest(url,responseJson,httpOptions)},handleUpdate:function(type,id,succeed){succeed=succeed===undefined?true:succeed;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())}});(function($){var _ajax=$.ajax,mockHandlers=[],mockedAjaxCalls=[],unmockedAjaxCalls=[],CALLBACK_REGEX=/=\?(&|$)/,jsc=(new Date).getTime();function parseXML(xml){if(window.DOMParser==undefined&&window.ActiveXObject){DOMParser=function(){};DOMParser.prototype.parseFromString=function(xmlString){var doc=new ActiveXObject("Microsoft.XMLDOM");doc.async="false";doc.loadXML(xmlString);return doc}}try{var xmlDoc=(new DOMParser).parseFromString(xml,"text/xml");if($.isXMLDoc(xmlDoc)){var err=$("parsererror",xmlDoc);if(err.length==1){throw new Error("Error: "+$(xmlDoc).text())}}else{throw new Error("Unable to parse XML")}return xmlDoc}catch(e){var msg=e.name==undefined?e:e.name+": "+e.message;$(document).trigger("xmlParseError",[msg]);return undefined}}function isMockDataEqual(mock,live){var identical=true;if(typeof live==="string"){return $.isFunction(mock.test)?mock.test(live):mock==live}$.each(mock,function(k){if(live[k]===undefined){identical=false;return identical}else{if(typeof live[k]==="object"&&live[k]!==null){if(identical&&$.isArray(live[k])){identical=$.isArray(mock[k])&&live[k].length===mock[k].length}identical=identical&&isMockDataEqual(mock[k],live[k])}else{if(mock[k]&&$.isFunction(mock[k].test)){identical=identical&&mock[k].test(live[k])}else{identical=identical&&mock[k]==live[k]}}}});return identical}function isDefaultSetting(handler,property){return handler[property]===$.mockjaxSettings[property]}function getMockForRequest(handler,requestSettings){if($.isFunction(handler)){return handler(requestSettings)}if($.isFunction(handler.url.test)){if(!handler.url.test(requestSettings.url)){return null}}else{var star=handler.url.indexOf("*");if(handler.url!==requestSettings.url&&star===-1||!new RegExp(handler.url.replace(/[-[\]{}()+?.,\\^$|#\s]/g,"\\$&").replace(/\*/g,".+")).test(requestSettings.url)){return null}}if(handler.data){if(!requestSettings.data||!isMockDataEqual(handler.data,requestSettings.data)){return null}}if(handler&&handler.type&&handler.type.toLowerCase()!=requestSettings.type.toLowerCase()){return null}return handler}function parseResponseTimeOpt(responseTime){if($.isArray(responseTime)){var min=responseTime[0];var max=responseTime[1];return typeof min==="number"&&typeof max==="number"?Math.floor(Math.random()*(max-min))+min:null}else{return typeof responseTime==="number"?responseTime:null}}function _xhrSend(mockHandler,requestSettings,origSettings){var process=function(that){return function(){return function(){this.status=mockHandler.status;this.statusText=mockHandler.statusText;this.readyState=1;var finishRequest=function(){this.readyState=4;var onReady;if(requestSettings.dataType=="json"&&typeof mockHandler.responseText=="object"){this.responseText=JSON.stringify(mockHandler.responseText)}else if(requestSettings.dataType=="xml"){if(typeof mockHandler.responseXML=="string"){this.responseXML=parseXML(mockHandler.responseXML);this.responseText=mockHandler.responseXML}else{this.responseXML=mockHandler.responseXML}}else if(typeof mockHandler.responseText==="object"&&mockHandler.responseText!==null){mockHandler.contentType="application/json";this.responseText=JSON.stringify(mockHandler.responseText)}else{this.responseText=mockHandler.responseText}if(typeof mockHandler.status=="number"||typeof mockHandler.status=="string"){this.status=mockHandler.status}if(typeof mockHandler.statusText==="string"){this.statusText=mockHandler.statusText}onReady=this.onreadystatechange||this.onload;if($.isFunction(onReady)){if(mockHandler.isTimeout){this.status=-1}onReady.call(this,mockHandler.isTimeout?"timeout":undefined)}else if(mockHandler.isTimeout){this.status=-1}};if($.isFunction(mockHandler.response)){if(mockHandler.response.length===2){mockHandler.response(origSettings,function(){finishRequest.call(that)});return}else{mockHandler.response(origSettings)}}finishRequest.call(that)}.apply(that)}}(this);if(mockHandler.proxy){_ajax({global:false,url:mockHandler.proxy,type:mockHandler.proxyType,data:mockHandler.data,dataType:requestSettings.dataType==="script"?"text/plain":requestSettings.dataType,complete:function(xhr){mockHandler.responseXML=xhr.responseXML;mockHandler.responseText=xhr.responseText;if(isDefaultSetting(mockHandler,"status")){mockHandler.status=xhr.status}if(isDefaultSetting(mockHandler,"statusText")){mockHandler.statusText=xhr.statusText}this.responseTimer=setTimeout(process,parseResponseTimeOpt(mockHandler.responseTime)||0)}})}else{if(requestSettings.async===false){process()}else{this.responseTimer=setTimeout(process,parseResponseTimeOpt(mockHandler.responseTime)||50)}}}function xhr(mockHandler,requestSettings,origSettings,origHandler){mockHandler=$.extend(true,{},$.mockjaxSettings,mockHandler);if(typeof mockHandler.headers==="undefined"){mockHandler.headers={}}if(typeof requestSettings.headers==="undefined"){requestSettings.headers={}}if(mockHandler.contentType){mockHandler.headers["content-type"]=mockHandler.contentType}return{status:mockHandler.status,statusText:mockHandler.statusText,readyState:1,open:function(){},send:function(){origHandler.fired=true;_xhrSend.call(this,mockHandler,requestSettings,origSettings)},abort:function(){clearTimeout(this.responseTimer)},setRequestHeader:function(header,value){requestSettings.headers[header]=value},getResponseHeader:function(header){if(mockHandler.headers&&mockHandler.headers[header]){return mockHandler.headers[header]}else if(header.toLowerCase()=="last-modified"){return mockHandler.lastModified||(new Date).toString()}else if(header.toLowerCase()=="etag"){return mockHandler.etag||""}else if(header.toLowerCase()=="content-type"){return mockHandler.contentType||"text/plain"}},getAllResponseHeaders:function(){var headers="";if(mockHandler.contentType){mockHandler.headers["Content-Type"]=mockHandler.contentType}$.each(mockHandler.headers,function(k,v){headers+=k+": "+v+"\n"});return headers}}}function processJsonpMock(requestSettings,mockHandler,origSettings){processJsonpUrl(requestSettings);requestSettings.dataType="json";if(requestSettings.data&&CALLBACK_REGEX.test(requestSettings.data)||CALLBACK_REGEX.test(requestSettings.url)){createJsonpCallback(requestSettings,mockHandler,origSettings);var rurl=/^(\w+:)?\/\/([^\/?#]+)/,parts=rurl.exec(requestSettings.url),remote=parts&&(parts[1]&&parts[1]!==location.protocol||parts[2]!==location.host);requestSettings.dataType="script";if(requestSettings.type.toUpperCase()==="GET"&&remote){var newMockReturn=processJsonpRequest(requestSettings,mockHandler,origSettings);if(newMockReturn){return newMockReturn}else{return true}}}return null}function processJsonpUrl(requestSettings){if(requestSettings.type.toUpperCase()==="GET"){if(!CALLBACK_REGEX.test(requestSettings.url)){requestSettings.url+=(/\?/.test(requestSettings.url)?"&":"?")+(requestSettings.jsonp||"callback")+"=?"}}else if(!requestSettings.data||!CALLBACK_REGEX.test(requestSettings.data)){requestSettings.data=(requestSettings.data?requestSettings.data+"&":"")+(requestSettings.jsonp||"callback")+"=?"}}function processJsonpRequest(requestSettings,mockHandler,origSettings){var callbackContext=origSettings&&origSettings.context||requestSettings,newMock=null;if(mockHandler.response&&$.isFunction(mockHandler.response)){mockHandler.response(origSettings)}else{if(typeof mockHandler.responseText==="object"){$.globalEval("("+JSON.stringify(mockHandler.responseText)+")")}else{$.globalEval("("+mockHandler.responseText+")")}}setTimeout(function(){jsonpSuccess(requestSettings,callbackContext,mockHandler);jsonpComplete(requestSettings,callbackContext,mockHandler)},parseResponseTimeOpt(mockHandler.responseTime)||0);if($.Deferred){newMock=new $.Deferred;if(typeof mockHandler.responseText=="object"){newMock.resolveWith(callbackContext,[mockHandler.responseText])}else{newMock.resolveWith(callbackContext,[$.parseJSON(mockHandler.responseText)])}}return newMock}function createJsonpCallback(requestSettings,mockHandler,origSettings){var callbackContext=origSettings&&origSettings.context||requestSettings;var jsonp=requestSettings.jsonpCallback||"jsonp"+jsc++;if(requestSettings.data){requestSettings.data=(requestSettings.data+"").replace(CALLBACK_REGEX,"="+jsonp+"$1")}requestSettings.url=requestSettings.url.replace(CALLBACK_REGEX,"="+jsonp+"$1");window[jsonp]=window[jsonp]||function(tmp){data=tmp;jsonpSuccess(requestSettings,callbackContext,mockHandler);jsonpComplete(requestSettings,callbackContext,mockHandler);window[jsonp]=undefined;try{delete window[jsonp]}catch(e){}if(head){head.removeChild(script)}}}function jsonpSuccess(requestSettings,callbackContext,mockHandler){if(requestSettings.success){requestSettings.success.call(callbackContext,mockHandler.responseText||"",status,{})}if(requestSettings.global){(requestSettings.context?$(requestSettings.context):$.event).trigger("ajaxSuccess",[{},requestSettings])}}function jsonpComplete(requestSettings,callbackContext){if(requestSettings.complete){requestSettings.complete.call(callbackContext,{},status)}if(requestSettings.global){(requestSettings.context?$(requestSettings.context):$.event).trigger("ajaxComplete",[{},requestSettings])}if(requestSettings.global&&!--$.active){$.event.trigger("ajaxStop")}}function handleAjax(url,origSettings){var mockRequest,requestSettings,mockHandler,overrideCallback;if(typeof url==="object"){origSettings=url;url=undefined}else{origSettings=origSettings||{};origSettings.url=url}requestSettings=$.extend(true,{},$.ajaxSettings,origSettings);overrideCallback=function(action,mockHandler){var origHandler=origSettings[action.toLowerCase()];return function(){if($.isFunction(origHandler)){origHandler.apply(this,[].slice.call(arguments))}mockHandler["onAfter"+action]()}};for(var k=0;k<mockHandlers.length;k++){if(!mockHandlers[k]){continue}mockHandler=getMockForRequest(mockHandlers[k],requestSettings);if(!mockHandler){continue}mockedAjaxCalls.push(requestSettings);$.mockjaxSettings.log(mockHandler,requestSettings);if(requestSettings.dataType&&requestSettings.dataType.toUpperCase()==="JSONP"){if(mockRequest=processJsonpMock(requestSettings,mockHandler,origSettings)){return mockRequest}}mockHandler.cache=requestSettings.cache;mockHandler.timeout=requestSettings.timeout;mockHandler.global=requestSettings.global;if(mockHandler.isTimeout){if(mockHandler.responseTime>1){origSettings.timeout=mockHandler.responseTime-1}else{mockHandler.responseTime=2;origSettings.timeout=1}mockHandler.isTimeout=false}if($.isFunction(mockHandler.onAfterSuccess)){origSettings.success=overrideCallback("Success",mockHandler)}if($.isFunction(mockHandler.onAfterError)){origSettings.error=overrideCallback("Error",mockHandler)}if($.isFunction(mockHandler.onAfterComplete)){origSettings.complete=overrideCallback("Complete",mockHandler)}copyUrlParameters(mockHandler,origSettings);(function(mockHandler,requestSettings,origSettings,origHandler){mockRequest=_ajax.call($,$.extend(true,{},origSettings,{xhr:function(){return xhr(mockHandler,requestSettings,origSettings,origHandler)}}))})(mockHandler,requestSettings,origSettings,mockHandlers[k]);return mockRequest}unmockedAjaxCalls.push(origSettings);if($.mockjaxSettings.throwUnmocked===true){throw new Error("AJAX not mocked: "+origSettings.url)}else{return _ajax.apply($,[origSettings])}}function copyUrlParameters(mockHandler,origSettings){if(!(mockHandler.url instanceof RegExp)){return}if(!mockHandler.hasOwnProperty("urlParams")){return}var captures=mockHandler.url.exec(origSettings.url);if(captures.length===1){return}captures.shift();var i=0,capturesLength=captures.length,paramsLength=mockHandler.urlParams.length,maxIterations=Math.min(capturesLength,paramsLength),paramValues={};for(i;i<maxIterations;i++){var key=mockHandler.urlParams[i];paramValues[key]=captures[i]}origSettings.urlParams=paramValues}$.extend({ajax:handleAjax});$.mockjaxSettings={log:function(mockHandler,requestSettings){if(mockHandler.logging===false||typeof mockHandler.logging==="undefined"&&$.mockjaxSettings.logging===false){return}if(window.console&&console.log){var message="MOCK "+requestSettings.type.toUpperCase()+": "+requestSettings.url;var request=$.extend({},requestSettings);if(typeof console.log==="function"){console.log(message,request)}else{try{console.log(message+" "+JSON.stringify(request))}catch(e){console.log(message)}}}},logging:true,status:200,statusText:"OK",responseTime:500,isTimeout:false,throwUnmocked:false,contentType:"text/plain",response:"",responseText:"",responseXML:"",proxy:"",proxyType:"GET",lastModified:null,etag:"",headers:{etag:"IJF@H#@923uf8023hFO@I#H#","content-type":"text/plain"}};$.mockjax=function(settings){var i=mockHandlers.length;mockHandlers[i]=settings;return i};$.mockjax.clear=function(i){if(arguments.length==1){mockHandlers[i]=null}else{mockHandlers=[]}mockedAjaxCalls=[];unmockedAjaxCalls=[]};$.mockjaxClear=function(i){window.console&&window.console.warn&&window.console.warn("DEPRECATED: The $.mockjaxClear() method has been deprecated in 1.6.0. Please use $.mockjax.clear() as the older function will be removed soon!");$.mockjax.clear()};$.mockjax.handler=function(i){if(arguments.length==1){return mockHandlers[i]}};$.mockjax.mockedAjaxCalls=function(){return mockedAjaxCalls};$.mockjax.unfiredHandlers=function(){var results=[];for(var i=0,len=mockHandlers.length;i<len;i++){var handler=mockHandlers[i];if(handler!==null&&!handler.fired){results.push(handler)}}return results};$.mockjax.unmockedAjaxCalls=function(){return unmockedAjaxCalls}})(jQuery);
|
@@ -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.7.
|
4
|
+
s.version = "0.7.5"
|
5
5
|
s.platform = Gem::Platform::RUBY
|
6
6
|
s.authors = ["Daniel Sudol", "Alex Opak"]
|
7
7
|
s.email = ["dansudol@yahoo.com", "opak.alexandr@gmail.com"]
|
data/package.json
CHANGED
data/src/factory_guy.js
CHANGED
@@ -158,9 +158,9 @@ FactoryGuy = {
|
|
158
158
|
Given a fixture name like 'person' or 'dude' determine what model this name
|
159
159
|
refers to. In this case it's 'person' for each one.
|
160
160
|
|
161
|
-
@param {String} name
|
161
|
+
@param {String} name a fixture name could be model name like 'person'
|
162
162
|
or a named person in model definition like 'dude'
|
163
|
-
@returns {String} model
|
163
|
+
@returns {String} model name associated with fixture name or undefined if not found
|
164
164
|
*/
|
165
165
|
lookupModelForFixtureName: function (name) {
|
166
166
|
var definition = this.lookupDefinitionForFixtureName(name);
|
@@ -190,11 +190,11 @@ FactoryGuy = {
|
|
190
190
|
FactoryGuy.build('bob') for a 'bob' User
|
191
191
|
FactoryGuy.build('bob', 'dude') for a 'bob' User with dude traits
|
192
192
|
FactoryGuy.build('bob', 'dude', 'funny') for a 'bob' User with dude and funny traits
|
193
|
-
FactoryGuy.build('bob', 'dude', name: 'wombat') for a 'bob' User with dude trait and custom attribute name of 'wombat'
|
193
|
+
FactoryGuy.build('bob', 'dude', {name: 'wombat'}) for a 'bob' User with dude trait and custom attribute name of 'wombat'
|
194
194
|
|
195
|
-
@param {String} name
|
196
|
-
@param {String} trait trait
|
197
|
-
@param {Object} opts
|
195
|
+
@param {String} name fixture name
|
196
|
+
@param {String} trait optional trait names ( one or more )
|
197
|
+
@param {Object} opts optional fixture options that will override default fixture values
|
198
198
|
@returns {Object} json fixture
|
199
199
|
*/
|
200
200
|
build: function () {
|
@@ -208,6 +208,7 @@ FactoryGuy = {
|
|
208
208
|
opts = args.pop();
|
209
209
|
}
|
210
210
|
var traits = args; // whatever is left are traits
|
211
|
+
|
211
212
|
var definition = this.lookupDefinitionForFixtureName(name);
|
212
213
|
if (!definition) {
|
213
214
|
throw new Error("Can't find that factory named [" + name + "]");
|
@@ -221,10 +222,10 @@ FactoryGuy = {
|
|
221
222
|
FactoryGuy.buildList('user', 2) for 2 User models
|
222
223
|
FactoryGuy.build('bob', 2) for 2 User model with bob attributes
|
223
224
|
|
224
|
-
@param {String} name
|
225
|
-
@param {Number} number
|
226
|
-
@param {String} trait (one or more)
|
227
|
-
@param {Object} opts options that will override default fixture values
|
225
|
+
@param {String} name fixture name
|
226
|
+
@param {Number} number number of fixtures to create
|
227
|
+
@param {String} trait optional traits (one or more)
|
228
|
+
@param {Object} opts optional fixture options that will override default fixture values
|
228
229
|
@returns {Array} list of fixtures
|
229
230
|
*/
|
230
231
|
buildList: function () {
|
@@ -80,15 +80,15 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
80
80
|
$.mockjax(request);
|
81
81
|
},
|
82
82
|
|
83
|
+
|
83
84
|
/**
|
84
85
|
Build the json used for creating or finding a record.
|
85
86
|
|
86
|
-
@param {String}
|
87
|
-
@param {
|
87
|
+
@param {String} modelName model name like 'user'
|
88
|
+
@param {String} fixture the fixture data
|
89
|
+
@return {Object} json response used for mocking a request
|
88
90
|
*/
|
89
|
-
buildAjaxHttpResponse: function (
|
90
|
-
var fixture = FactoryGuy.build(name, opts);
|
91
|
-
var modelName = FactoryGuy.lookupModelForFixtureName(name);
|
91
|
+
buildAjaxHttpResponse: function (modelName, fixture) {
|
92
92
|
if (this.usingActiveModelSerializer(modelName)) {
|
93
93
|
this.toSnakeCase(fixture);
|
94
94
|
}
|
@@ -97,6 +97,26 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
97
97
|
return hash;
|
98
98
|
},
|
99
99
|
|
100
|
+
|
101
|
+
_collectArgs: function (args, fromMethod) {
|
102
|
+
var args = Array.prototype.slice.call(arguments);
|
103
|
+
var name = args.shift();
|
104
|
+
if (!name) {
|
105
|
+
throw new Error(fromMethod + " needs a factory name to build");
|
106
|
+
}
|
107
|
+
var succeed = true;
|
108
|
+
if (Ember.typeOf(args[args.length-1]) == 'boolean') {
|
109
|
+
succeed = args.pop();
|
110
|
+
}
|
111
|
+
var opts = {}
|
112
|
+
if (Ember.typeOf(args[args.length-1]) == 'object') {
|
113
|
+
opts = args.pop();
|
114
|
+
}
|
115
|
+
var traits = args; // whatever is left are traits
|
116
|
+
|
117
|
+
return {name: name, traits: traits, opts: opts, succeed: succeed}
|
118
|
+
},
|
119
|
+
|
100
120
|
/**
|
101
121
|
Convert Object's keys to snake case
|
102
122
|
|
@@ -124,95 +144,104 @@ FactoryGuyTestMixin = Em.Mixin.create({
|
|
124
144
|
},
|
125
145
|
|
126
146
|
|
127
|
-
handleSideloadFind: function (modelName, json, sideload) {
|
128
|
-
var id = json.id
|
129
|
-
var url = this.buildURL(modelName, id);
|
130
|
-
var responseJson = {};
|
131
|
-
responseJson[modelName] = json;
|
132
|
-
$.extend(responseJson, sideload)
|
133
|
-
|
134
|
-
this.stubEndpointForHttpRequest(
|
135
|
-
url,
|
136
|
-
responseJson,
|
137
|
-
{type: 'GET', status: (status || 200)}
|
138
|
-
)
|
139
|
-
},
|
140
|
-
|
141
|
-
|
142
147
|
/**
|
143
|
-
Handling ajax GET
|
144
|
-
failed find by passing in
|
145
|
-
|
146
|
-
@param {String} name of the fixture ( or model ) to find
|
147
|
-
@param {
|
148
|
-
@param {
|
149
|
-
|
150
|
-
|
148
|
+
Handling ajax GET for finding all records for a type of model.
|
149
|
+
You can mock failed find by passing in success argument as false.
|
150
|
+
|
151
|
+
@param {String} name name of the fixture ( or model ) to find
|
152
|
+
@param {Number} number number of fixtures to create
|
153
|
+
@param {String} trait optional traits (one or more)
|
154
|
+
@param {Object} opts optional fixture options
|
155
|
+
@return {Object} json response
|
156
|
+
*/
|
157
|
+
handleFindMany: function () {
|
158
|
+
var store = this.getStore();
|
159
|
+
// make the records and load them in the store
|
160
|
+
store.makeList.apply(store,arguments);
|
161
|
+
|
162
|
+
var name = arguments[0];
|
151
163
|
var modelName = FactoryGuy.lookupModelForFixtureName(name);
|
152
|
-
var responseJson =
|
153
|
-
|
154
|
-
var url = this.buildURL(modelName
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
{type: 'GET', status: (status || 200)}
|
159
|
-
)
|
160
|
-
return responseJson;
|
164
|
+
var responseJson = {};
|
165
|
+
responseJson[modelName]=[];
|
166
|
+
var url = this.buildURL(modelName);
|
167
|
+
// mock the ajax call, but return nothing, since the records will be
|
168
|
+
// retrieved since they are already in the store
|
169
|
+
this.stubEndpointForHttpRequest(url, responseJson, {type: 'GET'})
|
161
170
|
},
|
162
171
|
|
163
172
|
/**
|
164
173
|
Handling ajax POST ( create record ) for a model. You can mock
|
165
|
-
failed create by passing in
|
174
|
+
failed create by passing in success argument as false.
|
166
175
|
|
167
|
-
@param {String} name of the fixture ( or model ) to create
|
168
|
-
@param {
|
169
|
-
@param {
|
176
|
+
@param {String} name name of the fixture ( or model ) to create
|
177
|
+
@param {String} trait optional traits ( one or more )
|
178
|
+
@param {Object} opts optional fixture options
|
179
|
+
@return {Object} json response
|
170
180
|
*/
|
171
|
-
handleCreate: function (
|
181
|
+
handleCreate: function () {
|
182
|
+
var args = Array.prototype.slice.call(arguments);
|
183
|
+
|
184
|
+
var succeed = true;
|
185
|
+
if (Ember.typeOf(args[args.length-1]) == 'boolean') {
|
186
|
+
succeed = args.pop();
|
187
|
+
}
|
188
|
+
|
189
|
+
var name = args[0];
|
172
190
|
var modelName = FactoryGuy.lookupModelForFixtureName(name);
|
173
|
-
var responseJson = this.buildAjaxHttpResponse(name, opts);
|
174
191
|
var url = this.buildURL(modelName);
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
192
|
+
var responseJson = {};
|
193
|
+
var httpOptions = {type: 'POST'}
|
194
|
+
|
195
|
+
if (succeed) {
|
196
|
+
var store = this.getStore();
|
197
|
+
// make the records and load them in the store
|
198
|
+
var model = store.makeFixture.apply(store,args);
|
199
|
+
responseJson[modelName]=model;
|
200
|
+
} else {
|
201
|
+
httpOptions.status = 500;
|
202
|
+
}
|
203
|
+
this.stubEndpointForHttpRequest(url, responseJson, httpOptions)
|
181
204
|
},
|
182
205
|
|
183
206
|
/**
|
184
207
|
Handling ajax PUT ( update record ) for a model type. You can mock
|
185
|
-
failed update by passing in
|
208
|
+
failed update by passing in success argument as false.
|
186
209
|
|
187
|
-
@param {String} type
|
188
|
-
@param {String} id
|
189
|
-
@param {
|
210
|
+
@param {String} type model type like 'user' for User model
|
211
|
+
@param {String} id id of record to update
|
212
|
+
@param {Boolean} succeed optional flag to indicate if the request
|
213
|
+
should succeed ( default is true )
|
190
214
|
*/
|
191
|
-
handleUpdate: function (type, id,
|
215
|
+
handleUpdate: function (type, id, succeed) {
|
216
|
+
succeed = succeed === undefined ? true : succeed;
|
217
|
+
|
192
218
|
this.stubEndpointForHttpRequest(
|
193
219
|
this.buildURL(type, id),
|
194
220
|
{},
|
195
|
-
{type: 'PUT', status: (
|
221
|
+
{type: 'PUT', status: (succeed ? 200 : 500)}
|
196
222
|
)
|
197
223
|
},
|
198
224
|
|
199
225
|
/**
|
200
226
|
Handling ajax DELETE ( delete record ) for a model type. You can mock
|
201
|
-
failed delete by passing in
|
227
|
+
failed delete by passing in success argument as false.
|
202
228
|
|
203
|
-
@param {String} type
|
204
|
-
@param {String} id
|
205
|
-
@param {
|
229
|
+
@param {String} type model type like 'user' for User model
|
230
|
+
@param {String} id id of record to update
|
231
|
+
@param {Boolean} succeed optional flag to indicate if the request
|
232
|
+
should succeed ( default is true )
|
206
233
|
*/
|
207
|
-
handleDelete: function (type, id,
|
234
|
+
handleDelete: function (type, id, succeed) {
|
235
|
+
succeed = succeed === undefined ? true : succeed;
|
236
|
+
|
208
237
|
this.stubEndpointForHttpRequest(
|
209
238
|
this.buildURL(type, id),
|
210
239
|
{},
|
211
|
-
{type: 'DELETE', status: (
|
240
|
+
{type: 'DELETE', status: (succeed ? 200 : 500)}
|
212
241
|
)
|
213
242
|
},
|
214
243
|
|
215
244
|
teardown: function () {
|
216
245
|
FactoryGuy.resetModels(this.getStore());
|
217
246
|
}
|
218
|
-
})
|
247
|
+
});
|
data/src/store.js
CHANGED
@@ -9,40 +9,47 @@ DS.Store.reopen({
|
|
9
9
|
|
10
10
|
/**
|
11
11
|
Make new fixture and save to store. If the store is using FixtureAdapter,
|
12
|
-
will push to FIXTURE array, otherwise will use push method on adapter
|
12
|
+
will push to FIXTURE array, otherwise will use push method on adapter to load
|
13
|
+
the record into the store
|
13
14
|
|
14
|
-
@param {String} name name
|
15
|
-
@param {
|
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
|
16
18
|
@returns {Object|DS.Model} json or record depending on the adapter type
|
17
19
|
*/
|
18
|
-
makeFixture: function (
|
20
|
+
makeFixture: function () {
|
19
21
|
var store = this;
|
22
|
+
var fixture = FactoryGuy.build.apply(FactoryGuy,arguments);
|
23
|
+
var name = arguments[0];
|
20
24
|
var modelName = FactoryGuy.lookupModelForFixtureName(name);
|
21
|
-
var fixture = FactoryGuy.build(name, options);
|
22
25
|
var modelType = store.modelFor(modelName);
|
23
26
|
|
24
27
|
if (this.usingFixtureAdapter()) {
|
25
28
|
this.setAssociationsForFixtureAdapter(modelType, modelName, fixture);
|
26
29
|
return FactoryGuy.pushFixture(modelType, fixture);
|
27
30
|
} else {
|
28
|
-
|
29
|
-
|
30
|
-
var model;
|
31
|
-
Em.run(function () {
|
32
|
-
store.findEmbeddedAssociationsForRESTAdapter(modelType, fixture);
|
33
|
-
if (fixture.type) {
|
34
|
-
// assuming its polymorphic if there is a type attribute
|
35
|
-
// is this too bold an assumption?
|
36
|
-
modelName = fixture.type.underscore();
|
37
|
-
modelType = store.modelFor(modelName);
|
38
|
-
}
|
39
|
-
model = store.push(modelName, fixture);
|
40
|
-
store.setAssociationsForRESTAdapter(modelType, modelName, model);
|
41
|
-
});
|
42
|
-
return model;
|
31
|
+
return store.makeModel(modelType, fixture)
|
43
32
|
}
|
44
33
|
},
|
45
34
|
|
35
|
+
makeModel: function (modelType, fixture) {
|
36
|
+
var store = this,
|
37
|
+
modelName = store.modelFor(modelType).typeKey,
|
38
|
+
model;
|
39
|
+
Em.run(function () {
|
40
|
+
store.findEmbeddedAssociationsForRESTAdapter(modelType, fixture);
|
41
|
+
if (fixture.type) {
|
42
|
+
// assuming its polymorphic if there is a type attribute
|
43
|
+
// is this too bold an assumption?
|
44
|
+
modelName = fixture.type.underscore();
|
45
|
+
modelType = store.modelFor(modelName);
|
46
|
+
}
|
47
|
+
model = store.push(modelName, fixture);
|
48
|
+
store.setAssociationsForRESTAdapter(modelType, modelName, model);
|
49
|
+
});
|
50
|
+
return model;
|
51
|
+
},
|
52
|
+
|
46
53
|
/**
|
47
54
|
Make a list of Fixtures
|
48
55
|
|
@@ -51,10 +58,11 @@ DS.Store.reopen({
|
|
51
58
|
@param {Object} options fixture options
|
52
59
|
@returns {Array} list of json fixtures or records depending on the adapter type
|
53
60
|
*/
|
54
|
-
makeList: function (
|
61
|
+
makeList: function () {
|
55
62
|
var arr = [];
|
63
|
+
var number = arguments[1];
|
56
64
|
for (var i = 0; i < number; i++) {
|
57
|
-
arr.push(this.makeFixture(
|
65
|
+
arr.push(this.makeFixture.apply(this,arguments));
|
58
66
|
}
|
59
67
|
return arr;
|
60
68
|
},
|
@@ -128,7 +136,8 @@ DS.Store.reopen({
|
|
128
136
|
},
|
129
137
|
|
130
138
|
/**
|
131
|
-
Before pushing the fixture to the store, do some preprocessing.
|
139
|
+
Before pushing the fixture to the store, do some preprocessing. Descend into the tree
|
140
|
+
of object data, and convert child objects to record instances recursively.
|
132
141
|
|
133
142
|
If its a belongs to association, and the fixture has an object there,
|
134
143
|
then push that model to the store and set the id of that new model
|
@@ -150,12 +159,11 @@ DS.Store.reopen({
|
|
150
159
|
}
|
151
160
|
if (relationship.kind == 'hasMany') {
|
152
161
|
var hasManyRecords = fixture[relationship.key];
|
153
|
-
// if the records are objects and not instances they need to be converted to
|
154
|
-
// instances
|
155
162
|
if (Ember.typeOf(hasManyRecords) == 'array') {
|
156
163
|
if (Ember.typeOf(hasManyRecords[0]) == 'object') {
|
157
164
|
var records = Em.A()
|
158
165
|
hasManyRecords.map(function (object) {
|
166
|
+
store.findEmbeddedAssociationsForRESTAdapter(relationship.type, object);
|
159
167
|
var record = store.push(relationship.type, object);
|
160
168
|
records.push(record);
|
161
169
|
return record;
|
@@ -212,7 +220,6 @@ DS.Store.reopen({
|
|
212
220
|
}
|
213
221
|
})
|
214
222
|
}
|
215
|
-
|
216
223
|
})
|
217
224
|
},
|
218
225
|
|
@@ -44,16 +44,11 @@ module('DS.Store#makeFixture with ActiveModelAdapter', {
|
|
44
44
|
});
|
45
45
|
|
46
46
|
|
47
|
-
test("creates DS.Model instances", function() {
|
48
|
-
var user = store.makeFixture('user');
|
49
|
-
equal(user instanceof DS.Model, true);
|
50
|
-
});
|
51
|
-
|
52
|
-
|
53
47
|
asyncTest("creates records in the store", function() {
|
54
48
|
var user = store.makeFixture('user');
|
49
|
+
ok(user instanceof User);
|
55
50
|
|
56
|
-
store.find('user', user.id).then
|
51
|
+
store.find('user', user.id).then(function(store_user) {
|
57
52
|
ok(store_user == user);
|
58
53
|
start()
|
59
54
|
});
|
@@ -62,7 +57,22 @@ asyncTest("creates records in the store", function() {
|
|
62
57
|
|
63
58
|
test("handles camelCase attributes", function() {
|
64
59
|
var profile = store.makeFixture('profile', {camelCaseDescription: 'description'});
|
65
|
-
ok(
|
60
|
+
ok(profile.get('camelCaseDescription') == 'description')
|
61
|
+
});
|
62
|
+
|
63
|
+
test("makeFixture with fixture options", function() {
|
64
|
+
var profile = store.makeFixture('profile', {description: 'dude'});
|
65
|
+
ok(profile.get('description') == 'dude');
|
66
|
+
});
|
67
|
+
|
68
|
+
test("makeFixture with traits", function() {
|
69
|
+
var profile = store.makeFixture('profile', 'goofy_description');
|
70
|
+
ok(profile.get('description') == 'goofy');
|
71
|
+
});
|
72
|
+
|
73
|
+
test("makeFixture with traits and fixture options ", function() {
|
74
|
+
var profile = store.makeFixture('profile', 'goofy_description', {description: 'dude'});
|
75
|
+
ok(profile.get('description') == 'dude');
|
66
76
|
});
|
67
77
|
|
68
78
|
|
@@ -219,14 +229,6 @@ test("belongsTo associations defined as attributes in fixture", function() {
|
|
219
229
|
ok(project.get('user.name') == 'Admin');
|
220
230
|
});
|
221
231
|
|
222
|
-
test("belongsTo with embedded hasMany associations", function() {
|
223
|
-
var project = store.makeFixture('project', 'with_user_having_hats');
|
224
|
-
var user = project.get('user');
|
225
|
-
var hats = user.get('hats');
|
226
|
-
|
227
|
-
ok(user.get('projects.firstObject') == project)
|
228
|
-
ok(hats.get('firstObject.user') == user)
|
229
|
-
});
|
230
232
|
|
231
233
|
|
232
234
|
test("hasMany associations defined as attributes in fixture", function() {
|
@@ -245,6 +247,26 @@ test("hasMany associations defined with traits", function() {
|
|
245
247
|
})
|
246
248
|
|
247
249
|
|
250
|
+
test("with (nested json fixture) belongsTo has a hasMany association which has a belongsTo", function() {
|
251
|
+
var project = store.makeFixture('project', 'with_user_having_hats_belonging_to_outfit');
|
252
|
+
var user = project.get('user');
|
253
|
+
var hats = user.get('hats');
|
254
|
+
var firstHat = hats.get('firstObject');
|
255
|
+
var lastHat = hats.get('lastObject');
|
256
|
+
|
257
|
+
ok(user.get('projects.firstObject') == project)
|
258
|
+
ok(firstHat.get('user') == user)
|
259
|
+
ok(firstHat.get('outfit.id') == 1)
|
260
|
+
ok(firstHat.get('outfit.hats.length') == 1)
|
261
|
+
ok(firstHat.get('outfit.hats.firstObject') == firstHat)
|
262
|
+
|
263
|
+
ok(lastHat.get('user') == user)
|
264
|
+
ok(lastHat.get('outfit.id') == 2)
|
265
|
+
ok(lastHat.get('outfit.hats.length') == 1)
|
266
|
+
ok(lastHat.get('outfit.hats.firstObject') == lastHat)
|
267
|
+
});
|
268
|
+
|
269
|
+
|
248
270
|
module('DS.Store#makeList with ActiveModelAdapter', {
|
249
271
|
setup: function() {
|
250
272
|
testHelper = TestHelper.setup(DS.ActiveModelAdapter);
|
@@ -260,47 +282,9 @@ test("creates list of DS.Model instances", function() {
|
|
260
282
|
var users = store.makeList('user', 2);
|
261
283
|
equal(users.length, 2);
|
262
284
|
ok(users[0] instanceof DS.Model == true);
|
263
|
-
});
|
264
|
-
|
265
|
-
|
266
|
-
test("creates records in the store", function() {
|
267
|
-
var users = store.makeList('user', 2);
|
268
285
|
|
269
286
|
var storeUsers = store.all('user').get('content');
|
270
287
|
ok(storeUsers[0] == users[0]);
|
271
288
|
ok(storeUsers[1] == users[1]);
|
272
289
|
});
|
273
290
|
|
274
|
-
|
275
|
-
|
276
|
-
module('DS.Store with ActiveModelAdapter', {
|
277
|
-
setup: function() {
|
278
|
-
testHelper = TestHelper.setup(DS.ActiveModelAdapter);
|
279
|
-
store = testHelper.getStore();
|
280
|
-
},
|
281
|
-
teardown: function() {
|
282
|
-
Em.run(function() { testHelper.teardown(); });
|
283
|
-
}
|
284
|
-
});
|
285
|
-
|
286
|
-
|
287
|
-
asyncTest("#createRecord (with mockjax) handles model's camelCase attributes", function() {
|
288
|
-
testHelper.handleCreate('profile', {camelCaseDescription: 'description'})
|
289
|
-
|
290
|
-
store.createRecord('profile').save().then(function(profile) {
|
291
|
-
ok(!!profile.get('camelCaseDescription'))
|
292
|
-
start();
|
293
|
-
});
|
294
|
-
});
|
295
|
-
|
296
|
-
|
297
|
-
asyncTest("#find (with mockajax) handles model's camelCase attributes", function() {
|
298
|
-
var responseJson = testHelper.handleFind('profile', {camelCaseDescription: 'description'})
|
299
|
-
var id = responseJson.profile.id
|
300
|
-
|
301
|
-
store.find('profile', id).then(function(profile) {
|
302
|
-
ok(!!profile.get('camelCaseDescription'))
|
303
|
-
start();
|
304
|
-
});
|
305
|
-
});
|
306
|
-
|