357 lines
10 KiB
JavaScript
Raw Normal View History

var Promise = testPromise;
module.exports = function(knex) {
2013-09-12 13:30:47 -04:00
describe('Selects', function() {
it('runs with no conditions', function() {
return knex('accounts').select();
});
it('throws errors on the exec if uncaught in the last block', function(ok) {
var listeners = process.listeners('uncaughtException');
process.removeAllListeners('uncaughtException');
2014-04-16 02:50:19 -04:00
process.on('uncaughtException', function() {
process.removeAllListeners('uncaughtException');
for (var i = 0, l = listeners.length; i < l; i++) {
process.on('uncaughtException', listeners[i]);
}
ok();
});
2014-04-16 02:50:19 -04:00
knex('accounts').select().exec(function() {
console.log(undefinedVar);
});
});
it('uses `orderBy`', function() {
return knex('accounts')
.select()
.orderBy('id', 'asc');
});
2013-09-12 13:30:47 -04:00
describe('simple "where" cases', function() {
2013-09-12 13:30:47 -04:00
it('allows key, value', function() {
2013-12-27 14:44:21 -05:00
return knex('accounts')
.where('id', 1)
.select('first_name', 'last_name')
.testSql(function(tester) {
tester(
'mysql',
'select `first_name`, `last_name` from `accounts` where `id` = ?',
[1]
);
tester(
'postgresql',
'select "first_name", "last_name" from "accounts" where "id" = ?',
[1]
);
tester(
'sqlite3',
'select "first_name", "last_name" from "accounts" where "id" = ?',
[1]
);
});
2013-09-12 13:30:47 -04:00
});
it('allows key, operator, value', function() {
2013-12-27 14:44:21 -05:00
return knex('accounts')
.where('id', 1)
.select('first_name', 'last_name')
.testSql(function(tester) {
tester(
'mysql',
'select `first_name`, `last_name` from `accounts` where `id` = ?',
[1]
);
tester(
'postgresql',
'select "first_name", "last_name" from "accounts" where "id" = ?',
[1]
);
tester(
'sqlite3',
'select "first_name", "last_name" from "accounts" where "id" = ?',
[1]
);
});
2013-09-12 13:30:47 -04:00
});
it('allows selecting columns with an array', function() {
2013-12-27 14:44:21 -05:00
return knex('accounts')
.where('id', '>', 1)
.select(['email', 'logins'])
.testSql(function(tester) {
tester(
'mysql',
'select `email`, `logins` from `accounts` where `id` > ?',
[1]
);
tester(
'postgresql',
'select "email", "logins" from "accounts" where "id" > ?',
[1]
);
tester(
'sqlite3',
'select "email", "logins" from "accounts" where "id" > ?',
[1]
);
});
2013-09-12 13:30:47 -04:00
});
it('allows a hash of where attrs', function() {
2013-12-27 14:44:21 -05:00
return knex('accounts')
.where({'id': 1})
.select('*')
.testSql(function(tester) {
tester(
'mysql',
'select * from `accounts` where `id` = ?',
[1],
[{
id: 1,
first_name: "Test",
last_name: "User",
email: "test@example.com",
logins: 1,
about: "Lorem ipsum Dolore labore incididunt enim.",
created_at: d,
updated_at: d,
phone: null
}]
);
tester(
'postgresql',
'select * from "accounts" where "id" = ?',
[1]
);
tester(
'sqlite3',
'select * from "accounts" where "id" = ?',
[1]
);
});
2013-09-12 13:30:47 -04:00
});
it('allows where id: undefined or id: null as a where null clause', function() {
2013-12-27 14:44:21 -05:00
return knex('accounts')
.where({'id': null})
.select('first_name', 'email')
.testSql(function(tester) {
tester(
'mysql',
'select `first_name`, `email` from `accounts` where `id` is null',
[]
);
tester(
'postgresql',
'select "first_name", "email" from "accounts" where "id" is null',
[]
);
tester(
'sqlite3',
'select "first_name", "email" from "accounts" where "id" is null',
[]
);
});
2013-09-12 13:30:47 -04:00
});
it('allows where id = 0', function() {
2013-12-27 14:44:21 -05:00
return knex('accounts')
.where({'id': 0})
.select()
.testSql(function(tester) {
tester(
'mysql',
'select * from `accounts` where `id` = ?',
[0]
);
tester(
'postgresql',
'select * from "accounts" where "id" = ?',
[0]
);
tester(
'sqlite3',
'select * from "accounts" where "id" = ?',
[0]
);
});
2013-09-12 13:30:47 -04:00
});
});
it('has a "distinct" clause', function() {
return Promise.all([
knex('accounts').select().distinct('email').where('logins', 2).orderBy('email'),
knex('accounts').distinct('email').select().orderBy('email')
]);
});
it('does "orWhere" cases', function() {
2014-04-16 02:50:19 -04:00
return knex('accounts').where('id', 1).orWhere('id', '>', 2).select('first_name', 'last_name');
});
it('does "andWhere" cases', function() {
2014-04-16 02:50:19 -04:00
return knex('accounts').select('first_name', 'last_name', 'about').where('id', 1).andWhere('email', 'test@example.com');
});
it('takes a function to wrap nested where statements', function() {
return Promise.all([
knex('accounts').where(function() {
this.where('id', 2);
this.orWhere('id', 3);
}).select('*')
]);
});
it('handles "where in" cases', function() {
return Promise.all([
knex('accounts').whereIn('id', [1, 2, 3]).select()
]);
});
it('handles "or where in" cases', function() {
return knex('accounts')
.where('email', 'test@example.com')
.orWhereIn('id', [2, 3, 4])
.select();
});
2014-04-16 02:50:19 -04:00
it('flag');
2014-03-25 18:56:07 +00:00
it('handles multi-column "where in" cases', function() {
if (knex.client.dialect != 'sqlite3') {
return knex('composite_key_test')
.whereIn(['column_a', 'column_b'], [[1, 1], [1, 2]])
2014-04-16 02:50:19 -04:00
.select()
.testSql(function(tester) {
tester('mysql',
'select * from `composite_key_test` where (`column_a`,`column_b`) in ((?, ?),(?, ?))',
[1,1,1,2],
[{
column_a: 1,
column_b: 1,
details: 'One, One, One',
status: 1
},{
column_a: 1,
column_b: 2,
details: 'One, Two, Zero',
status: 0
}]);
tester('postgresql',
'select * from "composite_key_test" where ("column_a","column_b") in ((?, ?),(?, ?))',
[1,1,1,2],
[{
column_a: 1,
column_b: 1,
details: 'One, One, One',
status: 1
},{
column_a: 1,
column_b: 2,
details: 'One, Two, Zero',
status: 0
}]);
});
2014-03-25 18:56:07 +00:00
}
});
2014-04-16 02:50:19 -04:00
it('flag');
it('handles multi-column "where in" cases with where', function() {
2014-03-25 18:56:07 +00:00
if (knex.client.dialect != 'sqlite3') {
return knex('composite_key_test')
.where('status', 1)
.whereIn(['column_a', 'column_b'], [[1, 1], [1, 2]])
2014-04-16 02:50:19 -04:00
.select()
.testSql(function(tester) {
tester('mysql',
'select * from `composite_key_test` where `status` = ? and (`column_a`,`column_b`) in ((?, ?),(?, ?))',
[1,1,1,1,2],
[{
column_a: 1,
column_b: 1,
details: 'One, One, One',
status: 1
}]);
tester('postgresql',
'select * from "composite_key_test" where "status" = ? and ("column_a","column_b") in ((?, ?),(?, ?))',
[1,1,1,1,2],
[{
column_a: 1,
column_b: 1,
details: 'One, One, One',
status: 1
}]);
});
2014-03-25 18:56:07 +00:00
}
});
it('handles "where exists"', function() {
return knex('accounts')
2014-03-26 19:15:46 -04:00
.whereExists(function() {
this.select('id').from('test_table_two').where({id: 1});
})
.select();
});
it('handles "where between"', function() {
return knex('accounts').whereBetween('id', [1, 100]).select();
});
it('handles "or where between"', function() {
return knex('accounts')
.whereBetween('id', [1, 100])
.orWhereBetween('id', [200, 300])
.select();
});
it('does whereRaw', function() {
return knex('accounts')
.whereExists(function() {
this.select(knex.raw(1))
.from('test_table_two')
.whereRaw('test_table_two.account_id = accounts.id');
})
.select();
});
it('does sub-selects', function() {
return knex('accounts').whereIn('id', function() {
this.select('account_id').from('test_table_two').where('status', 1);
}).select('first_name', 'last_name');
});
it("supports the <> operator", function() {
return knex('accounts').where('id', '<>', 2).select('email', 'logins');
});
it("Allows for knex.Raw passed to the `where` clause", function() {
return knex('accounts').where(knex.raw('id = 2')).select('email', 'logins');
});
it('Retains array bindings', function() {
var raw = knex.raw('select * from table t where t.id = ANY( $1::int[] )', [[1, 2, 3]]);
var raw2 = knex.raw('select "stored_procedure"(?, ?, ?)', [1, 2, ['a', 'b', 'c']]);
2014-04-16 02:50:19 -04:00
expect(raw.toSQL().bindings).to.eql([[1, 2, 3]]);
expect(raw2.toSQL().bindings).to.eql([1, 2, ['a', 'b', 'c']]);
});
});
};