think-mongo
Version:
421 lines (371 loc) • 13.2 kB
JavaScript
const test = require('ava');
const model = require('../src/model');
const defaultTable = 'test';
const defaultOptions = {
database: 'think_db',
pagesize: 2
};
const manyData = [
{name: 'thinkjs', version: '3.0', age: 1},
{name: 'thinkjs', version: '2.0', age: 2},
{name: 'thinkjs', version: '1.0', age: 3},
{name: 'kobe', age: 37, version: 1},
{name: 'lebron', age: 30, version: 1},
{name: 'durant', age: 28, version: 1},
{name: 'curry', age: 28, version: 1}
];
test.afterEach.always(async _ => {
const m = new model(defaultTable, defaultOptions);
await m.delete();
await m.table('think').delete();
});
test.serial('transaction', async t => {
const m = new model(defaultTable, defaultOptions);
await m.transaction(async session => {
await m.add({name: 'thinkjs'});
});
const ret = await m.select();
t.is(ret.length, 1);
});
test.serial('model', async t => {
const m = new model(defaultTable, defaultOptions);
const ret = m.model('test');
t.is(ret.modelName, 'test');
});
test.serial('add data', async t => {
const m = new model(defaultTable, defaultOptions);
const insertId = await m.add({name: 'thinkjs'});
t.is(!!insertId, true);
});
test.serial('where', async t => {
const m = new model(defaultTable, defaultOptions);
const data = {name: 'query data'};
await m.add(data);
const ret = await m.where(data).find();
t.is(ret.name, data.name);
});
test.serial('where with empty', async t => {
const m = new model(defaultTable, defaultOptions);
const data = {name: 'query data'};
await m.add(data);
const ret = await m.where().find();
t.is(ret.name, data.name);
});
test.serial('field', async t => {
const m = new model(defaultTable, defaultOptions);
const data = [
{name: 'thinkjs', version: 3},
{name: 'thinkjs', version: 2}
];
await m.addMany(data);
const ret = await m.field('version').select();
t.is(ret[0].name, undefined);
t.is(ret[1].version, 2);
});
test.serial('field with empty', async t => {
const m = new model(defaultTable, defaultOptions);
const data = {name: 'thinkjs', version: 3};
await m.add(data);
const ret = await m.field().select();
t.is(ret[0].name, data.name);
});
test.serial('limit', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.limit(1).select();
t.is(ret[0].version, manyData[0].version);
t.is(ret.length, 1);
});
test.serial('limit without params', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.limit().select();
t.is(ret.length, manyData.length);
});
test.serial('limit with array params', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.limit([1, 2]).select();
t.is(ret.length, 2);
});
test.serial('limit with two params', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.limit([1], 2).select();
t.is(ret.length, 2);
});
test.serial('limit with invalid offset and limit', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.limit('t', 'j').select();
t.is(ret.length, manyData.length);
});
test.serial('page', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.page(1, 2).select();
t.is(ret.length, 2);
t.is(ret[0].version, manyData[0].version);
});
test.serial('page without pagesize params', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.page([1, 2]).select();
t.is(ret.length, 2);
t.is(ret[0].version, manyData[0].version);
});
test.serial('page with array params', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.page([1]).select();
t.is(ret.length, 2);
t.is(ret[0].version, manyData[0].version);
});
test.serial('page with no params', async t => {
const opt = Object.assign({}, defaultOptions, {pagesize: null});
const m = new model(defaultTable, opt);
await m.addMany(manyData);
const ret = await m.page().select();
t.is(ret.length, manyData.length);
t.is(ret[0].version, manyData[0].version);
});
test.serial('table', async t => {
const m = new model(defaultTable, defaultOptions);
await m.table('think').addMany(manyData);
const ret = await m.table('think').select();
t.is(ret.length, manyData.length);
});
test.serial('order', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.where({name: 'thinkjs'}).order('version ASC').select();
t.is(ret[0].version, '1.0');
});
test.serial('order', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.group('name').select();
t.is(ret.length, manyData.length);
});
test.serial('thenAdd with exist data', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
await m.thenAdd(manyData[0], manyData[0]);
const ret = await m.select();
t.is(ret.length, manyData.length);
});
test.serial('thenAdd with no-exist data', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
await m.thenAdd({name: 'harden'}, {name: 'harden'});
const ret = await m.select();
t.is(ret.length, manyData.length + 1);
});
test.serial('thenUpdate with exist', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
await m.thenUpdate({age: 100}, manyData[0]);
const ret = await m.select();
t.is(ret[0].age, 100);
});
test.serial('thenUpdate with no-exist', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
await m.thenUpdate({name: 'harden'}, {name: 'harden'});
const ret = await m.where({name: 'harden'}).find();
t.is(!!ret, true);
});
test.serial('updateMany', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
await m.updateMany([{name: 'think'}]);
const ret = await m.where({name: 'think'}).find();
t.is(!!ret, true);
});
test.serial('update with no-exist', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const d = await m.where({name: 'kobe'}).find();
const ret = m.where({name: 'fake kobe'}).update({name: 'kobe bryant', _id: d._id}, true);
t.is(!!ret, true);
});
test.serial('countSelect', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.page(1, 2).countSelect();
t.is(!!ret.currentPage, true);
});
test.serial('countSelect with limit', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.countSelect({}, true);
t.is(!!ret.currentPage, true);
});
test.serial('countSelect with limit', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
let ret = await m.countSelect({limit: [10, 2]}, true);
t.is(!!ret.currentPage, true);
ret = await m.countSelect({limit: [10, 2]}, false);
t.is(!!ret.currentPage, true);
});
test.serial('countSelect with limit', async t => {
const m = new model(defaultTable, defaultOptions);
const ret = await m.countSelect();
t.deepEqual(ret.data, []);
});
test.serial('increment', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.where({age: 1}).increment('age');
t.deepEqual(!!ret, true);
});
test.serial('decrement', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.where({age: 3}).decrement('age');
t.deepEqual(!!ret, true);
});
test.serial('mapReduce', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
// Map function
var map = function() { emit(this.age, 1) };
// Reduce function
var reduce = function(k, vals) { return 1 };
const ret = await m.mapReduce(map, reduce, {out: {replace: 'tempCollection'}});
t.deepEqual(!!ret, true);
});
test.serial('getIndex', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.getIndexes();
t.deepEqual(!!ret, true);
});
test.serial('sum', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.sum('age');
const sum = manyData.reduce((s, i) => s + i.age, 0);
t.deepEqual(ret, sum);
});
test.serial('group sum', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.group('name').sum('age');
const sum = manyData.filter(item => item.name === 'thinkjs').reduce((s, i) => s + i.age, 0);
const thinkSum = ret.filter(item => item.group === 'thinkjs')[0].total;
t.deepEqual(thinkSum, sum);
});
test.serial('group sum', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.where({name: 'thinkjs'}).order('version ASC').group('name,version').sum('age');
const think1Sum = ret.filter(item => item.group.name === 'thinkjs' && item.group.version === '3.0')[0].total;
t.deepEqual(think1Sum, 1);
});
test.serial('aggregate', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.aggregate({$unwind: '$tags'});
t.deepEqual(ret, []);
});
test.serial('createIndex', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.createIndex('think');
t.deepEqual(ret, 'think_1');
});
test.serial('distinct', async t => {
const m = new model(defaultTable, defaultOptions);
await m.addMany(manyData);
const ret = await m.distinct('name').select();
const n = ret.filter(item => item === 'thinkjs').length;
t.is(n, 1);
});
test.serial('transaction', async t => {
const m = new model(defaultTable, defaultOptions);
await m.transaction(async session => {
await m.add({name: 'thinkjs'});
}).catch(e => {});
const ret = await m.select();
t.is(ret.length, 1);
});
test.serial('transaction', async t => {
const m = new model(defaultTable, defaultOptions);
await m.transaction(async session => {
await m.add({name: 'thinkjs'});
throw Error('transaction failed');
}).catch(e => {});
const ret = await m.select();
t.is(ret.length, 0);
});
test.serial('transaction failed with multi connection', async t => {
const m = new model(defaultTable, defaultOptions);
const n = new model(defaultTable, defaultOptions);
await m.transaction(async session => {
n.options.session = session;
await m.add({name: 'thinkjs'});
await n.add({name: 'thinkjs2'});
throw Error('transaction failed');
}).catch(e => {});
const ret = await m.select();
t.is(ret.length, 0);
});
test.serial('transaction with multi connection', async t => {
const m = new model(defaultTable, defaultOptions);
const n = new model(defaultTable, defaultOptions);
await m.transaction(async session => {
n.options.session = session;
await m.add({name: 'thinkjs'});
await n.add({name: 'thinkjs2'});
}).catch(e => {});
const ret = await m.select();
t.is(ret.length, 2);
});
test.serial('transaction with update', async t => {
const m = new model(defaultTable, defaultOptions);
const n = new model(defaultTable, defaultOptions);
await m.add({name: 'thinkjs'});
await m.transaction(async session => {
n.options.session = session;
await n.where({name: 'thinkjs'}).update({name: 'thinkjs2'});
}).catch(e => {});
const ret = await m.select();
t.is(ret[0].name, 'thinkjs2');
});
test.serial('transaction failed with update', async t => {
const m = new model(defaultTable, defaultOptions);
const n = new model(defaultTable, defaultOptions);
await m.add({name: 'thinkjs'});
await m.transaction(async session => {
n.options.session = session;
await n.where({name: 'thinkjs'}).update({name: 'thinkjs2'});
throw Error('transaction failed');
}).catch(e => {});
const ret = await m.select();
t.is(ret[0].name, 'thinkjs');
});
test.serial('transaction with delete', async t => {
const m = new model(defaultTable, defaultOptions);
const n = new model(defaultTable, defaultOptions);
await m.add({name: 'thinkjs'});
await m.transaction(async session => {
n.options.session = session;
await n.where({name: 'thinkjs'}).delete();
}).catch(e => {});
const ret = await m.select();
t.is(ret.length, 0);
});
test.serial('transaction failed with delete', async t => {
const m = new model(defaultTable, defaultOptions);
const n = new model(defaultTable, defaultOptions);
await m.add({name: 'thinkjs'});
await m.transaction(async session => {
n.options.session = session;
await n.where({name: 'thinkjs'}).delete();
throw Error('transaction failed');
}).catch(e => {});
const ret = await m.select();
t.is(ret.length, 1);
});