ember-data-factory-guy 0.7.3 → 0.7.5

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.
@@ -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.3"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.7.3",
3
+ "version": "0.7.5",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
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 a fixture name could be model name like 'person'
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 name associated with fixture name or undefined if not found
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 Fixture name
196
- @param {String} trait trait name ( can be more than one )
197
- @param {Object} opts Options that will override default fixture values
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 fixture name
225
- @param {Number} number number of fixtures to create
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} name of the fixture ( or model ) to create/find
87
- @param {Object} opts fixture options
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 (name, opts) {
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 ( find record ) for a model. You can mock
144
- failed find by passing in status of 500.
145
-
146
- @param {String} name of the fixture ( or model ) to find
147
- @param {Object} opts fixture options
148
- @param {Integer} status Optional HTTP status response code
149
- */
150
- handleFind: function (name, opts, status) {
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 = this.buildAjaxHttpResponse(name, opts);
153
- var id = responseJson[modelName].id
154
- var url = this.buildURL(modelName, id);
155
- this.stubEndpointForHttpRequest(
156
- url,
157
- responseJson,
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 status of 500.
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 {Object} opts fixture options
169
- @param {Integer} status Optional HTTP status response code
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 (name, opts, status) {
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
- this.stubEndpointForHttpRequest(
176
- url,
177
- responseJson,
178
- {type: 'POST', status: (status || 200)}
179
- )
180
- return responseJson;
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 status of 500.
208
+ failed update by passing in success argument as false.
186
209
 
187
- @param {String} type model type like 'user' for User model
188
- @param {String} id id of record to update
189
- @param {Integer} status Optional HTTP status response code
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, status) {
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: (status || 200)}
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 status of 500.
227
+ failed delete by passing in success argument as false.
202
228
 
203
- @param {String} type model type like 'user' for User model
204
- @param {String} id id of record to update
205
- @param {Integer} status Optional HTTP status response code
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, status) {
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: (status || 200)}
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 of fixture
15
- @param {Object} options fixture options
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 (name, options) {
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
- var store = this;
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 (name, number, options) {
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(name, options))
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 ( function(store_user) {
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(!!profile.get('camelCaseDescription'))
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
-