UNPKG

mongoose-restapi-ui

Version:

Rest api library for your mongoose apps, with react ui: mongoose-restapi-ui-component react library

517 lines 22.1 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; 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 EMPTY_MODEL = 'Empty'; var CUSTOMER = 'Customer'; var PROVIDER = 'Provider'; var MULTIPROVIDER = 'MultiProvider'; var customerSchema = new mongoose_1.Schema({ name: String, number: Number, boolean: Boolean, boolean2: Boolean, date: Date, objectid: mongoose_1.Schema.Types.ObjectId }); var emptySchema = new mongoose_1.Schema({}); var providerSchema = new mongoose_1.Schema({ ref: { type: mongoose_1.Schema.Types.ObjectId, ref: CUSTOMER }, name: String }); var multiProviderSchema = new mongoose_1.Schema({ ref: { type: mongoose_1.Schema.Types.ObjectId, ref: CUSTOMER }, ref2: { type: mongoose_1.Schema.Types.ObjectId, ref: CUSTOMER } }); describe('SimpleQueryTest', 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, boolean2: true }]; var EmptyModel; //the Customer model var Customer; //the Provider model var Provider; //the Provider model var MultiProvider; var connection; var EmptyCtx = { fullPathTypes: {}, numberFullPaths: [], refFullPaths: [], stringFullPaths: [], dateFullPaths: [], booleanFullPaths: [], objectIdFullPaths: [], }; var CustomerCtx = { fullPathTypes: { name: { type: 'String' }, number: { type: 'Number' }, boolean: { type: 'Boolean' }, boolean2: { type: 'Boolean' }, date: { type: 'Date' }, objectid: { type: 'ObjectId' }, }, numberFullPaths: ['number'], refFullPaths: [], stringFullPaths: ['name'], dateFullPaths: ['date'], booleanFullPaths: ['boolean', 'boolean2'], objectIdFullPaths: ['objectid'], }; var ProviderCtx = { fullPathTypes: { ref: { type: 'Ref', to: CUSTOMER }, name: { type: 'String' } }, numberFullPaths: [], refFullPaths: ['ref'], dateFullPaths: [], objectIdFullPaths: [], booleanFullPaths: [], stringFullPaths: ['name'], }; var MultiProviderCtx = { fullPathTypes: { ref: { type: 'Ref', to: CUSTOMER }, ref2: { type: 'Ref', to: CUSTOMER } }, numberFullPaths: [], refFullPaths: ['ref', 'ref2'], dateFullPaths: [], objectIdFullPaths: [], booleanFullPaths: [], stringFullPaths: [], }; 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); EmptyModel = connection.model(EMPTY_MODEL, emptySchema); Customer = connection.model(CUSTOMER, customerSchema); Provider = connection.model(PROVIDER, providerSchema); MultiProvider = connection.model(MULTIPROVIDER, multiProviderSchema); 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: Provider }, _a[MULTIPROVIDER] = { name: MULTIPROVIDER, route: '', paths: Object.keys(MultiProviderCtx.fullPathTypes).map(function (name) { return ({ name: name, type: MultiProviderCtx[name], required: false }); }), label: 'name', model: MultiProvider }, _a[EMPTY_MODEL] = { name: EMPTY_MODEL, route: '', paths: [], label: '', model: EmptyModel }, _a); return models; } function createSimpleTest(title, info, query, prevFilter) { it(title, function (done) { var collection = info === 'Customer' ? Customer : EmptyModel; var ctx = info === 'Customer' ? CustomerCtx : info === 'Provider' ? ProviderCtx : EmptyCtx; query_1.default(false, {}, 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 dataset = customerData; if (info === 'Empty') dataset = []; var results = dataset.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(false, {}, 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) { var elJson = JSON.parse(JSON.stringify(el)); var paths = Object.keys(elJson).filter(function (key) { return Array.isArray(value) ? value.indexOf(key) >= 0 : key === value; }); if (paths.length > 0) { var res_1 = false; paths.forEach(function (path) { if (elJson[path] === true) res_1 = true; }); if (res_1) return true; } return Object.keys(ctx.fullPathTypes).filter(function (key) { if (!el[key]) { return false; } else { var map = function (el) { return el.toString(); }; if (key === 'number' || key === 'boolean') { map = function (el) { return JSON.stringify(el); }; } if (key === 'string') return map(el[key]).indexOf(value) >= 0; if (Array.isArray(value)) { return value.some(function (v) { return v === map(el[key]); }); } return map(el[key]) === value; } }).length > 0; }); docs.length.should.equal(results.length); docs.forEach(function (doc, key) { doc._id.toString().should.equal(results[key]._id.toString()); }); done(); }); }); }); } function createAnyAndFilterTest(title, info, any, query) { it(title, function (done) { var collection = info === 'Customer' ? Customer : Provider; var ctx = info === 'Customer' ? CustomerCtx : ProviderCtx; query_1.default(false, {}, collection, ctx, __assign({ $any: any }, query), 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) { if (Object.keys(ctx.fullPathTypes).filter(function (key) { if (!el[key]) { return false; } else { var map = function (el) { return el.toString(); }; if (key === 'number' || key === 'boolean') { map = function (el) { return JSON.stringify(el); }; } if (key === 'string') return map(el[key]).indexOf(any) >= 0; if (Array.isArray(any)) { return any.some(function (v) { return v === map(el[key]); }); } return map(el[key]) === any; } }).length > 0) return true; 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 createRefTest(title, info, ref) { it(title, function (done) { var collection = Provider; var ctx = ProviderCtx; query_1.default(false, 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(false, 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 all documents', 'Customer', {}); createSimpleTest('find in document without fields', 'Empty', { $any: '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 number array', 'Customer', ['1']); createAnyTest('find by any long number', 'Customer', '54321'); createAnyTest('find by any boolean', 'Customer', 'true'); createAnyTest('find by any boolean array', 'Customer', ['true']); createAnyTest('find by any boolean with name', 'Customer', 'boolean'); createAnyTest('find by any boolean with name', 'Customer', ['boolean', 'boolean2']); createAnyTest('find by any date', 'Customer', date.getFullYear().toString()); createAnyTest('find by any objectid', 'Customer', JSON.parse(JSON.stringify(objid))); createAnyTest('find by any objectid array', 'Customer', [JSON.parse(JSON.stringify(objid)), 'some error']); 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 $any with prevFilter', function (done) { var query = { name: 'jose' }; query_1.default(false, getModels(), Customer, CustomerCtx, query, { name: 'hector' }, function (err, docs) { if (err) return done(err); docs.find(function (err, res) { if (err) return done(err); res.length.should.equal(0); query_1.default(false, getModels(), Customer, CustomerCtx, query, { name: 'jose' }, function (err, docs) { if (err) return done(err); docs.find(function (err, res) { if (err) return done(err); res.length.should.equal(1); done(); }); }); }); }); }); it('Find by multi refs', function (done) { var query = { ref: 'hector', ref2: 'hector' }; query_1.default(false, getModels(), MultiProvider, MultiProviderCtx, query, { name: 'hector' }, function (err, docs) { if (err) return done(err); done(); }); }); it('Find by type not contemplated not in schema', function (done) { var query = { $any2: '1' }; query_1.default(false, {}, Provider, ProviderCtx, query, null, function (err, docs) { if (err) return done(null); done('this must be unreachable...'); }); }); createAnyAndFilterTest('find by complex query', 'Customer', '1', { name: 'hector' }); }); //# sourceMappingURL=query.test.js.map