mongoose-restapi-ui
Version:
Rest api library for your mongoose apps, with react ui: mongoose-restapi-ui-component react library
386 lines • 15.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
require("mocha-typescript");
var query_1 = require("../src/models/query");
var mongoose = require("mongoose");
var mongoose_1 = require("mongoose");
var CUSTOMER = 'Customer';
var PROVIDER = 'Provider';
var customerSchema = new mongoose_1.Schema({
name: String,
number: Number,
boolean: Boolean,
date: Date,
objectid: mongoose_1.Schema.Types.ObjectId
});
var providerSchema = new mongoose_1.Schema({
ref: { type: mongoose_1.Schema.Types.ObjectId, ref: CUSTOMER },
name: String
});
describe('SimpleQueryTest with mongo4', function () {
var date = new Date();
var objid = new mongoose_1.Types.ObjectId('12a456789012345678901234');
//store test data
var customerData = [{
name: 'hector',
number: 1,
boolean: true,
objectid: objid
}, {
name: 'jose',
number: 2,
boolean: true
}, {
name: 'Alice',
number: 543210,
date: date
}];
//the Customer model
var Customer;
//the Provider model
var Provider;
var connection;
var CustomerCtx = {
fullPathTypes: {
name: {
type: 'String'
},
number: {
type: 'Number'
},
boolean: {
type: 'Boolean'
},
date: {
type: 'Date'
},
objectid: {
type: 'ObjectId'
},
},
numberFullPaths: ['number'],
refFullPaths: [],
stringFullPaths: ['name'],
dateFullPaths: ['date'],
booleanFullPaths: ['boolean'],
objectIdFullPaths: ['objectid'],
};
var ProviderCtx = {
fullPathTypes: {
ref: {
type: 'Ref',
to: CUSTOMER
},
name: {
type: 'String'
}
},
numberFullPaths: [],
refFullPaths: ['ref'],
dateFullPaths: [],
objectIdFullPaths: [],
booleanFullPaths: [],
stringFullPaths: ['name'],
};
var connect = function (callback) {
//connect to mongoose and create model
var MONGODB_CONNECTION = "mongodb://localhost:27017/test_mongoose_api_ui_simple";
connection = mongoose.createConnection(MONGODB_CONNECTION);
Customer = connection.model(CUSTOMER, customerSchema);
Provider = connection.model(PROVIDER, providerSchema);
Customer.find(callback);
};
before(function (done) {
//use q promises
global.Promise = require("q").Promise;
//use q library for mongoose promise
mongoose.Promise = global.Promise;
connect(function (err) {
if (err)
return done(err);
var chai = require("chai");
chai.should();
//require chai and use should() assertions
Customer.insertMany(customerData, function (error, customerDocs) {
if (error)
return done(error);
customerData = customerDocs;
Provider.insertMany(customerDocs.map(function (el) { return ({ ref: el._id, name: 'Alice' }); }), function (error, docs) {
done(error);
});
});
});
});
after(function (done) {
this.timeout(10000);
connection.dropDatabase(function (err) {
if (err)
return done(err);
connection.close().then(function () { return done(); }).catch(done);
});
});
function getModels() {
var _a;
var models = (_a = {},
_a[CUSTOMER] = {
name: CUSTOMER,
route: '',
paths: Object.keys(CustomerCtx.fullPathTypes).map(function (name) { return ({
name: name,
type: CustomerCtx[name],
required: false
}); }),
label: 'name',
model: Customer
},
_a[PROVIDER] = {
name: PROVIDER,
route: '',
paths: Object.keys(ProviderCtx.fullPathTypes).map(function (name) { return ({
name: name,
type: ProviderCtx[name],
required: false
}); }),
label: 'name',
model: Customer
},
_a);
return models;
}
function createSimpleTest(title, info, query, prevFilter) {
it(title, function (done) {
var collection = info === 'Customer' ? Customer : Provider;
var ctx = info === 'Customer' ? CustomerCtx : ProviderCtx;
query_1.default(true, {}, collection, ctx, query, prevFilter ? prevFilter : null, function (err, cursor) {
if (err)
return done(err);
cursor.should.exist;
cursor.find(function (err, docs) {
if (err)
return done(err);
docs.should.exist;
var results = customerData.filter(function (el) {
var equal = true;
Object.keys(query).forEach(function (key) {
if (equal) {
if (!el[key]) {
equal = false;
}
else {
var map = function (el) { return el.toString(); };
if (key === 'date') {
map = function (el) { return JSON.stringify(el); };
}
if (Array.isArray(query[key])) {
equal = query[key].filter(function (subel) { return map(subel) === map(el[key]); }).length > 0;
}
else {
equal = (map(el[key]) === map(query[key]));
}
}
}
});
return equal;
});
docs.length.should.equal(results.length);
docs.forEach(function (doc, key) {
doc._id.toString().should.equal(results[key]._id.toString());
});
done();
});
});
});
}
function createAnyTest(title, info, value) {
it(title, function (done) {
var collection = info === 'Customer' ? Customer : Provider;
var ctx = info === 'Customer' ? CustomerCtx : ProviderCtx;
query_1.default(true, {}, collection, ctx, { $any: value }, null, function (err, cursor) {
if (err)
return done(err);
cursor.should.exist;
cursor.find(function (err, docs) {
if (err)
return done(err);
docs.should.exist;
var results = customerData.filter(function (el) {
return Object.keys(ctx.fullPathTypes).filter(function (key) {
if (!el[key]) {
return false;
}
else {
var map = function (el) { return el.toString(); };
if (key === 'date') {
map = function (el) { return JSON.stringify(el); };
}
return map(el[key]).indexOf(value) >= 0;
}
}).length > 0;
});
docs.length.should.equal(results.length);
docs.forEach(function (doc, key) {
doc._id.toString().should.equal(results[key]._id.toString());
});
done();
});
});
});
}
function createRefTest(title, info, ref) {
it(title, function (done) {
var collection = Provider;
var ctx = ProviderCtx;
query_1.default(true, getModels(), collection, ctx, { ref: ref }, null, function (err, cursor) {
if (err)
return done(err);
cursor.should.exist;
cursor.find(function (err, docs) {
if (err)
return done(err);
var results = customerData.filter(function (el) {
if (Array.isArray(ref))
return ref.indexOf(el.name) >= 0;
return el.name === ref;
});
docs.length.should.equal(results.length);
docs.forEach(function (doc, key) {
doc.ref.toString().should.equal(results[key]._id.toString());
});
done();
});
});
});
}
function createAnyRefTest(title, info, ref) {
it(title, function (done) {
var collection = Provider;
var ctx = ProviderCtx;
query_1.default(true, getModels(), collection, ctx, { $any: ref }, null, function (err, cursor) {
if (err)
return done(err);
cursor.should.exist;
cursor.find(function (err, docs) {
if (err)
return done(err);
if (ref === 'Alice' || JSON.stringify(ref) === '[]') {
docs.length.should.equal(3);
done();
}
else {
var results_1 = customerData.filter(function (el) {
if (Array.isArray(ref))
return ref.indexOf(el.name) >= 0;
return el.name === ref;
});
docs.length.should.equal(results_1.length);
docs.forEach(function (doc, key) {
doc.ref.toString().should.equal(results_1[key]._id.toString());
});
done();
}
});
});
});
}
createSimpleTest('find by string', 'Customer', { name: 'hector' });
createSimpleTest('find by string', 'Customer', { name: 'hector' }, { name: 'hector' });
createSimpleTest('find by number', 'Customer', { number: '1' });
createSimpleTest('find by number', 'Customer', { name: ['hector', '1'] });
createSimpleTest('find by boolean', 'Customer', { boolean: 'true' });
createSimpleTest('find by date', 'Customer', { date: JSON.stringify(date).slice(1, -1) });
createSimpleTest('find by object id', 'Customer', { objectid: JSON.parse(JSON.stringify(objid)) });
createSimpleTest('find by array string', 'Customer', { name: ['hector', 'jose'] });
createSimpleTest('find by array number', 'Customer', { number: ['1', '3'] });
createSimpleTest('find by array boolean', 'Customer', { boolean: ['true'] });
createSimpleTest('find by array date', 'Customer', { date: [JSON.stringify(date).slice(1, -1)] });
createSimpleTest('find by array object id', 'Customer', { objectid: [JSON.parse(JSON.stringify(objid))] });
createAnyTest('find by any string', 'Customer', 'hector');
createAnyTest('find by any number', 'Customer', '1');
createAnyTest('find by any long number', 'Customer', '54321');
createAnyTest('find by any boolean', 'Customer', 'true');
createAnyTest('find by any date', 'Customer', date.getFullYear().toString());
createAnyTest('find by any objectid', 'Customer', JSON.parse(JSON.stringify(objid)));
createRefTest('find by ref', 'Provider', 'jose');
createRefTest('find by ref', 'Provider', 'hector');
createAnyRefTest('find by any ref empty array', 'Provider', []);
createAnyRefTest('find by any ref', 'Provider', 'hector');
createAnyRefTest('find by any ref alice', 'Provider', 'Alice');
createRefTest('find by array ref', 'Provider', ['hector']);
it('Find by ref with error', function (done) {
var query = {
ref: 'hector'
};
var fakeProvider = mongoose.model(PROVIDER + 'FAKE', providerSchema);
fakeProvider.aggregate = function (aggregate, callback) {
callback('some error');
return null;
};
query_1.default(true, getModels(), fakeProvider, ProviderCtx, query, null, function (err, docs) {
err.should.be.equal('some error');
if (err)
return done(null);
done('this line must be unreachable');
});
});
it('Find by $any string with error', function (done) {
var query = {
$any: 'hector'
};
var fakeCustomer = mongoose.model(CUSTOMER + 'FAKE', customerSchema);
fakeCustomer.aggregate = function (aggregate, callback) {
callback('some error');
return null;
};
query_1.default(true, {}, fakeCustomer, CustomerCtx, query, null, function (err, docs) {
err.should.be.equal('some error');
if (err)
return done(null);
done('this line must be unreachable');
});
});
it('Find by $any number and close connection', function (done) {
var query = {
$any: '1'
};
var fakeCustomer = mongoose.model(CUSTOMER + 'FAKE', customerSchema);
var originalAggregate = fakeCustomer.aggregate;
fakeCustomer.aggregate = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
var result = originalAggregate.apply(void 0, args);
result.exec = function (callback) {
callback('some error', []);
};
return result;
};
query_1.default(true, {}, fakeCustomer, CustomerCtx, query, null, function (err, docs) {
err.should.be.equal('some error');
if (err)
return done(null);
done('this line must be unreachable');
});
});
it('Find by any array string', function (done) {
var query = {
$any: ['hector', 'jose']
};
query_1.default(true, {}, Customer, CustomerCtx, query, null, function (err, docs) {
if (err)
return done(err);
return done();
});
});
it('Find by type not contemplated not in schema', function (done) {
var query = {
$any2: '1'
};
query_1.default(true, {}, Provider, ProviderCtx, query, null, function (err, docs) {
if (err)
return done(null);
done('this must be unreachable...');
});
});
});
//# sourceMappingURL=query.mongo4.test.js.map