不要怂,就是干,撸起袖子干!

Commit f14f6cdf by Sushant Committed by Jan Aagaard Meier

code coverage, tests and docker fix (#7131)

1 parent 2a78517d
...@@ -3,21 +3,14 @@ version: '2' ...@@ -3,21 +3,14 @@ version: '2'
services: services:
# PostgreSQL # PostgreSQL
postgres-95: postgres-95:
image: mdillon/postgis:9.5 image: camptocamp/postgis:9.5
environment: environment:
POSTGRES_USER: sequelize_test POSTGRES_USER: sequelize_test
POSTGRES_PASSWORD: sequelize_test POSTGRES_PASSWORD: sequelize_test
POSTGRES_DB: sequelize_test
ports: ports:
- "127.0.0.1:8998:5432" - "127.0.0.1:8998:5432"
container_name: postgres-95 container_name: postgres-95
postgres-94:
image: mdillon/postgis:9.4
environment:
POSTGRES_USER: sequelize_test
POSTGRES_PASSWORD: sequelize_test
ports:
- "127.0.0.1:8998:5432"
container_name: postgres-94
# MySQL # MySQL
mysql-57: mysql-57:
...@@ -30,23 +23,3 @@ services: ...@@ -30,23 +23,3 @@ services:
ports: ports:
- "127.0.0.1:8999:3306" - "127.0.0.1:8999:3306"
container_name: mysql-57 container_name: mysql-57
mysql-56:
image: mysql:5.6
environment:
MYSQL_ROOT_PASSWORD: lollerskates
MYSQL_DATABASE: sequelize_test
MYSQL_USER: sequelize_test
MYSQL_PASSWORD: sequelize_test
ports:
- "127.0.0.1:8999:3306"
container_name: mysql-56
mysql-55:
image: mysql:5.5
environment:
MYSQL_ROOT_PASSWORD: lollerskates
MYSQL_DATABASE: sequelize_test
MYSQL_USER: sequelize_test
MYSQL_PASSWORD: sequelize_test
ports:
- "127.0.0.1:8999:3306"
container_name: mysql-55
...@@ -86,24 +86,22 @@ class ConnectionManager extends AbstractConnectionManager { ...@@ -86,24 +86,22 @@ class ConnectionManager extends AbstractConnectionManager {
case 'ESOCKET': case 'ESOCKET':
if (_.includes(err.message, 'connect EHOSTUNREACH')) { if (_.includes(err.message, 'connect EHOSTUNREACH')) {
reject(new sequelizeErrors.HostNotReachableError(err)); reject(new sequelizeErrors.HostNotReachableError(err));
} else if (_.includes(err.message, 'connect ENETUNREACH')) {
reject(new sequelizeErrors.HostNotReachableError(err));
} else if (_.includes(err.message, 'connect EADDRNOTAVAIL')) {
reject(new sequelizeErrors.HostNotReachableError(err));
} else if (_.includes(err.message, 'getaddrinfo ENOTFOUND')) {
reject(new sequelizeErrors.HostNotFoundError(err));
} else if (_.includes(err.message, 'connect ECONNREFUSED')) { } else if (_.includes(err.message, 'connect ECONNREFUSED')) {
reject(new sequelizeErrors.ConnectionRefusedError(err)); reject(new sequelizeErrors.ConnectionRefusedError(err));
} else { } else {
reject(new sequelizeErrors.ConnectionError(err)); reject(new sequelizeErrors.ConnectionError(err));
} }
break; break;
case 'ECONNREFUSED':
reject(new sequelizeErrors.ConnectionRefusedError(err));
break;
case 'ER_ACCESS_DENIED_ERROR': case 'ER_ACCESS_DENIED_ERROR':
case 'ELOGIN':
reject(new sequelizeErrors.AccessDeniedError(err)); reject(new sequelizeErrors.AccessDeniedError(err));
break; break;
case 'ENOTFOUND':
reject(new sequelizeErrors.HostNotFoundError(err));
break;
case 'EHOSTUNREACH':
reject(new sequelizeErrors.HostNotReachableError(err));
break;
case 'EINVAL': case 'EINVAL':
reject(new sequelizeErrors.InvalidConnectionError(err)); reject(new sequelizeErrors.InvalidConnectionError(err));
break; break;
......
'use strict'; 'use strict';
/* jshint -W030 */ /* jshint -W030 */
var chai = require('chai') const chai = require('chai');
, expect = chai.expect const expect = chai.expect;
, Support = require('../../support') const Support = require('../../support');
, dialect = Support.getTestDialect(); const dialect = Support.getTestDialect();
if (dialect.match(/^mssql/)) { if (dialect.match(/^mssql/)) {
describe('[MSSQL Specific] Query Queue', function () { describe('[MSSQL Specific] Query Queue', function () {
it('should work with handleDisconnects', function() { it('should work with handleDisconnects', () => {
var sequelize = Support.createSequelizeInstance({pool: {min: 1, max: 1, idle: 5000}}) const sequelize = Support.createSequelizeInstance({ pool: { min: 1, max: 1, idle: 5000 } });
, cm = sequelize.connectionManager const cm = sequelize.connectionManager;
, conn; let conn;
return sequelize.sync() return sequelize
.then(function() { .sync()
return cm.getConnection(); .then(() => cm.getConnection())
}) .then(connection => {
.then(function(connection) {
// Save current connection // Save current connection
conn = connection; conn = connection;
...@@ -25,16 +24,59 @@ if (dialect.match(/^mssql/)) { ...@@ -25,16 +24,59 @@ if (dialect.match(/^mssql/)) {
// connection removed from pool by MSSQL Conn Manager // connection removed from pool by MSSQL Conn Manager
conn.unwrap().emit('error', {code: 'ECONNRESET'}); conn.unwrap().emit('error', {code: 'ECONNRESET'});
}) })
.then(function() { .then(() => cm.getConnection())
// Get next available connection .then(connection => {
return cm.getConnection();
})
.then(function(connection) {
expect(conn).to.not.be.equal(connection); expect(conn).to.not.be.equal(connection);
expect(cm.validate(conn)).to.not.be.ok; expect(cm.validate(conn)).to.not.be.ok;
return cm.releaseConnection(connection); return cm.releaseConnection(connection);
}); });
}); });
it('should handle double disconnect', () => {
const sequelize = Support.createSequelizeInstance({ pool: { min: 1, max: 1, idle: 5000 } });
const cm = sequelize.connectionManager;
let count = 0;
let conn = null;
return sequelize
.sync()
.then(() => cm.getConnection())
.then(connection => {
conn = connection;
const unwrapConn = conn.unwrap();
unwrapConn.on('end', () => {
count++;
});
return cm.disconnect(conn);
})
.then(() => cm.disconnect(conn))
.then(() => {
expect(count).to.be.eql(1);
});
});
describe('Errors', () => {
it('ECONNREFUSED', () => {
const sequelize = Support.createSequelizeInstance({ port: 34237 });
return expect(sequelize.connectionManager.getConnection()).to.have.been.rejectedWith(sequelize.ConnectionRefusedError);
});
it('ENOTFOUND', () => {
const sequelize = Support.createSequelizeInstance({ host: 'http://wowow.example.com' });
return expect(sequelize.connectionManager.getConnection()).to.have.been.rejectedWith(sequelize.HostNotFoundError);
});
it('EHOSTUNREACH', () => {
const sequelize = Support.createSequelizeInstance({ host: '255.255.255.255' });
return expect(sequelize.connectionManager.getConnection()).to.have.been.rejectedWith(sequelize.HostNotReachableError);
});
it('ER_ACCESS_DENIED_ERROR | ELOGIN', () => {
const sequelize = new Support.Sequelize('localhost', 'was', 'ddsd', Support.sequelize.options);
return expect(sequelize.connectionManager.getConnection()).to.have.been.rejectedWith(sequelize.AccessDeniedError);
});
});
}); });
} }
'use strict'; 'use strict';
/* jshint -W030 */ /* jshint -W030 */
var chai = require('chai') const chai = require('chai');
, expect = chai.expect const expect = chai.expect;
, Support = require(__dirname + '/../../support') const Support = require(__dirname + '/../../support');
, dialect = Support.getTestDialect() const dialect = Support.getTestDialect();
, sinon = require('sinon') const sinon = require('sinon');
, DataTypes = require(__dirname + '/../../../../lib/data-types'); const DataTypes = require(__dirname + '/../../../../lib/data-types');
if (dialect === 'mysql') { if (dialect === 'mysql') {
describe('[MYSQL Specific] Connection Manager', function() { describe('[MYSQL Specific] Connection Manager', function () {
it('works correctly after being idle', function() { it('works correctly after being idle', function () {
var User = this.sequelize.define('User', { username: DataTypes.STRING }) const User = this.sequelize.define('User', { username: DataTypes.STRING });
, spy = sinon.spy() const spy = sinon.spy();
, self = this;
return User.sync({force: true}).then(function() { return User
return User.create({username: 'user1'}).then(function() { .sync({force: true})
return User.count().then(function(count) { .then(() => User.create({username: 'user1'}))
expect(count).to.equal(1); .then(() => User.count())
spy(); .then(count => {
return self.sequelize.Promise.delay(1000).then(function() { expect(count).to.equal(1);
return User.count().then(function(count) { spy();
expect(count).to.equal(1); return this.sequelize.Promise.delay(1000);
spy(); })
if (!spy.calledTwice) { .then(() => User.count())
throw new Error('Spy was not called twice'); .then(count => {
} expect(count).to.equal(1);
}); spy();
}); if (!spy.calledTwice) {
}); throw new Error('Spy was not called twice');
}
}); });
});
}); });
it('accepts new queries after shutting down a connection', function() { it('accepts new queries after shutting down a connection', () => {
// Create a sequelize instance with fast disconnecting connection // Create a sequelize instance with fast disconnecting connection
var sequelize = Support.createSequelizeInstance({ pool: { const sequelize = Support.createSequelizeInstance({ pool: { idle: 50, max: 1 }});
idle: 50, const User = sequelize.define('User', { username: DataTypes.STRING });
max: 1
} });
var User = sequelize.define('User', { username: DataTypes.STRING });
return User.sync({force: true}).then(function() { return User
return User.create({username: 'user1'}); .sync({force: true})
}).then(function() { .then(() => User.create({username: 'user1'}))
// After 100 ms the DB connection will be disconnected for inactivity .then(() => sequelize.Promise.delay(100))
return sequelize.Promise.delay(100); .then(() => {
}).then(function () {
// This query will be queued just after the `client.end` is executed and before its callback is called // This query will be queued just after the `client.end` is executed and before its callback is called
return sequelize.query('SELECT COUNT(*) AS count FROM Users', { type: sequelize.QueryTypes.SELECT }); return sequelize.query('SELECT COUNT(*) AS count FROM Users', { type: sequelize.QueryTypes.SELECT });
}).then(function(count) { })
.then((count) => {
expect(count[0].count).to.equal(1); expect(count[0].count).to.equal(1);
}); });
}); });
// This should run only on direct mysql it('should maintain connection', () => {
if (dialect === 'mysql') { const sequelize = Support.createSequelizeInstance({ pool: {min: 1, max: 1, handleDisconnects: true, idle: 5000 }});
it('should maintain connection', function() { const cm = sequelize.connectionManager;
var sequelize = Support.createSequelizeInstance({pool: {min: 1, max: 1, handleDisconnects: true, idle: 5000}}) let conn;
, cm = sequelize.connectionManager
, conn;
return sequelize.sync()
.then(function() {
return cm.getConnection();
})
.then(function(connection) {
// Save current connection
conn = connection;
})
.then(function() {
return cm.releaseConnection(conn);
})
.then(function() {
// Get next available connection
return cm.getConnection();
})
.then(function(connection) {
// Old threadId should be different from current new one
expect(conn.threadId).to.be.equal(connection.threadId);
expect(cm.validate(conn)).to.be.ok;
return cm.releaseConnection(connection); return sequelize.sync()
}); .then(() => cm.getConnection())
}); .then(connection => {
// Save current connection
conn = connection;
it('should work with handleDisconnects', function() { return cm.releaseConnection(conn);
var sequelize = Support.createSequelizeInstance({pool: {min: 1, max: 1, handleDisconnects: true, idle: 5000}}) })
, cm = sequelize.connectionManager .then(() => {
, conn; // Get next available connection
return cm.getConnection();
})
.then((connection) => {
// Old threadId should be different from current new one
expect(conn.threadId).to.be.equal(connection.threadId);
expect(cm.validate(conn)).to.be.ok;
return sequelize.sync() return cm.releaseConnection(connection);
.then(function() { });
return cm.getConnection(); });
})
.then(function(connection) {
// Save current connection
conn = connection;
// simulate a unexpected end
connection.close();
})
.then(function() {
return cm.releaseConnection(conn);
})
.then(function() {
// Get next available connection
return cm.getConnection();
})
.then(function(connection) {
// Old threadId should be different from current new one
expect(conn.threadId).to.not.be.equal(connection.threadId);
expect(cm.validate(conn)).to.not.be.ok;
return cm.releaseConnection(connection); it('should work with handleDisconnects', () => {
}); const sequelize = Support.createSequelizeInstance({pool: {min: 1, max: 1, handleDisconnects: true, idle: 5000}});
}); const cm = sequelize.connectionManager;
} let conn;
return sequelize
.sync()
.then(() => cm.getConnection())
.then((connection) => {
// Save current connection
conn = connection;
// simulate a unexpected end
connection.close();
})
.then(() => cm.releaseConnection(conn))
.then(() => {
// Get next available connection
return cm.getConnection();
})
.then((connection) => {
// Old threadId should be different from current new one
expect(conn.threadId).to.not.be.equal(connection.threadId);
expect(cm.validate(conn)).to.not.be.ok;
return cm.releaseConnection(connection);
});
});
}); });
} }
...@@ -395,7 +395,7 @@ describe(Support.getTestDialectTeaser('Model'), function() { ...@@ -395,7 +395,7 @@ describe(Support.getTestDialectTeaser('Model'), function() {
engine: 'MyISAM' engine: 'MyISAM'
}); });
return this.sequelize.sync({ force: true }).bind(this).then(function() { return this.sequelize.sync().bind(this).then(function() {
return this.sequelize.sync(); // The second call should not try to create the indices again return this.sequelize.sync(); // The second call should not try to create the indices again
}).then(function() { }).then(function() {
return this.sequelize.queryInterface.showIndex(Model.tableName); return this.sequelize.queryInterface.showIndex(Model.tableName);
......
'use strict'; 'use strict';
/* jshint -W030 */ /* jshint -W030 */
var chai = require('chai') const chai = require('chai');
, expect = chai.expect const expect = chai.expect;
, Support = require(__dirname + '/support') const Support = require(__dirname + '/support');
, DataTypes = require(__dirname + '/../../lib/data-types') const DataTypes = require(__dirname + '/../../lib/data-types');
, dialect = Support.getTestDialect() const dialect = Support.getTestDialect();
, _ = require('lodash') const _ = require('lodash');
, count = 0 let count = 0;
, log = function (sql) { const log = function() {
// sqlite fires a lot more querys than the other dbs. this is just a simple hack, since i'm lazy // sqlite fires a lot more querys than the other dbs. this is just a simple hack, since i'm lazy
if (dialect !== 'sqlite' || count === 0) { if (dialect !== 'sqlite' || count === 0) {
count++; count++;
} }
}; };
describe(Support.getTestDialectTeaser('QueryInterface'), function() { describe(Support.getTestDialectTeaser('QueryInterface'), function() {
beforeEach(function() { beforeEach(function() {
...@@ -25,6 +25,24 @@ describe(Support.getTestDialectTeaser('QueryInterface'), function() { ...@@ -25,6 +25,24 @@ describe(Support.getTestDialectTeaser('QueryInterface'), function() {
return this.sequelize.dropAllSchemas(); return this.sequelize.dropAllSchemas();
}); });
describe('renameTable', function() {
it('should rename table', function() {
return this.queryInterface
.createTable('myTestTable', {
name: DataTypes.STRING
})
.then(() => this.queryInterface.renameTable('myTestTable', 'myTestTableNew'))
.then(() => this.queryInterface.showAllTables())
.then((tableNames) => {
if (dialect === 'mssql') {
tableNames = _.map(tableNames, 'tableName');
}
expect(tableNames).to.contain('myTestTableNew');
expect(tableNames).to.not.contain('myTestTable');
});
});
});
describe('dropAllTables', function() { describe('dropAllTables', function() {
it('should drop all tables', function() { it('should drop all tables', function() {
const filterMSSQLDefault = tableNames => tableNames.filter(t => t.tableName !== 'spt_values'); const filterMSSQLDefault = tableNames => tableNames.filter(t => t.tableName !== 'spt_values');
...@@ -228,7 +246,7 @@ describe(Support.getTestDialectTeaser('QueryInterface'), function() { ...@@ -228,7 +246,7 @@ describe(Support.getTestDialectTeaser('QueryInterface'), function() {
return self.queryInterface.describeTable('_Country').then(function(metacountry) { return self.queryInterface.describeTable('_Country').then(function(metacountry) {
expect(metacountry.code.primaryKey).to.eql(true); expect(metacountry.code.primaryKey).to.eql(true);
expect(metacountry.name.primaryKey).to.eql(false); expect(metacountry.name.primaryKey).to.eql(false);
return Alumni.sync({ force: true }).then(function() { return Alumni.sync({ force: true }).then(function() {
return self.queryInterface.describeTable('_Alumni').then(function(metalumni) { return self.queryInterface.describeTable('_Alumni').then(function(metalumni) {
expect(metalumni.year.primaryKey).to.eql(true); expect(metalumni.year.primaryKey).to.eql(true);
...@@ -651,7 +669,7 @@ describe(Support.getTestDialectTeaser('QueryInterface'), function() { ...@@ -651,7 +669,7 @@ describe(Support.getTestDialectTeaser('QueryInterface'), function() {
expect(table).to.not.have.property('id'); expect(table).to.not.have.property('id');
}); });
}); });
}); });
describe('(with a schema)', function() { describe('(with a schema)', function() {
......
'use strict'; 'use strict';
/* jshint -W110 */ /* jshint -W110 */
var Support = require(__dirname + '/../../support') const Support = require(__dirname + '/../../support');
, expectsql = Support.expectsql const expectsql = Support.expectsql;
, current = Support.sequelize const current = Support.sequelize;
, QueryGenerator = require('../../../../lib/dialects/mssql/query-generator') const QueryGenerator = require('../../../../lib/dialects/mssql/query-generator');
, _ = require('lodash'); const _ = require('lodash');
if (current.dialect.name === 'mssql') { if (current.dialect.name === 'mssql') {
suite('[MSSQL Specific] QueryGenerator', function () { suite('[MSSQL Specific] QueryGenerator', function() {
// Dialect would normally be set by the query interface that instantiates the query-generator, but here we specify it explicitly // Dialect would normally be set by the query interface that instantiates the query-generator, but here we specify it explicitly
QueryGenerator._dialect = current.dialect; QueryGenerator._dialect = current.dialect;
test('getDefaultConstraintQuery', function () { test('getDefaultConstraintQuery', () => {
expectsql(QueryGenerator.getDefaultConstraintQuery({tableName: 'myTable', schema: 'mySchema'}, 'myColumn'), { expectsql(QueryGenerator.getDefaultConstraintQuery({tableName: 'myTable', schema: 'mySchema'}, 'myColumn'), {
mssql: "SELECT name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('[mySchema].[myTable]', 'U') AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = ('myColumn') AND object_id = OBJECT_ID('[mySchema].[myTable]', 'U'));" mssql: "SELECT name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('[mySchema].[myTable]', 'U') AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = ('myColumn') AND object_id = OBJECT_ID('[mySchema].[myTable]', 'U'));"
}); });
}); });
test('dropConstraintQuery', function () { test('dropConstraintQuery', () => {
expectsql(QueryGenerator.dropConstraintQuery({tableName: 'myTable', schema: 'mySchema'}, 'myConstraint'), { expectsql(QueryGenerator.dropConstraintQuery({tableName: 'myTable', schema: 'mySchema'}, 'myConstraint'), {
mssql: "ALTER TABLE [mySchema].[myTable] DROP CONSTRAINT [myConstraint];" mssql: 'ALTER TABLE [mySchema].[myTable] DROP CONSTRAINT [myConstraint];'
}); });
}); });
test('bulkInsertQuery', function() { test('bulkInsertQuery', () => {
//normal cases //normal cases
expectsql(QueryGenerator.bulkInsertQuery('myTable', [{ name: 'foo' }, {name: 'bar'}]), { expectsql(QueryGenerator.bulkInsertQuery('myTable', [{ name: 'foo' }, {name: 'bar'}]), {
mssql: "INSERT INTO [myTable] ([name]) VALUES (N'foo'),(N'bar');" mssql: "INSERT INTO [myTable] ([name]) VALUES (N'foo'),(N'bar');"
...@@ -39,14 +39,14 @@ if (current.dialect.name === 'mssql') { ...@@ -39,14 +39,14 @@ if (current.dialect.name === 'mssql') {
}); });
//Bulk Insert With autogenerated primary key //Bulk Insert With autogenerated primary key
var attributes = { id: { autoIncrement: true }}; const attributes = { id: { autoIncrement: true }};
expectsql(QueryGenerator.bulkInsertQuery('myTable', [{ id: null }], {}, attributes), { expectsql(QueryGenerator.bulkInsertQuery('myTable', [{ id: null }], {}, attributes), {
mssql: "INSERT INTO [myTable] DEFAULT VALUES" mssql: 'INSERT INTO [myTable] DEFAULT VALUES'
}); });
}); });
test('selectFromTableFragment', function() { test('selectFromTableFragment', () => {
var modifiedGen = _.clone(QueryGenerator); const modifiedGen = _.clone(QueryGenerator);
// Test newer versions first // Test newer versions first
// Should be all the same since handling is done in addLimitAndOffset // Should be all the same since handling is done in addLimitAndOffset
// for SQL Server 2012 and higher (>= v11.0.0) // for SQL Server 2012 and higher (>= v11.0.0)
...@@ -58,22 +58,22 @@ if (current.dialect.name === 'mssql') { ...@@ -58,22 +58,22 @@ if (current.dialect.name === 'mssql') {
// Base case // Base case
expectsql(modifiedGen.selectFromTableFragment({}, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName', 'WHERE id=1'), { expectsql(modifiedGen.selectFromTableFragment({}, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName', 'WHERE id=1'), {
mssql: "SELECT id, name FROM myTable AS myOtherName" mssql: 'SELECT id, name FROM myTable AS myOtherName'
}); });
// With limit // With limit
expectsql(modifiedGen.selectFromTableFragment({ limit: 10 }, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName'), { expectsql(modifiedGen.selectFromTableFragment({ limit: 10 }, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName'), {
mssql: "SELECT id, name FROM myTable AS myOtherName" mssql: 'SELECT id, name FROM myTable AS myOtherName'
}); });
// With offset // With offset
expectsql(modifiedGen.selectFromTableFragment({ offset: 10 }, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName'), { expectsql(modifiedGen.selectFromTableFragment({ offset: 10 }, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName'), {
mssql: "SELECT id, name FROM myTable AS myOtherName" mssql: 'SELECT id, name FROM myTable AS myOtherName'
}); });
// With both limit and offset // With both limit and offset
expectsql(modifiedGen.selectFromTableFragment({ limit: 10, offset: 10 }, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName'), { expectsql(modifiedGen.selectFromTableFragment({ limit: 10, offset: 10 }, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName'), {
mssql: "SELECT id, name FROM myTable AS myOtherName" mssql: 'SELECT id, name FROM myTable AS myOtherName'
}); });
// Test older version (< v11.0.0) // Test older version (< v11.0.0)
...@@ -81,29 +81,95 @@ if (current.dialect.name === 'mssql') { ...@@ -81,29 +81,95 @@ if (current.dialect.name === 'mssql') {
// Base case // Base case
expectsql(modifiedGen.selectFromTableFragment({}, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName', 'WHERE id=1'), { expectsql(modifiedGen.selectFromTableFragment({}, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName', 'WHERE id=1'), {
mssql: "SELECT id, name FROM myTable AS myOtherName" mssql: 'SELECT id, name FROM myTable AS myOtherName'
}); });
// With limit // With limit
expectsql(modifiedGen.selectFromTableFragment({ limit: 10 }, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName'), { expectsql(modifiedGen.selectFromTableFragment({ limit: 10 }, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName'), {
mssql: "SELECT TOP 10 id, name FROM myTable AS myOtherName" mssql: 'SELECT TOP 10 id, name FROM myTable AS myOtherName'
}); });
// With offset // With offset
expectsql(modifiedGen.selectFromTableFragment({ offset: 10 }, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName'), { expectsql(modifiedGen.selectFromTableFragment({ offset: 10 }, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName'), {
mssql: "SELECT TOP 100 PERCENT id, name FROM (SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY [id]) as row_num, * FROM myTable AS myOtherName) AS myOtherName WHERE row_num > 10) AS myOtherName" mssql: 'SELECT TOP 100 PERCENT id, name FROM (SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY [id]) as row_num, * FROM myTable AS myOtherName) AS myOtherName WHERE row_num > 10) AS myOtherName'
}); });
// With both limit and offset // With both limit and offset
expectsql(modifiedGen.selectFromTableFragment({ limit: 10, offset: 10 }, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName'), { expectsql(modifiedGen.selectFromTableFragment({ limit: 10, offset: 10 }, { primaryKeyField: 'id' }, ['id', 'name'], 'myTable', 'myOtherName'), {
mssql: "SELECT TOP 100 PERCENT id, name FROM (SELECT TOP 10 * FROM (SELECT ROW_NUMBER() OVER (ORDER BY [id]) as row_num, * FROM myTable AS myOtherName) AS myOtherName WHERE row_num > 10) AS myOtherName" mssql: 'SELECT TOP 100 PERCENT id, name FROM (SELECT TOP 10 * FROM (SELECT ROW_NUMBER() OVER (ORDER BY [id]) as row_num, * FROM myTable AS myOtherName) AS myOtherName WHERE row_num > 10) AS myOtherName'
}); });
}); });
test('getPrimaryKeyConstraintQuery', function () { test('getPrimaryKeyConstraintQuery', () => {
expectsql(QueryGenerator.getPrimaryKeyConstraintQuery('myTable', 'myColumnName'), { expectsql(QueryGenerator.getPrimaryKeyConstraintQuery('myTable', 'myColumnName'), {
mssql: 'SELECT K.TABLE_NAME AS tableName, K.COLUMN_NAME AS columnName, K.CONSTRAINT_NAME AS constraintName FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K ON C.TABLE_NAME = K.TABLE_NAME AND C.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG AND C.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA AND C.CONSTRAINT_NAME = K.CONSTRAINT_NAME WHERE C.CONSTRAINT_TYPE = \'PRIMARY KEY\' AND K.COLUMN_NAME = \'myColumnName\' AND K.TABLE_NAME = \'myTable\';' mssql: 'SELECT K.TABLE_NAME AS tableName, K.COLUMN_NAME AS columnName, K.CONSTRAINT_NAME AS constraintName FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K ON C.TABLE_NAME = K.TABLE_NAME AND C.CONSTRAINT_CATALOG = K.CONSTRAINT_CATALOG AND C.CONSTRAINT_SCHEMA = K.CONSTRAINT_SCHEMA AND C.CONSTRAINT_NAME = K.CONSTRAINT_NAME WHERE C.CONSTRAINT_TYPE = \'PRIMARY KEY\' AND K.COLUMN_NAME = \'myColumnName\' AND K.TABLE_NAME = \'myTable\';'
}); });
}); });
test('createSchema', () => {
expectsql(QueryGenerator.createSchema('mySchema'), {
mssql: 'IF NOT EXISTS (SELECT schema_name FROM information_schema.schemata WHERE schema_name = \'mySchema\' ) BEGIN EXEC sp_executesql N\'CREATE SCHEMA [mySchema] ;\' END;'
});
});
test('showSchemasQuery', () => {
expectsql(QueryGenerator.showSchemasQuery(), {
mssql: 'SELECT "name" as "schema_name" FROM sys.schemas as s WHERE "s"."name" NOT IN ( \'INFORMATION_SCHEMA\', \'dbo\', \'guest\', \'sys\', \'archive\' ) AND "s"."name" NOT LIKE \'db_%\''
});
});
test('versionQuery', () => {
expectsql(QueryGenerator.versionQuery(), {
mssql: "DECLARE @ms_ver NVARCHAR(20); SET @ms_ver = REVERSE(CONVERT(NVARCHAR(20), SERVERPROPERTY('ProductVersion'))); SELECT REVERSE(SUBSTRING(@ms_ver, CHARINDEX('.', @ms_ver)+1, 20)) AS 'version'"
});
});
test('renameTableQuery', () => {
expectsql(QueryGenerator.renameTableQuery('oldTableName', 'newTableName'), {
mssql: 'EXEC sp_rename [oldTableName], [newTableName];'
});
});
test('showTablesQuery', () => {
expectsql(QueryGenerator.showTablesQuery(), {
mssql: 'SELECT TABLE_NAME, TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES;'
});
});
test('dropTableQuery', () => {
expectsql(QueryGenerator.dropTableQuery('dirtyTable'), {
mssql: "IF OBJECT_ID('[dirtyTable]', 'U') IS NOT NULL DROP TABLE [dirtyTable];"
});
});
test('removeColumnQuery', () => {
expectsql(QueryGenerator.removeColumnQuery('myTable', 'myColumn'), {
mssql: 'ALTER TABLE [myTable] DROP COLUMN [myColumn];'
});
});
test('quoteIdentifier', () => {
expectsql(QueryGenerator.quoteIdentifier("'myTable'.'Test'"), {
mssql: '[myTable.Test]'
});
});
test('getForeignKeysQuery', () => {
expectsql(QueryGenerator.getForeignKeysQuery('myTable'), {
mssql: "SELECT constraint_name = C.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS C WHERE C.CONSTRAINT_TYPE = 'FOREIGN KEY' AND C.TABLE_NAME = 'myTable'"
});
});
test('getForeignKeyQuery', () => {
expectsql(QueryGenerator.getForeignKeyQuery('myTable', 'myColumn'), {
mssql: "SELECT constraint_name = TC.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU ON TC.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME WHERE TC.CONSTRAINT_TYPE = 'FOREIGN KEY' AND TC.TABLE_NAME = 'myTable' AND CCU.COLUMN_NAME = 'myColumn'"
});
});
test('dropForeignKeyQuery', () => {
expectsql(QueryGenerator.dropForeignKeyQuery('myTable', 'myColumnKey'), {
mssql: 'ALTER TABLE [myTable] DROP [myColumnKey]'
});
});
}); });
} }
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!