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