ember-data-factory-guy 0.9.9 → 0.9.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gruntfile.js +3 -0
- data/README.md +53 -5
- data/bower.json +1 -1
- data/dist/amd/factory-guy.js +67 -17
- data/dist/ember-data-factory-guy.js +67 -17
- data/dist/ember-data-factory-guy.min.js +1 -1
- data/package.json +1 -1
- data/src/factory_guy_test_mixin.js +18 -17
- data/src/mock_update_request.js +49 -0
- data/tests/factory_guy_test_mixin_test.js +147 -30
- data/vendor/assets/javascripts/ember_data_factory_guy.js +71 -23
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5e79cf8c600cf6d977adb4d9c988e0d31486785a
|
|
4
|
+
data.tar.gz: 64dd2732df1804268becf7d76c3f3c593d05be12
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d3b8ab0f269111f6b6583e4cae4936e3e7b3f055a1ae56bb2128494d61729790172fe6f5768f94f6a810077918fdfb9adf34502d5dc391ff07464e19c767ce25
|
|
7
|
+
data.tar.gz: f2dba9d3a2e780cd58afadf3f32c913924a53e927c7c36886f8906116dc6497ffcdc39f80c437ff6920ff50406a31f6bd035feb7f0f7a89a9b246a36044a3d7d
|
data/Gruntfile.js
CHANGED
|
@@ -11,6 +11,7 @@ module.exports = function(grunt) {
|
|
|
11
11
|
'src/model_definition.js',
|
|
12
12
|
'src/factory_guy.js',
|
|
13
13
|
'src/mock_create_request.js',
|
|
14
|
+
'src/mock_update_request.js',
|
|
14
15
|
'src/store.js',
|
|
15
16
|
'src/factory_guy_test_mixin.js',
|
|
16
17
|
],
|
|
@@ -23,6 +24,7 @@ module.exports = function(grunt) {
|
|
|
23
24
|
'src/model_definition.js',
|
|
24
25
|
'src/factory_guy.js',
|
|
25
26
|
'src/mock_create_request.js',
|
|
27
|
+
'src/mock_update_request.js',
|
|
26
28
|
'src/store.js',
|
|
27
29
|
'src/factory_guy_test_mixin.js',
|
|
28
30
|
'src/epilogue.js'
|
|
@@ -40,6 +42,7 @@ module.exports = function(grunt) {
|
|
|
40
42
|
'src/model_definition.js',
|
|
41
43
|
'src/factory_guy.js',
|
|
42
44
|
'src/mock_create_request.js',
|
|
45
|
+
'src/mock_update_request.js',
|
|
43
46
|
'src/store.js',
|
|
44
47
|
'src/factory_guy_test_mixin.js',
|
|
45
48
|
'bower_components/jquery-mockjax/jquery.mockjax.js'],
|
data/README.md
CHANGED
|
@@ -15,7 +15,7 @@ of ember-data-factory-guy.
|
|
|
15
15
|
- 0.7.1.1 -> ember-data-1.0.0-beta.10
|
|
16
16
|
- 0.8.6 -> ember-data-1.0.0-beta.11
|
|
17
17
|
- 0.9.8 -> ember-data-1.0.0-beta.12
|
|
18
|
-
- 0.9.
|
|
18
|
+
- 0.9.10 -> ember-data-1.0.0-beta.15
|
|
19
19
|
|
|
20
20
|
**Support for fixture adapter is working for versions 0.9.3 -> 0.9.8**
|
|
21
21
|
|
|
@@ -44,7 +44,7 @@ gem 'ember-data-factory-guy', group: test
|
|
|
44
44
|
or for particular version:
|
|
45
45
|
|
|
46
46
|
```ruby
|
|
47
|
-
gem 'ember-data-factory-guy', '0.9.
|
|
47
|
+
gem 'ember-data-factory-guy', '0.9.10', group: test
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
then:
|
|
@@ -79,7 +79,7 @@ or for particular version:
|
|
|
79
79
|
"dependencies": {
|
|
80
80
|
"foo-dependency": "latest",
|
|
81
81
|
"other-foo-dependency": "latest",
|
|
82
|
-
"ember-data-factory-guy": "0.9.
|
|
82
|
+
"ember-data-factory-guy": "0.9.10"
|
|
83
83
|
}
|
|
84
84
|
```
|
|
85
85
|
|
|
@@ -814,8 +814,17 @@ chainable methods, or options hash.
|
|
|
814
814
|
|
|
815
815
|
|
|
816
816
|
##### handleUpdate
|
|
817
|
+
|
|
818
|
+
- Use chainable methods to build response:
|
|
819
|
+
- andFail - request should fail, use options argument to pass status and response text
|
|
820
|
+
- andSucceed - update should succeed, this is the default behavior, use this after a ```andFail``` call
|
|
821
|
+
|
|
817
822
|
- handleUpdate(model)
|
|
818
823
|
- handleUpdate(modelType, id)
|
|
824
|
+
- Use hash of options to build response:
|
|
825
|
+
- status - HTTP status code, defaults to 200.
|
|
826
|
+
- response - what the server has responded, only used on failure cases, default is empty on failure and model json on succees.
|
|
827
|
+
- succeed - indicates if the resquest should succeed, defaults to true.
|
|
819
828
|
- need to wrap tests using handleUpdate with: Ember.run.function() { 'your test' })
|
|
820
829
|
|
|
821
830
|
*success case is the default*
|
|
@@ -834,15 +843,54 @@ chainable methods, or options hash.
|
|
|
834
843
|
profile.save() //=> will succeed
|
|
835
844
|
````
|
|
836
845
|
|
|
846
|
+
######Using chainable methods
|
|
847
|
+
|
|
848
|
+
*mocking a failed update*
|
|
849
|
+
|
|
850
|
+
```javascript
|
|
851
|
+
var profile = FactoryGuy.make('profile');
|
|
852
|
+
|
|
853
|
+
// set the succeed flag to 'false'
|
|
854
|
+
testHelper.handleUpdate('profile', profile.id).andFail({status: 422, response: "{error: 'Invalid data'}"});
|
|
855
|
+
// or
|
|
856
|
+
testHelper.handleUpdate(profile).andFail({status: 422, response: "{error: 'Invalid data'}"});
|
|
857
|
+
|
|
858
|
+
profile.set('description', 'bad value');
|
|
859
|
+
profile.save() //=> will fail
|
|
860
|
+
````
|
|
861
|
+
|
|
862
|
+
*mocking a failed update and retry with succees*
|
|
863
|
+
|
|
864
|
+
```javascript
|
|
865
|
+
var profile = FactoryGuy.make('profile');
|
|
866
|
+
|
|
867
|
+
// set the succeed flag to 'false'
|
|
868
|
+
var mockUpdate = testHelper.handleUpdate('profile', profile.id);
|
|
869
|
+
// or
|
|
870
|
+
var mockUpdate = testHelper.handleUpdate(profile);
|
|
871
|
+
|
|
872
|
+
mockUpdate.andFail({status: 422, response: "{error: 'Invalid data'}"});
|
|
873
|
+
|
|
874
|
+
profile.set('description', 'bad value');
|
|
875
|
+
profile.save() //=> will fail
|
|
876
|
+
|
|
877
|
+
// Some logic for retrying...
|
|
878
|
+
|
|
879
|
+
mockUpdate.andSucceed();
|
|
880
|
+
profile.save() //=> will succeed!
|
|
881
|
+
````
|
|
882
|
+
|
|
883
|
+
######Using hash of options
|
|
884
|
+
|
|
837
885
|
*mocking a failed update*
|
|
838
886
|
|
|
839
887
|
```javascript
|
|
840
888
|
var profile = FactoryGuy.make('profile');
|
|
841
889
|
|
|
842
890
|
// set the succeed flag to 'false'
|
|
843
|
-
testHelper.handleUpdate('profile', profile.id, false);
|
|
891
|
+
testHelper.handleUpdate('profile', profile.id, {succeed: false});
|
|
844
892
|
// or
|
|
845
|
-
testHelper.handleUpdate(profile, false);
|
|
893
|
+
testHelper.handleUpdate(profile, {succeed: false});
|
|
846
894
|
|
|
847
895
|
profile.set('description', 'bad value');
|
|
848
896
|
profile.save() //=> will fail
|
data/bower.json
CHANGED
data/dist/amd/factory-guy.js
CHANGED
|
@@ -649,6 +649,55 @@ var MockCreateRequest = function(url, store, modelName, options) {
|
|
|
649
649
|
$.mockjax(this.handler);
|
|
650
650
|
};
|
|
651
651
|
|
|
652
|
+
var MockUpdateRequest = function(url, model, mapFind, options) {
|
|
653
|
+
var status = options.status || 200;
|
|
654
|
+
var succeed = true;
|
|
655
|
+
var response = null;
|
|
656
|
+
|
|
657
|
+
if ('succeed' in options) {
|
|
658
|
+
succeed = options.succeed;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
if ('response' in options) {
|
|
662
|
+
response = options.response;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
this.andSucceed = function(options) {
|
|
666
|
+
succeed = true;
|
|
667
|
+
return this;
|
|
668
|
+
};
|
|
669
|
+
|
|
670
|
+
this.andFail = function(options) {
|
|
671
|
+
succeed = false;
|
|
672
|
+
status = options.status || 500;
|
|
673
|
+
if ('response' in options) {
|
|
674
|
+
response = options.response;
|
|
675
|
+
}
|
|
676
|
+
return this;
|
|
677
|
+
};
|
|
678
|
+
|
|
679
|
+
this.handler = function(settings) {
|
|
680
|
+
if (!succeed) {
|
|
681
|
+
this.status = status;
|
|
682
|
+
if (response !== null) {
|
|
683
|
+
this.responseText = response;
|
|
684
|
+
}
|
|
685
|
+
} else {
|
|
686
|
+
var json = model.toJSON({includeId: true});
|
|
687
|
+
this.responseText = mapFind(model.constructor.typeKey, json);
|
|
688
|
+
this.status = 200;
|
|
689
|
+
}
|
|
690
|
+
};
|
|
691
|
+
|
|
692
|
+
var requestConfig = {
|
|
693
|
+
url: url,
|
|
694
|
+
dataType: 'json',
|
|
695
|
+
type: 'PUT',
|
|
696
|
+
response: this.handler
|
|
697
|
+
};
|
|
698
|
+
|
|
699
|
+
$.mockjax(requestConfig);
|
|
700
|
+
};
|
|
652
701
|
(function () {
|
|
653
702
|
DS.Store.reopen({
|
|
654
703
|
/**
|
|
@@ -1196,34 +1245,35 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
|
1196
1245
|
Handling ajax PUT ( update record ) for a model type. You can mock
|
|
1197
1246
|
failed update by passing in success argument as false.
|
|
1198
1247
|
|
|
1199
|
-
@param {String} type model type like 'user' for User model
|
|
1248
|
+
@param {String} type model type like 'user' for User model, or a model instance
|
|
1200
1249
|
@param {String} id id of record to update
|
|
1201
|
-
@param {
|
|
1202
|
-
should succeed ( default is true )
|
|
1250
|
+
@param {Object} options options object
|
|
1203
1251
|
*/
|
|
1204
1252
|
handleUpdate: function () {
|
|
1205
|
-
var args = Array.prototype.slice.call(arguments)
|
|
1253
|
+
var args = Array.prototype.slice.call(arguments);
|
|
1206
1254
|
Ember.assert("To handleUpdate pass in a model instance or a type and an id", args.length>0)
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1255
|
+
|
|
1256
|
+
var options = {};
|
|
1257
|
+
if (args.length > 1 && typeof args[args.length - 1] === 'object') {
|
|
1258
|
+
options = args.pop();
|
|
1211
1259
|
}
|
|
1212
|
-
|
|
1213
|
-
var type, id;
|
|
1260
|
+
|
|
1261
|
+
var model, type, id;
|
|
1262
|
+
var store = this.getStore();
|
|
1263
|
+
|
|
1214
1264
|
if (args[0] instanceof DS.Model) {
|
|
1215
|
-
|
|
1216
|
-
type = model.constructor.typeKey;
|
|
1265
|
+
model = args[0];
|
|
1217
1266
|
id = model.id;
|
|
1267
|
+
type = model.constructor.typeKey;
|
|
1218
1268
|
} else if (typeof args[0] == "string" && typeof parseInt(args[1]) == "number") {
|
|
1219
1269
|
type = args[0];
|
|
1220
1270
|
id = args[1];
|
|
1271
|
+
model = store.getById(type, id)
|
|
1221
1272
|
}
|
|
1222
|
-
Ember.assert("To handleUpdate pass in a model instance or a type and an id",type && id)
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
});
|
|
1273
|
+
Ember.assert("To handleUpdate pass in a model instance or a type and an id",type && id);
|
|
1274
|
+
|
|
1275
|
+
var url = this.buildURL(type, id);
|
|
1276
|
+
return new MockUpdateRequest(url, model, this.mapFind, options);
|
|
1227
1277
|
},
|
|
1228
1278
|
/**
|
|
1229
1279
|
Handling ajax DELETE ( delete record ) for a model type. You can mock
|
|
@@ -644,6 +644,55 @@ var MockCreateRequest = function(url, store, modelName, options) {
|
|
|
644
644
|
$.mockjax(this.handler);
|
|
645
645
|
};
|
|
646
646
|
|
|
647
|
+
var MockUpdateRequest = function(url, model, mapFind, options) {
|
|
648
|
+
var status = options.status || 200;
|
|
649
|
+
var succeed = true;
|
|
650
|
+
var response = null;
|
|
651
|
+
|
|
652
|
+
if ('succeed' in options) {
|
|
653
|
+
succeed = options.succeed;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
if ('response' in options) {
|
|
657
|
+
response = options.response;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
this.andSucceed = function(options) {
|
|
661
|
+
succeed = true;
|
|
662
|
+
return this;
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
this.andFail = function(options) {
|
|
666
|
+
succeed = false;
|
|
667
|
+
status = options.status || 500;
|
|
668
|
+
if ('response' in options) {
|
|
669
|
+
response = options.response;
|
|
670
|
+
}
|
|
671
|
+
return this;
|
|
672
|
+
};
|
|
673
|
+
|
|
674
|
+
this.handler = function(settings) {
|
|
675
|
+
if (!succeed) {
|
|
676
|
+
this.status = status;
|
|
677
|
+
if (response !== null) {
|
|
678
|
+
this.responseText = response;
|
|
679
|
+
}
|
|
680
|
+
} else {
|
|
681
|
+
var json = model.toJSON({includeId: true});
|
|
682
|
+
this.responseText = mapFind(model.constructor.typeKey, json);
|
|
683
|
+
this.status = 200;
|
|
684
|
+
}
|
|
685
|
+
};
|
|
686
|
+
|
|
687
|
+
var requestConfig = {
|
|
688
|
+
url: url,
|
|
689
|
+
dataType: 'json',
|
|
690
|
+
type: 'PUT',
|
|
691
|
+
response: this.handler
|
|
692
|
+
};
|
|
693
|
+
|
|
694
|
+
$.mockjax(requestConfig);
|
|
695
|
+
};
|
|
647
696
|
(function () {
|
|
648
697
|
DS.Store.reopen({
|
|
649
698
|
/**
|
|
@@ -1191,34 +1240,35 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
|
1191
1240
|
Handling ajax PUT ( update record ) for a model type. You can mock
|
|
1192
1241
|
failed update by passing in success argument as false.
|
|
1193
1242
|
|
|
1194
|
-
@param {String} type model type like 'user' for User model
|
|
1243
|
+
@param {String} type model type like 'user' for User model, or a model instance
|
|
1195
1244
|
@param {String} id id of record to update
|
|
1196
|
-
@param {
|
|
1197
|
-
should succeed ( default is true )
|
|
1245
|
+
@param {Object} options options object
|
|
1198
1246
|
*/
|
|
1199
1247
|
handleUpdate: function () {
|
|
1200
|
-
var args = Array.prototype.slice.call(arguments)
|
|
1248
|
+
var args = Array.prototype.slice.call(arguments);
|
|
1201
1249
|
Ember.assert("To handleUpdate pass in a model instance or a type and an id", args.length>0)
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1250
|
+
|
|
1251
|
+
var options = {};
|
|
1252
|
+
if (args.length > 1 && typeof args[args.length - 1] === 'object') {
|
|
1253
|
+
options = args.pop();
|
|
1206
1254
|
}
|
|
1207
|
-
|
|
1208
|
-
var type, id;
|
|
1255
|
+
|
|
1256
|
+
var model, type, id;
|
|
1257
|
+
var store = this.getStore();
|
|
1258
|
+
|
|
1209
1259
|
if (args[0] instanceof DS.Model) {
|
|
1210
|
-
|
|
1211
|
-
type = model.constructor.typeKey;
|
|
1260
|
+
model = args[0];
|
|
1212
1261
|
id = model.id;
|
|
1262
|
+
type = model.constructor.typeKey;
|
|
1213
1263
|
} else if (typeof args[0] == "string" && typeof parseInt(args[1]) == "number") {
|
|
1214
1264
|
type = args[0];
|
|
1215
1265
|
id = args[1];
|
|
1266
|
+
model = store.getById(type, id)
|
|
1216
1267
|
}
|
|
1217
|
-
Ember.assert("To handleUpdate pass in a model instance or a type and an id",type && id)
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
});
|
|
1268
|
+
Ember.assert("To handleUpdate pass in a model instance or a type and an id",type && id);
|
|
1269
|
+
|
|
1270
|
+
var url = this.buildURL(type, id);
|
|
1271
|
+
return new MockUpdateRequest(url, model, this.mapFind, options);
|
|
1222
1272
|
},
|
|
1223
1273
|
/**
|
|
1224
1274
|
Handling ajax DELETE ( delete record ) for a model type. You can mock
|
|
@@ -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 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(var 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}
|
|
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(var 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)};var MockUpdateRequest=function(url,model,mapFind,options){var status=options.status||200;var succeed=true;var response=null;if("succeed"in options){succeed=options.succeed}if("response"in options){response=options.response}this.andSucceed=function(options){succeed=true;return this};this.andFail=function(options){succeed=false;status=options.status||500;if("response"in options){response=options.response}return this};this.handler=function(settings){if(!succeed){this.status=status;if(response!==null){this.responseText=response}}else{var json=model.toJSON({includeId:true});this.responseText=mapFind(model.constructor.typeKey,json);this.status=200}};var requestConfig={url:url,dataType:"json",type:"PUT",response:this.handler};$.mockjax(requestConfig)};(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 options={};if(args.length>1&&typeof args[args.length-1]==="object"){options=args.pop()}var model,type,id;var store=this.getStore();if(args[0]instanceof DS.Model){model=args[0];id=model.id;type=model.constructor.typeKey}else if(typeof args[0]=="string"&&typeof parseInt(args[1])=="number"){type=args[0];id=args[1];model=store.getById(type,id)}Ember.assert("To handleUpdate pass in a model instance or a type and an id",type&&id);var url=this.buildURL(type,id);return new MockUpdateRequest(url,model,this.mapFind,options)},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
|
@@ -268,34 +268,35 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
|
268
268
|
Handling ajax PUT ( update record ) for a model type. You can mock
|
|
269
269
|
failed update by passing in success argument as false.
|
|
270
270
|
|
|
271
|
-
@param {String} type model type like 'user' for User model
|
|
271
|
+
@param {String} type model type like 'user' for User model, or a model instance
|
|
272
272
|
@param {String} id id of record to update
|
|
273
|
-
@param {
|
|
274
|
-
should succeed ( default is true )
|
|
273
|
+
@param {Object} options options object
|
|
275
274
|
*/
|
|
276
275
|
handleUpdate: function () {
|
|
277
|
-
var args = Array.prototype.slice.call(arguments)
|
|
276
|
+
var args = Array.prototype.slice.call(arguments);
|
|
278
277
|
Ember.assert("To handleUpdate pass in a model instance or a type and an id", args.length>0)
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
278
|
+
|
|
279
|
+
var options = {};
|
|
280
|
+
if (args.length > 1 && typeof args[args.length - 1] === 'object') {
|
|
281
|
+
options = args.pop();
|
|
283
282
|
}
|
|
284
|
-
|
|
285
|
-
var type, id;
|
|
283
|
+
|
|
284
|
+
var model, type, id;
|
|
285
|
+
var store = this.getStore();
|
|
286
|
+
|
|
286
287
|
if (args[0] instanceof DS.Model) {
|
|
287
|
-
|
|
288
|
-
type = model.constructor.typeKey;
|
|
288
|
+
model = args[0];
|
|
289
289
|
id = model.id;
|
|
290
|
+
type = model.constructor.typeKey;
|
|
290
291
|
} else if (typeof args[0] == "string" && typeof parseInt(args[1]) == "number") {
|
|
291
292
|
type = args[0];
|
|
292
293
|
id = args[1];
|
|
294
|
+
model = store.getById(type, id)
|
|
293
295
|
}
|
|
294
|
-
Ember.assert("To handleUpdate pass in a model instance or a type and an id",type && id)
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
});
|
|
296
|
+
Ember.assert("To handleUpdate pass in a model instance or a type and an id",type && id);
|
|
297
|
+
|
|
298
|
+
var url = this.buildURL(type, id);
|
|
299
|
+
return new MockUpdateRequest(url, model, this.mapFind, options);
|
|
299
300
|
},
|
|
300
301
|
/**
|
|
301
302
|
Handling ajax DELETE ( delete record ) for a model type. You can mock
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
var MockUpdateRequest = function(url, model, mapFind, options) {
|
|
2
|
+
var status = options.status || 200;
|
|
3
|
+
var succeed = true;
|
|
4
|
+
var response = null;
|
|
5
|
+
|
|
6
|
+
if ('succeed' in options) {
|
|
7
|
+
succeed = options.succeed;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
if ('response' in options) {
|
|
11
|
+
response = options.response;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
this.andSucceed = function(options) {
|
|
15
|
+
succeed = true;
|
|
16
|
+
return this;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
this.andFail = function(options) {
|
|
20
|
+
succeed = false;
|
|
21
|
+
status = options.status || 500;
|
|
22
|
+
if ('response' in options) {
|
|
23
|
+
response = options.response;
|
|
24
|
+
}
|
|
25
|
+
return this;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
this.handler = function(settings) {
|
|
29
|
+
if (!succeed) {
|
|
30
|
+
this.status = status;
|
|
31
|
+
if (response !== null) {
|
|
32
|
+
this.responseText = response;
|
|
33
|
+
}
|
|
34
|
+
} else {
|
|
35
|
+
var json = model.toJSON({includeId: true});
|
|
36
|
+
this.responseText = mapFind(model.constructor.typeKey, json);
|
|
37
|
+
this.status = 200;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
var requestConfig = {
|
|
42
|
+
url: url,
|
|
43
|
+
dataType: 'json',
|
|
44
|
+
type: 'PUT',
|
|
45
|
+
response: this.handler
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
$.mockjax(requestConfig);
|
|
49
|
+
};
|
|
@@ -28,7 +28,7 @@ module('FactoryGuyTestMixin (using mockjax) with DS.RESTAdapter', {
|
|
|
28
28
|
setup: function () {
|
|
29
29
|
testHelper = TestHelper.setup(DS.RESTAdapter);
|
|
30
30
|
store = testHelper.getStore();
|
|
31
|
-
make = function() {return FactoryGuy.make.apply(FactoryGuy,arguments)}
|
|
31
|
+
make = function() {return FactoryGuy.make.apply(FactoryGuy,arguments);}
|
|
32
32
|
},
|
|
33
33
|
teardown: function () {
|
|
34
34
|
Em.run(function() {
|
|
@@ -623,17 +623,16 @@ asyncTest("#handleFindAll with traits and fixture options", function () {
|
|
|
623
623
|
test("#handleUpdate with incorrect parameters", function(assert) {
|
|
624
624
|
assert.throws(function(){testHelper.handleUpdate()},"missing everything");
|
|
625
625
|
assert.throws(function(){testHelper.handleUpdate('profile')},"missing id");
|
|
626
|
-
assert.throws(function(){testHelper.handleUpdate('profile',
|
|
627
|
-
assert.throws(function(){testHelper.handleUpdate('profile', true)},"missing id");
|
|
626
|
+
assert.throws(function(){testHelper.handleUpdate('profile', {})},"missing id");
|
|
628
627
|
});
|
|
629
628
|
|
|
630
|
-
asyncTest("#handleUpdate the with modelType and id", function() {
|
|
631
|
-
Em.run(function() {
|
|
629
|
+
asyncTest("#handleUpdate the with modelType and id", function () {
|
|
630
|
+
Em.run(function () {
|
|
632
631
|
var profile = make('profile');
|
|
633
632
|
testHelper.handleUpdate('profile', profile.id);
|
|
634
633
|
|
|
635
|
-
profile.set('description','new desc');
|
|
636
|
-
profile.save().then(function(profile) {
|
|
634
|
+
profile.set('description', 'new desc');
|
|
635
|
+
profile.save().then(function (profile) {
|
|
637
636
|
ok(profile.get('description') == 'new desc');
|
|
638
637
|
start();
|
|
639
638
|
});
|
|
@@ -641,52 +640,170 @@ asyncTest("#handleUpdate the with modelType and id", function() {
|
|
|
641
640
|
});
|
|
642
641
|
|
|
643
642
|
|
|
644
|
-
asyncTest("#handleUpdate the with model", function() {
|
|
645
|
-
Em.run(function() {
|
|
643
|
+
asyncTest("#handleUpdate the with model", function () {
|
|
644
|
+
Em.run(function () {
|
|
646
645
|
var profile = make('profile');
|
|
647
|
-
testHelper.handleUpdate(profile
|
|
646
|
+
testHelper.handleUpdate(profile);
|
|
648
647
|
|
|
649
|
-
profile.set('description','new desc');
|
|
650
|
-
profile.save().then(function(profile) {
|
|
648
|
+
profile.set('description', 'new desc');
|
|
649
|
+
profile.save().then(function (profile) {
|
|
651
650
|
ok(profile.get('description') == 'new desc');
|
|
652
651
|
start();
|
|
653
652
|
});
|
|
654
653
|
});
|
|
655
654
|
});
|
|
656
655
|
|
|
657
|
-
asyncTest("#handleUpdate the with modelType and id that fails", function() {
|
|
658
|
-
Em.run(function() {
|
|
656
|
+
asyncTest("#handleUpdate the with modelType and id that fails", function () {
|
|
657
|
+
Em.run(function () {
|
|
659
658
|
var profile = make('profile');
|
|
660
|
-
testHelper.handleUpdate('profile', profile.id, false);
|
|
661
659
|
|
|
662
|
-
|
|
660
|
+
testHelper.handleUpdate('profile', profile.id, {succeed: false, status: 500});
|
|
661
|
+
|
|
662
|
+
profile.set('description', 'new desc');
|
|
663
663
|
profile.save().then(
|
|
664
|
-
function() {
|
|
665
|
-
|
|
666
|
-
|
|
664
|
+
function () {
|
|
665
|
+
},
|
|
666
|
+
function () {
|
|
667
|
+
ok(true);
|
|
667
668
|
start();
|
|
668
669
|
}
|
|
669
|
-
)
|
|
670
|
+
);
|
|
670
671
|
});
|
|
671
672
|
});
|
|
672
673
|
|
|
673
|
-
asyncTest("#handleUpdate with model that fails", function() {
|
|
674
|
-
Em.run(function() {
|
|
674
|
+
asyncTest("#handleUpdate with model that fails", function () {
|
|
675
|
+
Em.run(function () {
|
|
675
676
|
var profile = make('profile');
|
|
676
677
|
|
|
677
|
-
testHelper.handleUpdate(profile, false);
|
|
678
|
+
testHelper.handleUpdate(profile, {succeed: false, status: 500});
|
|
678
679
|
|
|
679
|
-
profile.set('description','new desc');
|
|
680
|
+
profile.set('description', 'new desc');
|
|
680
681
|
profile.save().then(
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
682
|
+
function () {
|
|
683
|
+
},
|
|
684
|
+
function () {
|
|
685
|
+
ok(true);
|
|
686
|
+
start();
|
|
687
|
+
}
|
|
688
|
+
);
|
|
687
689
|
});
|
|
688
690
|
});
|
|
689
691
|
|
|
692
|
+
asyncTest("#handleUpdate with model that fails with custom response", function () {
|
|
693
|
+
Em.run(function () {
|
|
694
|
+
var profile = make('profile');
|
|
695
|
+
|
|
696
|
+
testHelper.handleUpdate(profile, {succeed: false, status: 400, response: "{error: 'invalid data'}"});
|
|
697
|
+
|
|
698
|
+
profile.set('description', 'new desc');
|
|
699
|
+
profile.save().then(
|
|
700
|
+
function () {
|
|
701
|
+
},
|
|
702
|
+
function (reason) {
|
|
703
|
+
ok(true);
|
|
704
|
+
equal(reason.status, 400);
|
|
705
|
+
equal(reason.responseText, "{error: 'invalid data'}");
|
|
706
|
+
start();
|
|
707
|
+
}
|
|
708
|
+
);
|
|
709
|
+
});
|
|
710
|
+
});
|
|
711
|
+
|
|
712
|
+
asyncTest("#handleUpdate the with modelType and id that fails chained", function () {
|
|
713
|
+
Em.run(function () {
|
|
714
|
+
var profile = make('profile');
|
|
715
|
+
|
|
716
|
+
testHelper.handleUpdate('profile', profile.id).andFail({
|
|
717
|
+
status: 500
|
|
718
|
+
});
|
|
719
|
+
|
|
720
|
+
profile.set('description', 'new desc');
|
|
721
|
+
profile.save().then(
|
|
722
|
+
function () {
|
|
723
|
+
},
|
|
724
|
+
function (reason) {
|
|
725
|
+
ok(true);
|
|
726
|
+
equal(reason.status, 500);
|
|
727
|
+
start();
|
|
728
|
+
}
|
|
729
|
+
);
|
|
730
|
+
});
|
|
731
|
+
});
|
|
732
|
+
|
|
733
|
+
asyncTest("#handleUpdate with model that fails chained", function () {
|
|
734
|
+
Em.run(function () {
|
|
735
|
+
var profile = make('profile');
|
|
736
|
+
|
|
737
|
+
testHelper.handleUpdate(profile).andFail({
|
|
738
|
+
status: 500
|
|
739
|
+
});
|
|
740
|
+
|
|
741
|
+
profile.set('description', 'new desc');
|
|
742
|
+
profile.save().then(
|
|
743
|
+
function () {
|
|
744
|
+
},
|
|
745
|
+
function (reason) {
|
|
746
|
+
ok(true);
|
|
747
|
+
equal(reason.status, 500);
|
|
748
|
+
start();
|
|
749
|
+
}
|
|
750
|
+
);
|
|
751
|
+
});
|
|
752
|
+
});
|
|
753
|
+
|
|
754
|
+
asyncTest("#handleUpdate with model that fail with custom response", function () {
|
|
755
|
+
Em.run(function () {
|
|
756
|
+
var profile = make('profile');
|
|
757
|
+
|
|
758
|
+
testHelper.handleUpdate(profile).andFail({
|
|
759
|
+
status: 400,
|
|
760
|
+
response: "{error: 'invalid data'}"
|
|
761
|
+
});
|
|
762
|
+
|
|
763
|
+
profile.set('description', 'new desc');
|
|
764
|
+
profile.save().then(
|
|
765
|
+
function () {
|
|
766
|
+
},
|
|
767
|
+
function (reason) {
|
|
768
|
+
ok(true);
|
|
769
|
+
equal(reason.responseText, "{error: 'invalid data'}");
|
|
770
|
+
start();
|
|
771
|
+
}
|
|
772
|
+
);
|
|
773
|
+
});
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
asyncTest("#handleUpdate with model that fail and then succeeds", function () {
|
|
777
|
+
Em.run(function () {
|
|
778
|
+
var profile = make('profile');
|
|
779
|
+
|
|
780
|
+
var updateMock = testHelper.handleUpdate(profile).andFail({
|
|
781
|
+
status: 400,
|
|
782
|
+
response: "{error: 'invalid data'}"
|
|
783
|
+
});
|
|
784
|
+
|
|
785
|
+
profile.set('description', 'new desc');
|
|
786
|
+
profile.save().then(
|
|
787
|
+
function () {
|
|
788
|
+
},
|
|
789
|
+
function (reason) {
|
|
790
|
+
equal(reason.responseText, "{error: 'invalid data'}", "Could not save model.");
|
|
791
|
+
}
|
|
792
|
+
).then(function () {
|
|
793
|
+
updateMock.andSucceed();
|
|
794
|
+
|
|
795
|
+
ok(!profile.get('valid'), "Profile is invalid.");
|
|
796
|
+
|
|
797
|
+
profile.save().then(
|
|
798
|
+
function () {
|
|
799
|
+
ok(!profile.get('saving'), "Saved model");
|
|
800
|
+
ok(profile.get('description') == 'new desc', "Description was updated.");
|
|
801
|
+
start();
|
|
802
|
+
}
|
|
803
|
+
);
|
|
804
|
+
});
|
|
805
|
+
});
|
|
806
|
+
});
|
|
690
807
|
|
|
691
808
|
/////// handleDelete //////////
|
|
692
809
|
|
|
@@ -644,6 +644,55 @@ var MockCreateRequest = function(url, store, modelName, options) {
|
|
|
644
644
|
$.mockjax(this.handler);
|
|
645
645
|
};
|
|
646
646
|
|
|
647
|
+
var MockUpdateRequest = function(url, model, mapFind, options) {
|
|
648
|
+
var status = options.status || 200;
|
|
649
|
+
var succeed = true;
|
|
650
|
+
var response = null;
|
|
651
|
+
|
|
652
|
+
if ('succeed' in options) {
|
|
653
|
+
succeed = options.succeed;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
if ('response' in options) {
|
|
657
|
+
response = options.response;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
this.andSucceed = function(options) {
|
|
661
|
+
succeed = true;
|
|
662
|
+
return this;
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
this.andFail = function(options) {
|
|
666
|
+
succeed = false;
|
|
667
|
+
status = options.status || 500;
|
|
668
|
+
if ('response' in options) {
|
|
669
|
+
response = options.response;
|
|
670
|
+
}
|
|
671
|
+
return this;
|
|
672
|
+
};
|
|
673
|
+
|
|
674
|
+
this.handler = function(settings) {
|
|
675
|
+
if (!succeed) {
|
|
676
|
+
this.status = status;
|
|
677
|
+
if (response !== null) {
|
|
678
|
+
this.responseText = response;
|
|
679
|
+
}
|
|
680
|
+
} else {
|
|
681
|
+
var json = model.toJSON({includeId: true});
|
|
682
|
+
this.responseText = mapFind(model.constructor.typeKey, json);
|
|
683
|
+
this.status = 200;
|
|
684
|
+
}
|
|
685
|
+
};
|
|
686
|
+
|
|
687
|
+
var requestConfig = {
|
|
688
|
+
url: url,
|
|
689
|
+
dataType: 'json',
|
|
690
|
+
type: 'PUT',
|
|
691
|
+
response: this.handler
|
|
692
|
+
};
|
|
693
|
+
|
|
694
|
+
$.mockjax(requestConfig);
|
|
695
|
+
};
|
|
647
696
|
(function () {
|
|
648
697
|
DS.Store.reopen({
|
|
649
698
|
/**
|
|
@@ -1191,34 +1240,35 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
|
1191
1240
|
Handling ajax PUT ( update record ) for a model type. You can mock
|
|
1192
1241
|
failed update by passing in success argument as false.
|
|
1193
1242
|
|
|
1194
|
-
@param {String} type model type like 'user' for User model
|
|
1243
|
+
@param {String} type model type like 'user' for User model, or a model instance
|
|
1195
1244
|
@param {String} id id of record to update
|
|
1196
|
-
@param {
|
|
1197
|
-
should succeed ( default is true )
|
|
1245
|
+
@param {Object} options options object
|
|
1198
1246
|
*/
|
|
1199
1247
|
handleUpdate: function () {
|
|
1200
|
-
var args = Array.prototype.slice.call(arguments)
|
|
1248
|
+
var args = Array.prototype.slice.call(arguments);
|
|
1201
1249
|
Ember.assert("To handleUpdate pass in a model instance or a type and an id", args.length>0)
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1250
|
+
|
|
1251
|
+
var options = {};
|
|
1252
|
+
if (args.length > 1 && typeof args[args.length - 1] === 'object') {
|
|
1253
|
+
options = args.pop();
|
|
1206
1254
|
}
|
|
1207
|
-
|
|
1208
|
-
var type, id;
|
|
1255
|
+
|
|
1256
|
+
var model, type, id;
|
|
1257
|
+
var store = this.getStore();
|
|
1258
|
+
|
|
1209
1259
|
if (args[0] instanceof DS.Model) {
|
|
1210
|
-
|
|
1211
|
-
type = model.constructor.typeKey;
|
|
1260
|
+
model = args[0];
|
|
1212
1261
|
id = model.id;
|
|
1262
|
+
type = model.constructor.typeKey;
|
|
1213
1263
|
} else if (typeof args[0] == "string" && typeof parseInt(args[1]) == "number") {
|
|
1214
1264
|
type = args[0];
|
|
1215
1265
|
id = args[1];
|
|
1266
|
+
model = store.getById(type, id)
|
|
1216
1267
|
}
|
|
1217
|
-
Ember.assert("To handleUpdate pass in a model instance or a type and an id",type && id)
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
});
|
|
1268
|
+
Ember.assert("To handleUpdate pass in a model instance or a type and an id",type && id);
|
|
1269
|
+
|
|
1270
|
+
var url = this.buildURL(type, id);
|
|
1271
|
+
return new MockUpdateRequest(url, model, this.mapFind, options);
|
|
1222
1272
|
},
|
|
1223
1273
|
/**
|
|
1224
1274
|
Handling ajax DELETE ( delete record ) for a model type. You can mock
|
|
@@ -1361,12 +1411,10 @@ if (FactoryGuy !== undefined) {
|
|
|
1361
1411
|
return null;
|
|
1362
1412
|
}
|
|
1363
1413
|
}
|
|
1414
|
+
|
|
1364
1415
|
// Inspect the data submitted in the request (either POST body or GET query string)
|
|
1365
1416
|
if ( handler.data ) {
|
|
1366
|
-
|
|
1367
|
-
// console.log('handler.data', handler.data )
|
|
1368
|
-
// console.log('data equal', isMockDataEqual(handler.data, requestSettings.data) )
|
|
1369
|
-
if ( ! requestSettings.data || !isMockDataEqual(handler.data, requestSettings.data) ) {
|
|
1417
|
+
if ( ! requestSettings.data || !isMockDataEqual(handler.data, requestSettings.data) ) {
|
|
1370
1418
|
// They're not identical, do not mock this request
|
|
1371
1419
|
return null;
|
|
1372
1420
|
}
|
|
@@ -1377,6 +1425,7 @@ if (FactoryGuy !== undefined) {
|
|
|
1377
1425
|
// The request type doesn't match (GET vs. POST)
|
|
1378
1426
|
return null;
|
|
1379
1427
|
}
|
|
1428
|
+
|
|
1380
1429
|
return handler;
|
|
1381
1430
|
}
|
|
1382
1431
|
|
|
@@ -1740,7 +1789,6 @@ if (FactoryGuy !== undefined) {
|
|
|
1740
1789
|
}
|
|
1741
1790
|
|
|
1742
1791
|
mockHandler = getMockForRequest( mockHandlers[k], requestSettings );
|
|
1743
|
-
|
|
1744
1792
|
if(!mockHandler) {
|
|
1745
1793
|
// No valid mock found for this request
|
|
1746
1794
|
continue;
|
|
@@ -1792,7 +1840,7 @@ if (FactoryGuy !== undefined) {
|
|
|
1792
1840
|
}
|
|
1793
1841
|
|
|
1794
1842
|
copyUrlParameters(mockHandler, origSettings);
|
|
1795
|
-
|
|
1843
|
+
|
|
1796
1844
|
(function(mockHandler, requestSettings, origSettings, origHandler) {
|
|
1797
1845
|
|
|
1798
1846
|
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
|
+
version: 0.9.10
|
|
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-02-
|
|
12
|
+
date: 2015-02-23 00:00:00.000000000 Z
|
|
13
13
|
dependencies: []
|
|
14
14
|
description: Easily create Fixtures for Ember Data
|
|
15
15
|
email:
|
|
@@ -37,6 +37,7 @@ files:
|
|
|
37
37
|
- src/factory_guy_test_mixin.js
|
|
38
38
|
- src/has_many.js
|
|
39
39
|
- src/mock_create_request.js
|
|
40
|
+
- src/mock_update_request.js
|
|
40
41
|
- src/model_definition.js
|
|
41
42
|
- src/prologue.js
|
|
42
43
|
- src/sequence.js
|