ember-data-factory-guy 0.3.9 → 0.4.0

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.
@@ -5,6 +5,9 @@ Hat = DS.Model.extend({
5
5
  hats: DS.hasMany('hat', {inverse: 'hat', polymorphic: true})
6
6
  });
7
7
 
8
- BigHat = Hat.extend();
8
+ BigHat = Hat.extend({
9
+ materials: DS.hasMany('soft_material')
10
+ });
9
11
  SmallHat = Hat.extend();
10
12
 
13
+
@@ -0,0 +1,4 @@
1
+ SoftMaterial = DS.Model.extend({
2
+ name: DS.attr('string'),
3
+ hat: DS.belongsTo('big_hat')
4
+ })
@@ -1,4 +1,6 @@
1
1
  Profile = DS.Model.extend({
2
- description: DS.attr('string'),
3
- company: DS.belongsTo('company')
2
+ description: DS.attr('string'),
3
+ camelCaseDescription: DS.attr('string'),
4
+ snake_case_description: DS.attr('string'),
5
+ company: DS.belongsTo('company')
4
6
  });
@@ -6,12 +6,16 @@ TestHelper = Ember.Object.createWithMixins(FactoryGuyTestMixin,{
6
6
  * @param adapter DS.FixtureAdapter or DS.ActiveModelSerializer or whatever
7
7
  */
8
8
  setup: function(adapter) {
9
+ $.mockjaxSettings.logging = false;
10
+ $.mockjaxSettings.responseTime = 0;
11
+
9
12
  var container = new Ember.Container();
10
13
  this.set('container', container);
11
14
 
12
15
  container.register("model:hat", Hat);
13
16
  container.register("model:small_hat", SmallHat);
14
17
  container.register("model:big_hat", BigHat);
18
+ container.register("model:soft_material", SoftMaterial);
15
19
  container.register("model:user", User);
16
20
  container.register("model:profile", Profile);
17
21
  container.register("model:company", Company);
data/tests/test_setup.js CHANGED
@@ -12,9 +12,19 @@ FactoryGuy.define('hat', {
12
12
  type: 'BigHat'
13
13
  }
14
14
  })
15
+ FactoryGuy.define('soft_material', {
16
+ default: {
17
+ name: 'Soft material'
18
+ },
19
+ silk: {
20
+ name: 'silk'
21
+ }
22
+ })
15
23
  FactoryGuy.define('profile', {
16
24
  default: {
17
- description: 'Text goes here'
25
+ description: 'Text goes here',
26
+ camelCaseDescription: 'boyThisIsSilly',
27
+ snake_case_description: 'how_do_birds_find_worms'
18
28
  }
19
29
  })
20
30
  FactoryGuy.define('project', {
@@ -60,13 +70,23 @@ Hat = DS.Model.extend({
60
70
  hats: DS.hasMany('hat', {inverse: 'hat', polymorphic: true})
61
71
  });
62
72
 
63
- BigHat = Hat.extend();
73
+ BigHat = Hat.extend({
74
+ materials: DS.hasMany('soft_material')
75
+ });
64
76
  SmallHat = Hat.extend();
65
77
 
66
78
 
79
+
80
+ SoftMaterial = DS.Model.extend({
81
+ name: DS.attr('string'),
82
+ hat: DS.belongsTo('big_hat')
83
+ })
84
+
67
85
  Profile = DS.Model.extend({
68
- description: DS.attr('string'),
69
- company: DS.belongsTo('company')
86
+ description: DS.attr('string'),
87
+ camelCaseDescription: DS.attr('string'),
88
+ snake_case_description: DS.attr('string'),
89
+ company: DS.belongsTo('company')
70
90
  });
71
91
 
72
92
  Project = DS.Model.extend({
@@ -82,6 +102,606 @@ User = DS.Model.extend({
82
102
  projects: DS.hasMany('project'),
83
103
  hats: DS.hasMany('hat', {polymorphic: true})
84
104
  });
105
+ /*!
106
+ * MockJax - jQuery Plugin to Mock Ajax requests
107
+ *
108
+ * Version: 1.5.3
109
+ * Released:
110
+ * Home: http://github.com/appendto/jquery-mockjax
111
+ * Author: Jonathan Sharp (http://jdsharp.com)
112
+ * License: MIT,GPL
113
+ *
114
+ * Copyright (c) 2011 appendTo LLC.
115
+ * Dual licensed under the MIT or GPL licenses.
116
+ * http://appendto.com/open-source-licenses
117
+ */
118
+ (function($) {
119
+ var _ajax = $.ajax,
120
+ mockHandlers = [],
121
+ mockedAjaxCalls = [],
122
+ CALLBACK_REGEX = /=\?(&|$)/,
123
+ jsc = (new Date()).getTime();
124
+
125
+
126
+ // Parse the given XML string.
127
+ function parseXML(xml) {
128
+ if ( window.DOMParser == undefined && window.ActiveXObject ) {
129
+ DOMParser = function() { };
130
+
131
+ DOMParser.prototype.parseFromString = function( xmlString ) {
132
+ var doc = new ActiveXObject('Microsoft.XMLDOM');
133
+ doc.async = 'false';
134
+ doc.loadXML( xmlString );
135
+ return doc;
136
+ };
137
+ }
138
+
139
+ try {
140
+ var xmlDoc = ( new DOMParser() ).parseFromString( xml, 'text/xml' );
141
+ if ( $.isXMLDoc( xmlDoc ) ) {
142
+ var err = $('parsererror', xmlDoc);
143
+ if ( err.length == 1 ) {
144
+ throw('Error: ' + $(xmlDoc).text() );
145
+ }
146
+ } else {
147
+ throw('Unable to parse XML');
148
+ }
149
+ return xmlDoc;
150
+ } catch( e ) {
151
+ var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
152
+ $(document).trigger('xmlParseError', [ msg ]);
153
+ return undefined;
154
+ }
155
+ }
156
+
157
+ // Trigger a jQuery event
158
+ function trigger(s, type, args) {
159
+ (s.context ? $(s.context) : $.event).trigger(type, args);
160
+ }
161
+
162
+ // Check if the data field on the mock handler and the request match. This
163
+ // can be used to restrict a mock handler to being used only when a certain
164
+ // set of data is passed to it.
165
+ function isMockDataEqual( mock, live ) {
166
+ var identical = true;
167
+ // Test for situations where the data is a querystring (not an object)
168
+ if (typeof live === 'string') {
169
+ // Querystring may be a regex
170
+ return $.isFunction( mock.test ) ? mock.test(live) : mock == live;
171
+ }
172
+ $.each(mock, function(k) {
173
+ if ( live[k] === undefined ) {
174
+ identical = false;
175
+ return identical;
176
+ } else {
177
+ // This will allow to compare Arrays
178
+ if ( typeof live[k] === 'object' && live[k] !== null ) {
179
+ identical = identical && isMockDataEqual(mock[k], live[k]);
180
+ } else {
181
+ if ( mock[k] && $.isFunction( mock[k].test ) ) {
182
+ identical = identical && mock[k].test(live[k]);
183
+ } else {
184
+ identical = identical && ( mock[k] == live[k] );
185
+ }
186
+ }
187
+ }
188
+ });
189
+
190
+ return identical;
191
+ }
192
+
193
+ // See if a mock handler property matches the default settings
194
+ function isDefaultSetting(handler, property) {
195
+ return handler[property] === $.mockjaxSettings[property];
196
+ }
197
+
198
+ // Check the given handler should mock the given request
199
+ function getMockForRequest( handler, requestSettings ) {
200
+
201
+ // If the mock was registered with a function, let the function decide if we
202
+ // want to mock this request
203
+ if ( $.isFunction(handler) ) {
204
+ return handler( requestSettings );
205
+ }
206
+
207
+ // Inspect the URL of the request and check if the mock handler's url
208
+ // matches the url for this ajax request
209
+ if ( $.isFunction(handler.url.test) ) {
210
+ // The user provided a regex for the url, test it
211
+ if ( !handler.url.test( requestSettings.url ) ) {
212
+ return null;
213
+ }
214
+ } else {
215
+ // Look for a simple wildcard '*' or a direct URL match
216
+ var star = handler.url.indexOf('*');
217
+ if (handler.url !== requestSettings.url && star === -1 ||
218
+ !new RegExp(handler.url.replace(/[-[\]{}()+?.,\\^$|#\s]/g, "\\$&").replace(/\*/g, '.+')).test(requestSettings.url)) {
219
+ return null;
220
+ }
221
+ }
222
+ // console.log(handler.url, handler.data, requestSettings.data)
223
+ // Inspect the data submitted in the request (either POST body or GET query string)
224
+ if ( handler.data && requestSettings.data ) {
225
+ if ( !isMockDataEqual(handler.data, requestSettings.data) ) {
226
+ // They're not identical, do not mock this request
227
+ return null;
228
+ }
229
+ }
230
+ // Inspect the request type
231
+ if ( handler && handler.type &&
232
+ handler.type.toLowerCase() != requestSettings.type.toLowerCase() ) {
233
+ // The request type doesn't match (GET vs. POST)
234
+ return null;
235
+ }
236
+
237
+ return handler;
238
+ }
239
+
240
+ // Process the xhr objects send operation
241
+ function _xhrSend(mockHandler, requestSettings, origSettings) {
242
+
243
+ // This is a substitute for < 1.4 which lacks $.proxy
244
+ var process = (function(that) {
245
+ return function() {
246
+ return (function() {
247
+ var onReady;
248
+
249
+ // The request has returned
250
+ this.status = mockHandler.status;
251
+ this.statusText = mockHandler.statusText;
252
+ this.readyState = 4;
253
+
254
+ // We have an executable function, call it to give
255
+ // the mock handler a chance to update it's data
256
+ if ( $.isFunction(mockHandler.response) ) {
257
+ mockHandler.response(origSettings);
258
+ }
259
+ // Copy over our mock to our xhr object before passing control back to
260
+ // jQuery's onreadystatechange callback
261
+ if ( requestSettings.dataType == 'json' && ( typeof mockHandler.responseText == 'object' ) ) {
262
+ this.responseText = JSON.stringify(mockHandler.responseText);
263
+ } else if ( requestSettings.dataType == 'xml' ) {
264
+ if ( typeof mockHandler.responseXML == 'string' ) {
265
+ this.responseXML = parseXML(mockHandler.responseXML);
266
+ //in jQuery 1.9.1+, responseXML is processed differently and relies on responseText
267
+ this.responseText = mockHandler.responseXML;
268
+ } else {
269
+ this.responseXML = mockHandler.responseXML;
270
+ }
271
+ } else {
272
+ this.responseText = mockHandler.responseText;
273
+ }
274
+ if( typeof mockHandler.status == 'number' || typeof mockHandler.status == 'string' ) {
275
+ this.status = mockHandler.status;
276
+ }
277
+ if( typeof mockHandler.statusText === "string") {
278
+ this.statusText = mockHandler.statusText;
279
+ }
280
+ // jQuery 2.0 renamed onreadystatechange to onload
281
+ onReady = this.onreadystatechange || this.onload;
282
+
283
+ // jQuery < 1.4 doesn't have onreadystate change for xhr
284
+ if ( $.isFunction( onReady ) ) {
285
+ if( mockHandler.isTimeout) {
286
+ this.status = -1;
287
+ }
288
+ onReady.call( this, mockHandler.isTimeout ? 'timeout' : undefined );
289
+ } else if ( mockHandler.isTimeout ) {
290
+ // Fix for 1.3.2 timeout to keep success from firing.
291
+ this.status = -1;
292
+ }
293
+ }).apply(that);
294
+ };
295
+ })(this);
296
+
297
+ if ( mockHandler.proxy ) {
298
+ // We're proxying this request and loading in an external file instead
299
+ _ajax({
300
+ global: false,
301
+ url: mockHandler.proxy,
302
+ type: mockHandler.proxyType,
303
+ data: mockHandler.data,
304
+ dataType: requestSettings.dataType === "script" ? "text/plain" : requestSettings.dataType,
305
+ complete: function(xhr) {
306
+ mockHandler.responseXML = xhr.responseXML;
307
+ mockHandler.responseText = xhr.responseText;
308
+ // Don't override the handler status/statusText if it's specified by the config
309
+ if (isDefaultSetting(mockHandler, 'status')) {
310
+ mockHandler.status = xhr.status;
311
+ }
312
+ if (isDefaultSetting(mockHandler, 'statusText')) {
313
+ mockHandler.statusText = xhr.statusText;
314
+ }
315
+
316
+ this.responseTimer = setTimeout(process, mockHandler.responseTime || 0);
317
+ }
318
+ });
319
+ } else {
320
+ // type == 'POST' || 'GET' || 'DELETE'
321
+ if ( requestSettings.async === false ) {
322
+ // TODO: Blocking delay
323
+ process();
324
+ } else {
325
+ this.responseTimer = setTimeout(process, mockHandler.responseTime || 50);
326
+ }
327
+ }
328
+ }
329
+
330
+ // Construct a mocked XHR Object
331
+ function xhr(mockHandler, requestSettings, origSettings, origHandler) {
332
+ // Extend with our default mockjax settings
333
+ mockHandler = $.extend(true, {}, $.mockjaxSettings, mockHandler);
334
+
335
+ if (typeof mockHandler.headers === 'undefined') {
336
+ mockHandler.headers = {};
337
+ }
338
+ if ( mockHandler.contentType ) {
339
+ mockHandler.headers['content-type'] = mockHandler.contentType;
340
+ }
341
+
342
+ return {
343
+ status: mockHandler.status,
344
+ statusText: mockHandler.statusText,
345
+ readyState: 1,
346
+ open: function() { },
347
+ send: function() {
348
+ origHandler.fired = true;
349
+ _xhrSend.call(this, mockHandler, requestSettings, origSettings);
350
+ },
351
+ abort: function() {
352
+ clearTimeout(this.responseTimer);
353
+ },
354
+ setRequestHeader: function(header, value) {
355
+ mockHandler.headers[header] = value;
356
+ },
357
+ getResponseHeader: function(header) {
358
+ // 'Last-modified', 'Etag', 'content-type' are all checked by jQuery
359
+ if ( mockHandler.headers && mockHandler.headers[header] ) {
360
+ // Return arbitrary headers
361
+ return mockHandler.headers[header];
362
+ } else if ( header.toLowerCase() == 'last-modified' ) {
363
+ return mockHandler.lastModified || (new Date()).toString();
364
+ } else if ( header.toLowerCase() == 'etag' ) {
365
+ return mockHandler.etag || '';
366
+ } else if ( header.toLowerCase() == 'content-type' ) {
367
+ return mockHandler.contentType || 'text/plain';
368
+ }
369
+ },
370
+ getAllResponseHeaders: function() {
371
+ var headers = '';
372
+ $.each(mockHandler.headers, function(k, v) {
373
+ headers += k + ': ' + v + "\n";
374
+ });
375
+ return headers;
376
+ }
377
+ };
378
+ }
379
+
380
+ // Process a JSONP mock request.
381
+ function processJsonpMock( requestSettings, mockHandler, origSettings ) {
382
+ // Handle JSONP Parameter Callbacks, we need to replicate some of the jQuery core here
383
+ // because there isn't an easy hook for the cross domain script tag of jsonp
384
+
385
+ processJsonpUrl( requestSettings );
386
+
387
+ requestSettings.dataType = "json";
388
+ if(requestSettings.data && CALLBACK_REGEX.test(requestSettings.data) || CALLBACK_REGEX.test(requestSettings.url)) {
389
+ createJsonpCallback(requestSettings, mockHandler, origSettings);
390
+
391
+ // We need to make sure
392
+ // that a JSONP style response is executed properly
393
+
394
+ var rurl = /^(\w+:)?\/\/([^\/?#]+)/,
395
+ parts = rurl.exec( requestSettings.url ),
396
+ remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
397
+
398
+ requestSettings.dataType = "script";
399
+ if(requestSettings.type.toUpperCase() === "GET" && remote ) {
400
+ var newMockReturn = processJsonpRequest( requestSettings, mockHandler, origSettings );
401
+
402
+ // Check if we are supposed to return a Deferred back to the mock call, or just
403
+ // signal success
404
+ if(newMockReturn) {
405
+ return newMockReturn;
406
+ } else {
407
+ return true;
408
+ }
409
+ }
410
+ }
411
+ return null;
412
+ }
413
+
414
+ // Append the required callback parameter to the end of the request URL, for a JSONP request
415
+ function processJsonpUrl( requestSettings ) {
416
+ if ( requestSettings.type.toUpperCase() === "GET" ) {
417
+ if ( !CALLBACK_REGEX.test( requestSettings.url ) ) {
418
+ requestSettings.url += (/\?/.test( requestSettings.url ) ? "&" : "?") +
419
+ (requestSettings.jsonp || "callback") + "=?";
420
+ }
421
+ } else if ( !requestSettings.data || !CALLBACK_REGEX.test(requestSettings.data) ) {
422
+ requestSettings.data = (requestSettings.data ? requestSettings.data + "&" : "") + (requestSettings.jsonp || "callback") + "=?";
423
+ }
424
+ }
425
+
426
+ // Process a JSONP request by evaluating the mocked response text
427
+ function processJsonpRequest( requestSettings, mockHandler, origSettings ) {
428
+ // Synthesize the mock request for adding a script tag
429
+ var callbackContext = origSettings && origSettings.context || requestSettings,
430
+ newMock = null;
431
+
432
+
433
+ // If the response handler on the moock is a function, call it
434
+ if ( mockHandler.response && $.isFunction(mockHandler.response) ) {
435
+ mockHandler.response(origSettings);
436
+ } else {
437
+
438
+ // Evaluate the responseText javascript in a global context
439
+ if( typeof mockHandler.responseText === 'object' ) {
440
+ $.globalEval( '(' + JSON.stringify( mockHandler.responseText ) + ')');
441
+ } else {
442
+ $.globalEval( '(' + mockHandler.responseText + ')');
443
+ }
444
+ }
445
+
446
+ // Successful response
447
+ jsonpSuccess( requestSettings, callbackContext, mockHandler );
448
+ jsonpComplete( requestSettings, callbackContext, mockHandler );
449
+
450
+ // If we are running under jQuery 1.5+, return a deferred object
451
+ if($.Deferred){
452
+ newMock = new $.Deferred();
453
+ if(typeof mockHandler.responseText == "object"){
454
+ newMock.resolveWith( callbackContext, [mockHandler.responseText] );
455
+ }
456
+ else{
457
+ newMock.resolveWith( callbackContext, [$.parseJSON( mockHandler.responseText )] );
458
+ }
459
+ }
460
+ return newMock;
461
+ }
462
+
463
+
464
+ // Create the required JSONP callback function for the request
465
+ function createJsonpCallback( requestSettings, mockHandler, origSettings ) {
466
+ var callbackContext = origSettings && origSettings.context || requestSettings;
467
+ var jsonp = requestSettings.jsonpCallback || ("jsonp" + jsc++);
468
+
469
+ // Replace the =? sequence both in the query string and the data
470
+ if ( requestSettings.data ) {
471
+ requestSettings.data = (requestSettings.data + "").replace(CALLBACK_REGEX, "=" + jsonp + "$1");
472
+ }
473
+
474
+ requestSettings.url = requestSettings.url.replace(CALLBACK_REGEX, "=" + jsonp + "$1");
475
+
476
+
477
+ // Handle JSONP-style loading
478
+ window[ jsonp ] = window[ jsonp ] || function( tmp ) {
479
+ data = tmp;
480
+ jsonpSuccess( requestSettings, callbackContext, mockHandler );
481
+ jsonpComplete( requestSettings, callbackContext, mockHandler );
482
+ // Garbage collect
483
+ window[ jsonp ] = undefined;
484
+
485
+ try {
486
+ delete window[ jsonp ];
487
+ } catch(e) {}
488
+
489
+ if ( head ) {
490
+ head.removeChild( script );
491
+ }
492
+ };
493
+ }
494
+
495
+ // The JSONP request was successful
496
+ function jsonpSuccess(requestSettings, callbackContext, mockHandler) {
497
+ // If a local callback was specified, fire it and pass it the data
498
+ if ( requestSettings.success ) {
499
+ requestSettings.success.call( callbackContext, mockHandler.responseText || "", status, {} );
500
+ }
501
+
502
+ // Fire the global callback
503
+ if ( requestSettings.global ) {
504
+ trigger(requestSettings, "ajaxSuccess", [{}, requestSettings] );
505
+ }
506
+ }
507
+
508
+ // The JSONP request was completed
509
+ function jsonpComplete(requestSettings, callbackContext) {
510
+ // Process result
511
+ if ( requestSettings.complete ) {
512
+ requestSettings.complete.call( callbackContext, {} , status );
513
+ }
514
+
515
+ // The request was completed
516
+ if ( requestSettings.global ) {
517
+ trigger( "ajaxComplete", [{}, requestSettings] );
518
+ }
519
+
520
+ // Handle the global AJAX counter
521
+ if ( requestSettings.global && ! --$.active ) {
522
+ $.event.trigger( "ajaxStop" );
523
+ }
524
+ }
525
+
526
+
527
+ // The core $.ajax replacement.
528
+ function handleAjax( url, origSettings ) {
529
+ var mockRequest, requestSettings, mockHandler;
530
+ // console.log('handleAjax', url)
531
+ // If url is an object, simulate pre-1.5 signature
532
+ if ( typeof url === "object" ) {
533
+ origSettings = url;
534
+ url = undefined;
535
+ } else {
536
+ // work around to support 1.5 signature
537
+ origSettings.url = url;
538
+ }
539
+
540
+ // Extend the original settings for the request
541
+ requestSettings = $.extend(true, {}, $.ajaxSettings, origSettings);
542
+
543
+ // Iterate over our mock handlers (in registration order) until we find
544
+ // one that is willing to intercept the request
545
+ for(var k = 0; k < mockHandlers.length; k++) {
546
+ if ( !mockHandlers[k] ) {
547
+ continue;
548
+ }
549
+
550
+ mockHandler = getMockForRequest( mockHandlers[k], requestSettings );
551
+ if(!mockHandler) {
552
+ // No valid mock found for this request
553
+ continue;
554
+ }
555
+
556
+ mockedAjaxCalls.push(requestSettings);
557
+
558
+ // If logging is enabled, log the mock to the console
559
+ $.mockjaxSettings.log( mockHandler, requestSettings );
560
+
561
+
562
+ if ( requestSettings.dataType === "jsonp" ) {
563
+ if ((mockRequest = processJsonpMock( requestSettings, mockHandler, origSettings ))) {
564
+ // This mock will handle the JSONP request
565
+ return mockRequest;
566
+ }
567
+ }
568
+
569
+
570
+ // Removed to fix #54 - keep the mocking data object intact
571
+ //mockHandler.data = requestSettings.data;
572
+
573
+ mockHandler.cache = requestSettings.cache;
574
+ mockHandler.timeout = requestSettings.timeout;
575
+ mockHandler.global = requestSettings.global;
576
+
577
+ copyUrlParameters(mockHandler, origSettings);
578
+
579
+ (function(mockHandler, requestSettings, origSettings, origHandler) {
580
+ mockRequest = _ajax.call($, $.extend(true, {}, origSettings, {
581
+ // Mock the XHR object
582
+ xhr: function() { return xhr( mockHandler, requestSettings, origSettings, origHandler ); }
583
+ }));
584
+ })(mockHandler, requestSettings, origSettings, mockHandlers[k]);
585
+
586
+ return mockRequest;
587
+ }
588
+
589
+ // We don't have a mock request
590
+ if($.mockjaxSettings.throwUnmocked === true) {
591
+ throw('AJAX not mocked: ' + origSettings.url);
592
+ }
593
+ else { // trigger a normal request
594
+ return _ajax.apply($, [origSettings]);
595
+ }
596
+ }
597
+
598
+ /**
599
+ * Copies URL parameter values if they were captured by a regular expression
600
+ * @param {Object} mockHandler
601
+ * @param {Object} origSettings
602
+ */
603
+ function copyUrlParameters(mockHandler, origSettings) {
604
+ //parameters aren't captured if the URL isn't a RegExp
605
+ if (!(mockHandler.url instanceof RegExp)) {
606
+ return;
607
+ }
608
+ //if no URL params were defined on the handler, don't attempt a capture
609
+ if (!mockHandler.hasOwnProperty('urlParams')) {
610
+ return;
611
+ }
612
+ var captures = mockHandler.url.exec(origSettings.url);
613
+ //the whole RegExp match is always the first value in the capture results
614
+ if (captures.length === 1) {
615
+ return;
616
+ }
617
+ captures.shift();
618
+ //use handler params as keys and capture resuts as values
619
+ var i = 0,
620
+ capturesLength = captures.length,
621
+ paramsLength = mockHandler.urlParams.length,
622
+ //in case the number of params specified is less than actual captures
623
+ maxIterations = Math.min(capturesLength, paramsLength),
624
+ paramValues = {};
625
+ for (i; i < maxIterations; i++) {
626
+ var key = mockHandler.urlParams[i];
627
+ paramValues[key] = captures[i];
628
+ }
629
+ origSettings.urlParams = paramValues;
630
+ }
631
+
632
+
633
+ // Public
634
+
635
+ $.extend({
636
+ ajax: handleAjax
637
+ });
638
+
639
+ $.mockjaxSettings = {
640
+ //url: null,
641
+ //type: 'GET',
642
+ log: function( mockHandler, requestSettings ) {
643
+ if ( mockHandler.logging === false ||
644
+ ( typeof mockHandler.logging === 'undefined' && $.mockjaxSettings.logging === false ) ) {
645
+ return;
646
+ }
647
+ if ( window.console && console.log ) {
648
+ var message = 'MOCK ' + requestSettings.type.toUpperCase() + ': ' + requestSettings.url;
649
+ var request = $.extend({}, requestSettings);
650
+
651
+ if (typeof console.log === 'function') {
652
+ console.log(message, request);
653
+ } else {
654
+ try {
655
+ console.log( message + ' ' + JSON.stringify(request) );
656
+ } catch (e) {
657
+ console.log(message);
658
+ }
659
+ }
660
+ }
661
+ },
662
+ logging: true,
663
+ status: 200,
664
+ statusText: "OK",
665
+ responseTime: 500,
666
+ isTimeout: false,
667
+ throwUnmocked: false,
668
+ contentType: 'text/plain',
669
+ response: '',
670
+ responseText: '',
671
+ responseXML: '',
672
+ proxy: '',
673
+ proxyType: 'GET',
674
+
675
+ lastModified: null,
676
+ etag: '',
677
+ headers: {
678
+ etag: 'IJF@H#@923uf8023hFO@I#H#',
679
+ 'content-type' : 'text/plain'
680
+ }
681
+ };
682
+
683
+ $.mockjax = function(settings) {
684
+ var i = mockHandlers.length;
685
+ mockHandlers[i] = settings;
686
+ return i;
687
+ };
688
+ $.mockjaxClear = function(i) {
689
+ if ( arguments.length == 1 ) {
690
+ mockHandlers[i] = null;
691
+ } else {
692
+ mockHandlers = [];
693
+ }
694
+ mockedAjaxCalls = [];
695
+ };
696
+ $.mockjax.handler = function(i) {
697
+ if ( arguments.length == 1 ) {
698
+ return mockHandlers[i];
699
+ }
700
+ };
701
+ $.mockjax.mockedAjaxCalls = function() {
702
+ return mockedAjaxCalls;
703
+ };
704
+ })(jQuery);
85
705
  /**
86
706
  * Sinon.JS 1.6.0, 2013/02/18
87
707
  *