ember-data-factory-guy 0.9.4 → 0.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3487ba4072e7e89a32ffd9235291a65f24f79503
4
- data.tar.gz: c55698399c38e7f46f7036346a379f2a4648def4
3
+ metadata.gz: 6abc061f668dd5d677abe7b0ec4f559d16af91f9
4
+ data.tar.gz: 2d38bdb9f7f4f5255609cf8fe42f49f88d9857da
5
5
  SHA512:
6
- metadata.gz: 6fa20e03471792329dfec799f3a47f6471d7c3d255ae024e615d6c64fdc28e2d2419b8bfdffd1a0ceac2d8b59456abab91164637489f6e888ed920bd400f3155
7
- data.tar.gz: 5002f87e0d686881e3260d2725c4d2ce5a2e1d65fd13c9e3d7faf4e109b2075258fc24bfda52adaad5bda794e7766825bcf3364838e0eb90b4444d2ceb1be1f5
6
+ metadata.gz: 8cb599906cc1ce6ed367506f141aebaf405676142d34ee85984e3d76c85e167586a47abb8ffc30ae5e859e8eca1343930b4109f51436103478cebe203a34fc43
7
+ data.tar.gz: 9969fb77e5903fe169847c9bb741073194222b4e5fb92c1071df6fe17606e51a5d9a24b3e75f5e67e74b41aeb7da6b1d171d3da7811e88ade8a40674fe4f6de7
data/README.md CHANGED
@@ -10,9 +10,12 @@ of ember-data-factory-guy.
10
10
  - 0.6.4 -> ember-data-1.0.0-beta.8 and under
11
11
  - 0.7.1.1 -> ember-data-1.0.0-beta.10
12
12
  - 0.8.6 -> ember-data-1.0.0-beta.11
13
- - 0.9.3 -> ember-data-1.0.0-beta.12
13
+ - 0.9.4 -> ember-data-1.0.0-beta.12
14
14
 
15
- ** Support for fixture adapter is back in business as of version 0.9.3 **
15
+ **Waiting for ember-data-1.0.0-beta.15 to make upgrade release, since there are a few issues with
16
+ ember-data-1.0.0-beta.14.1 that make it difficult to use**
17
+
18
+ **Support for fixture adapter is back in business as of version 0.9.3**
16
19
 
17
20
  *Version 0.9.0 and up deprecates explicit call to store.makeFixture in your tests, in favor
18
21
  of using the FactoryGuy.make or testHelper.make function from FactoryGuyTestHelperMixin instead.
@@ -39,7 +42,7 @@ gem 'ember-data-factory-guy', group: test
39
42
  or for particular version:
40
43
 
41
44
  ```ruby
42
- gem 'ember-data-factory-guy', '0.9.3', group: test
45
+ gem 'ember-data-factory-guy', '0.9.4', group: test
43
46
  ```
44
47
 
45
48
  then:
@@ -74,7 +77,7 @@ or for particular version:
74
77
  "dependencies": {
75
78
  "foo-dependency": "latest",
76
79
  "other-foo-dependency": "latest",
77
- "ember-data-factory-guy": "0.9.3"
80
+ "ember-data-factory-guy": "0.9.4"
78
81
  }
79
82
  ```
80
83
 
@@ -460,7 +463,7 @@ the reverse user hasMany 'projects' association is being setup for you on the us
460
463
 
461
464
  ``` javascript
462
465
  FactoryGuy.define('user', {
463
- user_with_projects: { FactoryGuy.hasMany('project', 2) }
466
+ user_with_projects: { projects: FactoryGuy.hasMany('project', 2) }
464
467
  });
465
468
 
466
469
  var user = FactoryGuy.make('user_with_projects');
@@ -594,8 +597,8 @@ test("make a user using your applications default adapter", function() {
594
597
 
595
598
  - Uses mockjax
596
599
  - Has helper methods
597
- - handleFindMany
598
- - handleFindOne
600
+ - handleFindAll
601
+ - handleFind
599
602
  - handleFindQuery
600
603
  - handleCreate
601
604
  - handleUpdate
@@ -619,24 +622,43 @@ and this is already bundled for you when you use the ember-data-factory-guy libr
619
622
  tests run as shown in the previous section (Using FactoryGuyTestMixin)**
620
623
 
621
624
 
622
- ##### handleFindMany
625
+ ##### handleFindAll
623
626
  - for dealing with finding all records of a particular type
627
+ - handleFindMany ( deprecated alias )
624
628
 
625
629
  ```javascript
626
630
  // can use traits and extra fixture options here as you would with FactoryGuy#makeList
627
- testHelper.handleFindMany('profile', 2);
631
+ testHelper.handleFindAll('profile', 2);
628
632
 
629
633
  store.find('profile').then(function (profiles) {
630
634
  profiles.get('length') //=> 2
631
635
  });
632
636
  ```
633
637
 
634
- ##### handleFindOne
635
- - for dealing with finding one record with an id
638
+ ##### handleFind
639
+ - pass in a record to handle reload
640
+ - pass in fixture name and options ( including id if needed ) to handle making a record
641
+ with those options and finding that record
642
+ - handleFindOne ( deprecated alias )
643
+
644
+ *Passing in a model instance*
636
645
 
637
646
  ```javascript
638
- // can use traits and extra fixture options here as you would with FactoryGuy#make
639
- testHelper.handleFindOne('profile', {id: 1});
647
+ var profile = FactoryGuy.make('profile')
648
+ testHelper.handleFind(profile);
649
+
650
+ profile.reload().then(function (profile2) {
651
+ ok(profile2.id == profile.id);
652
+ start();
653
+ });
654
+ ```
655
+
656
+ *Passing in fixture name and options*
657
+
658
+ ```javascript
659
+ // can use traits and extra fixture options here as you would with FactoryGuy#make,
660
+ // since a record will be made, and placed in the store for you.
661
+ testHelper.handleFind('profile', {id: 1});
640
662
 
641
663
  store.find('profile', 1).then(function (profile) {
642
664
  profile.get('id') //=> 1
@@ -714,8 +736,13 @@ match and or returns options.
714
736
  // Simplest case
715
737
  // Don't care about a match just handle createRecord for any project
716
738
  testHelper.handleCreate('project')
739
+
717
740
  // Exactly matching attributes
718
741
  testHelper.handleCreate('project', {match: {name: "Moo", user: user}})
742
+
743
+ // Matching some attributes
744
+ testHelper.handleCreate('project', {match: {name: "Moo"}})
745
+
719
746
  // Exactly matching attributes, and returning extra attributes
720
747
  testHelper.handleCreate('project', {
721
748
  match: {name: "Moo", user: user}, returns: {created_at: new Date()}
@@ -732,7 +759,7 @@ match and or returns options.
732
759
  // when the createRecord on the 'project' is called, it will fail
733
760
  store.createRecord('project').save() //=> fails
734
761
 
735
- // or fail only if the attribues match exactly
762
+ // or fail only if the attributes match the match options
736
763
  testHelper.handleCreate('project', {
737
764
  match: {name: "Moo", user: user}, {succeed: false}
738
765
  })
data/bower.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.9.4",
3
+ "version": "0.9.5",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
@@ -913,6 +913,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
913
913
  if (options.data) {
914
914
  request.data = options.data;
915
915
  }
916
+
916
917
  $.mockjax(request);
917
918
  },
918
919
  /**
@@ -934,7 +935,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
934
935
  // Pass in the parameters you would normally pass into FactoryGuy.makeList,
935
936
  // like fixture name, number of fixtures to make, and optional traits,
936
937
  // or fixture options
937
- testHelper.handleFindMany('user', 2, 'with_hats');
938
+ testHelper.handleFindAll('user', 2, 'with_hats');
938
939
 
939
940
  store.find('user').then(function(users){
940
941
 
@@ -946,7 +947,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
946
947
  @param {String} trait optional traits (one or more)
947
948
  @param {Object} opts optional fixture options
948
949
  */
949
- handleFindMany: function () {
950
+ handleFindAll: function () {
950
951
  // make the records and load them in the store
951
952
  var records = FactoryGuy.makeList.apply(FactoryGuy, arguments);
952
953
  var name = arguments[0];
@@ -957,7 +958,10 @@ var FactoryGuyTestMixin = Em.Mixin.create({
957
958
  var url = this.buildURL(modelName);
958
959
  this.stubEndpointForHttpRequest(url, responseJson);
959
960
  },
960
-
961
+ handleFindMany: function() {
962
+ Ember.deprecate('DEPRECATION Warning: use handleFindAll instead');
963
+ this.handleFindAll.apply(this, arguments)
964
+ },
961
965
  /**
962
966
  Handling ajax GET for finding one record for a type of model and an id.
963
967
  You can mock failed find by passing in success argument as false.
@@ -977,18 +981,28 @@ var FactoryGuyTestMixin = Em.Mixin.create({
977
981
  @param {String} trait optional traits (one or more)
978
982
  @param {Object} opts optional fixture options (including id)
979
983
  */
980
- handleFindOne: function () {
981
- // make the records and load them in the store
982
- var record = FactoryGuy.make.apply(FactoryGuy, arguments);
983
- var name = arguments[0];
984
- var modelName = FactoryGuy.lookupModelForFixtureName(name);
984
+ handleFind: function () {
985
+ var args = Array.prototype.slice.call(arguments)
986
+ Ember.assert("To handleFindOne pass in a model instance or a type and model options", args.length>0)
987
+
988
+ var record, modelName;
989
+ if (args[0] instanceof DS.Model) {
990
+ record = args[0];
991
+ modelName = record.constructor.typeKey;
992
+ } else {
993
+ // make the record and load it in the store
994
+ record = FactoryGuy.make.apply(FactoryGuy, arguments);
995
+ var name = arguments[0];
996
+ modelName = FactoryGuy.lookupModelForFixtureName(name);
997
+ }
998
+
985
999
  var responseJson = {};
986
1000
  var json = record.toJSON({includeId: true});
987
1001
  responseJson[modelName.pluralize()] = json;
988
1002
  var url = this.buildURL(modelName, record.id);
989
1003
  this.stubEndpointForHttpRequest(url, responseJson);
990
1004
  },
991
-
1005
+ handleFindOne: function() { this.handleFind.apply(this, arguments) },
992
1006
  /**
993
1007
  Handling ajax GET for finding all records for a type of model with query parameters.
994
1008
 
@@ -1053,55 +1067,74 @@ var FactoryGuyTestMixin = Em.Mixin.create({
1053
1067
  succeed - flag to indicate if the request should succeed ( default is true )
1054
1068
 
1055
1069
  Note:
1056
- 1) that any attributes in match will be added to the response json automatically,
1057
- so you don't need to include them in the returns hash as well.
1070
+ 1) Any attributes in match will be added to the response json automatically,
1071
+ so you don't need to include them in the returns hash.
1072
+
1073
+ 2) As long as all the match attributes are found in the record being created,
1074
+ the create will succeed. In other words, there may be other attributes in the
1075
+ createRecord call, but you don't have to match them all. For example:
1058
1076
 
1059
- 2) If you don't use match options for exact match, there will be no id returned to the model.
1060
- The reason being, that this method purposely returns an empty hash response with a 'don't match'
1061
- style handleCreate, because if the responseJson returns a non empty data hash ( with even only
1062
- the id), this essentially empty hash of attributes will override ( and nullify ) all the attributes
1063
- that set when you created the record.
1064
- 3) If you match on a belongsTo association, you don't have to include that in the
1065
- returns hash.
1077
+ ```js
1078
+ handleCreate('post', {match: {title: 'foo'})
1079
+ store.createRecord('post', {title: 'foo', created_at: new Date()})
1080
+ ```
1081
+
1082
+ 2) If you match on a belongsTo association, you don't have to include that in the
1083
+ returns hash either.
1066
1084
 
1067
1085
  @param {String} modelName name of model your creating like 'profile' for Profile
1068
1086
  @param {Object} options hash of options for handling request
1069
1087
  */
1070
1088
  handleCreate: function (modelName, options) {
1071
1089
  var opts = options === undefined ? {} : options;
1090
+ var store = this.getStore()
1072
1091
  var succeed = opts.succeed === undefined ? true : opts.succeed;
1073
1092
  var match = opts.match || {};
1074
1093
  var returnArgs = opts.returns || {};
1075
1094
 
1076
- var url = this.buildURL(modelName);
1077
- var definition = FactoryGuy.modelDefinitions[modelName];
1078
-
1079
- var httpOptions = {type: 'POST'};
1080
1095
  if (opts.match) {
1081
- var expectedRequest = {};
1082
- var record = this.getStore().createRecord(modelName, match);
1083
- expectedRequest[modelName] = record.serialize();
1084
- httpOptions.data = JSON.stringify(expectedRequest);
1096
+ var record = store.createRecord(modelName, match);
1097
+ var expectedRequest = record.serialize();
1085
1098
  }
1086
1099
 
1087
- var modelType = this.getStore().modelFor(modelName)
1100
+ var modelType = store.modelFor(modelName)
1088
1101
 
1089
1102
  var responseJson = {};
1090
1103
  if (succeed) {
1091
- responseJson[modelName] = $.extend({id: definition.nextId()}, match, returnArgs);
1092
- // Remove belongsTo associations since they will already be set when you called
1093
- // createRecord, and included them in those attributes
1094
- Ember.get(modelType, 'relationshipsByName').forEach(function (relationship) {
1095
- if (relationship.kind == 'belongsTo') {
1096
- delete responseJson[modelName][relationship.key];
1104
+ var definition = FactoryGuy.modelDefinitions[modelName];
1105
+ responseJson[modelName] = $.extend({id: definition.nextId()}, match, returnArgs);
1106
+ // Remove belongsTo associations since they will already be set when you called
1107
+ // createRecord, so they don't need to be returned.
1108
+ Ember.get(modelType, 'relationshipsByName').forEach(function (relationship) {
1109
+ if (relationship.kind == 'belongsTo') {
1110
+ delete responseJson[modelName][relationship.key];
1111
+ }
1112
+ })
1113
+ }
1114
+
1115
+ var url = this.buildURL(modelName);
1116
+
1117
+ var handler = function(settings) {
1118
+ if (settings.url != url || settings.type != 'POST') { return false}
1119
+
1120
+ if (opts.match) {
1121
+ var requestData = JSON.parse(settings.data)[modelName];
1122
+ for (attribute in expectedRequest) {
1123
+ if (expectedRequest[attribute] && requestData[attribute] != expectedRequest[attribute]) {
1124
+ return false
1097
1125
  }
1098
- })
1099
- } else {
1100
- httpOptions.status = 500;
1126
+ }
1127
+ }
1128
+ var responseStatus = (succeed ? 200: 500);
1129
+ return {
1130
+ responseText: responseJson,
1131
+ status: responseStatus
1132
+ };
1101
1133
  }
1102
1134
 
1103
- this.stubEndpointForHttpRequest(url, responseJson, httpOptions);
1135
+ $.mockjax(handler);
1104
1136
  },
1137
+
1105
1138
  /**
1106
1139
  Handling ajax PUT ( update record ) for a model type. You can mock
1107
1140
  failed update by passing in success argument as false.
@@ -908,6 +908,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
908
908
  if (options.data) {
909
909
  request.data = options.data;
910
910
  }
911
+
911
912
  $.mockjax(request);
912
913
  },
913
914
  /**
@@ -929,7 +930,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
929
930
  // Pass in the parameters you would normally pass into FactoryGuy.makeList,
930
931
  // like fixture name, number of fixtures to make, and optional traits,
931
932
  // or fixture options
932
- testHelper.handleFindMany('user', 2, 'with_hats');
933
+ testHelper.handleFindAll('user', 2, 'with_hats');
933
934
 
934
935
  store.find('user').then(function(users){
935
936
 
@@ -941,7 +942,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
941
942
  @param {String} trait optional traits (one or more)
942
943
  @param {Object} opts optional fixture options
943
944
  */
944
- handleFindMany: function () {
945
+ handleFindAll: function () {
945
946
  // make the records and load them in the store
946
947
  var records = FactoryGuy.makeList.apply(FactoryGuy, arguments);
947
948
  var name = arguments[0];
@@ -952,7 +953,10 @@ var FactoryGuyTestMixin = Em.Mixin.create({
952
953
  var url = this.buildURL(modelName);
953
954
  this.stubEndpointForHttpRequest(url, responseJson);
954
955
  },
955
-
956
+ handleFindMany: function() {
957
+ Ember.deprecate('DEPRECATION Warning: use handleFindAll instead');
958
+ this.handleFindAll.apply(this, arguments)
959
+ },
956
960
  /**
957
961
  Handling ajax GET for finding one record for a type of model and an id.
958
962
  You can mock failed find by passing in success argument as false.
@@ -972,18 +976,28 @@ var FactoryGuyTestMixin = Em.Mixin.create({
972
976
  @param {String} trait optional traits (one or more)
973
977
  @param {Object} opts optional fixture options (including id)
974
978
  */
975
- handleFindOne: function () {
976
- // make the records and load them in the store
977
- var record = FactoryGuy.make.apply(FactoryGuy, arguments);
978
- var name = arguments[0];
979
- var modelName = FactoryGuy.lookupModelForFixtureName(name);
979
+ handleFind: function () {
980
+ var args = Array.prototype.slice.call(arguments)
981
+ Ember.assert("To handleFindOne pass in a model instance or a type and model options", args.length>0)
982
+
983
+ var record, modelName;
984
+ if (args[0] instanceof DS.Model) {
985
+ record = args[0];
986
+ modelName = record.constructor.typeKey;
987
+ } else {
988
+ // make the record and load it in the store
989
+ record = FactoryGuy.make.apply(FactoryGuy, arguments);
990
+ var name = arguments[0];
991
+ modelName = FactoryGuy.lookupModelForFixtureName(name);
992
+ }
993
+
980
994
  var responseJson = {};
981
995
  var json = record.toJSON({includeId: true});
982
996
  responseJson[modelName.pluralize()] = json;
983
997
  var url = this.buildURL(modelName, record.id);
984
998
  this.stubEndpointForHttpRequest(url, responseJson);
985
999
  },
986
-
1000
+ handleFindOne: function() { this.handleFind.apply(this, arguments) },
987
1001
  /**
988
1002
  Handling ajax GET for finding all records for a type of model with query parameters.
989
1003
 
@@ -1048,55 +1062,74 @@ var FactoryGuyTestMixin = Em.Mixin.create({
1048
1062
  succeed - flag to indicate if the request should succeed ( default is true )
1049
1063
 
1050
1064
  Note:
1051
- 1) that any attributes in match will be added to the response json automatically,
1052
- so you don't need to include them in the returns hash as well.
1065
+ 1) Any attributes in match will be added to the response json automatically,
1066
+ so you don't need to include them in the returns hash.
1067
+
1068
+ 2) As long as all the match attributes are found in the record being created,
1069
+ the create will succeed. In other words, there may be other attributes in the
1070
+ createRecord call, but you don't have to match them all. For example:
1053
1071
 
1054
- 2) If you don't use match options for exact match, there will be no id returned to the model.
1055
- The reason being, that this method purposely returns an empty hash response with a 'don't match'
1056
- style handleCreate, because if the responseJson returns a non empty data hash ( with even only
1057
- the id), this essentially empty hash of attributes will override ( and nullify ) all the attributes
1058
- that set when you created the record.
1059
- 3) If you match on a belongsTo association, you don't have to include that in the
1060
- returns hash.
1072
+ ```js
1073
+ handleCreate('post', {match: {title: 'foo'})
1074
+ store.createRecord('post', {title: 'foo', created_at: new Date()})
1075
+ ```
1076
+
1077
+ 2) If you match on a belongsTo association, you don't have to include that in the
1078
+ returns hash either.
1061
1079
 
1062
1080
  @param {String} modelName name of model your creating like 'profile' for Profile
1063
1081
  @param {Object} options hash of options for handling request
1064
1082
  */
1065
1083
  handleCreate: function (modelName, options) {
1066
1084
  var opts = options === undefined ? {} : options;
1085
+ var store = this.getStore()
1067
1086
  var succeed = opts.succeed === undefined ? true : opts.succeed;
1068
1087
  var match = opts.match || {};
1069
1088
  var returnArgs = opts.returns || {};
1070
1089
 
1071
- var url = this.buildURL(modelName);
1072
- var definition = FactoryGuy.modelDefinitions[modelName];
1073
-
1074
- var httpOptions = {type: 'POST'};
1075
1090
  if (opts.match) {
1076
- var expectedRequest = {};
1077
- var record = this.getStore().createRecord(modelName, match);
1078
- expectedRequest[modelName] = record.serialize();
1079
- httpOptions.data = JSON.stringify(expectedRequest);
1091
+ var record = store.createRecord(modelName, match);
1092
+ var expectedRequest = record.serialize();
1080
1093
  }
1081
1094
 
1082
- var modelType = this.getStore().modelFor(modelName)
1095
+ var modelType = store.modelFor(modelName)
1083
1096
 
1084
1097
  var responseJson = {};
1085
1098
  if (succeed) {
1086
- responseJson[modelName] = $.extend({id: definition.nextId()}, match, returnArgs);
1087
- // Remove belongsTo associations since they will already be set when you called
1088
- // createRecord, and included them in those attributes
1089
- Ember.get(modelType, 'relationshipsByName').forEach(function (relationship) {
1090
- if (relationship.kind == 'belongsTo') {
1091
- delete responseJson[modelName][relationship.key];
1099
+ var definition = FactoryGuy.modelDefinitions[modelName];
1100
+ responseJson[modelName] = $.extend({id: definition.nextId()}, match, returnArgs);
1101
+ // Remove belongsTo associations since they will already be set when you called
1102
+ // createRecord, so they don't need to be returned.
1103
+ Ember.get(modelType, 'relationshipsByName').forEach(function (relationship) {
1104
+ if (relationship.kind == 'belongsTo') {
1105
+ delete responseJson[modelName][relationship.key];
1106
+ }
1107
+ })
1108
+ }
1109
+
1110
+ var url = this.buildURL(modelName);
1111
+
1112
+ var handler = function(settings) {
1113
+ if (settings.url != url || settings.type != 'POST') { return false}
1114
+
1115
+ if (opts.match) {
1116
+ var requestData = JSON.parse(settings.data)[modelName];
1117
+ for (attribute in expectedRequest) {
1118
+ if (expectedRequest[attribute] && requestData[attribute] != expectedRequest[attribute]) {
1119
+ return false
1092
1120
  }
1093
- })
1094
- } else {
1095
- httpOptions.status = 500;
1121
+ }
1122
+ }
1123
+ var responseStatus = (succeed ? 200: 500);
1124
+ return {
1125
+ responseText: responseJson,
1126
+ status: responseStatus
1127
+ };
1096
1128
  }
1097
1129
 
1098
- this.stubEndpointForHttpRequest(url, responseJson, httpOptions);
1130
+ $.mockjax(handler);
1099
1131
  },
1132
+
1100
1133
  /**
1101
1134
  Handling ajax PUT ( update record ) for a model type. You can mock
1102
1135
  failed update by passing in success argument as false.
@@ -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={}}}};(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)},handleFindMany: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)},handleFindOne:function(){var record=FactoryGuy.make.apply(FactoryGuy,arguments);var name=arguments[0];var 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)},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 opts=options===undefined?{}:options;var succeed=opts.succeed===undefined?true:opts.succeed;var match=opts.match||{};var returnArgs=opts.returns||{};var url=this.buildURL(modelName);var definition=FactoryGuy.modelDefinitions[modelName];var httpOptions={type:"POST"};if(opts.match){var expectedRequest={};var record=this.getStore().createRecord(modelName,match);expectedRequest[modelName]=record.serialize();httpOptions.data=JSON.stringify(expectedRequest)}var modelType=this.getStore().modelFor(modelName);var responseJson={};if(succeed){responseJson[modelName]=$.extend({id:definition.nextId()},match,returnArgs);Ember.get(modelType,"relationshipsByName").forEach(function(relationship){if(relationship.kind=="belongsTo"){delete responseJson[modelName][relationship.key]}})}else{httpOptions.status=500}this.stubEndpointForHttpRequest(url,responseJson,httpOptions)},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={}}}};(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 opts=options===undefined?{}:options;var store=this.getStore();var succeed=opts.succeed===undefined?true:opts.succeed;var match=opts.match||{};var returnArgs=opts.returns||{};if(opts.match){var record=store.createRecord(modelName,match);var expectedRequest=record.serialize()}var modelType=store.modelFor(modelName);var responseJson={};if(succeed){var definition=FactoryGuy.modelDefinitions[modelName];responseJson[modelName]=$.extend({id:definition.nextId()},match,returnArgs);Ember.get(modelType,"relationshipsByName").forEach(function(relationship){if(relationship.kind=="belongsTo"){delete responseJson[modelName][relationship.key]}})}var url=this.buildURL(modelName);var handler=function(settings){if(settings.url!=url||settings.type!="POST"){return false}if(opts.match){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}};$.mockjax(handler)},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,6 +1,6 @@
1
1
  {
2
2
  "name": "ember-data-factory-guy",
3
- "version": "0.9.4",
3
+ "version": "0.9.5",
4
4
  "authors": [
5
5
  "Daniel Sudol <dansudol@yahoo.com>",
6
6
  "Opak Alex <opak.alexandr@gmail.com>"
@@ -60,6 +60,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
60
60
  if (options.data) {
61
61
  request.data = options.data;
62
62
  }
63
+
63
64
  $.mockjax(request);
64
65
  },
65
66
  /**
@@ -81,7 +82,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
81
82
  // Pass in the parameters you would normally pass into FactoryGuy.makeList,
82
83
  // like fixture name, number of fixtures to make, and optional traits,
83
84
  // or fixture options
84
- testHelper.handleFindMany('user', 2, 'with_hats');
85
+ testHelper.handleFindAll('user', 2, 'with_hats');
85
86
 
86
87
  store.find('user').then(function(users){
87
88
 
@@ -93,7 +94,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
93
94
  @param {String} trait optional traits (one or more)
94
95
  @param {Object} opts optional fixture options
95
96
  */
96
- handleFindMany: function () {
97
+ handleFindAll: function () {
97
98
  // make the records and load them in the store
98
99
  var records = FactoryGuy.makeList.apply(FactoryGuy, arguments);
99
100
  var name = arguments[0];
@@ -104,7 +105,10 @@ var FactoryGuyTestMixin = Em.Mixin.create({
104
105
  var url = this.buildURL(modelName);
105
106
  this.stubEndpointForHttpRequest(url, responseJson);
106
107
  },
107
-
108
+ handleFindMany: function() {
109
+ Ember.deprecate('DEPRECATION Warning: use handleFindAll instead');
110
+ this.handleFindAll.apply(this, arguments)
111
+ },
108
112
  /**
109
113
  Handling ajax GET for finding one record for a type of model and an id.
110
114
  You can mock failed find by passing in success argument as false.
@@ -124,18 +128,28 @@ var FactoryGuyTestMixin = Em.Mixin.create({
124
128
  @param {String} trait optional traits (one or more)
125
129
  @param {Object} opts optional fixture options (including id)
126
130
  */
127
- handleFindOne: function () {
128
- // make the records and load them in the store
129
- var record = FactoryGuy.make.apply(FactoryGuy, arguments);
130
- var name = arguments[0];
131
- var modelName = FactoryGuy.lookupModelForFixtureName(name);
131
+ handleFind: function () {
132
+ var args = Array.prototype.slice.call(arguments)
133
+ Ember.assert("To handleFindOne pass in a model instance or a type and model options", args.length>0)
134
+
135
+ var record, modelName;
136
+ if (args[0] instanceof DS.Model) {
137
+ record = args[0];
138
+ modelName = record.constructor.typeKey;
139
+ } else {
140
+ // make the record and load it in the store
141
+ record = FactoryGuy.make.apply(FactoryGuy, arguments);
142
+ var name = arguments[0];
143
+ modelName = FactoryGuy.lookupModelForFixtureName(name);
144
+ }
145
+
132
146
  var responseJson = {};
133
147
  var json = record.toJSON({includeId: true});
134
148
  responseJson[modelName.pluralize()] = json;
135
149
  var url = this.buildURL(modelName, record.id);
136
150
  this.stubEndpointForHttpRequest(url, responseJson);
137
151
  },
138
-
152
+ handleFindOne: function() { this.handleFind.apply(this, arguments) },
139
153
  /**
140
154
  Handling ajax GET for finding all records for a type of model with query parameters.
141
155
 
@@ -200,55 +214,74 @@ var FactoryGuyTestMixin = Em.Mixin.create({
200
214
  succeed - flag to indicate if the request should succeed ( default is true )
201
215
 
202
216
  Note:
203
- 1) that any attributes in match will be added to the response json automatically,
204
- so you don't need to include them in the returns hash as well.
217
+ 1) Any attributes in match will be added to the response json automatically,
218
+ so you don't need to include them in the returns hash.
219
+
220
+ 2) As long as all the match attributes are found in the record being created,
221
+ the create will succeed. In other words, there may be other attributes in the
222
+ createRecord call, but you don't have to match them all. For example:
223
+
224
+ ```js
225
+ handleCreate('post', {match: {title: 'foo'})
226
+ store.createRecord('post', {title: 'foo', created_at: new Date()})
227
+ ```
205
228
 
206
- 2) If you don't use match options for exact match, there will be no id returned to the model.
207
- The reason being, that this method purposely returns an empty hash response with a 'don't match'
208
- style handleCreate, because if the responseJson returns a non empty data hash ( with even only
209
- the id), this essentially empty hash of attributes will override ( and nullify ) all the attributes
210
- that set when you created the record.
211
- 3) If you match on a belongsTo association, you don't have to include that in the
212
- returns hash.
229
+ 2) If you match on a belongsTo association, you don't have to include that in the
230
+ returns hash either.
213
231
 
214
232
  @param {String} modelName name of model your creating like 'profile' for Profile
215
233
  @param {Object} options hash of options for handling request
216
234
  */
217
235
  handleCreate: function (modelName, options) {
218
236
  var opts = options === undefined ? {} : options;
237
+ var store = this.getStore()
219
238
  var succeed = opts.succeed === undefined ? true : opts.succeed;
220
239
  var match = opts.match || {};
221
240
  var returnArgs = opts.returns || {};
222
241
 
223
- var url = this.buildURL(modelName);
224
- var definition = FactoryGuy.modelDefinitions[modelName];
225
-
226
- var httpOptions = {type: 'POST'};
227
242
  if (opts.match) {
228
- var expectedRequest = {};
229
- var record = this.getStore().createRecord(modelName, match);
230
- expectedRequest[modelName] = record.serialize();
231
- httpOptions.data = JSON.stringify(expectedRequest);
243
+ var record = store.createRecord(modelName, match);
244
+ var expectedRequest = record.serialize();
232
245
  }
233
246
 
234
- var modelType = this.getStore().modelFor(modelName)
247
+ var modelType = store.modelFor(modelName)
235
248
 
236
249
  var responseJson = {};
237
250
  if (succeed) {
238
- responseJson[modelName] = $.extend({id: definition.nextId()}, match, returnArgs);
239
- // Remove belongsTo associations since they will already be set when you called
240
- // createRecord, and included them in those attributes
241
- Ember.get(modelType, 'relationshipsByName').forEach(function (relationship) {
242
- if (relationship.kind == 'belongsTo') {
243
- delete responseJson[modelName][relationship.key];
251
+ var definition = FactoryGuy.modelDefinitions[modelName];
252
+ responseJson[modelName] = $.extend({id: definition.nextId()}, match, returnArgs);
253
+ // Remove belongsTo associations since they will already be set when you called
254
+ // createRecord, so they don't need to be returned.
255
+ Ember.get(modelType, 'relationshipsByName').forEach(function (relationship) {
256
+ if (relationship.kind == 'belongsTo') {
257
+ delete responseJson[modelName][relationship.key];
258
+ }
259
+ })
260
+ }
261
+
262
+ var url = this.buildURL(modelName);
263
+
264
+ var handler = function(settings) {
265
+ if (settings.url != url || settings.type != 'POST') { return false}
266
+
267
+ if (opts.match) {
268
+ var requestData = JSON.parse(settings.data)[modelName];
269
+ for (attribute in expectedRequest) {
270
+ if (expectedRequest[attribute] && requestData[attribute] != expectedRequest[attribute]) {
271
+ return false
244
272
  }
245
- })
246
- } else {
247
- httpOptions.status = 500;
273
+ }
274
+ }
275
+ var responseStatus = (succeed ? 200: 500);
276
+ return {
277
+ responseText: responseJson,
278
+ status: responseStatus
279
+ };
248
280
  }
249
281
 
250
- this.stubEndpointForHttpRequest(url, responseJson, httpOptions);
282
+ $.mockjax(handler);
251
283
  },
284
+
252
285
  /**
253
286
  Handling ajax PUT ( update record ) for a model type. You can mock
254
287
  failed update by passing in success argument as false.
@@ -107,10 +107,10 @@ asyncTest("#handleFindQuery passing in existing instances with hasMany and belon
107
107
  });
108
108
 
109
109
 
110
- /////// handleFindMany //////////
110
+ /////// handleFindAll //////////
111
111
 
112
- asyncTest("#handleFindMany the basic", function () {
113
- testHelper.handleFindMany('profile', 2);
112
+ asyncTest("#handleFindAll the basic", function () {
113
+ testHelper.handleFindAll('profile', 2);
114
114
 
115
115
  store.findAll('profile').then(function (profiles) {
116
116
  ok(profiles.get('length') == 2);
@@ -118,8 +118,8 @@ asyncTest("#handleFindMany the basic", function () {
118
118
  });
119
119
  });
120
120
 
121
- asyncTest("#handleFindMany with fixture options", function () {
122
- testHelper.handleFindMany('profile', 2, {description: 'dude'});
121
+ asyncTest("#handleFindAll with fixture options", function () {
122
+ testHelper.handleFindAll('profile', 2, {description: 'dude'});
123
123
 
124
124
  store.findAll('profile').then(function (profiles) {
125
125
  ok(profiles.get('length') == 2);
@@ -128,8 +128,8 @@ asyncTest("#handleFindMany with fixture options", function () {
128
128
  });
129
129
  });
130
130
 
131
- asyncTest("#handleFindMany with traits", function () {
132
- testHelper.handleFindMany('profile', 2, 'goofy_description');
131
+ asyncTest("#handleFindAll with traits", function () {
132
+ testHelper.handleFindAll('profile', 2, 'goofy_description');
133
133
 
134
134
  store.findAll('profile').then(function (profiles) {
135
135
  ok(profiles.get('length') == 2);
@@ -138,8 +138,8 @@ asyncTest("#handleFindMany with traits", function () {
138
138
  });
139
139
  });
140
140
 
141
- asyncTest("#handleFindMany with traits and extra options", function () {
142
- testHelper.handleFindMany('profile', 2, 'goofy_description', {description: 'dude'});
141
+ asyncTest("#handleFindAll with traits and extra options", function () {
142
+ testHelper.handleFindAll('profile', 2, 'goofy_description', {description: 'dude'});
143
143
 
144
144
  store.findAll('profile').then(function (profiles) {
145
145
  ok(profiles.get('length') == 2);
@@ -149,9 +149,9 @@ asyncTest("#handleFindMany with traits and extra options", function () {
149
149
  });
150
150
 
151
151
 
152
- //////// handleFindOne /////////
152
+ //////// handleFind /////////
153
153
 
154
- asyncTest("#handleFindOne the basic", function () {
154
+ asyncTest("#handleFindOne aliases handleFind", function () {
155
155
  var id = 1
156
156
  testHelper.handleFindOne('profile', {id: id});
157
157
 
@@ -159,11 +159,45 @@ asyncTest("#handleFindOne the basic", function () {
159
159
  ok(profile.get('id') == id);
160
160
  start();
161
161
  });
162
+
163
+ });
164
+
165
+ asyncTest("#handleFind with a record returns the record", function () {
166
+ var profile = FactoryGuy.make('profile')
167
+ testHelper.handleFind(profile);
168
+
169
+ store.find('profile', 1).then(function (profile2) {
170
+ ok(profile2.id == profile.id);
171
+ start();
172
+ });
173
+
174
+ });
175
+
176
+ asyncTest("#handleFind with a record handles reload", function () {
177
+ var profile = FactoryGuy.make('profile')
178
+ testHelper.handleFind(profile);
179
+
180
+ profile.reload().then(function (profile2) {
181
+ ok(profile2.id == profile.id);
182
+ start();
183
+ });
184
+
185
+ });
186
+
187
+ asyncTest("#handleFind with options", function () {
188
+ var id = 1
189
+ testHelper.handleFind('profile', {id: id});
190
+
191
+ store.find('profile', 1).then(function (profile) {
192
+ ok(profile.get('id') == id);
193
+ start();
194
+ });
195
+
162
196
  });
163
197
 
164
- asyncTest("#handleFindOne with traits", function () {
198
+ asyncTest("#handleFind with traits", function () {
165
199
  var id = 1
166
- testHelper.handleFindOne('profile', 'goofy_description', {id: id});
200
+ testHelper.handleFind('profile', 'goofy_description', {id: id});
167
201
 
168
202
  store.find('profile', 1).then(function (profile) {
169
203
  ok(profile.get('description') == 'goofy');
@@ -171,10 +205,10 @@ asyncTest("#handleFindOne with traits", function () {
171
205
  });
172
206
  });
173
207
 
174
- asyncTest("#handleFindOne with arguments", function () {
208
+ asyncTest("#handleFind with arguments", function () {
175
209
  var id = 1
176
210
  var description = 'guy';
177
- testHelper.handleFindOne('profile', {id: id, description: description });
211
+ testHelper.handleFind('profile', {id: id, description: description });
178
212
 
179
213
  store.find('profile', 1).then(function (profile) {
180
214
  ok(profile.get('description') == description);
@@ -182,10 +216,10 @@ asyncTest("#handleFindOne with arguments", function () {
182
216
  });
183
217
  });
184
218
 
185
- asyncTest("#handleFindOne with traits and arguments", function () {
219
+ asyncTest("#handleFind with traits and arguments", function () {
186
220
  var id = 1
187
221
  var description = 'guy';
188
- testHelper.handleFindOne('profile', 'goofy_description', {id: id, description: description});
222
+ testHelper.handleFind('profile', 'goofy_description', {id: id, description: description});
189
223
 
190
224
  store.find('profile', 1).then(function (profile) {
191
225
  ok(profile.get('description') == description);
@@ -219,15 +253,16 @@ asyncTest("#handleCreate with no specific match", function() {
219
253
  });
220
254
  });
221
255
 
222
- asyncTest("#handleCreate matches attributes and returns these", function() {
256
+ asyncTest("#handleCreate match some attributes", function() {
223
257
  var customDescription = "special description"
258
+ var date = new Date();
224
259
 
225
260
  testHelper.handleCreate('profile', {
226
261
  match: {description: customDescription}
227
262
  })
228
263
 
229
264
  store.createRecord('profile', {
230
- description: customDescription
265
+ description: customDescription, created_at: date
231
266
  }).save().then(function(profile) {
232
267
  ok(profile instanceof Profile)
233
268
  ok(profile.id == 1)
@@ -236,6 +271,25 @@ asyncTest("#handleCreate matches attributes and returns these", function() {
236
271
  });
237
272
  });
238
273
 
274
+ asyncTest("#handleCreate match all attributes", function() {
275
+ var customDescription = "special description"
276
+ var date = new Date();
277
+
278
+ testHelper.handleCreate('profile', {
279
+ match: {description: customDescription, created_at: date}
280
+ })
281
+
282
+ store.createRecord('profile', {
283
+ description: customDescription, created_at: date
284
+ }).save().then(function(profile) {
285
+ ok(profile instanceof Profile)
286
+ ok(profile.id == 1)
287
+ ok(profile.get('description') == customDescription)
288
+ ok(profile.get('created_at') == date.toString())
289
+ start();
290
+ });
291
+ });
292
+
239
293
 
240
294
  asyncTest("#handleCreate returns attributes", function() {
241
295
  var date = new Date()
@@ -342,12 +396,21 @@ asyncTest("#handleCreate match but still fail", function() {
342
396
 
343
397
 
344
398
 
345
- /////// handleFindMany //////////
399
+ /////// handleFindAll //////////
346
400
 
347
-
348
- asyncTest("#handleFindMany the basic", function () {
401
+ asyncTest("#handleFindMany aliases handleFindAll", function () {
349
402
  testHelper.handleFindMany('profile', 2);
350
403
 
404
+ store.find('profile').then(function (profiles) {
405
+ ok(profiles.get('length') == 2);
406
+ ok(profiles.get('firstObject.description') == 'Text goes here');
407
+ start();
408
+ });
409
+ })
410
+
411
+ asyncTest("#handleFindAll the basic", function () {
412
+ testHelper.handleFindAll('profile', 2);
413
+
351
414
  store.find('profile').then(function (profiles) {
352
415
  ok(profiles.get('length') == 2);
353
416
  ok(profiles.get('firstObject.description') == 'Text goes here');
@@ -355,8 +418,8 @@ asyncTest("#handleFindMany the basic", function () {
355
418
  });
356
419
  });
357
420
 
358
- asyncTest("#handleFindMany with fixture options", function () {
359
- testHelper.handleFindMany('profile', 2, {description: 'dude'});
421
+ asyncTest("#handleFindAll with fixture options", function () {
422
+ testHelper.handleFindAll('profile', 2, {description: 'dude'});
360
423
 
361
424
  store.find('profile').then(function (profiles) {
362
425
  ok(profiles.get('length') == 2);
@@ -365,8 +428,8 @@ asyncTest("#handleFindMany with fixture options", function () {
365
428
  });
366
429
  });
367
430
 
368
- asyncTest("#handleFindMany with traits", function () {
369
- testHelper.handleFindMany('profile', 2, 'goofy_description');
431
+ asyncTest("#handleFindAll with traits", function () {
432
+ testHelper.handleFindAll('profile', 2, 'goofy_description');
370
433
 
371
434
  store.find('profile').then(function (profiles) {
372
435
  ok(profiles.get('length') == 2);
@@ -375,8 +438,8 @@ asyncTest("#handleFindMany with traits", function () {
375
438
  });
376
439
  });
377
440
 
378
- asyncTest("#handleFindMany with traits and fixture options", function () {
379
- testHelper.handleFindMany('profile', 2, 'goofy_description', {description: 'dude'});
441
+ asyncTest("#handleFindAll with traits and fixture options", function () {
442
+ testHelper.handleFindAll('profile', 2, 'goofy_description', {description: 'dude'});
380
443
 
381
444
  store.find('profile').then(function (profiles) {
382
445
  ok(profiles.get('length') == 2);
@@ -908,6 +908,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
908
908
  if (options.data) {
909
909
  request.data = options.data;
910
910
  }
911
+
911
912
  $.mockjax(request);
912
913
  },
913
914
  /**
@@ -929,7 +930,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
929
930
  // Pass in the parameters you would normally pass into FactoryGuy.makeList,
930
931
  // like fixture name, number of fixtures to make, and optional traits,
931
932
  // or fixture options
932
- testHelper.handleFindMany('user', 2, 'with_hats');
933
+ testHelper.handleFindAll('user', 2, 'with_hats');
933
934
 
934
935
  store.find('user').then(function(users){
935
936
 
@@ -941,7 +942,7 @@ var FactoryGuyTestMixin = Em.Mixin.create({
941
942
  @param {String} trait optional traits (one or more)
942
943
  @param {Object} opts optional fixture options
943
944
  */
944
- handleFindMany: function () {
945
+ handleFindAll: function () {
945
946
  // make the records and load them in the store
946
947
  var records = FactoryGuy.makeList.apply(FactoryGuy, arguments);
947
948
  var name = arguments[0];
@@ -952,7 +953,10 @@ var FactoryGuyTestMixin = Em.Mixin.create({
952
953
  var url = this.buildURL(modelName);
953
954
  this.stubEndpointForHttpRequest(url, responseJson);
954
955
  },
955
-
956
+ handleFindMany: function() {
957
+ Ember.deprecate('DEPRECATION Warning: use handleFindAll instead');
958
+ this.handleFindAll.apply(this, arguments)
959
+ },
956
960
  /**
957
961
  Handling ajax GET for finding one record for a type of model and an id.
958
962
  You can mock failed find by passing in success argument as false.
@@ -972,18 +976,28 @@ var FactoryGuyTestMixin = Em.Mixin.create({
972
976
  @param {String} trait optional traits (one or more)
973
977
  @param {Object} opts optional fixture options (including id)
974
978
  */
975
- handleFindOne: function () {
976
- // make the records and load them in the store
977
- var record = FactoryGuy.make.apply(FactoryGuy, arguments);
978
- var name = arguments[0];
979
- var modelName = FactoryGuy.lookupModelForFixtureName(name);
979
+ handleFind: function () {
980
+ var args = Array.prototype.slice.call(arguments)
981
+ Ember.assert("To handleFindOne pass in a model instance or a type and model options", args.length>0)
982
+
983
+ var record, modelName;
984
+ if (args[0] instanceof DS.Model) {
985
+ record = args[0];
986
+ modelName = record.constructor.typeKey;
987
+ } else {
988
+ // make the record and load it in the store
989
+ record = FactoryGuy.make.apply(FactoryGuy, arguments);
990
+ var name = arguments[0];
991
+ modelName = FactoryGuy.lookupModelForFixtureName(name);
992
+ }
993
+
980
994
  var responseJson = {};
981
995
  var json = record.toJSON({includeId: true});
982
996
  responseJson[modelName.pluralize()] = json;
983
997
  var url = this.buildURL(modelName, record.id);
984
998
  this.stubEndpointForHttpRequest(url, responseJson);
985
999
  },
986
-
1000
+ handleFindOne: function() { this.handleFind.apply(this, arguments) },
987
1001
  /**
988
1002
  Handling ajax GET for finding all records for a type of model with query parameters.
989
1003
 
@@ -1048,55 +1062,74 @@ var FactoryGuyTestMixin = Em.Mixin.create({
1048
1062
  succeed - flag to indicate if the request should succeed ( default is true )
1049
1063
 
1050
1064
  Note:
1051
- 1) that any attributes in match will be added to the response json automatically,
1052
- so you don't need to include them in the returns hash as well.
1065
+ 1) Any attributes in match will be added to the response json automatically,
1066
+ so you don't need to include them in the returns hash.
1067
+
1068
+ 2) As long as all the match attributes are found in the record being created,
1069
+ the create will succeed. In other words, there may be other attributes in the
1070
+ createRecord call, but you don't have to match them all. For example:
1071
+
1072
+ ```js
1073
+ handleCreate('post', {match: {title: 'foo'})
1074
+ store.createRecord('post', {title: 'foo', created_at: new Date()})
1075
+ ```
1053
1076
 
1054
- 2) If you don't use match options for exact match, there will be no id returned to the model.
1055
- The reason being, that this method purposely returns an empty hash response with a 'don't match'
1056
- style handleCreate, because if the responseJson returns a non empty data hash ( with even only
1057
- the id), this essentially empty hash of attributes will override ( and nullify ) all the attributes
1058
- that set when you created the record.
1059
- 3) If you match on a belongsTo association, you don't have to include that in the
1060
- returns hash.
1077
+ 2) If you match on a belongsTo association, you don't have to include that in the
1078
+ returns hash either.
1061
1079
 
1062
1080
  @param {String} modelName name of model your creating like 'profile' for Profile
1063
1081
  @param {Object} options hash of options for handling request
1064
1082
  */
1065
1083
  handleCreate: function (modelName, options) {
1066
1084
  var opts = options === undefined ? {} : options;
1085
+ var store = this.getStore()
1067
1086
  var succeed = opts.succeed === undefined ? true : opts.succeed;
1068
1087
  var match = opts.match || {};
1069
1088
  var returnArgs = opts.returns || {};
1070
1089
 
1071
- var url = this.buildURL(modelName);
1072
- var definition = FactoryGuy.modelDefinitions[modelName];
1073
-
1074
- var httpOptions = {type: 'POST'};
1075
1090
  if (opts.match) {
1076
- var expectedRequest = {};
1077
- var record = this.getStore().createRecord(modelName, match);
1078
- expectedRequest[modelName] = record.serialize();
1079
- httpOptions.data = JSON.stringify(expectedRequest);
1091
+ var record = store.createRecord(modelName, match);
1092
+ var expectedRequest = record.serialize();
1080
1093
  }
1081
1094
 
1082
- var modelType = this.getStore().modelFor(modelName)
1095
+ var modelType = store.modelFor(modelName)
1083
1096
 
1084
1097
  var responseJson = {};
1085
1098
  if (succeed) {
1086
- responseJson[modelName] = $.extend({id: definition.nextId()}, match, returnArgs);
1087
- // Remove belongsTo associations since they will already be set when you called
1088
- // createRecord, and included them in those attributes
1089
- Ember.get(modelType, 'relationshipsByName').forEach(function (relationship) {
1090
- if (relationship.kind == 'belongsTo') {
1091
- delete responseJson[modelName][relationship.key];
1099
+ var definition = FactoryGuy.modelDefinitions[modelName];
1100
+ responseJson[modelName] = $.extend({id: definition.nextId()}, match, returnArgs);
1101
+ // Remove belongsTo associations since they will already be set when you called
1102
+ // createRecord, so they don't need to be returned.
1103
+ Ember.get(modelType, 'relationshipsByName').forEach(function (relationship) {
1104
+ if (relationship.kind == 'belongsTo') {
1105
+ delete responseJson[modelName][relationship.key];
1106
+ }
1107
+ })
1108
+ }
1109
+
1110
+ var url = this.buildURL(modelName);
1111
+
1112
+ var handler = function(settings) {
1113
+ if (settings.url != url || settings.type != 'POST') { return false}
1114
+
1115
+ if (opts.match) {
1116
+ var requestData = JSON.parse(settings.data)[modelName];
1117
+ for (attribute in expectedRequest) {
1118
+ if (expectedRequest[attribute] && requestData[attribute] != expectedRequest[attribute]) {
1119
+ return false
1092
1120
  }
1093
- })
1094
- } else {
1095
- httpOptions.status = 500;
1121
+ }
1122
+ }
1123
+ var responseStatus = (succeed ? 200: 500);
1124
+ return {
1125
+ responseText: responseJson,
1126
+ status: responseStatus
1127
+ };
1096
1128
  }
1097
1129
 
1098
- this.stubEndpointForHttpRequest(url, responseJson, httpOptions);
1130
+ $.mockjax(handler);
1099
1131
  },
1132
+
1100
1133
  /**
1101
1134
  Handling ajax PUT ( update record ) for a model type. You can mock
1102
1135
  failed update by passing in success argument as false.
@@ -1650,6 +1683,7 @@ if (FactoryGuy !== undefined) {
1650
1683
  }
1651
1684
 
1652
1685
  mockHandler = getMockForRequest( mockHandlers[k], requestSettings );
1686
+
1653
1687
  if(!mockHandler) {
1654
1688
  // No valid mock found for this request
1655
1689
  continue;
@@ -1701,7 +1735,7 @@ if (FactoryGuy !== undefined) {
1701
1735
  }
1702
1736
 
1703
1737
  copyUrlParameters(mockHandler, origSettings);
1704
-
1738
+ //console.log('here copyUrlParameters', 'mockHandler=>',mockHandler, 'requestSettings=>',requestSettings, 'origSettings=>',origSettings)
1705
1739
  (function(mockHandler, requestSettings, origSettings, origHandler) {
1706
1740
 
1707
1741
  mockRequest = _ajax.call($, $.extend(true, {}, origSettings, {
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.4
4
+ version: 0.9.5
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-14 00:00:00.000000000 Z
12
+ date: 2015-01-17 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Easily create Fixtures for Ember Data
15
15
  email: