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.
@@ -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
-