ember-data-factory-guy 0.9.6 → 0.9.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 144fe2b151234c1c12f5fbc7c65ec2b10041a9cc
4
- data.tar.gz: 2bce284e264f02e5fe52b7873e547b8269054d48
3
+ metadata.gz: 635976ca31386b3b5023526335088bfd90ca80b6
4
+ data.tar.gz: 3cd896fa342d199cabe1f977ae5064170e0f015f
5
5
  SHA512:
6
- metadata.gz: ab291d9acdf10c07f817e3e1472001e85dfff454b9f5e58b1708b358b2f8a0f1105e8891030ddc89fd710523c82a90b14324d717bf549c717558efedd264bfa5
7
- data.tar.gz: 625aaea6c2fbc4098cd96855605ec34a5cd13a51b9d38b6c777cd8b6775dc7bdabb626d800ce4537037fe463ed2989f2dd47ea9bc3af816b90bd375a2b0d9461
6
+ metadata.gz: bc167c9d68080b700f68ce04f97caff52e377582fa9693c145aa9be5beadeb14a8f78ae1b3888f14b5ac13203fa3416c04c8c2892eaeef1924b8b734a86e247f
7
+ data.tar.gz: 6138a1ed022f6ee1a2d941dd9c214f5248ba79ab25e4d0dec18ba513a9b0b66c4f89ffbc83fe43c12596543a5a0eb4fda2dfe898656c88ffa220cd3661383fa5
data/Gruntfile.js CHANGED
@@ -39,6 +39,7 @@ module.exports = function(grunt) {
39
39
  'src/sequence.js',
40
40
  'src/model_definition.js',
41
41
  'src/factory_guy.js',
42
+ 'src/mock_create_request.js',
42
43
  'src/store.js',
43
44
  'src/factory_guy_test_mixin.js',
44
45
  'bower_components/jquery-mockjax/jquery.mockjax.js'],
data/README.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Ember Data Factory Guy [![Build Status](https://secure.travis-ci.org/danielspaniel/ember-data-factory-guy.png?branch=master)](http://travis-ci.org/danielspaniel/ember-data-factory-guy)
2
2
 
3
+ Feel the thrill and enjoyment of testing when using Factories instead of Fixtures.
4
+ Factories simplify the process of testing, making you more efficient and your tests more readable.
5
+
6
+
3
7
  *NOTE*
4
8
 
5
9
  ember-data is changing the way they are doing relationships in 1.0.0-beta.10 and above
@@ -10,7 +14,7 @@ of ember-data-factory-guy.
10
14
  - 0.6.4 -> ember-data-1.0.0-beta.8 and under
11
15
  - 0.7.1.1 -> ember-data-1.0.0-beta.10
12
16
  - 0.8.6 -> ember-data-1.0.0-beta.11
13
- - 0.9.5 -> ember-data-1.0.0-beta.12
17
+ - 0.9.6 -> ember-data-1.0.0-beta.12
14
18
 
15
19
  **Waiting for ember-data-1.0.0-beta.15 to make upgrade release, since there are a few issues with
16
20
  ember-data-1.0.0-beta.14.1 that make it difficult to use**
@@ -42,7 +46,7 @@ gem 'ember-data-factory-guy', group: test
42
46
  or for particular version:
43
47
 
44
48
  ```ruby
45
- gem 'ember-data-factory-guy', '0.9.5', group: test
49
+ gem 'ember-data-factory-guy', '0.9.6', group: test
46
50
  ```
47
51
 
48
52
  then:
@@ -77,7 +81,7 @@ or for particular version:
77
81
  "dependencies": {
78
82
  "foo-dependency": "latest",
79
83
  "other-foo-dependency": "latest",
80
- "ember-data-factory-guy": "0.9.5"
84
+ "ember-data-factory-guy": "0.9.6"
81
85
  }
82
86
  ```
83
87
 
@@ -736,7 +740,7 @@ Realistically, you will have code in a view action or controller action that wil
736
740
 
737
741
  In this case, you are are creating a 'project' record with a specific name, and belonging
738
742
  to a particular user. To mock this createRecord call here are a few ways to do this using
739
- match and or returns options.
743
+ chainable methods, or options hash.
740
744
 
741
745
 
742
746
  ######Using chainable methods
data/bower.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.9.6",
3
+ "version": "0.9.7",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
@@ -584,8 +584,9 @@ var MockCreateRequest = function(url, store, modelName, options) {
584
584
 
585
585
  this.calculate = function() {
586
586
  if (matchArgs) {
587
- var record = store.createRecord(modelName, matchArgs);
588
- expectedRequest = record.serialize();
587
+ var tmpRecord = store.createRecord(modelName, matchArgs);
588
+ expectedRequest = tmpRecord.serialize(matchArgs);
589
+ tmpRecord.deleteRecord();
589
590
  }
590
591
 
591
592
  if (succeed) {
@@ -1001,6 +1002,34 @@ var FactoryGuyTestMixin = Em.Mixin.create({
1001
1002
  var type = this.getStore().modelFor(typeName);
1002
1003
  return this.getStore().adapterFor(type).buildURL(type.typeKey, id);
1003
1004
  },
1005
+ /**
1006
+ Map many json objects to response json.
1007
+
1008
+ Allows custom serializing mappings and meta data to be added to requests.
1009
+
1010
+ @param {String} modelName model name
1011
+ @param {Object} json Json objects from records.map
1012
+ @return {Object} responseJson
1013
+ */
1014
+ mapFindAll: function(modelName, json) {
1015
+ var responseJson = {};
1016
+ responseJson[modelName.pluralize()] = json;
1017
+ return responseJson;
1018
+ },
1019
+ /**
1020
+ Map single object to response json.
1021
+
1022
+ Allows custom serializing mappings and meta data to be added to requests.
1023
+
1024
+ @param {String} modelName model name
1025
+ @param {Object} json Json object from record.toJSON
1026
+ @return {Object} responseJson
1027
+ */
1028
+ mapFind:function(modelName, json){
1029
+ var responseJson = {};
1030
+ responseJson[modelName.pluralize()] = json;
1031
+ return responseJson;
1032
+ },
1004
1033
  /**
1005
1034
  Handling ajax GET for finding all records for a type of model.
1006
1035
  You can mock failed find by passing in success argument as false.
@@ -1026,9 +1055,8 @@ var FactoryGuyTestMixin = Em.Mixin.create({
1026
1055
  var records = FactoryGuy.makeList.apply(FactoryGuy, arguments);
1027
1056
  var name = arguments[0];
1028
1057
  var modelName = FactoryGuy.lookupModelForFixtureName(name);
1029
- var responseJson = {};
1030
1058
  var json = records.map(function(record) {return record.toJSON({includeId: true})});
1031
- responseJson[modelName.pluralize()] = json;
1059
+ var responseJson = this.mapFindAll(modelName, json);
1032
1060
  var url = this.buildURL(modelName);
1033
1061
  this.stubEndpointForHttpRequest(url, responseJson);
1034
1062
  },
@@ -1070,9 +1098,8 @@ var FactoryGuyTestMixin = Em.Mixin.create({
1070
1098
  modelName = FactoryGuy.lookupModelForFixtureName(name);
1071
1099
  }
1072
1100
 
1073
- var responseJson = {};
1074
1101
  var json = record.toJSON({includeId: true});
1075
- responseJson[modelName.pluralize()] = json;
1102
+ var responseJson = this.mapFind(modelName, json);
1076
1103
  var url = this.buildURL(modelName, record.id);
1077
1104
  this.stubEndpointForHttpRequest(url, responseJson);
1078
1105
  },
@@ -1118,8 +1145,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
1118
1145
  records = []
1119
1146
  }
1120
1147
  var json = records.map(function(record) {return record.toJSON({includeId: true})})
1121
- var responseJson = {};
1122
- responseJson[modelName.pluralize()] = json;
1148
+ var responseJson = this.mapFindAll(modelName, json);
1123
1149
  var url = this.buildURL(modelName);
1124
1150
  this.stubEndpointForHttpRequest(url, responseJson, {urlParams: searchParams});
1125
1151
  },
@@ -579,8 +579,9 @@ var MockCreateRequest = function(url, store, modelName, options) {
579
579
 
580
580
  this.calculate = function() {
581
581
  if (matchArgs) {
582
- var record = store.createRecord(modelName, matchArgs);
583
- expectedRequest = record.serialize();
582
+ var tmpRecord = store.createRecord(modelName, matchArgs);
583
+ expectedRequest = tmpRecord.serialize(matchArgs);
584
+ tmpRecord.deleteRecord();
584
585
  }
585
586
 
586
587
  if (succeed) {
@@ -996,6 +997,34 @@ var FactoryGuyTestMixin = Em.Mixin.create({
996
997
  var type = this.getStore().modelFor(typeName);
997
998
  return this.getStore().adapterFor(type).buildURL(type.typeKey, id);
998
999
  },
1000
+ /**
1001
+ Map many json objects to response json.
1002
+
1003
+ Allows custom serializing mappings and meta data to be added to requests.
1004
+
1005
+ @param {String} modelName model name
1006
+ @param {Object} json Json objects from records.map
1007
+ @return {Object} responseJson
1008
+ */
1009
+ mapFindAll: function(modelName, json) {
1010
+ var responseJson = {};
1011
+ responseJson[modelName.pluralize()] = json;
1012
+ return responseJson;
1013
+ },
1014
+ /**
1015
+ Map single object to response json.
1016
+
1017
+ Allows custom serializing mappings and meta data to be added to requests.
1018
+
1019
+ @param {String} modelName model name
1020
+ @param {Object} json Json object from record.toJSON
1021
+ @return {Object} responseJson
1022
+ */
1023
+ mapFind:function(modelName, json){
1024
+ var responseJson = {};
1025
+ responseJson[modelName.pluralize()] = json;
1026
+ return responseJson;
1027
+ },
999
1028
  /**
1000
1029
  Handling ajax GET for finding all records for a type of model.
1001
1030
  You can mock failed find by passing in success argument as false.
@@ -1021,9 +1050,8 @@ var FactoryGuyTestMixin = Em.Mixin.create({
1021
1050
  var records = FactoryGuy.makeList.apply(FactoryGuy, arguments);
1022
1051
  var name = arguments[0];
1023
1052
  var modelName = FactoryGuy.lookupModelForFixtureName(name);
1024
- var responseJson = {};
1025
1053
  var json = records.map(function(record) {return record.toJSON({includeId: true})});
1026
- responseJson[modelName.pluralize()] = json;
1054
+ var responseJson = this.mapFindAll(modelName, json);
1027
1055
  var url = this.buildURL(modelName);
1028
1056
  this.stubEndpointForHttpRequest(url, responseJson);
1029
1057
  },
@@ -1065,9 +1093,8 @@ var FactoryGuyTestMixin = Em.Mixin.create({
1065
1093
  modelName = FactoryGuy.lookupModelForFixtureName(name);
1066
1094
  }
1067
1095
 
1068
- var responseJson = {};
1069
1096
  var json = record.toJSON({includeId: true});
1070
- responseJson[modelName.pluralize()] = json;
1097
+ var responseJson = this.mapFind(modelName, json);
1071
1098
  var url = this.buildURL(modelName, record.id);
1072
1099
  this.stubEndpointForHttpRequest(url, responseJson);
1073
1100
  },
@@ -1113,8 +1140,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
1113
1140
  records = []
1114
1141
  }
1115
1142
  var json = records.map(function(record) {return record.toJSON({includeId: true})})
1116
- var responseJson = {};
1117
- responseJson[modelName.pluralize()] = json;
1143
+ var responseJson = this.mapFindAll(modelName, json);
1118
1144
  var url = this.buildURL(modelName);
1119
1145
  this.stubEndpointForHttpRequest(url, responseJson, {urlParams: searchParams});
1120
1146
  },
@@ -1 +1 @@
1
- var Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};var MissingSequenceError=function(message){this.toString=function(){return message}};if(FactoryGuy!==undefined){FactoryGuy.sequence=Sequence;FactoryGuy.missingSequenceError=MissingSequenceError}var ModelDefinition=function(model,config){var sequences={};var traits={};var defaultAttributes={};var namedModels={};var modelId=1;var sequenceName=null;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.nextId=function(){return modelId++};this.generate=function(name,sequenceFn){if(sequenceFn){if(!sequences[name]){sequences[name]=new Sequence(sequenceFn)}}var sequence=sequences[name];if(!sequence){throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+model+"' definition")}return sequence.next()};this.build=function(name,opts,traitArgs){var traitsObj={};traitArgs.forEach(function(trait){$.extend(traitsObj,traits[trait])});var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,traitsObj,opts);for(var attribute in fixture){if(Ember.typeOf(fixture[attribute])=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}else if(Ember.typeOf(fixture[attribute])=="object"){if(FactoryGuy.getStore()){if(FactoryGuy.isAttributeRelationship(this.model,attribute)){fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}else{fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}}if(!fixture.id){fixture.id=this.nextId()}return fixture};this.buildList=function(name,number,traits,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts,traits))}return arr};this.reset=function(){modelId=1;for(var name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseTraits=function(object){if(!object){return}traits=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(Ember.typeOf(sequenceFn)!="function"){throw new Error("Problem with ["+sequenceName+"] sequence definition. Sequences must be functions")}object[sequenceName]=new Sequence(sequenceFn)}sequences=object};var parseConfig=function(config){parseSequences(config.sequences);delete config.sequences;parseTraits(config.traits);delete config.traits;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};if(FactoryGuy!==undefined){FactoryGuy.modelDefiniton=ModelDefinition}var FactoryGuy={modelDefinitions:{},define:function(model,config){if(this.modelDefinitions[model]){this.modelDefinitions[model].merge(config)}else{this.modelDefinitions[model]=new ModelDefinition(model,config)}},setStore:function(store){Ember.assert("FactoryGuy#setStore needs a valid store instance.You passed in ["+store+"]",store instanceof DS.Store);this.store=store},getStore:function(){return this.store},isAttributeRelationship:function(typeName,attribute){if(!this.store){Ember.debug("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures");return true}var model=this.store.modelFor(typeName);return!!model.typeForRelationship(attribute)},generate:function(nameOrFunction){var sortaRandomName=Math.floor((1+Math.random())*65536).toString(16)+Date.now();return function(){if(Em.typeOf(nameOrFunction)=="function"){return this.generate(sortaRandomName,nameOrFunction)}else{return this.generate(nameOrFunction)}}},belongsTo:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},association:function(fixtureName,opts){Ember.deprecate("DEPRECATION Warning: use FactoryGuy.belongsTo instead");return this.belongsTo(fixtureName,opts)},hasMany:function(fixtureName,number,opts){return function(){return FactoryGuy.buildList(fixtureName,number,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName:function(name){for(var model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(){var args=Array.prototype.slice.call(arguments);var opts={};var name=args.shift();if(!name){throw new Error("Build needs a factory name to build")}if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts,traits)},buildList:function(){var args=Array.prototype.slice.call(arguments);var name=args.shift();var number=args.shift();if(!name||!number){throw new Error("buildList needs a name and a number ( at least ) to build with")}var opts={};if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,traits,opts)},make:function(){var store=this.store;Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures",store);var fixture=this.build.apply(this,arguments);var name=arguments[0];var modelName=this.lookupModelForFixtureName(name);var modelType=store.modelFor(modelName);if(store.usingFixtureAdapter()){store.setAssociationsForFixtureAdapter(modelType,modelName,fixture);fixture=FactoryGuy.pushFixture(modelType,fixture);store.loadModelForFixtureAdapter(modelType,fixture);return fixture}else{return store.makeModel(modelType,fixture)}},makeList:function(){Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures",this.store);var arr=[];var args=Array.prototype.slice.call(arguments);Ember.assert("makeList needs at least 2 arguments, a name and a number",args.length>=2);var number=args.splice(1,1)[0];Ember.assert("Second argument to makeList should be a number (of fixtures to make.)",typeof number=="number");for(var i=0;i<number;i++){arr.push(this.make.apply(this,args))}return arr},resetModels:function(store){for(var model in this.modelDefinitions){var definition=this.modelDefinitions[model];definition.reset();try{var modelType=store.modelFor(definition.model);if(store.usingFixtureAdapter()){modelType.FIXTURES=[]}store.unloadAll(modelType)}catch(e){console.log("resetModels",e)}}},pushFixture:function(modelClass,fixture){var index;if(!modelClass.FIXTURES){modelClass.FIXTURES=[]}index=this.indexOfFixture(modelClass.FIXTURES,fixture);if(index>-1){modelClass.FIXTURES.splice(index,1)}modelClass.FIXTURES.push(fixture);return fixture},indexOfFixture:function(fixtures,fixture){var index=-1,id=fixture.id+"";Ember.A(fixtures).find(function(r,i){if(""+Ember.get(r,"id")===id){index=i;return true}else{return false}});return index},clear:function(opts){if(!opts){this.modelDefinitions={}}}};var MockCreateRequest=function(url,store,modelName,options){var succeed=options.succeed===undefined?true:options.succeed;var matchArgs=options.match;var returnArgs=options.returns;var responseJson={};var expectedRequest={};var modelType=store.modelFor(modelName);this.calculate=function(){if(matchArgs){var record=store.createRecord(modelName,matchArgs);expectedRequest=record.serialize()}if(succeed){var definition=FactoryGuy.modelDefinitions[modelName];if(responseJson[modelName]){responseJson[modelName]=$.extend({id:responseJson[modelName].id},matchArgs,returnArgs)}else{responseJson[modelName]=$.extend({id:definition.nextId()},matchArgs,returnArgs)}Ember.get(modelType,"relationshipsByName").forEach(function(relationship){if(relationship.kind=="belongsTo"){delete responseJson[modelName][relationship.key]}})}};this.match=function(matches){matchArgs=matches;this.calculate();return this};this.andReturn=function(returns){returnArgs=returns;this.calculate();return this};this.andFail=function(){succeed=false;return this};this.handler=function(settings){if(settings.url!=url||settings.type!="POST"){return false}if(matchArgs){var requestData=JSON.parse(settings.data)[modelName];for(attribute in expectedRequest){if(expectedRequest[attribute]&&requestData[attribute]!=expectedRequest[attribute]){return false}}}var responseStatus=succeed?200:500;return{responseText:responseJson,status:responseStatus}};this.calculate();$.mockjax(this.handler)};(function(){DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(){Ember.deprecate("DEPRECATION Warning: use FactoryGuy.make instead");FactoryGuy.make.call(FactoryGuy,arguments)},makeList:function(){Ember.deprecate("DEPRECATION Warning: use FactoryGuy.makeList instead");FactoryGuy.makeList.call(FactoryGuy,arguments)},makeModel:function(modelType,fixture){var store=this,modelName=store.modelFor(modelType).typeKey,model;Em.run(function(){store.findEmbeddedAssociationsForRESTAdapter(modelType,fixture);if(fixture.type){modelName=fixture.type.underscore();modelType=store.modelFor(modelName)}model=store.push(modelName,fixture);store.setAssociationsForRESTAdapter(modelType,modelName,model)});return model},setAssociationsForFixtureAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){var hasManyRelation,belongsToRecord;if(relationship.kind=="hasMany"){hasManyRelation=fixture[relationship.key];if(hasManyRelation){$.each(fixture[relationship.key],function(index,object){var id=object;if(Ember.typeOf(object)=="object"){FactoryGuy.pushFixture(relationship.type,object);id=object.id;hasManyRelation[index]=id}var hasManyfixtures=adapter.fixturesForType(relationship.type);var hasManyFixture=adapter.findFixtureById(hasManyfixtures,id);hasManyFixture[modelName]=fixture.id;self.loadModelForFixtureAdapter(relationship.type,hasManyFixture)})}}if(relationship.kind=="belongsTo"){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);self.loadModelForFixtureAdapter(relationship.type,belongsTofixture)}}})},loadModelForFixtureAdapter:function(modelType,fixture){var storeModel=this.getById(modelType,fixture.id),that=this;if(!Ember.isPresent(storeModel)||storeModel.get("isEmpty")){Ember.run(function(){var dup=Ember.copy(fixture,true);that.push(modelType,fixture);Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(fixture[relationship.key]){fixture[relationship.key]=dup[relationship.key]}})})}},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){var typeName,model;if(this.usingFixtureAdapter()){if(Ember.typeOf(type)==="string"&&Ember.isPresent(payload)&&Ember.isPresent(payload.id)){model=this.modelFor(type);FactoryGuy.pushFixture(model,payload);this.push(model,Ember.copy(payload,true))}else if(Ember.typeOf(type)==="object"||Ember.typeOf(payload)==="object"){if(Ember.isBlank(payload)){payload=type}for(var prop in payload){typeName=Ember.String.camelize(Ember.String.singularize(prop));model=this.modelFor(typeName);this.pushMany(model,Ember.makeArray(Ember.copy(payload[prop],true)));Ember.ArrayPolyfills.forEach.call(Ember.makeArray(payload[prop]),function(hash){FactoryGuy.pushFixture(model,hash)},this)}}else{throw new Ember.Error("Assertion Failed: You cannot use `store#pushPayload` with this method signature pushPayload("+type+","+payload+")")}}else{this._super(type,payload)}}})})();var FactoryGuyTestMixin=Em.Mixin.create({setup:function(app){this.set("container",app.__container__);FactoryGuy.setStore(this.getStore());return this},useFixtureAdapter:function(app){app.ApplicationAdapter=DS.FixtureAdapter;this.getStore().adapterFor("application").simulateRemoteResponse=false},usingActiveModelSerializer:function(type){var store=this.getStore();var modelType=store.modelFor(type);var serializer=store.serializerFor(modelType.typeKey);return serializer instanceof DS.ActiveModelSerializer},find:function(type,id){return this.getStore().find(type,id)},make:function(){return FactoryGuy.make.apply(FactoryGuy,arguments)},getStore:function(){return this.get("container").lookup("store:main")},stubEndpointForHttpRequest:function(url,json,options){options=options||{};var request={url:url,dataType:"json",responseText:json,type:options.type||"GET",status:options.status||200};if(options.urlParams){request.urlParams=options.urlParams}if(options.data){request.data=options.data}$.mockjax(request)},buildURL:function(typeName,id){var type=this.getStore().modelFor(typeName);return this.getStore().adapterFor(type).buildURL(type.typeKey,id)},handleFindAll:function(){var records=FactoryGuy.makeList.apply(FactoryGuy,arguments);var name=arguments[0];var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson={};var json=records.map(function(record){return record.toJSON({includeId:true})});responseJson[modelName.pluralize()]=json;var url=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson)},handleFindMany:function(){Ember.deprecate("DEPRECATION Warning: use handleFindAll instead");this.handleFindAll.apply(this,arguments)},handleFind:function(){var args=Array.prototype.slice.call(arguments);Ember.assert("To handleFindOne pass in a model instance or a type and model options",args.length>0);var record,modelName;if(args[0]instanceof DS.Model){record=args[0];modelName=record.constructor.typeKey}else{record=FactoryGuy.make.apply(FactoryGuy,arguments);var name=arguments[0];modelName=FactoryGuy.lookupModelForFixtureName(name)}var responseJson={};var json=record.toJSON({includeId:true});responseJson[modelName.pluralize()]=json;var url=this.buildURL(modelName,record.id);this.stubEndpointForHttpRequest(url,responseJson)},handleFindOne:function(){this.handleFind.apply(this,arguments)},handleFindQuery:function(modelName,searchParams,records){Ember.assert("The second argument of searchParams must be an array",Em.typeOf(searchParams)=="array");if(records){Ember.assert("The third argument ( records ) must be an array - found type:"+Em.typeOf(records),Em.typeOf(records)=="array")}else{records=[]}var json=records.map(function(record){return record.toJSON({includeId:true})});var responseJson={};responseJson[modelName.pluralize()]=json;var url=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson,{urlParams:searchParams})},handleCreate:function(modelName,options){var url=this.buildURL(modelName);var store=this.getStore();var opts=options===undefined?{}:options;return new MockCreateRequest(url,store,modelName,opts)},handleUpdate:function(){var args=Array.prototype.slice.call(arguments);Ember.assert("To handleUpdate pass in a model instance or a type and an id",args.length>0);var succeed=true;if(typeof args[args.length-1]=="boolean"){args.pop();succeed=false}Ember.assert("To handleUpdate pass in a model instance or a type and an id",args.length>0);var type,id;if(args[0]instanceof DS.Model){var model=args[0];type=model.constructor.typeKey;id=model.id}else if(typeof args[0]=="string"&&typeof parseInt(args[1])=="number"){type=args[0];id=args[1]}Ember.assert("To handleUpdate pass in a model instance or a type and an id",type&&id);this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"PUT",status:succeed?200:500})},handleDelete:function(type,id,succeed){succeed=succeed===undefined?true:succeed;this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"DELETE",status:succeed?200:500})},teardown:function(){FactoryGuy.resetModels(this.getStore());$.mockjax.clear()}});if(FactoryGuy!==undefined){FactoryGuy.testMixin=FactoryGuyTestMixin}
1
+ var Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};var MissingSequenceError=function(message){this.toString=function(){return message}};if(FactoryGuy!==undefined){FactoryGuy.sequence=Sequence;FactoryGuy.missingSequenceError=MissingSequenceError}var ModelDefinition=function(model,config){var sequences={};var traits={};var defaultAttributes={};var namedModels={};var modelId=1;var sequenceName=null;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.nextId=function(){return modelId++};this.generate=function(name,sequenceFn){if(sequenceFn){if(!sequences[name]){sequences[name]=new Sequence(sequenceFn)}}var sequence=sequences[name];if(!sequence){throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+model+"' definition")}return sequence.next()};this.build=function(name,opts,traitArgs){var traitsObj={};traitArgs.forEach(function(trait){$.extend(traitsObj,traits[trait])});var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,traitsObj,opts);for(var attribute in fixture){if(Ember.typeOf(fixture[attribute])=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}else if(Ember.typeOf(fixture[attribute])=="object"){if(FactoryGuy.getStore()){if(FactoryGuy.isAttributeRelationship(this.model,attribute)){fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}else{fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}}if(!fixture.id){fixture.id=this.nextId()}return fixture};this.buildList=function(name,number,traits,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts,traits))}return arr};this.reset=function(){modelId=1;for(var name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseTraits=function(object){if(!object){return}traits=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(Ember.typeOf(sequenceFn)!="function"){throw new Error("Problem with ["+sequenceName+"] sequence definition. Sequences must be functions")}object[sequenceName]=new Sequence(sequenceFn)}sequences=object};var parseConfig=function(config){parseSequences(config.sequences);delete config.sequences;parseTraits(config.traits);delete config.traits;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};if(FactoryGuy!==undefined){FactoryGuy.modelDefiniton=ModelDefinition}var FactoryGuy={modelDefinitions:{},define:function(model,config){if(this.modelDefinitions[model]){this.modelDefinitions[model].merge(config)}else{this.modelDefinitions[model]=new ModelDefinition(model,config)}},setStore:function(store){Ember.assert("FactoryGuy#setStore needs a valid store instance.You passed in ["+store+"]",store instanceof DS.Store);this.store=store},getStore:function(){return this.store},isAttributeRelationship:function(typeName,attribute){if(!this.store){Ember.debug("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures");return true}var model=this.store.modelFor(typeName);return!!model.typeForRelationship(attribute)},generate:function(nameOrFunction){var sortaRandomName=Math.floor((1+Math.random())*65536).toString(16)+Date.now();return function(){if(Em.typeOf(nameOrFunction)=="function"){return this.generate(sortaRandomName,nameOrFunction)}else{return this.generate(nameOrFunction)}}},belongsTo:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},association:function(fixtureName,opts){Ember.deprecate("DEPRECATION Warning: use FactoryGuy.belongsTo instead");return this.belongsTo(fixtureName,opts)},hasMany:function(fixtureName,number,opts){return function(){return FactoryGuy.buildList(fixtureName,number,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName:function(name){for(var model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(){var args=Array.prototype.slice.call(arguments);var opts={};var name=args.shift();if(!name){throw new Error("Build needs a factory name to build")}if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts,traits)},buildList:function(){var args=Array.prototype.slice.call(arguments);var name=args.shift();var number=args.shift();if(!name||!number){throw new Error("buildList needs a name and a number ( at least ) to build with")}var opts={};if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,traits,opts)},make:function(){var store=this.store;Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures",store);var fixture=this.build.apply(this,arguments);var name=arguments[0];var modelName=this.lookupModelForFixtureName(name);var modelType=store.modelFor(modelName);if(store.usingFixtureAdapter()){store.setAssociationsForFixtureAdapter(modelType,modelName,fixture);fixture=FactoryGuy.pushFixture(modelType,fixture);store.loadModelForFixtureAdapter(modelType,fixture);return fixture}else{return store.makeModel(modelType,fixture)}},makeList:function(){Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures",this.store);var arr=[];var args=Array.prototype.slice.call(arguments);Ember.assert("makeList needs at least 2 arguments, a name and a number",args.length>=2);var number=args.splice(1,1)[0];Ember.assert("Second argument to makeList should be a number (of fixtures to make.)",typeof number=="number");for(var i=0;i<number;i++){arr.push(this.make.apply(this,args))}return arr},resetModels:function(store){for(var model in this.modelDefinitions){var definition=this.modelDefinitions[model];definition.reset();try{var modelType=store.modelFor(definition.model);if(store.usingFixtureAdapter()){modelType.FIXTURES=[]}store.unloadAll(modelType)}catch(e){console.log("resetModels",e)}}},pushFixture:function(modelClass,fixture){var index;if(!modelClass.FIXTURES){modelClass.FIXTURES=[]}index=this.indexOfFixture(modelClass.FIXTURES,fixture);if(index>-1){modelClass.FIXTURES.splice(index,1)}modelClass.FIXTURES.push(fixture);return fixture},indexOfFixture:function(fixtures,fixture){var index=-1,id=fixture.id+"";Ember.A(fixtures).find(function(r,i){if(""+Ember.get(r,"id")===id){index=i;return true}else{return false}});return index},clear:function(opts){if(!opts){this.modelDefinitions={}}}};var MockCreateRequest=function(url,store,modelName,options){var succeed=options.succeed===undefined?true:options.succeed;var matchArgs=options.match;var returnArgs=options.returns;var responseJson={};var expectedRequest={};var modelType=store.modelFor(modelName);this.calculate=function(){if(matchArgs){var tmpRecord=store.createRecord(modelName,matchArgs);expectedRequest=tmpRecord.serialize(matchArgs);tmpRecord.deleteRecord()}if(succeed){var definition=FactoryGuy.modelDefinitions[modelName];if(responseJson[modelName]){responseJson[modelName]=$.extend({id:responseJson[modelName].id},matchArgs,returnArgs)}else{responseJson[modelName]=$.extend({id:definition.nextId()},matchArgs,returnArgs)}Ember.get(modelType,"relationshipsByName").forEach(function(relationship){if(relationship.kind=="belongsTo"){delete responseJson[modelName][relationship.key]}})}};this.match=function(matches){matchArgs=matches;this.calculate();return this};this.andReturn=function(returns){returnArgs=returns;this.calculate();return this};this.andFail=function(){succeed=false;return this};this.handler=function(settings){if(settings.url!=url||settings.type!="POST"){return false}if(matchArgs){var requestData=JSON.parse(settings.data)[modelName];for(attribute in expectedRequest){if(expectedRequest[attribute]&&requestData[attribute]!=expectedRequest[attribute]){return false}}}var responseStatus=succeed?200:500;return{responseText:responseJson,status:responseStatus}};this.calculate();$.mockjax(this.handler)};(function(){DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(){Ember.deprecate("DEPRECATION Warning: use FactoryGuy.make instead");FactoryGuy.make.call(FactoryGuy,arguments)},makeList:function(){Ember.deprecate("DEPRECATION Warning: use FactoryGuy.makeList instead");FactoryGuy.makeList.call(FactoryGuy,arguments)},makeModel:function(modelType,fixture){var store=this,modelName=store.modelFor(modelType).typeKey,model;Em.run(function(){store.findEmbeddedAssociationsForRESTAdapter(modelType,fixture);if(fixture.type){modelName=fixture.type.underscore();modelType=store.modelFor(modelName)}model=store.push(modelName,fixture);store.setAssociationsForRESTAdapter(modelType,modelName,model)});return model},setAssociationsForFixtureAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){var hasManyRelation,belongsToRecord;if(relationship.kind=="hasMany"){hasManyRelation=fixture[relationship.key];if(hasManyRelation){$.each(fixture[relationship.key],function(index,object){var id=object;if(Ember.typeOf(object)=="object"){FactoryGuy.pushFixture(relationship.type,object);id=object.id;hasManyRelation[index]=id}var hasManyfixtures=adapter.fixturesForType(relationship.type);var hasManyFixture=adapter.findFixtureById(hasManyfixtures,id);hasManyFixture[modelName]=fixture.id;self.loadModelForFixtureAdapter(relationship.type,hasManyFixture)})}}if(relationship.kind=="belongsTo"){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);self.loadModelForFixtureAdapter(relationship.type,belongsTofixture)}}})},loadModelForFixtureAdapter:function(modelType,fixture){var storeModel=this.getById(modelType,fixture.id),that=this;if(!Ember.isPresent(storeModel)||storeModel.get("isEmpty")){Ember.run(function(){var dup=Ember.copy(fixture,true);that.push(modelType,fixture);Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(fixture[relationship.key]){fixture[relationship.key]=dup[relationship.key]}})})}},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){var typeName,model;if(this.usingFixtureAdapter()){if(Ember.typeOf(type)==="string"&&Ember.isPresent(payload)&&Ember.isPresent(payload.id)){model=this.modelFor(type);FactoryGuy.pushFixture(model,payload);this.push(model,Ember.copy(payload,true))}else if(Ember.typeOf(type)==="object"||Ember.typeOf(payload)==="object"){if(Ember.isBlank(payload)){payload=type}for(var prop in payload){typeName=Ember.String.camelize(Ember.String.singularize(prop));model=this.modelFor(typeName);this.pushMany(model,Ember.makeArray(Ember.copy(payload[prop],true)));Ember.ArrayPolyfills.forEach.call(Ember.makeArray(payload[prop]),function(hash){FactoryGuy.pushFixture(model,hash)},this)}}else{throw new Ember.Error("Assertion Failed: You cannot use `store#pushPayload` with this method signature pushPayload("+type+","+payload+")")}}else{this._super(type,payload)}}})})();var FactoryGuyTestMixin=Em.Mixin.create({setup:function(app){this.set("container",app.__container__);FactoryGuy.setStore(this.getStore());return this},useFixtureAdapter:function(app){app.ApplicationAdapter=DS.FixtureAdapter;this.getStore().adapterFor("application").simulateRemoteResponse=false},usingActiveModelSerializer:function(type){var store=this.getStore();var modelType=store.modelFor(type);var serializer=store.serializerFor(modelType.typeKey);return serializer instanceof DS.ActiveModelSerializer},find:function(type,id){return this.getStore().find(type,id)},make:function(){return FactoryGuy.make.apply(FactoryGuy,arguments)},getStore:function(){return this.get("container").lookup("store:main")},stubEndpointForHttpRequest:function(url,json,options){options=options||{};var request={url:url,dataType:"json",responseText:json,type:options.type||"GET",status:options.status||200};if(options.urlParams){request.urlParams=options.urlParams}if(options.data){request.data=options.data}$.mockjax(request)},buildURL:function(typeName,id){var type=this.getStore().modelFor(typeName);return this.getStore().adapterFor(type).buildURL(type.typeKey,id)},mapFindAll:function(modelName,json){var responseJson={};responseJson[modelName.pluralize()]=json;return responseJson},mapFind:function(modelName,json){var responseJson={};responseJson[modelName.pluralize()]=json;return responseJson},handleFindAll:function(){var records=FactoryGuy.makeList.apply(FactoryGuy,arguments);var name=arguments[0];var modelName=FactoryGuy.lookupModelForFixtureName(name);var json=records.map(function(record){return record.toJSON({includeId:true})});var responseJson=this.mapFindAll(modelName,json);var url=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson)},handleFindMany:function(){Ember.deprecate("DEPRECATION Warning: use handleFindAll instead");this.handleFindAll.apply(this,arguments)},handleFind:function(){var args=Array.prototype.slice.call(arguments);Ember.assert("To handleFindOne pass in a model instance or a type and model options",args.length>0);var record,modelName;if(args[0]instanceof DS.Model){record=args[0];modelName=record.constructor.typeKey}else{record=FactoryGuy.make.apply(FactoryGuy,arguments);var name=arguments[0];modelName=FactoryGuy.lookupModelForFixtureName(name)}var json=record.toJSON({includeId:true});var responseJson=this.mapFind(modelName,json);var url=this.buildURL(modelName,record.id);this.stubEndpointForHttpRequest(url,responseJson)},handleFindOne:function(){this.handleFind.apply(this,arguments)},handleFindQuery:function(modelName,searchParams,records){Ember.assert("The second argument of searchParams must be an array",Em.typeOf(searchParams)=="array");if(records){Ember.assert("The third argument ( records ) must be an array - found type:"+Em.typeOf(records),Em.typeOf(records)=="array")}else{records=[]}var json=records.map(function(record){return record.toJSON({includeId:true})});var responseJson=this.mapFindAll(modelName,json);var url=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson,{urlParams:searchParams})},handleCreate:function(modelName,options){var url=this.buildURL(modelName);var store=this.getStore();var opts=options===undefined?{}:options;return new MockCreateRequest(url,store,modelName,opts)},handleUpdate:function(){var args=Array.prototype.slice.call(arguments);Ember.assert("To handleUpdate pass in a model instance or a type and an id",args.length>0);var succeed=true;if(typeof args[args.length-1]=="boolean"){args.pop();succeed=false}Ember.assert("To handleUpdate pass in a model instance or a type and an id",args.length>0);var type,id;if(args[0]instanceof DS.Model){var model=args[0];type=model.constructor.typeKey;id=model.id}else if(typeof args[0]=="string"&&typeof parseInt(args[1])=="number"){type=args[0];id=args[1]}Ember.assert("To handleUpdate pass in a model instance or a type and an id",type&&id);this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"PUT",status:succeed?200:500})},handleDelete:function(type,id,succeed){succeed=succeed===undefined?true:succeed;this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"DELETE",status:succeed?200:500})},teardown:function(){FactoryGuy.resetModels(this.getStore());$.mockjax.clear()}});if(FactoryGuy!==undefined){FactoryGuy.testMixin=FactoryGuyTestMixin}
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.9.6",
3
+ "version": "0.9.7",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
@@ -74,6 +74,34 @@ var FactoryGuyTestMixin = Em.Mixin.create({
74
74
  var type = this.getStore().modelFor(typeName);
75
75
  return this.getStore().adapterFor(type).buildURL(type.typeKey, id);
76
76
  },
77
+ /**
78
+ Map many json objects to response json.
79
+
80
+ Allows custom serializing mappings and meta data to be added to requests.
81
+
82
+ @param {String} modelName model name
83
+ @param {Object} json Json objects from records.map
84
+ @return {Object} responseJson
85
+ */
86
+ mapFindAll: function(modelName, json) {
87
+ var responseJson = {};
88
+ responseJson[modelName.pluralize()] = json;
89
+ return responseJson;
90
+ },
91
+ /**
92
+ Map single object to response json.
93
+
94
+ Allows custom serializing mappings and meta data to be added to requests.
95
+
96
+ @param {String} modelName model name
97
+ @param {Object} json Json object from record.toJSON
98
+ @return {Object} responseJson
99
+ */
100
+ mapFind:function(modelName, json){
101
+ var responseJson = {};
102
+ responseJson[modelName.pluralize()] = json;
103
+ return responseJson;
104
+ },
77
105
  /**
78
106
  Handling ajax GET for finding all records for a type of model.
79
107
  You can mock failed find by passing in success argument as false.
@@ -99,9 +127,8 @@ var FactoryGuyTestMixin = Em.Mixin.create({
99
127
  var records = FactoryGuy.makeList.apply(FactoryGuy, arguments);
100
128
  var name = arguments[0];
101
129
  var modelName = FactoryGuy.lookupModelForFixtureName(name);
102
- var responseJson = {};
103
130
  var json = records.map(function(record) {return record.toJSON({includeId: true})});
104
- responseJson[modelName.pluralize()] = json;
131
+ var responseJson = this.mapFindAll(modelName, json);
105
132
  var url = this.buildURL(modelName);
106
133
  this.stubEndpointForHttpRequest(url, responseJson);
107
134
  },
@@ -143,9 +170,8 @@ var FactoryGuyTestMixin = Em.Mixin.create({
143
170
  modelName = FactoryGuy.lookupModelForFixtureName(name);
144
171
  }
145
172
 
146
- var responseJson = {};
147
173
  var json = record.toJSON({includeId: true});
148
- responseJson[modelName.pluralize()] = json;
174
+ var responseJson = this.mapFind(modelName, json);
149
175
  var url = this.buildURL(modelName, record.id);
150
176
  this.stubEndpointForHttpRequest(url, responseJson);
151
177
  },
@@ -191,8 +217,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
191
217
  records = []
192
218
  }
193
219
  var json = records.map(function(record) {return record.toJSON({includeId: true})})
194
- var responseJson = {};
195
- responseJson[modelName.pluralize()] = json;
220
+ var responseJson = this.mapFindAll(modelName, json);
196
221
  var url = this.buildURL(modelName);
197
222
  this.stubEndpointForHttpRequest(url, responseJson, {urlParams: searchParams});
198
223
  },
@@ -8,8 +8,9 @@ var MockCreateRequest = function(url, store, modelName, options) {
8
8
 
9
9
  this.calculate = function() {
10
10
  if (matchArgs) {
11
- var record = store.createRecord(modelName, matchArgs);
12
- expectedRequest = record.serialize();
11
+ var tmpRecord = store.createRecord(modelName, matchArgs);
12
+ expectedRequest = tmpRecord.serialize(matchArgs);
13
+ tmpRecord.deleteRecord();
13
14
  }
14
15
 
15
16
  if (succeed) {
@@ -43,12 +43,13 @@ asyncTest("#handleCreate the basic", function() {
43
43
  testHelper.handleCreate('profile', {
44
44
  match: {description: customDescription}
45
45
  })
46
-
46
+ ok(store.all('profile').get('content.length') == 0)
47
47
  store.createRecord('profile', {
48
48
  description: customDescription
49
49
  }).save().then(function(profile) {
50
- ok(profile instanceof Profile)
51
- ok(profile.get('description') == customDescription)
50
+ ok(store.all('profile').get('content.length') == 1, 'No extra records created')
51
+ ok(profile instanceof Profile, 'Creates the correct type of record')
52
+ ok(profile.get('description') == customDescription, 'Passes along the match attributes')
52
53
  start();
53
54
  });
54
55
  });
@@ -569,6 +569,81 @@ var FactoryGuy = {
569
569
  }
570
570
  };
571
571
 
572
+ var MockCreateRequest = function(url, store, modelName, options) {
573
+ var succeed = options.succeed === undefined ? true : options.succeed;
574
+ var matchArgs = options.match;
575
+ var returnArgs = options.returns;
576
+ var responseJson = {};
577
+ var expectedRequest = {};
578
+ var modelType = store.modelFor(modelName);
579
+
580
+ this.calculate = function() {
581
+ if (matchArgs) {
582
+ var tmpRecord = store.createRecord(modelName, matchArgs);
583
+ expectedRequest = tmpRecord.serialize(matchArgs);
584
+ tmpRecord.deleteRecord();
585
+ }
586
+
587
+ if (succeed) {
588
+ var definition = FactoryGuy.modelDefinitions[modelName];
589
+ if (responseJson[modelName]) {
590
+ // already calculated once, keep the same id
591
+ responseJson[modelName] = $.extend({id: responseJson[modelName].id}, matchArgs, returnArgs);
592
+ } else {
593
+ responseJson[modelName] = $.extend({id: definition.nextId()}, matchArgs, returnArgs);
594
+ }
595
+ // Remove belongsTo associations since they will already be set when you called
596
+ // createRecord, so they don't need to be returned.
597
+ Ember.get(modelType, 'relationshipsByName').forEach(function (relationship) {
598
+ if (relationship.kind == 'belongsTo') {
599
+ delete responseJson[modelName][relationship.key];
600
+ }
601
+ })
602
+ }
603
+
604
+ }
605
+
606
+ this.match = function(matches) {
607
+ matchArgs = matches;
608
+ this.calculate();
609
+ return this;
610
+ }
611
+
612
+ this.andReturn = function(returns) {
613
+ returnArgs = returns;
614
+ this.calculate();
615
+ return this;
616
+ }
617
+
618
+ this.andFail = function() {
619
+ succeed = false;
620
+ return this;
621
+ }
622
+
623
+ this.handler = function(settings) {
624
+ if (settings.url != url || settings.type != 'POST') { return false}
625
+
626
+ if (matchArgs) {
627
+ var requestData = JSON.parse(settings.data)[modelName];
628
+ for (attribute in expectedRequest) {
629
+ if (expectedRequest[attribute] &&
630
+ requestData[attribute] != expectedRequest[attribute]) {
631
+ return false
632
+ }
633
+ }
634
+ }
635
+ var responseStatus = (succeed ? 200: 500);
636
+ return {
637
+ responseText: responseJson,
638
+ status: responseStatus
639
+ };
640
+ }
641
+
642
+ this.calculate();
643
+
644
+ $.mockjax(this.handler);
645
+ };
646
+
572
647
  (function () {
573
648
  DS.Store.reopen({
574
649
  /**
@@ -922,6 +997,34 @@ var FactoryGuyTestMixin = Em.Mixin.create({
922
997
  var type = this.getStore().modelFor(typeName);
923
998
  return this.getStore().adapterFor(type).buildURL(type.typeKey, id);
924
999
  },
1000
+ /**
1001
+ Map many json objects to response json.
1002
+
1003
+ Allows custom serializing mappings and meta data to be added to requests.
1004
+
1005
+ @param {String} modelName model name
1006
+ @param {Object} json Json objects from records.map
1007
+ @return {Object} responseJson
1008
+ */
1009
+ mapFindAll: function(modelName, json) {
1010
+ var responseJson = {};
1011
+ responseJson[modelName.pluralize()] = json;
1012
+ return responseJson;
1013
+ },
1014
+ /**
1015
+ Map single object to response json.
1016
+
1017
+ Allows custom serializing mappings and meta data to be added to requests.
1018
+
1019
+ @param {String} modelName model name
1020
+ @param {Object} json Json object from record.toJSON
1021
+ @return {Object} responseJson
1022
+ */
1023
+ mapFind:function(modelName, json){
1024
+ var responseJson = {};
1025
+ responseJson[modelName.pluralize()] = json;
1026
+ return responseJson;
1027
+ },
925
1028
  /**
926
1029
  Handling ajax GET for finding all records for a type of model.
927
1030
  You can mock failed find by passing in success argument as false.
@@ -947,9 +1050,8 @@ var FactoryGuyTestMixin = Em.Mixin.create({
947
1050
  var records = FactoryGuy.makeList.apply(FactoryGuy, arguments);
948
1051
  var name = arguments[0];
949
1052
  var modelName = FactoryGuy.lookupModelForFixtureName(name);
950
- var responseJson = {};
951
1053
  var json = records.map(function(record) {return record.toJSON({includeId: true})});
952
- responseJson[modelName.pluralize()] = json;
1054
+ var responseJson = this.mapFindAll(modelName, json);
953
1055
  var url = this.buildURL(modelName);
954
1056
  this.stubEndpointForHttpRequest(url, responseJson);
955
1057
  },
@@ -991,9 +1093,8 @@ var FactoryGuyTestMixin = Em.Mixin.create({
991
1093
  modelName = FactoryGuy.lookupModelForFixtureName(name);
992
1094
  }
993
1095
 
994
- var responseJson = {};
995
1096
  var json = record.toJSON({includeId: true});
996
- responseJson[modelName.pluralize()] = json;
1097
+ var responseJson = this.mapFind(modelName, json);
997
1098
  var url = this.buildURL(modelName, record.id);
998
1099
  this.stubEndpointForHttpRequest(url, responseJson);
999
1100
  },
@@ -1039,8 +1140,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
1039
1140
  records = []
1040
1141
  }
1041
1142
  var json = records.map(function(record) {return record.toJSON({includeId: true})})
1042
- var responseJson = {};
1043
- responseJson[modelName.pluralize()] = json;
1143
+ var responseJson = this.mapFindAll(modelName, json);
1044
1144
  var url = this.buildURL(modelName);
1045
1145
  this.stubEndpointForHttpRequest(url, responseJson, {urlParams: searchParams});
1046
1146
  },
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ember-data-factory-guy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.6
4
+ version: 0.9.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Sudol
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-01-19 00:00:00.000000000 Z
12
+ date: 2015-01-23 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Easily create Fixtures for Ember Data
15
15
  email: