UNPKG

dojox

Version:

Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.

141 lines (136 loc) 4.4 kB
define([ 'intern!object', 'intern/chai!assert', '../transaction', 'dojo/Deferred', 'dojo/promise/all', 'dojo/_base/declare', 'dojo/store/Memory', 'dojo/store/util/QueryResults' ], function (registerSuite, assert, transaction, Deferred, all, declare, Memory, QueryResults) { var started = 0; function anAsyncMethod(query){ return function(){ started++; var results = this.inherited(arguments); if(results && results.then){ return results; } var deferred = new Deferred(); setTimeout(function(){ deferred.resolve(results); }, 10); return query ? new QueryResults(deferred) : deferred; } } var AsyncMemory = declare(Memory, { get: anAsyncMethod(), put: anAsyncMethod(), add: anAsyncMethod(), query: anAsyncMethod(true) }); var data = [ {id: 1, name: 'one', prime: false, mappedTo: 'E', words: ['banana']}, {id: 2, name: 'two', even: true, prime: true, mappedTo: 'D', words: ['banana', 'orange']}, {id: 3, name: 'three', prime: true, mappedTo: 'C', words: ['apple', 'orange']}, {id: 4, name: 'four', even: true, prime: false, mappedTo: null}, {id: 5, name: 'five', prime: true, mappedTo: 'A'} ]; var masterStore = new AsyncMemory({ data: data }); var cachingStore = new AsyncMemory(); var masterStore2 = new AsyncMemory({ data: [] }); var cachingStore2 = new AsyncMemory(); var logStore = new AsyncMemory(); var transactionStore = transaction({ masterStore: masterStore, cachingStore: cachingStore, transactionLogStore: logStore }); var transactionStore2 = transaction({ masterStore: masterStore2, cachingStore: cachingStore2, transactionLogStore: logStore }); registerSuite({ name: "transaction", 'auto-commit': function(){ // initially in auto-commit mode var operations = []; operations.push(transactionStore.add( {id: 6, name: 'six'} )); assert.strictEqual(masterStore.data.length, 6); operations.push(transactionStore.remove(6)); assert.strictEqual(masterStore.data.length, 5); return all(operations); }, 'commit transaction': function(){ var operations = []; var transaction = transactionStore.transaction(); operations.push(transactionStore.put( {id: 6, name: 'six', perfect: true} )); operations.push(transactionStore.add( {id: 7, name: 'seven'} )); operations.push(transactionStore.remove(3)); // make sure the master store hasn't been updated yet assert.strictEqual(masterStore.data.length, 5); return all(operations).then(function(){ // make sure it is in the caching store operations.push(transactionStore.get(6).then(function(six){ assert.deepEqual(six, {id: 6, name: 'six', perfect: true}); })); assert.strictEqual(cachingStore.data.length, 2); assert.strictEqual(logStore.data.length, 3); return transaction.commit().then(function(){ operations = []; operations.push(transactionStore.get(6).then(function(six){ assert.deepEqual(six, {id: 6, name: 'six', perfect: true}); })); operations.push(transactionStore.get(7).then(function(seven){ assert.deepEqual(seven, {id: 7, name: 'seven'}); })); operations.push(transactionStore.get(3).then(function(gone){ assert.strictEqual(gone, undefined); })); return all(operations); }); }); }, 'multi-store transaction': function(){ var operations = []; var transaction = transactionStore.transaction(); transactionStore2.transaction(); assert.strictEqual(logStore.data.length, 0); operations.push(transactionStore.add( {id: 8, name: 'eight'} )); operations.push(transactionStore2.put( {id: 'a', name: 'A'} )); // make sure the master stores haven't been updated yet assert.strictEqual(masterStore.data.length, 6); assert.strictEqual(masterStore2.data.length, 0); return all(operations).then(function(){ // but the cache should be updated assert.strictEqual(cachingStore2.data.length, 1); assert.strictEqual(logStore.data.length, 2); return transaction.commit().then(function(){ operations = []; operations.push(transactionStore.get(8).then(function(six){ assert.deepEqual(six, {id: 8, name: 'eight'}); })); operations.push(transactionStore2.get('a').then(function(seven){ assert.deepEqual(seven, {id: 'a', name: 'A'}); })); return all(operations); }); }); } }); });