UNPKG

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
"use strict"; 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