ember-data-factory-guy 0.9.5 → 0.9.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gruntfile.js +2 -0
- data/README.md +60 -20
- data/bower.json +1 -1
- data/dist/amd/factory-guy.js +77 -46
- data/dist/ember-data-factory-guy.js +77 -46
- data/dist/ember-data-factory-guy.min.js +1 -1
- data/package.json +1 -1
- data/src/factory_guy_test_mixin.js +3 -46
- data/src/mock_create_request.js +73 -0
- data/tests/factory_guy_test_mixin_test.js +127 -6
- data/vendor/assets/javascripts/ember_data_factory_guy.js +3 -46
- 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: 144fe2b151234c1c12f5fbc7c65ec2b10041a9cc
|
4
|
+
data.tar.gz: 2bce284e264f02e5fe52b7873e547b8269054d48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab291d9acdf10c07f817e3e1472001e85dfff454b9f5e58b1708b358b2f8a0f1105e8891030ddc89fd710523c82a90b14324d717bf549c717558efedd264bfa5
|
7
|
+
data.tar.gz: 625aaea6c2fbc4098cd96855605ec34a5cd13a51b9d38b6c777cd8b6775dc7bdabb626d800ce4537037fe463ed2989f2dd47ea9bc3af816b90bd375a2b0d9461
|
data/Gruntfile.js
CHANGED
@@ -10,6 +10,7 @@ module.exports = function(grunt) {
|
|
10
10
|
'src/sequence.js',
|
11
11
|
'src/model_definition.js',
|
12
12
|
'src/factory_guy.js',
|
13
|
+
'src/mock_create_request.js',
|
13
14
|
'src/store.js',
|
14
15
|
'src/factory_guy_test_mixin.js',
|
15
16
|
],
|
@@ -21,6 +22,7 @@ module.exports = function(grunt) {
|
|
21
22
|
'src/sequence.js',
|
22
23
|
'src/model_definition.js',
|
23
24
|
'src/factory_guy.js',
|
25
|
+
'src/mock_create_request.js',
|
24
26
|
'src/store.js',
|
25
27
|
'src/factory_guy_test_mixin.js',
|
26
28
|
'src/epilogue.js'
|
data/README.md
CHANGED
@@ -10,7 +10,7 @@ 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.
|
13
|
+
- 0.9.5 -> ember-data-1.0.0-beta.12
|
14
14
|
|
15
15
|
**Waiting for ember-data-1.0.0-beta.15 to make upgrade release, since there are a few issues with
|
16
16
|
ember-data-1.0.0-beta.14.1 that make it difficult to use**
|
@@ -42,7 +42,7 @@ gem 'ember-data-factory-guy', group: test
|
|
42
42
|
or for particular version:
|
43
43
|
|
44
44
|
```ruby
|
45
|
-
gem 'ember-data-factory-guy', '0.9.
|
45
|
+
gem 'ember-data-factory-guy', '0.9.5', group: test
|
46
46
|
```
|
47
47
|
|
48
48
|
then:
|
@@ -77,7 +77,7 @@ or for particular version:
|
|
77
77
|
"dependencies": {
|
78
78
|
"foo-dependency": "latest",
|
79
79
|
"other-foo-dependency": "latest",
|
80
|
-
"ember-data-factory-guy": "0.9.
|
80
|
+
"ember-data-factory-guy": "0.9.5"
|
81
81
|
}
|
82
82
|
```
|
83
83
|
|
@@ -102,7 +102,7 @@ The preferred way to use this project is to use the default adapter for your pro
|
|
102
102
|
which is usually going to be the RESTAdapter/ActiveModelAdapter.
|
103
103
|
*In other words, it is NOT recommended to use the DS.FixtureAdapter.*
|
104
104
|
|
105
|
-
When you call:
|
105
|
+
When you call: FactoryGuy.make('user'), you create model in the store and this method
|
106
106
|
returns this model instance
|
107
107
|
|
108
108
|
*Since you are synchronously getting model instances, you can immediately start asking
|
@@ -567,11 +567,11 @@ module('User Model', {
|
|
567
567
|
// Assumes the application's namespace is App, though yours may not be.
|
568
568
|
testHelper = TestHelper.setup(App);
|
569
569
|
store = testHelper.getStore();
|
570
|
-
// You could at this point, make fixtures with
|
570
|
+
// You could at this point, make fixtures with FactoryGuy.make,
|
571
571
|
// but to be even more concise try this shortcut method to your tests
|
572
|
-
make =
|
572
|
+
make = FactoryGuy.make.bind(FactoryGuy)
|
573
573
|
// or if your running in phantomjs and it does not support bind method try this:
|
574
|
-
// make = function() {return
|
574
|
+
// make = function() {return FactoryGuy.make.apply(FactoryGuy,arguments)}
|
575
575
|
},
|
576
576
|
teardown: function() {
|
577
577
|
Em.run(function() { testHelper.teardown(); });
|
@@ -593,7 +593,7 @@ test("make a user using your applications default adapter", function() {
|
|
593
593
|
### Integration Tests
|
594
594
|
|
595
595
|
|
596
|
-
|
596
|
+
##### With FactoryGuyTestMixin
|
597
597
|
|
598
598
|
- Uses mockjax
|
599
599
|
- Has helper methods
|
@@ -609,10 +609,10 @@ FactoryGuyTestMixin assumes you will want to use that adapter to do your integra
|
|
609
609
|
|
610
610
|
To do that you will still have to deal with ember data trying to create, update or delete records.
|
611
611
|
|
612
|
-
If you put models into the store ( with
|
612
|
+
If you put models into the store ( with FactoryGuy#make ), the http GET call does not need to be mocked,
|
613
613
|
since that model is already in the store.
|
614
614
|
|
615
|
-
But what if you want to handle create, update, and delete? Or even findAll records?
|
615
|
+
But what if you want to handle create, update, and delete? Or even reload or findAll records?
|
616
616
|
|
617
617
|
FactoryGuy assumes you want to mock ajax calls with the mockjax library,
|
618
618
|
and this is already bundled for you when you use the ember-data-factory-guy library.
|
@@ -624,7 +624,7 @@ tests run as shown in the previous section (Using FactoryGuyTestMixin)**
|
|
624
624
|
|
625
625
|
##### handleFindAll
|
626
626
|
- for dealing with finding all records of a particular type
|
627
|
-
- handleFindMany
|
627
|
+
- handleFindMany is a deprecated alias for handleFindAll
|
628
628
|
|
629
629
|
```javascript
|
630
630
|
// can use traits and extra fixture options here as you would with FactoryGuy#makeList
|
@@ -639,7 +639,7 @@ tests run as shown in the previous section (Using FactoryGuyTestMixin)**
|
|
639
639
|
- pass in a record to handle reload
|
640
640
|
- pass in fixture name and options ( including id if needed ) to handle making a record
|
641
641
|
with those options and finding that record
|
642
|
-
- handleFindOne
|
642
|
+
- handleFindOne is a deprecated alias for handleFind
|
643
643
|
|
644
644
|
*Passing in a model instance*
|
645
645
|
|
@@ -698,10 +698,16 @@ tests run as shown in the previous section (Using FactoryGuyTestMixin)**
|
|
698
698
|
|
699
699
|
|
700
700
|
##### handleCreate
|
701
|
-
-
|
701
|
+
- use chainable methods to build the response
|
702
|
+
- match - attributes that must be in request json
|
703
|
+
- andReturns - attributes to include in response json
|
704
|
+
- andFail - request should fail
|
705
|
+
|
706
|
+
- use hash of options to build the response
|
702
707
|
- match - attributes that must be in request json
|
703
708
|
- returns - attributes to include in response json
|
704
709
|
- succeed - flag to indicate if the request should succeed ( default is true )
|
710
|
+
- this style will eventually be deprecated
|
705
711
|
|
706
712
|
**Note**
|
707
713
|
|
@@ -732,17 +738,51 @@ In this case, you are are creating a 'project' record with a specific name, and
|
|
732
738
|
to a particular user. To mock this createRecord call here are a few ways to do this using
|
733
739
|
match and or returns options.
|
734
740
|
|
741
|
+
|
742
|
+
######Using chainable methods
|
743
|
+
|
735
744
|
```javascript
|
736
745
|
// Simplest case
|
737
746
|
// Don't care about a match just handle createRecord for any project
|
738
747
|
testHelper.handleCreate('project')
|
739
748
|
|
740
|
-
//
|
741
|
-
testHelper.handleCreate('project'
|
749
|
+
// Matching some attributes
|
750
|
+
testHelper.handleCreate('project').match({match: {name: "Moo"})
|
751
|
+
|
752
|
+
// Match all attributes
|
753
|
+
testHelper.handleCreate('project').match({match: {name: "Moo", user: user})
|
754
|
+
|
755
|
+
// Exactly matching attributes, and returning extra attributes
|
756
|
+
testHelper.handleCreate('project')
|
757
|
+
.match({name: "Moo", user: user})
|
758
|
+
.andReturn({created_at: new Date()})
|
759
|
+
|
760
|
+
```
|
761
|
+
|
762
|
+
*mocking a failed create*
|
763
|
+
|
764
|
+
```javascript
|
765
|
+
|
766
|
+
// Mocking failure case is easy with chainable methods, just use #andFail
|
767
|
+
testHelper.handleCreate('project').match({match: {name: "Moo"}).andFail()
|
768
|
+
|
769
|
+
store.createRecord('project', {name: "Moo"}).save() //=> fails
|
770
|
+
```
|
771
|
+
|
772
|
+
|
773
|
+
######Using hash of options
|
774
|
+
|
775
|
+
```javascript
|
776
|
+
// Simplest case
|
777
|
+
// Don't care about a match just handle createRecord for any project
|
778
|
+
testHelper.handleCreate('project')
|
742
779
|
|
743
780
|
// Matching some attributes
|
744
781
|
testHelper.handleCreate('project', {match: {name: "Moo"}})
|
745
782
|
|
783
|
+
// Match all attributes
|
784
|
+
testHelper.handleCreate('project', {match: {name: "Moo", user: user}})
|
785
|
+
|
746
786
|
// Exactly matching attributes, and returning extra attributes
|
747
787
|
testHelper.handleCreate('project', {
|
748
788
|
match: {name: "Moo", user: user}, returns: {created_at: new Date()}
|
@@ -776,7 +816,7 @@ match and or returns options.
|
|
776
816
|
*success case is the default*
|
777
817
|
|
778
818
|
```javascript
|
779
|
-
var profile =
|
819
|
+
var profile = FactoryGuy.make('profile');
|
780
820
|
|
781
821
|
// Pass in the model that will be updated ( if you have it available )
|
782
822
|
testHelper.handleUpdate(profile);
|
@@ -792,7 +832,7 @@ match and or returns options.
|
|
792
832
|
*mocking a failed update*
|
793
833
|
|
794
834
|
```javascript
|
795
|
-
var profile =
|
835
|
+
var profile = FactoryGuy.make('profile');
|
796
836
|
|
797
837
|
// set the succeed flag to 'false'
|
798
838
|
testHelper.handleUpdate('profile', profile.id, false);
|
@@ -810,7 +850,7 @@ match and or returns options.
|
|
810
850
|
*success case is the default*
|
811
851
|
|
812
852
|
```javascript
|
813
|
-
var profile =
|
853
|
+
var profile = FactoryGuy.make('profile');
|
814
854
|
testHelper.handleDelete('profile', profile.id);
|
815
855
|
|
816
856
|
profile.destroyRecord() // => will succeed
|
@@ -819,7 +859,7 @@ match and or returns options.
|
|
819
859
|
*mocking a failed delete*
|
820
860
|
|
821
861
|
```javascript
|
822
|
-
var profile =
|
862
|
+
var profile = FactoryGuy.make('profile');
|
823
863
|
// set the succeed flag to 'false'
|
824
864
|
testHelper.handleDelete('profile', profile.id, false);
|
825
865
|
|
@@ -847,7 +887,7 @@ var viewHelper, user;
|
|
847
887
|
module('User View', {
|
848
888
|
setup: function() {
|
849
889
|
viewHelper = ViewTestHelper.setup(App); // set up helper
|
850
|
-
user =
|
890
|
+
user = FactoryGuy.make('user'); // create a user in the store
|
851
891
|
visit('/users/'+user.id); // visit the users route
|
852
892
|
},
|
853
893
|
teardown: function() {
|
data/bower.json
CHANGED
data/dist/amd/factory-guy.js
CHANGED
@@ -574,6 +574,80 @@ var FactoryGuy = {
|
|
574
574
|
}
|
575
575
|
};
|
576
576
|
|
577
|
+
var MockCreateRequest = function(url, store, modelName, options) {
|
578
|
+
var succeed = options.succeed === undefined ? true : options.succeed;
|
579
|
+
var matchArgs = options.match;
|
580
|
+
var returnArgs = options.returns;
|
581
|
+
var responseJson = {};
|
582
|
+
var expectedRequest = {};
|
583
|
+
var modelType = store.modelFor(modelName);
|
584
|
+
|
585
|
+
this.calculate = function() {
|
586
|
+
if (matchArgs) {
|
587
|
+
var record = store.createRecord(modelName, matchArgs);
|
588
|
+
expectedRequest = record.serialize();
|
589
|
+
}
|
590
|
+
|
591
|
+
if (succeed) {
|
592
|
+
var definition = FactoryGuy.modelDefinitions[modelName];
|
593
|
+
if (responseJson[modelName]) {
|
594
|
+
// already calculated once, keep the same id
|
595
|
+
responseJson[modelName] = $.extend({id: responseJson[modelName].id}, matchArgs, returnArgs);
|
596
|
+
} else {
|
597
|
+
responseJson[modelName] = $.extend({id: definition.nextId()}, matchArgs, returnArgs);
|
598
|
+
}
|
599
|
+
// Remove belongsTo associations since they will already be set when you called
|
600
|
+
// createRecord, so they don't need to be returned.
|
601
|
+
Ember.get(modelType, 'relationshipsByName').forEach(function (relationship) {
|
602
|
+
if (relationship.kind == 'belongsTo') {
|
603
|
+
delete responseJson[modelName][relationship.key];
|
604
|
+
}
|
605
|
+
})
|
606
|
+
}
|
607
|
+
|
608
|
+
}
|
609
|
+
|
610
|
+
this.match = function(matches) {
|
611
|
+
matchArgs = matches;
|
612
|
+
this.calculate();
|
613
|
+
return this;
|
614
|
+
}
|
615
|
+
|
616
|
+
this.andReturn = function(returns) {
|
617
|
+
returnArgs = returns;
|
618
|
+
this.calculate();
|
619
|
+
return this;
|
620
|
+
}
|
621
|
+
|
622
|
+
this.andFail = function() {
|
623
|
+
succeed = false;
|
624
|
+
return this;
|
625
|
+
}
|
626
|
+
|
627
|
+
this.handler = function(settings) {
|
628
|
+
if (settings.url != url || settings.type != 'POST') { return false}
|
629
|
+
|
630
|
+
if (matchArgs) {
|
631
|
+
var requestData = JSON.parse(settings.data)[modelName];
|
632
|
+
for (attribute in expectedRequest) {
|
633
|
+
if (expectedRequest[attribute] &&
|
634
|
+
requestData[attribute] != expectedRequest[attribute]) {
|
635
|
+
return false
|
636
|
+
}
|
637
|
+
}
|
638
|
+
}
|
639
|
+
var responseStatus = (succeed ? 200: 500);
|
640
|
+
return {
|
641
|
+
responseText: responseJson,
|
642
|
+
status: responseStatus
|
643
|
+
};
|
644
|
+
}
|
645
|
+
|
646
|
+
this.calculate();
|
647
|
+
|
648
|
+
$.mockjax(this.handler);
|
649
|
+
};
|
650
|
+
|
577
651
|
(function () {
|
578
652
|
DS.Store.reopen({
|
579
653
|
/**
|
@@ -1086,53 +1160,10 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
1086
1160
|
@param {Object} options hash of options for handling request
|
1087
1161
|
*/
|
1088
1162
|
handleCreate: function (modelName, options) {
|
1089
|
-
var opts = options === undefined ? {} : options;
|
1090
|
-
var store = this.getStore()
|
1091
|
-
var succeed = opts.succeed === undefined ? true : opts.succeed;
|
1092
|
-
var match = opts.match || {};
|
1093
|
-
var returnArgs = opts.returns || {};
|
1094
|
-
|
1095
|
-
if (opts.match) {
|
1096
|
-
var record = store.createRecord(modelName, match);
|
1097
|
-
var expectedRequest = record.serialize();
|
1098
|
-
}
|
1099
|
-
|
1100
|
-
var modelType = store.modelFor(modelName)
|
1101
|
-
|
1102
|
-
var responseJson = {};
|
1103
|
-
if (succeed) {
|
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
1163
|
var url = this.buildURL(modelName);
|
1116
|
-
|
1117
|
-
var
|
1118
|
-
|
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
|
1125
|
-
}
|
1126
|
-
}
|
1127
|
-
}
|
1128
|
-
var responseStatus = (succeed ? 200: 500);
|
1129
|
-
return {
|
1130
|
-
responseText: responseJson,
|
1131
|
-
status: responseStatus
|
1132
|
-
};
|
1133
|
-
}
|
1134
|
-
|
1135
|
-
$.mockjax(handler);
|
1164
|
+
var store = this.getStore();
|
1165
|
+
var opts = options === undefined ? {} : options;
|
1166
|
+
return new MockCreateRequest(url, store, modelName, opts);
|
1136
1167
|
},
|
1137
1168
|
|
1138
1169
|
/**
|
@@ -569,6 +569,80 @@ var FactoryGuy = {
|
|
569
569
|
}
|
570
570
|
};
|
571
571
|
|
572
|
+
var MockCreateRequest = function(url, store, modelName, options) {
|
573
|
+
var succeed = options.succeed === undefined ? true : options.succeed;
|
574
|
+
var matchArgs = options.match;
|
575
|
+
var returnArgs = options.returns;
|
576
|
+
var responseJson = {};
|
577
|
+
var expectedRequest = {};
|
578
|
+
var modelType = store.modelFor(modelName);
|
579
|
+
|
580
|
+
this.calculate = function() {
|
581
|
+
if (matchArgs) {
|
582
|
+
var record = store.createRecord(modelName, matchArgs);
|
583
|
+
expectedRequest = record.serialize();
|
584
|
+
}
|
585
|
+
|
586
|
+
if (succeed) {
|
587
|
+
var definition = FactoryGuy.modelDefinitions[modelName];
|
588
|
+
if (responseJson[modelName]) {
|
589
|
+
// already calculated once, keep the same id
|
590
|
+
responseJson[modelName] = $.extend({id: responseJson[modelName].id}, matchArgs, returnArgs);
|
591
|
+
} else {
|
592
|
+
responseJson[modelName] = $.extend({id: definition.nextId()}, matchArgs, returnArgs);
|
593
|
+
}
|
594
|
+
// Remove belongsTo associations since they will already be set when you called
|
595
|
+
// createRecord, so they don't need to be returned.
|
596
|
+
Ember.get(modelType, 'relationshipsByName').forEach(function (relationship) {
|
597
|
+
if (relationship.kind == 'belongsTo') {
|
598
|
+
delete responseJson[modelName][relationship.key];
|
599
|
+
}
|
600
|
+
})
|
601
|
+
}
|
602
|
+
|
603
|
+
}
|
604
|
+
|
605
|
+
this.match = function(matches) {
|
606
|
+
matchArgs = matches;
|
607
|
+
this.calculate();
|
608
|
+
return this;
|
609
|
+
}
|
610
|
+
|
611
|
+
this.andReturn = function(returns) {
|
612
|
+
returnArgs = returns;
|
613
|
+
this.calculate();
|
614
|
+
return this;
|
615
|
+
}
|
616
|
+
|
617
|
+
this.andFail = function() {
|
618
|
+
succeed = false;
|
619
|
+
return this;
|
620
|
+
}
|
621
|
+
|
622
|
+
this.handler = function(settings) {
|
623
|
+
if (settings.url != url || settings.type != 'POST') { return false}
|
624
|
+
|
625
|
+
if (matchArgs) {
|
626
|
+
var requestData = JSON.parse(settings.data)[modelName];
|
627
|
+
for (attribute in expectedRequest) {
|
628
|
+
if (expectedRequest[attribute] &&
|
629
|
+
requestData[attribute] != expectedRequest[attribute]) {
|
630
|
+
return false
|
631
|
+
}
|
632
|
+
}
|
633
|
+
}
|
634
|
+
var responseStatus = (succeed ? 200: 500);
|
635
|
+
return {
|
636
|
+
responseText: responseJson,
|
637
|
+
status: responseStatus
|
638
|
+
};
|
639
|
+
}
|
640
|
+
|
641
|
+
this.calculate();
|
642
|
+
|
643
|
+
$.mockjax(this.handler);
|
644
|
+
};
|
645
|
+
|
572
646
|
(function () {
|
573
647
|
DS.Store.reopen({
|
574
648
|
/**
|
@@ -1081,53 +1155,10 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
1081
1155
|
@param {Object} options hash of options for handling request
|
1082
1156
|
*/
|
1083
1157
|
handleCreate: function (modelName, options) {
|
1084
|
-
var opts = options === undefined ? {} : options;
|
1085
|
-
var store = this.getStore()
|
1086
|
-
var succeed = opts.succeed === undefined ? true : opts.succeed;
|
1087
|
-
var match = opts.match || {};
|
1088
|
-
var returnArgs = opts.returns || {};
|
1089
|
-
|
1090
|
-
if (opts.match) {
|
1091
|
-
var record = store.createRecord(modelName, match);
|
1092
|
-
var expectedRequest = record.serialize();
|
1093
|
-
}
|
1094
|
-
|
1095
|
-
var modelType = store.modelFor(modelName)
|
1096
|
-
|
1097
|
-
var responseJson = {};
|
1098
|
-
if (succeed) {
|
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
1158
|
var url = this.buildURL(modelName);
|
1111
|
-
|
1112
|
-
var
|
1113
|
-
|
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
|
1120
|
-
}
|
1121
|
-
}
|
1122
|
-
}
|
1123
|
-
var responseStatus = (succeed ? 200: 500);
|
1124
|
-
return {
|
1125
|
-
responseText: responseJson,
|
1126
|
-
status: responseStatus
|
1127
|
-
};
|
1128
|
-
}
|
1129
|
-
|
1130
|
-
$.mockjax(handler);
|
1159
|
+
var store = this.getStore();
|
1160
|
+
var opts = options === undefined ? {} : options;
|
1161
|
+
return new MockCreateRequest(url, store, modelName, opts);
|
1131
1162
|
},
|
1132
1163
|
|
1133
1164
|
/**
|
@@ -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)},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
|
+
var Sequence=function(fn){var index=1;this.next=function(){return fn.call(this,index++)};this.reset=function(){index=1}};var MissingSequenceError=function(message){this.toString=function(){return message}};if(FactoryGuy!==undefined){FactoryGuy.sequence=Sequence;FactoryGuy.missingSequenceError=MissingSequenceError}var ModelDefinition=function(model,config){var sequences={};var traits={};var defaultAttributes={};var namedModels={};var modelId=1;var sequenceName=null;this.model=model;this.matchesName=function(name){return model==name||namedModels[name]};this.nextId=function(){return modelId++};this.generate=function(name,sequenceFn){if(sequenceFn){if(!sequences[name]){sequences[name]=new Sequence(sequenceFn)}}var sequence=sequences[name];if(!sequence){throw new MissingSequenceError("Can not find that sequence named ["+sequenceName+"] in '"+model+"' definition")}return sequence.next()};this.build=function(name,opts,traitArgs){var traitsObj={};traitArgs.forEach(function(trait){$.extend(traitsObj,traits[trait])});var modelAttributes=namedModels[name]||{};var fixture=$.extend({},defaultAttributes,modelAttributes,traitsObj,opts);for(var attribute in fixture){if(Ember.typeOf(fixture[attribute])=="function"){fixture[attribute]=fixture[attribute].call(this,fixture)}else if(Ember.typeOf(fixture[attribute])=="object"){if(FactoryGuy.getStore()){if(FactoryGuy.isAttributeRelationship(this.model,attribute)){fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}else{fixture[attribute]=FactoryGuy.build(attribute,fixture[attribute])}}}if(!fixture.id){fixture.id=this.nextId()}return fixture};this.buildList=function(name,number,traits,opts){var arr=[];for(var i=0;i<number;i++){arr.push(this.build(name,opts,traits))}return arr};this.reset=function(){modelId=1;for(var name in sequences){sequences[name].reset()}};var parseDefault=function(object){if(!object){return}defaultAttributes=object};var parseTraits=function(object){if(!object){return}traits=object};var parseSequences=function(object){if(!object){return}for(sequenceName in object){var sequenceFn=object[sequenceName];if(Ember.typeOf(sequenceFn)!="function"){throw new Error("Problem with ["+sequenceName+"] sequence definition. Sequences must be functions")}object[sequenceName]=new Sequence(sequenceFn)}sequences=object};var parseConfig=function(config){parseSequences(config.sequences);delete config.sequences;parseTraits(config.traits);delete config.traits;parseDefault(config.default);delete config.default;namedModels=config};parseConfig(config)};if(FactoryGuy!==undefined){FactoryGuy.modelDefiniton=ModelDefinition}var FactoryGuy={modelDefinitions:{},define:function(model,config){if(this.modelDefinitions[model]){this.modelDefinitions[model].merge(config)}else{this.modelDefinitions[model]=new ModelDefinition(model,config)}},setStore:function(store){Ember.assert("FactoryGuy#setStore needs a valid store instance.You passed in ["+store+"]",store instanceof DS.Store);this.store=store},getStore:function(){return this.store},isAttributeRelationship:function(typeName,attribute){if(!this.store){Ember.debug("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures");return true}var model=this.store.modelFor(typeName);return!!model.typeForRelationship(attribute)},generate:function(nameOrFunction){var sortaRandomName=Math.floor((1+Math.random())*65536).toString(16)+Date.now();return function(){if(Em.typeOf(nameOrFunction)=="function"){return this.generate(sortaRandomName,nameOrFunction)}else{return this.generate(nameOrFunction)}}},belongsTo:function(fixtureName,opts){return function(){return FactoryGuy.build(fixtureName,opts)}},association:function(fixtureName,opts){Ember.deprecate("DEPRECATION Warning: use FactoryGuy.belongsTo instead");return this.belongsTo(fixtureName,opts)},hasMany:function(fixtureName,number,opts){return function(){return FactoryGuy.buildList(fixtureName,number,opts)}},lookupModelForFixtureName:function(name){var definition=this.lookupDefinitionForFixtureName(name);if(definition){return definition.model}},lookupDefinitionForFixtureName:function(name){for(var model in this.modelDefinitions){var definition=this.modelDefinitions[model];if(definition.matchesName(name)){return definition}}},build:function(){var args=Array.prototype.slice.call(arguments);var opts={};var name=args.shift();if(!name){throw new Error("Build needs a factory name to build")}if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.build(name,opts,traits)},buildList:function(){var args=Array.prototype.slice.call(arguments);var name=args.shift();var number=args.shift();if(!name||!number){throw new Error("buildList needs a name and a number ( at least ) to build with")}var opts={};if(Ember.typeOf(args[args.length-1])=="object"){opts=args.pop()}var traits=args;var definition=this.lookupDefinitionForFixtureName(name);if(!definition){throw new Error("Can't find that factory named ["+name+"]")}return definition.buildList(name,number,traits,opts)},make:function(){var store=this.store;Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures",store);var fixture=this.build.apply(this,arguments);var name=arguments[0];var modelName=this.lookupModelForFixtureName(name);var modelType=store.modelFor(modelName);if(store.usingFixtureAdapter()){store.setAssociationsForFixtureAdapter(modelType,modelName,fixture);fixture=FactoryGuy.pushFixture(modelType,fixture);store.loadModelForFixtureAdapter(modelType,fixture);return fixture}else{return store.makeModel(modelType,fixture)}},makeList:function(){Ember.assert("FactoryGuy does not have the application's store. Use FactoryGuy.setStore(store) before making any fixtures",this.store);var arr=[];var args=Array.prototype.slice.call(arguments);Ember.assert("makeList needs at least 2 arguments, a name and a number",args.length>=2);var number=args.splice(1,1)[0];Ember.assert("Second argument to makeList should be a number (of fixtures to make.)",typeof number=="number");for(var i=0;i<number;i++){arr.push(this.make.apply(this,args))}return arr},resetModels:function(store){for(var model in this.modelDefinitions){var definition=this.modelDefinitions[model];definition.reset();try{var modelType=store.modelFor(definition.model);if(store.usingFixtureAdapter()){modelType.FIXTURES=[]}store.unloadAll(modelType)}catch(e){console.log("resetModels",e)}}},pushFixture:function(modelClass,fixture){var index;if(!modelClass.FIXTURES){modelClass.FIXTURES=[]}index=this.indexOfFixture(modelClass.FIXTURES,fixture);if(index>-1){modelClass.FIXTURES.splice(index,1)}modelClass.FIXTURES.push(fixture);return fixture},indexOfFixture:function(fixtures,fixture){var index=-1,id=fixture.id+"";Ember.A(fixtures).find(function(r,i){if(""+Ember.get(r,"id")===id){index=i;return true}else{return false}});return index},clear:function(opts){if(!opts){this.modelDefinitions={}}}};var MockCreateRequest=function(url,store,modelName,options){var succeed=options.succeed===undefined?true:options.succeed;var matchArgs=options.match;var returnArgs=options.returns;var responseJson={};var expectedRequest={};var modelType=store.modelFor(modelName);this.calculate=function(){if(matchArgs){var record=store.createRecord(modelName,matchArgs);expectedRequest=record.serialize()}if(succeed){var definition=FactoryGuy.modelDefinitions[modelName];if(responseJson[modelName]){responseJson[modelName]=$.extend({id:responseJson[modelName].id},matchArgs,returnArgs)}else{responseJson[modelName]=$.extend({id:definition.nextId()},matchArgs,returnArgs)}Ember.get(modelType,"relationshipsByName").forEach(function(relationship){if(relationship.kind=="belongsTo"){delete responseJson[modelName][relationship.key]}})}};this.match=function(matches){matchArgs=matches;this.calculate();return this};this.andReturn=function(returns){returnArgs=returns;this.calculate();return this};this.andFail=function(){succeed=false;return this};this.handler=function(settings){if(settings.url!=url||settings.type!="POST"){return false}if(matchArgs){var requestData=JSON.parse(settings.data)[modelName];for(attribute in expectedRequest){if(expectedRequest[attribute]&&requestData[attribute]!=expectedRequest[attribute]){return false}}}var responseStatus=succeed?200:500;return{responseText:responseJson,status:responseStatus}};this.calculate();$.mockjax(this.handler)};(function(){DS.Store.reopen({usingFixtureAdapter:function(){var adapter=this.adapterFor("application");return adapter instanceof DS.FixtureAdapter},makeFixture:function(){Ember.deprecate("DEPRECATION Warning: use FactoryGuy.make instead");FactoryGuy.make.call(FactoryGuy,arguments)},makeList:function(){Ember.deprecate("DEPRECATION Warning: use FactoryGuy.makeList instead");FactoryGuy.makeList.call(FactoryGuy,arguments)},makeModel:function(modelType,fixture){var store=this,modelName=store.modelFor(modelType).typeKey,model;Em.run(function(){store.findEmbeddedAssociationsForRESTAdapter(modelType,fixture);if(fixture.type){modelName=fixture.type.underscore();modelType=store.modelFor(modelName)}model=store.push(modelName,fixture);store.setAssociationsForRESTAdapter(modelType,modelName,model)});return model},setAssociationsForFixtureAdapter:function(modelType,modelName,fixture){var self=this;var adapter=this.adapterFor("application");Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){var hasManyRelation,belongsToRecord;if(relationship.kind=="hasMany"){hasManyRelation=fixture[relationship.key];if(hasManyRelation){$.each(fixture[relationship.key],function(index,object){var id=object;if(Ember.typeOf(object)=="object"){FactoryGuy.pushFixture(relationship.type,object);id=object.id;hasManyRelation[index]=id}var hasManyfixtures=adapter.fixturesForType(relationship.type);var hasManyFixture=adapter.findFixtureById(hasManyfixtures,id);hasManyFixture[modelName]=fixture.id;self.loadModelForFixtureAdapter(relationship.type,hasManyFixture)})}}if(relationship.kind=="belongsTo"){belongsToRecord=fixture[relationship.key];if(belongsToRecord){if(typeof belongsToRecord=="object"){FactoryGuy.pushFixture(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord.id}var hasManyName=self.findHasManyRelationshipNameForFixtureAdapter(relationship.type,relationship.parentType);var belongsToFixtures=adapter.fixturesForType(relationship.type);var belongsTofixture=adapter.findFixtureById(belongsToFixtures,fixture[relationship.key]);if(!belongsTofixture[hasManyName]){belongsTofixture[hasManyName]=[]}belongsTofixture[hasManyName].push(fixture.id);self.loadModelForFixtureAdapter(relationship.type,belongsTofixture)}}})},loadModelForFixtureAdapter:function(modelType,fixture){var storeModel=this.getById(modelType,fixture.id),that=this;if(!Ember.isPresent(storeModel)||storeModel.get("isEmpty")){Ember.run(function(){var dup=Ember.copy(fixture,true);that.push(modelType,fixture);Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(fixture[relationship.key]){fixture[relationship.key]=dup[relationship.key]}})})}},findEmbeddedAssociationsForRESTAdapter:function(modelType,fixture){var store=this;Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="belongsTo"){var belongsToRecord=fixture[relationship.key];if(Ember.typeOf(belongsToRecord)=="object"){store.findEmbeddedAssociationsForRESTAdapter(relationship.type,belongsToRecord);belongsToRecord=store.push(relationship.type,belongsToRecord);fixture[relationship.key]=belongsToRecord}}if(relationship.kind=="hasMany"){var hasManyRecords=fixture[relationship.key];if(Ember.typeOf(hasManyRecords)=="array"){if(Ember.typeOf(hasManyRecords[0])=="object"){var records=Em.A();hasManyRecords.map(function(object){store.findEmbeddedAssociationsForRESTAdapter(relationship.type,object);var record=store.push(relationship.type,object);records.push(record);return record});fixture[relationship.key]=records}}}})},setAssociationsForRESTAdapter:function(modelType,modelName,model){var self=this;Ember.get(modelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="hasMany"){var children=model.get(name)||[];children.forEach(function(child){var belongsToName=self.findRelationshipName("belongsTo",child.constructor,model);if(belongsToName){child.set(belongsToName,model)}})}})},findRelationshipName:function(kind,belongToModelType,childModel){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind==kind&&childModel instanceof relationship.type){relationshipName=relationship.key}});return relationshipName},findHasManyRelationshipNameForFixtureAdapter:function(belongToModelType,childModelType){var relationshipName;Ember.get(belongToModelType,"relationshipsByName").forEach(function(relationship,name){if(relationship.kind=="hasMany"&&childModelType==relationship.type){relationshipName=relationship.key}});return relationshipName},pushPayload:function(type,payload){var typeName,model;if(this.usingFixtureAdapter()){if(Ember.typeOf(type)==="string"&&Ember.isPresent(payload)&&Ember.isPresent(payload.id)){model=this.modelFor(type);FactoryGuy.pushFixture(model,payload);this.push(model,Ember.copy(payload,true))}else if(Ember.typeOf(type)==="object"||Ember.typeOf(payload)==="object"){if(Ember.isBlank(payload)){payload=type}for(var prop in payload){typeName=Ember.String.camelize(Ember.String.singularize(prop));model=this.modelFor(typeName);this.pushMany(model,Ember.makeArray(Ember.copy(payload[prop],true)));Ember.ArrayPolyfills.forEach.call(Ember.makeArray(payload[prop]),function(hash){FactoryGuy.pushFixture(model,hash)},this)}}else{throw new Ember.Error("Assertion Failed: You cannot use `store#pushPayload` with this method signature pushPayload("+type+","+payload+")")}}else{this._super(type,payload)}}})})();var FactoryGuyTestMixin=Em.Mixin.create({setup:function(app){this.set("container",app.__container__);FactoryGuy.setStore(this.getStore());return this},useFixtureAdapter:function(app){app.ApplicationAdapter=DS.FixtureAdapter;this.getStore().adapterFor("application").simulateRemoteResponse=false},usingActiveModelSerializer:function(type){var store=this.getStore();var modelType=store.modelFor(type);var serializer=store.serializerFor(modelType.typeKey);return serializer instanceof DS.ActiveModelSerializer},find:function(type,id){return this.getStore().find(type,id)},make:function(){return FactoryGuy.make.apply(FactoryGuy,arguments)},getStore:function(){return this.get("container").lookup("store:main")},stubEndpointForHttpRequest:function(url,json,options){options=options||{};var request={url:url,dataType:"json",responseText:json,type:options.type||"GET",status:options.status||200};if(options.urlParams){request.urlParams=options.urlParams}if(options.data){request.data=options.data}$.mockjax(request)},buildURL:function(typeName,id){var type=this.getStore().modelFor(typeName);return this.getStore().adapterFor(type).buildURL(type.typeKey,id)},handleFindAll:function(){var records=FactoryGuy.makeList.apply(FactoryGuy,arguments);var name=arguments[0];var modelName=FactoryGuy.lookupModelForFixtureName(name);var responseJson={};var json=records.map(function(record){return record.toJSON({includeId:true})});responseJson[modelName.pluralize()]=json;var url=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson)},handleFindMany:function(){Ember.deprecate("DEPRECATION Warning: use handleFindAll instead");this.handleFindAll.apply(this,arguments)},handleFind:function(){var args=Array.prototype.slice.call(arguments);Ember.assert("To handleFindOne pass in a model instance or a type and model options",args.length>0);var record,modelName;if(args[0]instanceof DS.Model){record=args[0];modelName=record.constructor.typeKey}else{record=FactoryGuy.make.apply(FactoryGuy,arguments);var name=arguments[0];modelName=FactoryGuy.lookupModelForFixtureName(name)}var responseJson={};var json=record.toJSON({includeId:true});responseJson[modelName.pluralize()]=json;var url=this.buildURL(modelName,record.id);this.stubEndpointForHttpRequest(url,responseJson)},handleFindOne:function(){this.handleFind.apply(this,arguments)},handleFindQuery:function(modelName,searchParams,records){Ember.assert("The second argument of searchParams must be an array",Em.typeOf(searchParams)=="array");if(records){Ember.assert("The third argument ( records ) must be an array - found type:"+Em.typeOf(records),Em.typeOf(records)=="array")}else{records=[]}var json=records.map(function(record){return record.toJSON({includeId:true})});var responseJson={};responseJson[modelName.pluralize()]=json;var url=this.buildURL(modelName);this.stubEndpointForHttpRequest(url,responseJson,{urlParams:searchParams})},handleCreate:function(modelName,options){var url=this.buildURL(modelName);var store=this.getStore();var opts=options===undefined?{}:options;return new MockCreateRequest(url,store,modelName,opts)},handleUpdate:function(){var args=Array.prototype.slice.call(arguments);Ember.assert("To handleUpdate pass in a model instance or a type and an id",args.length>0);var succeed=true;if(typeof args[args.length-1]=="boolean"){args.pop();succeed=false}Ember.assert("To handleUpdate pass in a model instance or a type and an id",args.length>0);var type,id;if(args[0]instanceof DS.Model){var model=args[0];type=model.constructor.typeKey;id=model.id}else if(typeof args[0]=="string"&&typeof parseInt(args[1])=="number"){type=args[0];id=args[1]}Ember.assert("To handleUpdate pass in a model instance or a type and an id",type&&id);this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"PUT",status:succeed?200:500})},handleDelete:function(type,id,succeed){succeed=succeed===undefined?true:succeed;this.stubEndpointForHttpRequest(this.buildURL(type,id),{},{type:"DELETE",status:succeed?200:500})},teardown:function(){FactoryGuy.resetModels(this.getStore());$.mockjax.clear()}});if(FactoryGuy!==undefined){FactoryGuy.testMixin=FactoryGuyTestMixin}
|
data/package.json
CHANGED
@@ -233,53 +233,10 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
233
233
|
@param {Object} options hash of options for handling request
|
234
234
|
*/
|
235
235
|
handleCreate: function (modelName, options) {
|
236
|
-
var opts = options === undefined ? {} : options;
|
237
|
-
var store = this.getStore()
|
238
|
-
var succeed = opts.succeed === undefined ? true : opts.succeed;
|
239
|
-
var match = opts.match || {};
|
240
|
-
var returnArgs = opts.returns || {};
|
241
|
-
|
242
|
-
if (opts.match) {
|
243
|
-
var record = store.createRecord(modelName, match);
|
244
|
-
var expectedRequest = record.serialize();
|
245
|
-
}
|
246
|
-
|
247
|
-
var modelType = store.modelFor(modelName)
|
248
|
-
|
249
|
-
var responseJson = {};
|
250
|
-
if (succeed) {
|
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
236
|
var url = this.buildURL(modelName);
|
263
|
-
|
264
|
-
var
|
265
|
-
|
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
|
272
|
-
}
|
273
|
-
}
|
274
|
-
}
|
275
|
-
var responseStatus = (succeed ? 200: 500);
|
276
|
-
return {
|
277
|
-
responseText: responseJson,
|
278
|
-
status: responseStatus
|
279
|
-
};
|
280
|
-
}
|
281
|
-
|
282
|
-
$.mockjax(handler);
|
237
|
+
var store = this.getStore();
|
238
|
+
var opts = options === undefined ? {} : options;
|
239
|
+
return new MockCreateRequest(url, store, modelName, opts);
|
283
240
|
},
|
284
241
|
|
285
242
|
/**
|
@@ -0,0 +1,73 @@
|
|
1
|
+
var MockCreateRequest = function(url, store, modelName, options) {
|
2
|
+
var succeed = options.succeed === undefined ? true : options.succeed;
|
3
|
+
var matchArgs = options.match;
|
4
|
+
var returnArgs = options.returns;
|
5
|
+
var responseJson = {};
|
6
|
+
var expectedRequest = {};
|
7
|
+
var modelType = store.modelFor(modelName);
|
8
|
+
|
9
|
+
this.calculate = function() {
|
10
|
+
if (matchArgs) {
|
11
|
+
var record = store.createRecord(modelName, matchArgs);
|
12
|
+
expectedRequest = record.serialize();
|
13
|
+
}
|
14
|
+
|
15
|
+
if (succeed) {
|
16
|
+
var definition = FactoryGuy.modelDefinitions[modelName];
|
17
|
+
if (responseJson[modelName]) {
|
18
|
+
// already calculated once, keep the same id
|
19
|
+
responseJson[modelName] = $.extend({id: responseJson[modelName].id}, matchArgs, returnArgs);
|
20
|
+
} else {
|
21
|
+
responseJson[modelName] = $.extend({id: definition.nextId()}, matchArgs, returnArgs);
|
22
|
+
}
|
23
|
+
// Remove belongsTo associations since they will already be set when you called
|
24
|
+
// createRecord, so they don't need to be returned.
|
25
|
+
Ember.get(modelType, 'relationshipsByName').forEach(function (relationship) {
|
26
|
+
if (relationship.kind == 'belongsTo') {
|
27
|
+
delete responseJson[modelName][relationship.key];
|
28
|
+
}
|
29
|
+
})
|
30
|
+
}
|
31
|
+
|
32
|
+
}
|
33
|
+
|
34
|
+
this.match = function(matches) {
|
35
|
+
matchArgs = matches;
|
36
|
+
this.calculate();
|
37
|
+
return this;
|
38
|
+
}
|
39
|
+
|
40
|
+
this.andReturn = function(returns) {
|
41
|
+
returnArgs = returns;
|
42
|
+
this.calculate();
|
43
|
+
return this;
|
44
|
+
}
|
45
|
+
|
46
|
+
this.andFail = function() {
|
47
|
+
succeed = false;
|
48
|
+
return this;
|
49
|
+
}
|
50
|
+
|
51
|
+
this.handler = function(settings) {
|
52
|
+
if (settings.url != url || settings.type != 'POST') { return false}
|
53
|
+
|
54
|
+
if (matchArgs) {
|
55
|
+
var requestData = JSON.parse(settings.data)[modelName];
|
56
|
+
for (attribute in expectedRequest) {
|
57
|
+
if (expectedRequest[attribute] &&
|
58
|
+
requestData[attribute] != expectedRequest[attribute]) {
|
59
|
+
return false
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
var responseStatus = (succeed ? 200: 500);
|
64
|
+
return {
|
65
|
+
responseText: responseJson,
|
66
|
+
status: responseStatus
|
67
|
+
};
|
68
|
+
}
|
69
|
+
|
70
|
+
this.calculate();
|
71
|
+
|
72
|
+
$.mockjax(this.handler);
|
73
|
+
};
|
@@ -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
|
31
|
+
make = function() {return FactoryGuy.make.apply(FactoryGuy,arguments)}
|
32
32
|
},
|
33
33
|
teardown: function () {
|
34
34
|
testHelper.teardown();
|
@@ -233,7 +233,7 @@ module('FactoryGuyTestMixin (using mockjax) with DS.ActiveModelAdapter', {
|
|
233
233
|
setup: function () {
|
234
234
|
testHelper = TestHelper.setup(DS.ActiveModelAdapter);
|
235
235
|
store = testHelper.getStore();
|
236
|
-
make = function() {return
|
236
|
+
make = function() {return FactoryGuy.make.apply(FactoryGuy,arguments)}
|
237
237
|
},
|
238
238
|
teardown: function () {
|
239
239
|
testHelper.teardown();
|
@@ -241,8 +241,9 @@ module('FactoryGuyTestMixin (using mockjax) with DS.ActiveModelAdapter', {
|
|
241
241
|
});
|
242
242
|
|
243
243
|
|
244
|
-
/////// handleCreate //////////
|
244
|
+
/////// handleCreate //////////
|
245
245
|
|
246
|
+
/////// with hash of parameters ///////////////////
|
246
247
|
asyncTest("#handleCreate with no specific match", function() {
|
247
248
|
testHelper.handleCreate('profile');
|
248
249
|
|
@@ -394,6 +395,128 @@ asyncTest("#handleCreate match but still fail", function() {
|
|
394
395
|
)
|
395
396
|
});
|
396
397
|
|
398
|
+
/////// handleCreate //////////
|
399
|
+
/////// with chaining methods ///////////////////
|
400
|
+
|
401
|
+
asyncTest("#handleCreate match some attributes with match method", function() {
|
402
|
+
var customDescription = "special description"
|
403
|
+
var date = new Date();
|
404
|
+
|
405
|
+
testHelper.handleCreate('profile').match({description: customDescription});
|
406
|
+
|
407
|
+
store.createRecord('profile', {
|
408
|
+
description: customDescription, created_at: date
|
409
|
+
}).save().then(function(profile) {
|
410
|
+
ok(profile instanceof Profile)
|
411
|
+
ok(profile.id == 1)
|
412
|
+
ok(profile.get('description') == customDescription)
|
413
|
+
start();
|
414
|
+
});
|
415
|
+
});
|
416
|
+
|
417
|
+
asyncTest("#handleCreate match all attributes with match method", function() {
|
418
|
+
var customDescription = "special description"
|
419
|
+
var date = new Date();
|
420
|
+
|
421
|
+
testHelper.handleCreate('profile').match({description: customDescription, created_at: date});
|
422
|
+
|
423
|
+
store.createRecord('profile', {
|
424
|
+
description: customDescription, created_at: date
|
425
|
+
}).save().then(function(profile) {
|
426
|
+
ok(profile instanceof Profile)
|
427
|
+
ok(profile.id == 1)
|
428
|
+
ok(profile.get('description') == customDescription)
|
429
|
+
ok(profile.get('created_at') == date.toString())
|
430
|
+
start();
|
431
|
+
});
|
432
|
+
});
|
433
|
+
|
434
|
+
asyncTest("#handleCreate match belongsTo association with match method", function() {
|
435
|
+
var company = make('company')
|
436
|
+
testHelper.handleCreate('profile').match({company: company})
|
437
|
+
|
438
|
+
store.createRecord('profile', {company: company}).save().then(function(profile) {
|
439
|
+
ok(profile.get('company') == company)
|
440
|
+
start();
|
441
|
+
});
|
442
|
+
});
|
443
|
+
|
444
|
+
asyncTest("#handleCreate match belongsTo polymorphic association with match method", function() {
|
445
|
+
var group = make('group')
|
446
|
+
testHelper.handleCreate('profile').match({group: group})
|
447
|
+
|
448
|
+
store.createRecord('profile', {group: group}).save().then(function(profile) {
|
449
|
+
ok(profile.get('group') == group)
|
450
|
+
start();
|
451
|
+
});
|
452
|
+
});
|
453
|
+
|
454
|
+
|
455
|
+
|
456
|
+
asyncTest("#handleCreate returns attributes with andReturns method", function() {
|
457
|
+
var date = new Date()
|
458
|
+
|
459
|
+
testHelper.handleCreate('profile').andReturn({created_at: date});
|
460
|
+
|
461
|
+
store.createRecord('profile').save().then(function(profile) {
|
462
|
+
ok(profile.get('created_at') == date.toString())
|
463
|
+
start();
|
464
|
+
});
|
465
|
+
});
|
466
|
+
|
467
|
+
asyncTest("#handleCreate match attributes and return attributes with match and andReturn methods", function() {
|
468
|
+
var date = new Date()
|
469
|
+
var customDescription = "special description"
|
470
|
+
var company = make('company')
|
471
|
+
var group = make('big_group')
|
472
|
+
|
473
|
+
testHelper.handleCreate('profile')
|
474
|
+
.match({description: customDescription, company: company, group: group})
|
475
|
+
.andReturn({created_at: new Date()})
|
476
|
+
|
477
|
+
store.createRecord('profile', {
|
478
|
+
description: customDescription, company: company, group: group
|
479
|
+
}).save().then(function(profile) {
|
480
|
+
start();
|
481
|
+
ok(profile.get('created_at') == date.toString())
|
482
|
+
ok(profile.get('group') == group)
|
483
|
+
ok(profile.get('company') == company)
|
484
|
+
ok(profile.get('description') == customDescription)
|
485
|
+
});
|
486
|
+
});
|
487
|
+
|
488
|
+
|
489
|
+
asyncTest("#handleCreate failure with andFail method", function() {
|
490
|
+
testHelper.handleCreate('profile').andFail();
|
491
|
+
|
492
|
+
store.createRecord('profile').save()
|
493
|
+
.then(
|
494
|
+
function() {},
|
495
|
+
function() {
|
496
|
+
ok(true)
|
497
|
+
start();
|
498
|
+
}
|
499
|
+
)
|
500
|
+
});
|
501
|
+
|
502
|
+
|
503
|
+
asyncTest("#handleCreate match but still fail with chaining methods", function() {
|
504
|
+
var description = "special description"
|
505
|
+
|
506
|
+
testHelper.handleCreate('profile').match({description: description}).andFail();
|
507
|
+
|
508
|
+
store.createRecord('profile', {description: description}).save()
|
509
|
+
.then(
|
510
|
+
function() {},
|
511
|
+
function() {
|
512
|
+
ok(true)
|
513
|
+
start();
|
514
|
+
}
|
515
|
+
)
|
516
|
+
});
|
517
|
+
|
518
|
+
|
519
|
+
|
397
520
|
|
398
521
|
|
399
522
|
/////// handleFindAll //////////
|
@@ -534,6 +657,4 @@ asyncTest("#handleDelete failure case", function() {
|
|
534
657
|
start();
|
535
658
|
}
|
536
659
|
);
|
537
|
-
});
|
538
|
-
|
539
|
-
|
660
|
+
});
|
@@ -1081,53 +1081,10 @@ var FactoryGuyTestMixin = Em.Mixin.create({
|
|
1081
1081
|
@param {Object} options hash of options for handling request
|
1082
1082
|
*/
|
1083
1083
|
handleCreate: function (modelName, options) {
|
1084
|
-
var opts = options === undefined ? {} : options;
|
1085
|
-
var store = this.getStore()
|
1086
|
-
var succeed = opts.succeed === undefined ? true : opts.succeed;
|
1087
|
-
var match = opts.match || {};
|
1088
|
-
var returnArgs = opts.returns || {};
|
1089
|
-
|
1090
|
-
if (opts.match) {
|
1091
|
-
var record = store.createRecord(modelName, match);
|
1092
|
-
var expectedRequest = record.serialize();
|
1093
|
-
}
|
1094
|
-
|
1095
|
-
var modelType = store.modelFor(modelName)
|
1096
|
-
|
1097
|
-
var responseJson = {};
|
1098
|
-
if (succeed) {
|
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
1084
|
var url = this.buildURL(modelName);
|
1111
|
-
|
1112
|
-
var
|
1113
|
-
|
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
|
1120
|
-
}
|
1121
|
-
}
|
1122
|
-
}
|
1123
|
-
var responseStatus = (succeed ? 200: 500);
|
1124
|
-
return {
|
1125
|
-
responseText: responseJson,
|
1126
|
-
status: responseStatus
|
1127
|
-
};
|
1128
|
-
}
|
1129
|
-
|
1130
|
-
$.mockjax(handler);
|
1085
|
+
var store = this.getStore();
|
1086
|
+
var opts = options === undefined ? {} : options;
|
1087
|
+
return new MockCreateRequest(url, store, modelName, opts);
|
1131
1088
|
},
|
1132
1089
|
|
1133
1090
|
/**
|
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.6
|
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-
|
12
|
+
date: 2015-01-19 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Easily create Fixtures for Ember Data
|
15
15
|
email:
|
@@ -36,6 +36,7 @@ files:
|
|
36
36
|
- src/factory_guy.js
|
37
37
|
- src/factory_guy_test_mixin.js
|
38
38
|
- src/has_many.js
|
39
|
+
- src/mock_create_request.js
|
39
40
|
- src/model_definition.js
|
40
41
|
- src/prologue.js
|
41
42
|
- src/sequence.js
|