2013-07-22 05:57:19 +00:00
|
|
|
process.env.NODE_ENV = 'test';
|
|
|
|
require('should');
|
|
|
|
|
|
|
|
var assert = require('assert');
|
2013-08-22 04:53:48 +00:00
|
|
|
var DataSource = require('loopback-datasource-juggler').DataSource;
|
2014-04-08 15:35:39 +00:00
|
|
|
var db, config;
|
2013-07-22 05:57:19 +00:00
|
|
|
|
2014-02-13 00:57:06 +00:00
|
|
|
before(function () {
|
2014-04-08 15:35:39 +00:00
|
|
|
config = require('rc')('loopback', {dev: {mysql: {}}}).dev.mysql;
|
2014-02-13 00:57:06 +00:00
|
|
|
config.database = 'STRONGLOOP';
|
|
|
|
db = new DataSource(require('../'), config);
|
2013-07-22 05:57:19 +00:00
|
|
|
});
|
|
|
|
|
2014-02-13 00:57:06 +00:00
|
|
|
describe('discoverModels', function () {
|
2015-05-13 17:17:15 +00:00
|
|
|
describe('Discover database schemas', function() {
|
|
|
|
it('should return an array of db schemas', function(done) {
|
|
|
|
db.connector.discoverDatabaseSchemas(function(err, schemas) {
|
|
|
|
if (err) return done(err);
|
|
|
|
schemas.should.be.an.array;
|
|
|
|
schemas.length.should.be.above(0);
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2014-02-13 00:57:06 +00:00
|
|
|
describe('Discover models including views', function () {
|
|
|
|
it('should return an array of tables and views', function (done) {
|
2013-07-22 05:57:19 +00:00
|
|
|
|
|
|
|
db.discoverModelDefinitions({
|
2014-02-13 00:57:06 +00:00
|
|
|
views: true,
|
|
|
|
limit: 3
|
|
|
|
}, function (err, models) {
|
2013-07-22 05:57:19 +00:00
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
done(err);
|
|
|
|
} else {
|
|
|
|
var views = false;
|
2014-02-13 00:57:06 +00:00
|
|
|
models.forEach(function (m) {
|
2013-08-20 17:23:51 +00:00
|
|
|
// console.dir(m);
|
2013-07-22 05:57:19 +00:00
|
|
|
if (m.type === 'view') {
|
|
|
|
views = true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
assert(views, 'Should have views');
|
|
|
|
done(null, models);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2014-04-08 15:35:39 +00:00
|
|
|
describe('Discover current user\'s tables', function () {
|
|
|
|
it('should return an array of tables for the current user', function (done) {
|
|
|
|
|
|
|
|
db.discoverModelDefinitions({
|
|
|
|
limit: 3
|
|
|
|
}, function (err, models) {
|
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
done(err);
|
|
|
|
} else {
|
|
|
|
var views = false;
|
|
|
|
models.forEach(function (m) {
|
|
|
|
assert.equal(m.owner, config.username);
|
|
|
|
});
|
|
|
|
done(null, models);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2014-02-13 00:57:06 +00:00
|
|
|
describe('Discover models excluding views', function () {
|
|
|
|
it('should return an array of only tables', function (done) {
|
2013-07-22 05:57:19 +00:00
|
|
|
|
|
|
|
db.discoverModelDefinitions({
|
2014-02-13 00:57:06 +00:00
|
|
|
views: false,
|
|
|
|
limit: 3
|
|
|
|
}, function (err, models) {
|
2013-07-22 05:57:19 +00:00
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
done(err);
|
|
|
|
} else {
|
|
|
|
var views = false;
|
2014-02-13 00:57:06 +00:00
|
|
|
models.forEach(function (m) {
|
2013-08-20 17:23:51 +00:00
|
|
|
// console.dir(m);
|
2013-07-22 05:57:19 +00:00
|
|
|
if (m.type === 'view') {
|
|
|
|
views = true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
models.should.have.length(3);
|
|
|
|
assert(!views, 'Should not have views');
|
|
|
|
done(null, models);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2014-02-13 00:57:06 +00:00
|
|
|
describe('Discover models including other users', function () {
|
|
|
|
it('should return an array of all tables and views', function (done) {
|
2013-07-22 05:57:19 +00:00
|
|
|
|
|
|
|
db.discoverModelDefinitions({
|
2014-02-13 00:57:06 +00:00
|
|
|
all: true,
|
|
|
|
limit: 3
|
|
|
|
}, function (err, models) {
|
2013-07-22 05:57:19 +00:00
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
done(err);
|
|
|
|
} else {
|
|
|
|
var others = false;
|
2014-02-13 00:57:06 +00:00
|
|
|
models.forEach(function (m) {
|
2013-08-20 17:23:51 +00:00
|
|
|
// console.dir(m);
|
2013-07-22 05:57:19 +00:00
|
|
|
if (m.owner !== 'STRONGLOOP') {
|
|
|
|
others = true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
assert(others, 'Should have tables/views owned by others');
|
|
|
|
done(err, models);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2014-02-13 00:57:06 +00:00
|
|
|
describe('Discover model properties', function () {
|
|
|
|
describe('Discover a named model', function () {
|
|
|
|
it('should return an array of columns for PRODUCT', function (done) {
|
|
|
|
db.discoverModelProperties('PRODUCT', function (err, models) {
|
2013-07-22 05:57:19 +00:00
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
done(err);
|
|
|
|
} else {
|
2014-02-13 00:57:06 +00:00
|
|
|
models.forEach(function (m) {
|
2013-08-20 17:23:51 +00:00
|
|
|
// console.dir(m);
|
2013-07-22 05:57:19 +00:00
|
|
|
assert(m.tableName === 'PRODUCT');
|
|
|
|
});
|
|
|
|
done(null, models);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('Discover model primary keys', function () {
|
2014-02-13 00:57:06 +00:00
|
|
|
it('should return an array of primary keys for PRODUCT', function (done) {
|
|
|
|
db.discoverPrimaryKeys('PRODUCT', function (err, models) {
|
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
done(err);
|
|
|
|
} else {
|
|
|
|
models.forEach(function (m) {
|
|
|
|
// console.dir(m);
|
|
|
|
assert(m.tableName === 'PRODUCT');
|
2013-07-22 05:57:19 +00:00
|
|
|
});
|
2014-02-13 00:57:06 +00:00
|
|
|
done(null, models);
|
|
|
|
}
|
2013-07-22 05:57:19 +00:00
|
|
|
});
|
2014-02-13 00:57:06 +00:00
|
|
|
});
|
2013-07-22 05:57:19 +00:00
|
|
|
|
2014-02-13 00:57:06 +00:00
|
|
|
it('should return an array of primary keys for STRONGLOOP.PRODUCT', function (done) {
|
|
|
|
db.discoverPrimaryKeys('PRODUCT', {owner: 'STRONGLOOP'}, function (err, models) {
|
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
done(err);
|
|
|
|
} else {
|
|
|
|
models.forEach(function (m) {
|
|
|
|
// console.dir(m);
|
|
|
|
assert(m.tableName === 'PRODUCT');
|
2013-07-22 05:57:19 +00:00
|
|
|
});
|
2014-02-13 00:57:06 +00:00
|
|
|
done(null, models);
|
|
|
|
}
|
2013-07-22 05:57:19 +00:00
|
|
|
});
|
2014-02-13 00:57:06 +00:00
|
|
|
});
|
2013-07-22 05:57:19 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
describe('Discover model foreign keys', function () {
|
2014-02-13 00:57:06 +00:00
|
|
|
it('should return an array of foreign keys for INVENTORY', function (done) {
|
|
|
|
db.discoverForeignKeys('INVENTORY', function (err, models) {
|
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
done(err);
|
|
|
|
} else {
|
|
|
|
models.forEach(function (m) {
|
|
|
|
// console.dir(m);
|
|
|
|
assert(m.fkTableName === 'INVENTORY');
|
2013-07-22 05:57:19 +00:00
|
|
|
});
|
2014-02-13 00:57:06 +00:00
|
|
|
done(null, models);
|
|
|
|
}
|
2013-07-22 05:57:19 +00:00
|
|
|
});
|
2014-02-13 00:57:06 +00:00
|
|
|
});
|
|
|
|
it('should return an array of foreign keys for STRONGLOOP.INVENTORY', function (done) {
|
|
|
|
db.discoverForeignKeys('INVENTORY', {owner: 'STRONGLOOP'}, function (err, models) {
|
|
|
|
if (err) {
|
|
|
|
console.error(err);
|
|
|
|
done(err);
|
|
|
|
} else {
|
|
|
|
models.forEach(function (m) {
|
|
|
|
// console.dir(m);
|
|
|
|
assert(m.fkTableName === 'INVENTORY');
|
2013-07-22 05:57:19 +00:00
|
|
|
});
|
2014-02-13 00:57:06 +00:00
|
|
|
done(null, models);
|
|
|
|
}
|
2013-07-22 05:57:19 +00:00
|
|
|
});
|
2014-02-13 00:57:06 +00:00
|
|
|
});
|
2013-07-22 05:57:19 +00:00
|
|
|
});
|
|
|
|
|
2013-10-14 22:19:36 +00:00
|
|
|
describe('Discover LDL schema from a table', function () {
|
2014-02-13 00:57:06 +00:00
|
|
|
it('should return an LDL schema for INVENTORY', function (done) {
|
|
|
|
db.discoverSchema('INVENTORY', {owner: 'STRONGLOOP'}, function (err, schema) {
|
|
|
|
// console.log('%j', schema);
|
|
|
|
assert(schema.name === 'Inventory');
|
|
|
|
assert(schema.options.mysql.schema === 'STRONGLOOP');
|
|
|
|
assert(schema.options.mysql.table === 'INVENTORY');
|
|
|
|
assert(schema.properties.productId);
|
2014-12-03 22:09:52 +00:00
|
|
|
assert(schema.properties.productId.required);
|
2014-02-13 00:57:06 +00:00
|
|
|
assert(schema.properties.productId.type === 'String');
|
|
|
|
assert(schema.properties.productId.mysql.columnName === 'PRODUCT_ID');
|
|
|
|
assert(schema.properties.locationId);
|
|
|
|
assert(schema.properties.locationId.type === 'String');
|
|
|
|
assert(schema.properties.locationId.mysql.columnName === 'LOCATION_ID');
|
|
|
|
assert(schema.properties.available);
|
2014-12-03 22:09:52 +00:00
|
|
|
assert(schema.properties.available.required === false);
|
2014-02-13 00:57:06 +00:00
|
|
|
assert(schema.properties.available.type === 'Number');
|
|
|
|
assert(schema.properties.total);
|
|
|
|
assert(schema.properties.total.type === 'Number');
|
|
|
|
done(null, schema);
|
2013-07-22 05:57:19 +00:00
|
|
|
});
|
2014-02-13 00:57:06 +00:00
|
|
|
});
|
2013-07-22 05:57:19 +00:00
|
|
|
});
|
2013-12-06 00:09:15 +00:00
|
|
|
|
|
|
|
describe('Discover and build models', function () {
|
|
|
|
it('should discover and build models', function (done) {
|
|
|
|
db.discoverAndBuildModels('INVENTORY', {owner: 'STRONGLOOP', visited: {}, associations: true}, function (err, models) {
|
|
|
|
assert(models.Inventory, 'Inventory model should be discovered and built');
|
|
|
|
var schema = models.Inventory.definition;
|
|
|
|
assert(schema.settings.mysql.schema === 'STRONGLOOP');
|
|
|
|
assert(schema.settings.mysql.table === 'INVENTORY');
|
|
|
|
assert(schema.properties.productId);
|
|
|
|
assert(schema.properties.productId.type === String);
|
|
|
|
assert(schema.properties.productId.mysql.columnName === 'PRODUCT_ID');
|
|
|
|
assert(schema.properties.locationId);
|
|
|
|
assert(schema.properties.locationId.type === String);
|
|
|
|
assert(schema.properties.locationId.mysql.columnName === 'LOCATION_ID');
|
|
|
|
assert(schema.properties.available);
|
|
|
|
assert(schema.properties.available.type === Number);
|
|
|
|
assert(schema.properties.total);
|
|
|
|
assert(schema.properties.total.type === Number);
|
|
|
|
models.Inventory.findOne(function (err, inv) {
|
|
|
|
assert(!err, 'error should not be reported');
|
|
|
|
done();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|