can
Version:
MIT-licensed, client-side, JavaScript framework that makes building rich web applications easy.
1,559 lines (1,477 loc) • 99.9 kB
JavaScript
// FIXME: this test assumes the existence of the global object "tests"
define(["dojo/main", "doh/main", "require", "dojo/data/api/Read", "dojo/data/api/Identity", "dojo/date", "dojo/date/stamp"], function(dojo, doh, require){
dojo.getObject("data.readOnlyItemFileTestTemplates", true, tests);
dojo.declare("tests.data.Wrapper", null, {
// summary:
// Simple class to use for typeMap in order to test out
// 'falsy' values for _value.
_wrapped: null,
constructor: function(obj){
this._wrapped = obj;
},
getValue: function(){
return this._wrapped;
},
setValue: function(obj){
this._wrapped = obj;
},
toString: function(){
return "WRAPPER: [" + this._wrapped + "]";
}
});
tests.data.readOnlyItemFileTestTemplates.registerTestsForDatastore = function(/* String */ datastoreClassName){
// summary:
// Given the name of a datastore class to use, this function creates
// a set of unit tests for that datastore, and registers the new test
// group with the doh test framework. The new unit tests are based
// on a set of "template" unit tests.
var datastoreClass = dojo.getObject(datastoreClassName);
var testTemplates = tests.data.readOnlyItemFileTestTemplates.testTemplates;
var testsForDatastore = [];
var makeNewTestFunction = function(template){
return function(t){return template.runTest(datastoreClass, t);};
};
for(var i = 0; i < testTemplates.length; ++i){
var testTemplate = testTemplates[i];
var test = {};
test.name = testTemplate.name;
test.runTest = makeNewTestFunction(testTemplate);
testsForDatastore.push(test);
}
var testGroupName = "IFSCommonTests: " + datastoreClassName;
doh.register(testGroupName, testsForDatastore);
};
//-----------------------------------------------------
// testFile data-sets
tests.data.readOnlyItemFileTestTemplates.getTestData = function(name){
var data = null;
if(name === "countries"){
if(dojo.isBrowser){
data = {url: require.toUrl("./countries.json")};
}else{
data = {data: {
identifier:"abbr",
label:"name",
items:[
{abbr:"ec", name:"Ecuador", capital:"Quito"},
{abbr:'eg', name:'Egypt', capital:'Cairo'},
{abbr:'sv', name:'El Salvador', capital:'San Salvador'},
{abbr:'gq', name:'Equatorial Guinea', capital:'Malabo'},
{abbr:'er', name:'Eritrea', capital:'Asmara'},
{abbr:'ee', name:'Estonia', capital:'Tallinn'},
{abbr:'et', name:'Ethiopia', capital:'Addis Ababa'}
]
} };
}
}else if(name === "countries_withNull"){
if(dojo.isBrowser){
data = {url: require.toUrl("./countries_withNull.json")};
}else{
data = {data: {
identifier:"abbr",
items:[
{abbr:"ec", name:null, capital:"Quito"},
{abbr:'eg', name:null, capital:'Cairo'},
{abbr:'sv', name:'El Salvador', capital:'San Salvador'},
{abbr:'gq', name:'Equatorial Guinea', capital:'Malabo'},
{abbr:'er', name:'Eritrea', capital:'Asmara'},
{abbr:'ee', name:null, capital:'Tallinn'},
{abbr:'et', name:'Ethiopia', capital:'Addis Ababa'}
]
} };
}
}else if(name === "countries_withoutid"){
if(dojo.isBrowser){
data = {url: require.toUrl("./countries_withoutid.json")};
}else{
data = {data: {
label: "name",
items:[
{abbr:"ec", name:null, capital:"Quito"},
{abbr:'eg', name:null, capital:'Cairo'},
{abbr:'sv', name:'El Salvador', capital:'San Salvador'},
{abbr:'gq', name:'Equatorial Guinea', capital:'Malabo'},
{abbr:'er', name:'Eritrea', capital:'Asmara'},
{abbr:'ee', name:null, capital:'Tallinn'},
{abbr:'et', name:'Ethiopia', capital:'Addis Ababa'}
]
} };
}
}else if (name === "countries_withBoolean"){
if(dojo.isBrowser){
data = {url: require.toUrl("./countries_withBoolean.json")};
}else{
data = {data: {
identifier:"abbr",
items:[
{abbr:"ec", name:"Ecuador", capital:"Quito", real:true},
{abbr:'eg', name:'Egypt', capital:'Cairo', real:true},
{abbr:'sv', name:'El Salvador', capital:'San Salvador', real:true},
{abbr:'gq', name:'Equatorial Guinea', capital:'Malabo', real:true},
{abbr:'er', name:'Eritrea', capital:'Asmara', real:true},
{abbr:'ee', name:'Estonia', capital:'Tallinn', real:true},
{abbr:'et', name:'Ethiopia', capital:'Addis Ababa', real:true},
{abbr:'ut', name:'Utopia', capital:'Paradise', real:false}
]
} };
}
}else if (name === "countries_withDates"){
if(dojo.isBrowser){
data = {url: require.toUrl("./countries_withDates.json")};
}else{
data = {data: {
identifier:"abbr",
items:[
{abbr:"ec", name:"Ecuador", capital:"Quito"},
{abbr:'eg', name:'Egypt', capital:'Cairo'},
{abbr:'sv', name:'El Salvador', capital:'San Salvador'},
{abbr:'gq', name:'Equatorial Guinea', capital:'Malabo'},
{abbr:'er', name:'Eritrea', capital:'Asmara', independence:{_type:'Date', _value:"1993-05-24T00:00:00Z"}}, // May 24, 1993,
{abbr:'ee', name:'Estonia', capital:'Tallinn', independence:{_type:'Date', _value:"1991-08-20T00:00:00Z"}}, // August 20, 1991
{abbr:'et', name:'Ethiopia', capital:'Addis Ababa'}
]
} };
}
}else if (name === "geography_hierarchy_small"){
if(dojo.isBrowser){
data = {url: require.toUrl("./geography_hierarchy_small.json")};
}else{
data = {data: {
items:[
{ name:'Africa', countries:[
{ name:'Egypt', capital:'Cairo' },
{ name:'Kenya', capital:'Nairobi' },
{ name:'Sudan', capital:'Khartoum' }]},
{ name:'Australia', capital:'Canberra' },
{ name:'North America', countries:[
{ name:'Canada', population:'33 million', cities:[
{ name:'Toronto', population:'2.5 million' },
{ name:'Alberta', population:'1 million' }
]},
{ name: 'United States of America', capital: 'Washington DC', states:[
{ name: 'Missouri'},
{ name: 'Arkansas'}
]}
]}
]
}};
}
}else if (name === "data_multitype"){
if(dojo.isBrowser){
data = {url: require.toUrl("./data_multitype.json")};
}else{
data = {data: {
"identifier": "count",
"label": "count",
items: [
{ count: 1, value: "true" },
{ count: 2, value: true },
{ count: 3, value: "false"},
{ count: 4, value: false },
{ count: 5, value: true },
{ count: 6, value: true },
{ count: 7, value: "true" },
{ count: 8, value: "true" },
{ count: 9, value: "false"},
{ count: 10, value: false },
{ count: 11, value: [false, false]},
{ count: "12", value: [false, "true"]}
]
}
};
}
}else if (name === "countries_references"){
if(dojo.isBrowser){
data = {url: require.toUrl("./countries_references.json")};
}else{
data = {data: { identifier: 'name',
label: 'name',
items: [
{ name:'Africa', type:'continent',
children:[{_reference:'Egypt'}, {_reference:'Kenya'}, {_reference:'Sudan'}] },
{ name:'Egypt', type:'country' },
{ name:'Kenya', type:'country',
children:[{_reference:'Nairobi'}, {_reference:'Mombasa'}] },
{ name:'Nairobi', type:'city' },
{ name:'Mombasa', type:'city' },
{ name:'Sudan', type:'country',
children:{_reference:'Khartoum'} },
{ name:'Khartoum', type:'city' },
{ name:'Asia', type:'continent',
children:[{_reference:'China'}, {_reference:'India'}, {_reference:'Russia'}, {_reference:'Mongolia'}] },
{ name:'China', type:'country' },
{ name:'India', type:'country' },
{ name:'Russia', type:'country' },
{ name:'Mongolia', type:'country' },
{ name:'Australia', type:'continent', population:'21 million',
children:{_reference:'Commonwealth of Australia'}},
{ name:'Commonwealth of Australia', type:'country', population:'21 million'},
{ name:'Europe', type:'continent',
children:[{_reference:'Germany'}, {_reference:'France'}, {_reference:'Spain'}, {_reference:'Italy'}] },
{ name:'Germany', type:'country' },
{ name:'France', type:'country' },
{ name:'Spain', type:'country' },
{ name:'Italy', type:'country' },
{ name:'North America', type:'continent',
children:[{_reference:'Mexico'}, {_reference:'Canada'}, {_reference:'United States of America'}] },
{ name:'Mexico', type:'country', population:'108 million', area:'1,972,550 sq km',
children:[{_reference:'Mexico City'}, {_reference:'Guadalajara'}] },
{ name:'Mexico City', type:'city', population:'19 million', timezone:'-6 UTC'},
{ name:'Guadalajara', type:'city', population:'4 million', timezone:'-6 UTC' },
{ name:'Canada', type:'country', population:'33 million', area:'9,984,670 sq km',
children:[{_reference:'Ottawa'}, {_reference:'Toronto'}] },
{ name:'Ottawa', type:'city', population:'0.9 million', timezone:'-5 UTC'},
{ name:'Toronto', type:'city', population:'2.5 million', timezone:'-5 UTC' },
{ name:'United States of America', type:'country' },
{ name:'South America', type:'continent',
children:[{_reference:'Brazil'}, {_reference:'Argentina'}] },
{ name:'Brazil', type:'country', population:'186 million' },
{ name:'Argentina', type:'country', population:'40 million' }
]
}
};
}
}
return data;
};
//-----------------------------------------------------
// testTemplates
tests.data.readOnlyItemFileTestTemplates.testTemplates = [
{
name: "Identity API: fetchItemByIdentity()",
runTest: function(datastore, t){
// summary:
// Simple test of the fetchItemByIdentity function of the store.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item !== null);
if(item !== null){
var name = store.getValue(item,"name");
t.assertEqual(name, "El Salvador");
}
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "sv", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Identity API: fetchItemByIdentity() preventCache",
runTest: function(datastore, t){
// summary:
// Simple test of the fetchItemByIdentity function of the store.
var args = tests.data.readOnlyItemFileTestTemplates.getTestData("countries");
args.urlPreventCache = true;
var store = new datastore(args);
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item !== null);
if(item !== null){
var name = store.getValue(item,"name");
t.assertEqual(name, "El Salvador");
}
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "sv", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Identity API: fetchItemByIdentity() notFound",
runTest: function(datastore, t){
// summary:
// Simple test of the fetchItemByIdentity function of the store.
// description:
// Simple test of the fetchItemByIdentity function of the store.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item === null);
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "sv_not", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Identity API: getIdentityAttributes()",
runTest: function(datastore, t){
// summary:
// Simple test of the getIdentityAttributes function.
// description:
// Simple test of the getIdentityAttributes function.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item !== null);
var identifiers = store.getIdentityAttributes(item);
t.assertTrue(dojo.isArray(identifiers));
t.assertEqual(1, identifiers.length);
t.assertEqual("abbr", identifiers[0]);
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "sv", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Identity API: fetchItemByIdentity() commentFilteredJson",
runTest: function(datastore, t){
// summary:
// Simple test of the fetchItemByIdentity function of the store.
// description:
// Simple test of the fetchItemByIdentity function of the store.
// This tests loading a comment-filtered json file so that people using secure
// data with this store can bypass the JavaSceipt hijack noted in Fortify's
// paper.
if(dojo.isBrowser){
var store = new datastore({url: require.toUrl("./countries_commentFiltered.json")});
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item !== null);
var name = store.getValue(item,"name");
t.assertEqual(name, "El Salvador");
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "sv", onItem: onItem, onError: onError});
return d; // Deferred
}
}
},
{
name: "Identity API: fetchItemByIdentity() nullValue",
runTest: function(datastore, t){
// summary:
// Simple test of the fetchItemByIdentity function of the store, checling a null value.
// description:
// Simple test of the fetchItemByIdentity function of the store, checking a null value.
// This tests handling attributes in json that were defined as null properly.
// Introduced because of tracker: #3153
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries_withNull"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item !== null);
var name = store.getValue(item,"name");
t.assertEqual(name, null);
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "ec", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Identity API: fetchItemByIdentity() booleanValue",
runTest: function(datastore, t){
// summary:
// Simple test of the fetchItemByIdentity function of the store, checking a boolean value.
// description:
// Simple test of the fetchItemByIdentity function of the store, checking a boolean value.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries_withBoolean"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item !== null);
var name = store.getValue(item,"name");
t.assertEqual(name, "Utopia");
var real = store.getValue(item,"real");
t.assertEqual(real, false);
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "ut", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Identity API: fetchItemByIdentity() withoutSpecifiedIdInData",
runTest: function(datastore, t){
// summary:
// Simple test of bug #4691, looking up something by assigned id, not one specified in the JSON data.
// description:
// Simple test of bug #4691, looking up something by assigned id, not one specified in the JSON data.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries_withoutid"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item !== null);
var name = store.getValue(item,"name");
t.assertEqual(name, "El Salvador");
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "2", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Identity API: fetchItemByIdentity() Object.prototype item identifier",
runTest: function(datastore, t){
// summary:
// Simple test of bug where store would raise an error
// if the item identifier was the same as an Object property name.
var data = {identifier: 'id', items: [{id: 'toString', value: 'aha'}]};
var store = new datastore({data: data});
var d = new doh.Deferred();
function onitem(item){
t.assertTrue(item.value == 'aha');
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: 'toString', onItem: onitem, onError: onError});
return d; // Deferred
}
},
{
name: "Identity API: fetchItemByIdentity() Object.prototype item identifier 2",
runTest: function(datastore, t){
// summary:
// Simple test of bug where store would raise an error
// if the item identifier was the same as an Object property name.
var data = {identifier: 'id', items: [{id: 'hasOwnProperty', value: 'yep'}]};
var store = new datastore({data: data});
var d = new doh.Deferred();
function onitem(item){
t.assertTrue(item.value == 'yep');
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: 'hasOwnProperty', onItem: onitem, onError: onError});
return d; // Deferred
}
},
{
name: "Identity API: fetchItemByIdentity() Object.prototype identity",
runTest: function(datastore, t){
// summary:
// Simple test of bug where fetchItemByIdentity would return
// an object property.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries_withoutid"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item === null);
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: 'toString', onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Identity API: fetchItemByIdentity() Object.prototype identity 2",
runTest: function(datastore, t){
// summary:
// Simple test of bug where fetchItemByIdentity would return
// an object property.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries_withoutid"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item === null);
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: 'hasOwnProperty', onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Identity API: getIdentity()",
runTest: function(datastore, t){
// summary:
// Simple test of the getIdentity function of the store.
// description:
// Simple test of the getIdentity function of the store.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item !== null);
t.assertTrue(store.getIdentity(item) === "sv");
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "sv", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Identity API: getIdentity() withoutSpecifiedId",
runTest: function(datastore, t){
// summary:
// Simple test of the #4691 bug
// description:
// Simple test of the #4691 bug
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries_withoutid"));
var d = new doh.Deferred();
function onItem(item, request){
t.assertTrue(item !== null);
t.assertTrue(store.getIdentity(item) === 2);
d.callback(true);
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
store.fetch({ query:{abbr: "sv"}, onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Read API: fetch() all",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch on ItemFileReadStore.
// description:
// Simple test of a basic fetch on ItemFileReadStore.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function completedAll(items, request){
t.is(7, items.length);
d.callback(true);
}
function error(errData, request){
t.assertTrue(false);
d.errback(errData);
}
//Get everything...
store.fetch({ onComplete: completedAll, onError: error});
return d;
}
},
{
name: "Read API: fetch() all failOk",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch on ItemFileReadStore that fails quietly.
// description:
// Simple test of a basic fetch on ItemFileReadStore that fails quietly.
if(dojo.isBrowser){
var storeParams = {
url: "noSuchUrl",
failOk: true
};
var store = new datastore(storeParams);
console.log(store);
var d = new doh.Deferred();
var completedAll = function(items, request){
d.errback(new Error("Should not be here, should have failed load."));
};
var error = function(errData, request){
d.callback(true);
};
//Get everything...
store.fetch({ onComplete: completedAll, onError: error});
return d;
}
}
},
{
name: "Read API: fetch() abort",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch abort on ItemFileReadStore.
// description:
// Simple test of a basic fetch abort on ItemFileReadStore.
//Can only async abort in a browser, so disable this test from rhino
if(dojo.isBrowser){
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
var abortCalled = false;
function completedAll(items, request){
t.is(7, items.length);
if(abortCalled){
console.log("Made it to complete callback and abort was called. Problem.");
d.errback(new Error("Should not be here."));
}else{
//We beat out calling abort, so this is okay. Timing.
console.log("in onComplete and abort has not been called. Timing. This is okay.");
d.callback(true);
}
}
function error(errData, request){
//An abort should throw a cancel error, so we should
//reach this.
t.assertTrue(true);
d.callback(true);
}
//Get everything...
var req = store.fetch({ onComplete: completedAll, onError: error});
abortCalled=true;
console.log("Calling abort.");
req.abort();
return d;
}
}
},
{
name: "Read API: fetch() all (count === Infinity)",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch on ItemFileReadStore and with a count of Infinity.
// description:
// Simple test of a basic fetch on ItemFileReadStore and with a count of Infinity.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function completedAll(items, request){
t.is(7, items.length);
d.callback(true);
}
function error(errData, request){
t.assertTrue(false);
d.errback(errData);
}
//Get everything...
store.fetch({ onComplete: completedAll, onError: error, start: 0, count: Infinity});
return d;
}
},
{
name: "Read API: fetch() all PreventCache",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch on ItemFileReadStore.
// description:
// Simple test of a basic fetch on ItemFileReadStore.
var args = tests.data.readOnlyItemFileTestTemplates.getTestData("countries");
args.urlPreventCache = true;
var store = new datastore(args);
var d = new doh.Deferred();
function completedAll(items, request){
t.is(7, items.length);
d.callback(true);
}
function error(errData, request){
t.assertTrue(false);
d.errback(errData);
}
//Get everything...
store.fetch({ onComplete: completedAll, onError: error});
return d;
}
},
{
name: "Read API: fetch() one",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch on ItemFileReadStore of a single item.
// description:
// Simple test of a basic fetch on ItemFileReadStore of a single item.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onComplete(items, request){
t.assertEqual(items.length, 1);
d.callback(true);
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
store.fetch({ query: {abbr: "ec"},
onComplete: onComplete,
onError: onError
});
return d;
}
},
{
name: "Read API: fetch() shallow",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch on ItemFileReadStore of only toplevel items
// description:
// Simple test of a basic fetch on ItemFileReadStore of only toplevel items.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("geography_hierarchy_small"));
var d = new doh.Deferred();
function onComplete(items, request){
t.assertEqual(items.length, 2);
d.callback(true);
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
//Find all items starting with A, only toplevel (root) items.
store.fetch({ query: {name: "A*"},
onComplete: onComplete,
onError: onError
});
return d;
}
},
{
name: "Read API: fetch() Multiple",
runTest: function(datastore, t){
// summary:
// Tests that multiple fetches at the same time queue up properly and do not clobber each other on initial load.
// description:
// Tests that multiple fetches at the same time queue up properly and do not clobber each other on initial load.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("geography_hierarchy_small"));
var d = new doh.Deferred();
var done = [false, false];
function onCompleteOne(items, request){
done[0] = true;
t.assertEqual(items.length, 2);
if(done[0] && done[1]){
d.callback(true);
}
}
function onCompleteTwo(items, request){
done[1] = true;
if(done[0] && done[1]){
d.callback(true);
}
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
//Find all items starting with A, only toplevel (root) items.
store.fetch({ query: {name: "A*"},
onComplete: onCompleteOne,
onError: onError
});
//Find all items starting with A, only toplevel (root) items.
store.fetch({ query: {name: "N*"},
onComplete: onCompleteTwo,
onError: onError
});
return d;
}
},
{
name: "Read API: fetch() MultipleMixedFetch",
runTest: function(datastore, t){
// summary:
// Tests that multiple fetches at the same time queue up properly and do not clobber each other on initial load.
// description:
// Tests that multiple fetches at the same time queue up properly and do not clobber each other on initial load.
// Tests an item fetch and an identity fetch.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
var done = [false, false];
function onComplete(items, request){
done[0] = true;
t.assertEqual(items.length, 1);
if(done[0] && done[1]){
d.callback(true);
}
}
function onItem(item){
done[1] = true;
t.assertTrue(item !== null);
var name = store.getValue(item,"name");
t.assertEqual(name, "El Salvador");
if(done[0] && done[1]){
d.callback(true);
}
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
//Find all items starting with A, only toplevel (root) items.
store.fetch({ query: {name: "El*"},
onComplete: onComplete,
onError: onError
});
store.fetchItemByIdentity({identity: "sv", onItem: onItem, onError: onError});
return d;
}
},
{
name: "Read API: fetch() deep",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch on ItemFileReadStore of all items (including children (nested))
// description:
// Simple test of a basic fetch on ItemFileReadStore of all items (including children (nested))
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("geography_hierarchy_small"));
var d = new doh.Deferred();
function onComplete(items, request){
t.assertEqual(items.length, 4);
d.callback(true);
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
//Find all items starting with A, including child (nested) items.
store.fetch({ query: {name: "A*"},
onComplete: onComplete,
onError: onError,
queryOptions: {deep:true}
});
return d;
}
},
{
name: "Read API: fetch() hierarchy off",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch on ItemFileReadStore of all items with hierarchy disabled
// This should turn off processing child objects as data store items. It will still process
// references and type maps.
// description:
// Simple test of a basic fetch on ItemFileReadStore of all items with hierarchy disabled
// This should turn off processing child objects as data store items. It will still process
// references and type maps.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("geography_hierarchy_small"));
//Set this as hierarchy off before fetch to make sure it traps and configs right.
store.hierarchical = false;
var d = new doh.Deferred();
function onComplete(items, request){
//With hierarchy off, this should only match 2, as only two data store items
//will be quertied
t.assertEqual(items.length, 2);
var i;
var passed = true;
for(i = 0; i < items.length; i++){
var countries = store.getValues(items[i], "countries");
if(countries){
var j;
//Make sure none of the child objects were processed into items.
for(j = 0; j<countries.length; j++){
passed = !store.isItem(countries[j]);
if(!passed){
break;
}
}
}
if(!passed){
break;
}
}
if(!passed){
d.errback(new Error("Located a child item with hierarchy off and no references in the data. Error."));
}else{
d.callback(true);
}
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
//Find all items starting with A, including child (nested) items.
store.fetch({ query: {name: "A*"},
onComplete: onComplete,
onError: onError,
queryOptions: {deep:true}
});
return d;
}
},
{
name: "Read API: fetch() hierarchy off refs still parse",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch on ItemFileReadStore of all items with hierarchy disabled
// This should turn off processing child objects as data store items. It will still process
// references and type maps.
// description:
// Simple test of a basic fetch on ItemFileReadStore of all items with hierarchy disabled
// This should turn off processing child objects as data store items. It will still process
// references and type maps.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries_references"));
//Set this as hierarchy off before fetch to make sure it traps and configs right.
store.hierarchical = false;
var d = new doh.Deferred();
function onComplete(items, request){
//With hierarchy off, this should only match 2, as only two data store items
//will be quertied
t.assertEqual(items.length, 4);
var i;
var passed = true;
for(i = 0; i < items.length; i++){
var countries = store.getValues(items[i], "children");
if(countries){
var j;
//Make sure none of the child objects were processed into items.
for(j = 0; j<countries.length; j++){
passed = store.isItem(countries[j]);
if(!passed){
break;
}
}
}
if(!passed){
break;
}
}
if(!passed){
d.errback(new Error("Found a non-child item in a reference list in a references based input. Error."));
}else{
d.callback(true);
}
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
//Find all items starting with A, including child (nested) items.
store.fetch({ query: {name: "A*"},
onComplete: onComplete,
onError: onError,
queryOptions: {deep:true}
});
return d;
}
},
{
name: "Read API: fetch() one_commentFilteredJson",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch on ItemFileReadStore of a single item.
// description:
// Simple test of a basic fetch on ItemFileReadStore of a single item.
// This tests loading a comment-filtered json file so that people using secure
// data with this store can bypass the JavaSceipt hijack noted in Fortify's
// paper.
if(dojo.isBrowser){
var store = new datastore({url: require.toUrl("./countries_commentFiltered.json")});
var d = new doh.Deferred();
function onComplete(items, request){
t.assertEqual(items.length, 1);
d.callback(true);
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
store.fetch({ query: {abbr: "ec"},
onComplete: onComplete,
onError: onError
});
return d;
}
}
},
{
name: "Read API: fetch() withNull",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch on ItemFileReadStore of a single item where some attributes are null.
// description:
// Simple test of a basic fetch on ItemFileReadStore of a single item where some attributes are null.
// Introduced because of tracker: #3153
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries_withNull"));
var d = new doh.Deferred();
function onComplete(items, request){
t.assertEqual(4, items.length);
d.callback(true);
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
store.fetch({ query: {name: "E*"},
onComplete: onComplete,
onError: onError
});
return d;
}
},
{
name: "Read API: fetch() all_streaming",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch on ItemFileReadStore.
// description:
// Simple test of a basic fetch on ItemFileReadStore.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
count = 0;
function onBegin(size, requestObj){
t.assertEqual(size, 7);
}
function onItem(item, requestObj){
t.assertTrue(store.isItem(item));
count++;
}
function onComplete(items, request){
t.assertEqual(count, 7);
t.assertTrue(items === null);
d.callback(true);
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
//Get everything...
store.fetch({ onBegin: onBegin,
onItem: onItem,
onComplete: onComplete,
onError: onError
});
return d;
}
},
{
name: "Read API: fetch() paging",
runTest: function(datastore, t){
// summary:
// Test of multiple fetches on a single result. Paging, if you will.
// description:
// Test of multiple fetches on a single result. Paging, if you will.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function dumpFirstFetch(items, request){
t.assertEqual(items.length, 5);
request.start = 3;
request.count = 1;
request.onComplete = dumpSecondFetch;
store.fetch(request);
}
function dumpSecondFetch(items, request){
t.assertEqual(items.length, 1);
request.start = 0;
request.count = 5;
request.onComplete = dumpThirdFetch;
store.fetch(request);
}
function dumpThirdFetch(items, request){
t.assertEqual(items.length, 5);
request.start = 2;
request.count = 20;
request.onComplete = dumpFourthFetch;
store.fetch(request);
}
function dumpFourthFetch(items, request){
t.assertEqual(items.length, 5);
request.start = 9;
request.count = 100;
request.onComplete = dumpFifthFetch;
store.fetch(request);
}
function dumpFifthFetch(items, request){
t.assertEqual(items.length, 0);
request.start = 2;
request.count = 20;
request.onComplete = dumpSixthFetch;
store.fetch(request);
}
function dumpSixthFetch(items, request){
t.assertEqual(items.length, 5);
d.callback(true);
}
function completed(items, request){
t.assertEqual(items.length, 7);
request.start = 1;
request.count = 5;
request.onComplete = dumpFirstFetch;
store.fetch(request);
}
function error(errData, request){
t.assertTrue(false);
d.errback(errData);
}
store.fetch({onComplete: completed, onError: error});
return d;
}
},
{
name: "Read API: fetch() with MultiType Match",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch againct an attribute that has different types for the value across items
// description:
// Simple test of a basic fetch againct an attribute that has different types for the value across items
// Introduced because of tracker: #4931
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("data_multitype"));
var d = new doh.Deferred();
function onComplete(items, request){
t.assertEqual(4, items.length);
d.callback(true);
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
store.fetch({ query: {count: "1*"},
onComplete: onComplete,
onError: onError
});
return d;
}
},
{
name: "Read API: fetch() with RegExp Match",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch using a RegExp works with IFRS
// description:
// Simple test of a basic fetch using a RegExp works with IFRS
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("data_multitype"));
var d = new doh.Deferred();
function onComplete(items, request){
t.assertEqual(4, items.length);
d.callback(true);
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
store.fetch({ query: {count: new RegExp("^1.*$", "gi")},
onComplete: onComplete,
onError: onError
});
return d;
}
},
{
name: "Read API: fetch() with RegExp Match Inline",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch using a RegExp works with IFRS
// description:
// Simple test of a basic fetch using a RegExp works with IFRS
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("data_multitype"));
var d = new doh.Deferred();
function onComplete(items, request){
t.assertEqual(4, items.length);
d.callback(true);
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
store.fetch({ query: {count: /^1.*$/gi},
onComplete: onComplete,
onError: onError
});
return d;
}
},
{
name: "Read API: fetch() with MultiType, MultiValue Match",
runTest: function(datastore, t){
// summary:
// Simple test of a basic fetch againct an attribute that has different types for the value across items
// description:
// Simple test of a basic fetch againct an attribute that has different types for the value across items
// Introduced because of tracker: #4931
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("data_multitype"));
var d = new doh.Deferred();
function onComplete(items, request){
t.assertEqual(7, items.length);
d.callback(true);
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
store.fetch({ query: {value: "true"},
onComplete: onComplete,
onError: onError
});
return d;
}
},
{
name: "Read API: getLabel()",
runTest: function(datastore, t){
// summary:
// Simple test of the getLabel function against a store set that has a label defined.
// description:
// Simple test of the getLabel function against a store set that has a label defined.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onComplete(items, request){
t.assertEqual(items.length, 1);
var label = store.getLabel(items[0]);
t.assertTrue(label !== null);
t.assertEqual("Ecuador", label);
d.callback(true);
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
store.fetch({ query: {abbr: "ec"},
onComplete: onComplete,
onError: onError
});
return d;
}
},
{
name: "Read API: getLabelAttributes()",
runTest: function(datastore, t){
// summary:
// Simple test of the getLabelAttributes function against a store set that has a label defined.
// description:
// Simple test of the getLabelAttributes function against a store set that has a label defined.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onComplete(items, request){
t.assertEqual(items.length, 1);
var labelList = store.getLabelAttributes(items[0]);
t.assertTrue(dojo.isArray(labelList));
t.assertEqual("name", labelList[0]);
d.callback(true);
}
function onError(errData, request){
t.assertTrue(false);
d.errback(errData);
}
store.fetch({ query: {abbr: "ec"},
onComplete: onComplete,
onError: onError
});
return d;
}
},
{
name: "Read API: getValue()",
runTest: function(datastore, t){
// summary:
// Simple test of the getValue function of the store.
// description:
// Simple test of the getValue function of the store.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item !== null);
var name = store.getValue(item,"name");
t.assertTrue(name === "El Salvador");
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "sv", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Read API: getValues()",
runTest: function(datastore, t){
// summary:
// Simple test of the getValues function of the store.
// description:
// Simple test of the getValues function of the store.
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item !== null);
var names = store.getValues(item,"name");
t.assertTrue(dojo.isArray(names));
t.assertEqual(names.length, 1);
t.assertEqual(names[0], "El Salvador");
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "sv", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Read API: isItem()",
runTest: function(datastore, t){
// summary:
// Simple test of the isItem function of the store
// description:
// Simple test of the isItem function of the store
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item !== null);
t.assertTrue(store.isItem(item));
t.assertTrue(!store.isItem({}));
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "sv", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Read API: isItem() multistore",
runTest: function(datastore, t){
// summary:
// Simple test of the isItem function of the store
// to verify two different store instances do not accept
// items from each other.
// description:
// Simple test of the isItem function of the store
// to verify two different store instances do not accept
// items from each other.
// Two different instances, even if they read from the same URL
// should not accept items between each other!
var store1 = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var store2 = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onItem1(item1){
t.assertTrue(item1 !== null);
function onItem2(item2){
t.assertTrue(item1 !== null);
t.assertTrue(item2 !== null);
t.assertTrue(store1.isItem(item1));
t.assertTrue(store2.isItem(item2));
t.assertTrue(!store1.isItem(item2));
t.assertTrue(!store2.isItem(item1));
d.callback(true);
}
store2.fetchItemByIdentity({identity: "sv", onItem: onItem2, onError: onError});
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store1.fetchItemByIdentity({identity: "sv", onItem: onItem1, onError: onError});
return d; // Deferred
}
},
{
name: "Read API: hasAttribute()",
runTest: function(datastore, t){
// summary:
// Simple test of the hasAttribute function of the store
// description:
// Simple test of the hasAttribute function of the store
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onItem(item){
try{
t.assertTrue(item !== null);
t.assertTrue(store.hasAttribute(item, "abbr"));
t.assertTrue(!store.hasAttribute(item, "abbr_not"));
//Test that null attributes throw an exception
var passed = false;
try{
store.hasAttribute(item, null);
}catch (e){
passed = true;
}
t.assertTrue(passed);
d.callback(true);
}catch(e){
d.errback(e);
}
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "sv", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Read API: containsValue()",
runTest: function(datastore, t){
// summary:
// Simple test of the containsValue function of the store
// description:
// Simple test of the containsValue function of the store
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item !== null);
t.assertTrue(store.containsValue(item, "abbr", "sv"));
t.assertTrue(!store.containsValue(item, "abbr", "sv1"));
t.assertTrue(!store.containsValue(item, "abbr", null));
//Test that null attributes throw an exception
var passed = false;
try{
store.containsValue(item, null, "foo");
}catch (e){
passed = true;
}
t.assertTrue(passed);
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "sv", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Read API: getAttributes()",
runTest: function(datastore, t){
// summary:
// Simple test of the getAttributes function of the store
// description:
// Simple test of the getAttributes function of the store
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var d = new doh.Deferred();
function onItem(item){
t.assertTrue(item !== null);
t.assertTrue(store.isItem(item));
var attributes = store.getAttributes(item);
t.assertEqual(attributes.length, 3);
for(var i = 0; i < attributes.length; i++){
t.assertTrue((attributes[i] === "name" || attributes[i] === "abbr" || attributes[i] === "capital"));
}
d.callback(true);
}
function onError(errData){
t.assertTrue(false);
d.errback(errData);
}
store.fetchItemByIdentity({identity: "sv", onItem: onItem, onError: onError});
return d; // Deferred
}
},
{
name: "Read API: getFeatures()",
runTest: function(datastore, t){
// summary:
// Simple test of the getFeatures function of the store
// description:
// Simple test of the getFeatures function of the store
var store = new datastore(tests.data.readOnlyItemFileTestTemplates.getTestData("countries"));
var features = store.getFeatures();
t.assertTrue(features["dojo.data.api.Read"] != null);
t.assertTrue(