Skip to content

Commit 61bb1c2

Browse files
committed
✅ Add tests for backbone.sync.js
1 parent 8fdc949 commit 61bb1c2

File tree

4 files changed

+351
-34
lines changed

4 files changed

+351
-34
lines changed

app/scripts/backbone.noworker.sync.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ define([
1414
], function(Q, _, Sync, DB) {
1515
'use strict';
1616

17-
var Adapter = _.extend(Sync, {
17+
var Adapter = _.extend({}, Sync, {
1818
promises: [],
1919

2020
/**

app/scripts/backbone.sync.js

Lines changed: 49 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,61 +9,77 @@
99
define([
1010
'q',
1111
'underscore'
12-
], function(Q) {
12+
], function(Q, _) {
1313
'use strict';
1414

1515
var Adapter = {
16-
promises: [],
16+
promises: {},
1717

1818
/**
1919
* Create a new worker and start listening to its events.
2020
*
2121
* @return function
2222
*/
2323
sync: function() {
24-
var self = this,
25-
sync;
24+
_.bindAll(this, 'listenToWorker', 'backboneSync');
2625

2726
this.worker = new Worker('scripts/workers/localForage.js');
2827

2928
// Promise which signifies whether the worker is ready
3029
this.workerPromise = Q.defer();
3130

32-
this.worker.onmessage = function(data) {
33-
var msg = data.data;
31+
// Start listening to WebWorker events
32+
this.worker.onmessage = this.listenToWorker;
3433

35-
switch (msg.msg) {
34+
// A function for Backbone sync
35+
return this.backboneSync;
36+
},
3637

37-
// Database webworker is ready
38-
case 'ready':
39-
self.workerPromise.resolve();
40-
break;
38+
/**
39+
* Resolve promises after receiving WebWorker messages.
40+
*
41+
* @type object data
42+
*/
43+
listenToWorker: function(data) {
44+
var msg = data.data;
4145

42-
// Request was fullfilled
43-
case 'done':
44-
self.promises[msg.promiseId].resolve(msg.data);
45-
delete self.promises[msg.promiseId];
46-
break;
46+
switch (msg.msg) {
4747

48-
// Request failed with errors
49-
case 'fail':
50-
self.promises[msg.promiseId].reject(msg.data);
51-
delete self.promises[msg.promiseId];
52-
break;
48+
// Database webworker is ready
49+
case 'ready':
50+
this.workerPromise.resolve();
51+
break;
5352

54-
default:
55-
}
56-
};
53+
// Request was fullfilled
54+
case 'done':
55+
this.promises[msg.promiseId].resolve(msg.data);
56+
delete this.promises[msg.promiseId];
57+
break;
5758

58-
// A function for Backbone sync
59-
sync = function(method, model, options) {
60-
return self.workerPromise.promise
61-
.then(function() {
62-
return self[method](model, options);
63-
});
64-
};
65-
66-
return sync;
59+
// Request failed with errors
60+
case 'fail':
61+
this.promises[msg.promiseId].reject(msg.data);
62+
delete this.promises[msg.promiseId];
63+
break;
64+
65+
default:
66+
}
67+
},
68+
69+
/**
70+
* With this method Backbone.sync will be overriden.
71+
*
72+
* @return promise
73+
*/
74+
backboneSync: function(method, model, options) {
75+
76+
// First, make sure WebWorker is ready
77+
return this.workerPromise.promise
78+
.then(_.bind(function() {
79+
80+
// Execute the method (read, create, update)
81+
return this[method](model, options);
82+
}, this));
6783
},
6884

6985
/**

0 commit comments

Comments
 (0)