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
JavaScript
;
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