Commit 1ebfd26d authored by Marco Mariani's avatar Marco Mariani

async key+query tests

parent 44a20b19
/*jslint indent: 2, maxlen: 120, nomen: true, vars: true */
/*global define, exports, require, module, complex_queries, jiodate, window, test, ok,
equal, deepEqual, sinon */
equal, deepEqual, sinon, start, stop, RSVP */
// define([module_name], [dependencies], module);
(function (dependencies, module) {
......@@ -17,8 +17,12 @@
module('Custom Key Queries with JIODate');
var noop = function () {
return; // use with RSVP.all
};
test('Stock comparison operators with year precision', function () {
var doc_list, docList = function () {
var docList = function () {
return [
{'identifier': 'twenty ten', 'date': '2010-03-04T08:52:13.746Z'},
{'identifier': 'twenty eleven', 'date': '2011-03-04T08:52:13.746Z'},
......@@ -31,75 +35,101 @@
cast_to: jiodate.JIODate
}
}
}, query_list = null;
doc_list = docList();
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date',
value: '2011'
}, key_schema).exec(doc_list);
deepEqual(doc_list, [
{'date': '2011-03-04T08:52:13.746Z', 'identifier': 'twenty eleven'}
], 'Match with "date = 2011" (query tree form)');
doc_list = docList();
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date',
operator: '!=',
value: '2011'
}, key_schema).exec(doc_list);
deepEqual(doc_list, [
{'date': '2010-03-04T08:52:13.746Z', 'identifier': 'twenty ten'},
{'date': '2012-03-04T08:52:13.746Z', 'identifier': 'twenty twelve'}
], 'Match with "date != 2011" (query tree form)');
doc_list = docList();
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date',
operator: '<',
value: '2011'
}, key_schema).exec(doc_list);
deepEqual(doc_list, [
{'date': '2010-03-04T08:52:13.746Z', 'identifier': 'twenty ten'}
], 'Match with "date < 2011" (query tree form)');
doc_list = docList();
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date',
operator: '<=',
value: '2011'
}, key_schema).exec(doc_list);
deepEqual(doc_list, [
{'date': '2010-03-04T08:52:13.746Z', 'identifier': 'twenty ten'},
{'date': '2011-03-04T08:52:13.746Z', 'identifier': 'twenty eleven'}
], 'Match with "date <= 2011" (query tree form)');
doc_list = docList();
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date',
operator: '>',
value: '2011'
}, key_schema).exec(doc_list);
deepEqual(doc_list, [
{'date': '2012-03-04T08:52:13.746Z', 'identifier': 'twenty twelve'}
], 'Match with "date > 2011" (query tree form)');
doc_list = docList();
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date',
operator: '>=',
value: '2011'
}, key_schema).exec(doc_list);
deepEqual(doc_list, [
{'date': '2011-03-04T08:52:13.746Z', 'identifier': 'twenty eleven'},
{'date': '2012-03-04T08:52:13.746Z', 'identifier': 'twenty twelve'}
], 'Match with "date >= 2011" (query tree form)');
}, query_list = [], promise = [];
stop();
promise.push(
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date',
value: '2011'
}, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, [
{'date': '2011-03-04T08:52:13.746Z', 'identifier': 'twenty eleven'}
], 'Match with "date = 2011" (query tree form)');
})
);
promise.push(
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date',
operator: '!=',
value: '2011'
}, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, [
{'date': '2010-03-04T08:52:13.746Z', 'identifier': 'twenty ten'},
{'date': '2012-03-04T08:52:13.746Z', 'identifier': 'twenty twelve'}
], 'Match with "date != 2011" (query tree form)');
})
);
promise.push(
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date',
operator: '<',
value: '2011'
}, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, [
{'date': '2010-03-04T08:52:13.746Z', 'identifier': 'twenty ten'}
], 'Match with "date < 2011" (query tree form)');
})
);
promise.push(
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date',
operator: '<=',
value: '2011'
}, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, [
{'date': '2010-03-04T08:52:13.746Z', 'identifier': 'twenty ten'},
{'date': '2011-03-04T08:52:13.746Z', 'identifier': 'twenty eleven'}
], 'Match with "date <= 2011" (query tree form)');
})
);
promise.push(
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date',
operator: '>',
value: '2011'
}, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, [
{'date': '2012-03-04T08:52:13.746Z', 'identifier': 'twenty twelve'}
], 'Match with "date > 2011" (query tree form)');
})
);
promise.push(
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date',
operator: '>=',
value: '2011'
}, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, [
{'date': '2011-03-04T08:52:13.746Z', 'identifier': 'twenty eleven'},
{'date': '2012-03-04T08:52:13.746Z', 'identifier': 'twenty twelve'}
], 'Match with "date >= 2011" (query tree form)');
})
);
query_list = [
[
......@@ -119,9 +149,13 @@
query_list.forEach(function (o) {
var qs = o[0], expected = o[1];
doc_list = docList();
complex_queries.QueryFactory.create(qs, key_schema).exec(doc_list);
deepEqual(doc_list, expected, "Match with '" + qs + "' (parsed query string)");
promise.push(
complex_queries.QueryFactory.create(qs, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, expected, "Match with '" + qs + "' (parsed query string)");
})
);
});
query_list = [
......@@ -132,13 +166,17 @@
];
query_list.forEach(function (qs) {
doc_list = docList();
complex_queries.QueryFactory.create(qs, key_schema).exec(doc_list);
deepEqual(doc_list, [
], "Match with an invalid parsed string " + qs + " should return empty list but not raise errors");
promise.push(
complex_queries.QueryFactory.create(qs, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, [
], "Match with an invalid parsed string " + qs + " should return empty list but not raise errors");
})
);
});
RSVP.all(promise).then(noop).always(start);
});
}));
......@@ -21,54 +21,6 @@
local_storage.clear();
/**
* all(promises): Promise
*
* Produces a promise that is resolved when all the given promises are
* fulfilled. The resolved value is an array of each of the answers of the
* given promises.
*
* @param {Array} promises The promises to use
* @return {Promise} A new promise
*/
function all(promises) {
var results = [], i, count = 0;
function cancel() {
var j;
for (j = 0; j < promises.length; j += 1) {
if (typeof promises[j].cancel === 'function') {
promises[j].cancel();
}
}
}
return new RSVP.Promise(function (resolve, reject, notify) {
/*jslint unparam: true */
function succeed(j) {
return function (answer) {
results[j] = answer;
count += 1;
if (count !== promises.length) {
return;
}
resolve(results);
};
}
function notified(j) {
return function (answer) {
notify({
"promise": promises[j],
"index": j,
"notified": answer
});
};
}
for (i = 0; i < promises.length; i += 1) {
promises[i].then(succeed(i), succeed(i), notified(i));
}
}, cancel);
}
var key_schema = {
cast_lookup: {
dateType: function (obj) {
......@@ -105,7 +57,7 @@
o.date_b = new Date();
// put some document before listing them
all([
RSVP.all([
jio.put({
"_id": "a",
"title": "one",
......
/*jslint indent: 2, maxlen: 100, nomen: true, vars: true */
/*global define, exports, require, module, complex_queries, window, test, ok,
deepEqual, sinon */
deepEqual, sinon, start, stop, RSVP */
// define([module_name], [dependencies], module);
(function (dependencies, module) {
......@@ -17,6 +17,10 @@
module('Custom Key Queries with Schema');
var noop = function () {
return; // use with RSVP.all
};
var translationEqualityMatcher = function (data) {
return function (object_value, value) {
value = data[value];
......@@ -24,7 +28,6 @@
};
};
/*jslint unparam: true*/
var key_schema = {
cast_lookup: {
......@@ -90,29 +93,37 @@
test('Keys defined in a Schema can be used like metadata', function () {
var doc_list, docList = function () {
var docList = function () {
return [
{'identifier': 'a'},
{'identifier': 'A'},
{'identifier': 'b'}
];
};
}, promise = [];
stop();
promise.push(
complex_queries.QueryFactory.create({
type: 'simple',
key: 'case_insensitive_identifier',
value: 'A'
}, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, [
{'identifier': 'a'},
{'identifier': 'A'}
], 'Key Schema: case_insensitive_identifier');
})
);
doc_list = docList();
complex_queries.QueryFactory.create({
type: 'simple',
key: 'case_insensitive_identifier',
value: 'A'
}, key_schema).exec(doc_list);
deepEqual(doc_list, [
{'identifier': 'a'},
{'identifier': 'A'}
], 'Key Schema: case_insensitive_identifier');
RSVP.all(promise).then(noop).always(start);
});
test('Standard date keys', function () {
var doc_list, docList = function () {
var docList = function () {
return [
{'identifier': 'a', 'date': '2013-01-01'},
{'identifier': 'b', 'date': '2013-02-01'},
......@@ -121,54 +132,58 @@
{'identifier': 'c', 'date': '2013-03-03'},
{'identifier': 'd', 'date': '2013-04-04'}
];
};
}, promise = [];
doc_list = docList();
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date_day',
value: '2013-02-02'
}, key_schema).exec(doc_list);
deepEqual(doc_list, [
{'identifier': 'bb', 'date': '2013-02-02'}
], 'Key Schema: same_day');
doc_list = docList();
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date_month',
value: '2013-02-10'
}, key_schema).exec(doc_list);
deepEqual(doc_list, [
{
'date': '2013-02-01',
'identifier': 'b'
},
{
'date': '2013-02-02',
'identifier': 'bb'
},
{
'date': '2013-02-03',
'identifier': 'bbb'
}
], 'Key Schema: date_month');
stop();
promise.push(
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date_day',
value: '2013-02-02'
}, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, [
{'identifier': 'bb', 'date': '2013-02-02'}
], 'Key Schema: same_day');
})
);
promise.push(
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date_month',
value: '2013-02-10'
}, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, [
{'date': '2013-02-01', 'identifier': 'b'},
{'date': '2013-02-02', 'identifier': 'bb'},
{'date': '2013-02-03', 'identifier': 'bbb'}
], 'Key Schema: date_month');
})
);
doc_list = docList();
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date_year',
value: '2013-02-10'
}, key_schema).exec(doc_list);
deepEqual(doc_list.length, 6, 'Key Schema: date_year');
promise.push(
complex_queries.QueryFactory.create({
type: 'simple',
key: 'date_year',
value: '2013-02-10'
}, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl.length, 6, 'Key Schema: date_year');
})
);
RSVP.all(promise).then(noop).always(start);
});
test('Test key schema + complex queries', function () {
var doc_list, docList = function () {
var docList = function () {
return [
{'identifier': '10', 'number': '10'},
{'identifier': '19', 'number': '19'},
......@@ -189,61 +204,77 @@
cast_to: 'intType'
}
}
};
}, promise = [];
doc_list = docList();
complex_queries.QueryFactory.create({
type: 'complex',
operator: 'OR',
query_list: [{
type: 'simple',
key: 'number',
operator: '<',
value: '19'
}, {
type: 'simple',
key: 'number',
operator: '=',
value: '19'
}]
}, key_schema).exec(doc_list);
deepEqual(doc_list, [
{'identifier': '10', 'number': '10'},
{'identifier': '19', 'number': '19'}
], 'Key schema should be propagated from complex to simple queries');
stop();
promise.push(
complex_queries.QueryFactory.create({
type: 'complex',
operator: 'OR',
query_list: [{
type: 'simple',
key: 'number',
operator: '<',
value: '19'
}, {
type: 'simple',
key: 'number',
operator: '=',
value: '19'
}]
}, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, [
{'identifier': '10', 'number': '10'},
{'identifier': '19', 'number': '19'}
], 'Key schema should be propagated from complex to simple queries');
})
);
RSVP.all(promise).then(noop).always(start);
});
test('Key Schema with translation lookup', function () {
var doc_list, docList = function () {
var docList = function () {
return [
{'identifier': '1', 'state': 'open'},
{'identifier': '2', 'state': 'closed'}
];
};
}, promise = [];
stop();
promise.push(
complex_queries.QueryFactory.create({
type: 'simple',
key: 'translated_state',
value: 'ouvert'
}, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, [
{'identifier': '1', 'state': 'open'}
], 'Key Schema: It should be possible to look for a translated string');
})
);
doc_list = docList();
complex_queries.QueryFactory.create({
type: 'simple',
key: 'translated_state',
value: 'ouvert'
}, key_schema).exec(doc_list);
deepEqual(doc_list, [
{'identifier': '1', 'state': 'open'}
], 'Key Schema: It should be possible to look for a translated string');
doc_list = docList();
complex_queries.QueryFactory.create({
type: 'simple',
key: 'translated_state',
operator: '=',
value: 'ouvert'
}, key_schema).exec(doc_list);
deepEqual(doc_list, [
{'identifier': '1', 'state': 'open'}
], 'Key Schema: It should be possible to look for a translated string with operator =');
promise.push(
complex_queries.QueryFactory.create({
type: 'simple',
key: 'translated_state',
operator: '=',
value: 'ouvert'
}, key_schema).
exec(docList()).
then(function (dl) {
deepEqual(dl, [
{'identifier': '1', 'state': 'open'}
], 'Key Schema: It should be possible to look for a translated string with operator =');
})
);
// XXX not implemented yet
......@@ -258,6 +289,7 @@
// {'identifier': '2', 'state': 'closed'}
// ], 'Key Schema: It should be possible to look for a translated string with operator !=');
RSVP.all(promise).then(noop).always(start);
});
}));
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment