UNPKG

mohair

Version:

mohair is an sql builder

293 lines (202 loc) 9.77 kB
mohair = require './index' module.exports = 'throw on': 'insert without table': (test) -> q = mohair.insert {name: 'foo', email: 'foo@example.com'} test.throws -> q.sql() test.done() 'create multiple records without matching keys': (test) -> test.throws -> mohair.table('user').insert [ {name: 'foo', email: 'foo@example.com'} {name: 'bar'} ] test.throws -> mohair.table('user').insert [ {name: 'foo', email: 'foo@example.com'} {name: 'bar', id: 9} ] test.done() 'insert': 'a record': (test) -> q = mohair.table('user').insert {name: 'foo', user_id: 5} test.equal q.sql(), 'INSERT INTO user(name, user_id) VALUES (?, ?)' test.deepEqual q.params(), ['foo', 5] test.done() 'multiple records': (test) -> q = mohair.table('user').insert [ {name: 'foo', email: 'foo@example.com'} {name: 'bar', email: 'bar@example.com'} {name: 'baz', email: 'baz@example.com'} ] test.equal q.sql(), 'INSERT INTO user(name, email) VALUES (?, ?), (?, ?), (?, ?)' test.deepEqual q.params(), ['foo', 'foo@example.com', 'bar', 'bar@example.com', 'baz', 'baz@example.com'] test.done() 'delete': 'without criteria': (test) -> q = mohair.table('user').delete() test.equal q.sql(), 'DELETE FROM user' test.deepEqual q.params(), [] test.done() 'with criteria': (test) -> q = mohair.table('user') .delete() .where('x BETWEEN ? AND ?', 50, 55) .where($or: {x: 10, y: 6}) test.equal q.sql(), 'DELETE FROM user WHERE x BETWEEN ? AND ? AND (x = ?) OR (y = ?)' test.deepEqual q.params(), [50, 55, 10, 6] test.done() 'update': 'without criteria': (test) -> q = mohair.table('user').update {name: 'bar', email: 'bar@example.com'} test.equal q.sql(), 'UPDATE user SET name = ?, email = ?' test.deepEqual q.params(), ['bar', 'bar@example.com'] test.done() 'with criteria': (test) -> q = mohair.table('user') .where(id: 3, x: 5) .update {name: 'bar', email: 'bar@example.com'} test.equal q.sql(), 'UPDATE user SET name = ?, email = ? WHERE id = ? AND x = ?' test.deepEqual q.params(), ['bar', 'bar@example.com', 3, 5] test.done() 'select': 'default is select *': (test) -> q = mohair.table('user') test.equal q.sql(), 'SELECT * FROM user' test.deepEqual q.params(), [] test.done() 'all fields': (test) -> q = mohair.table('user').select() test.equal q.sql(), 'SELECT * FROM user' test.deepEqual q.params(), [] test.done() 'specific fields': (test) -> q = mohair.table('user').select('name, timestamp AS created_at') test.equal q.sql(), 'SELECT name, timestamp AS created_at FROM user' test.deepEqual q.params(), [] test.done() 'with criteria': (test) -> q = mohair.table('user').where(id: 3).select() test.equal q.sql(), 'SELECT * FROM user WHERE id = ?' test.deepEqual q.params(), [3] test.done() 'criteria are anded together': (test) -> q = mohair.table('user').where(id: 3).where('name = ?', 'foo').select() test.equal q.sql(), 'SELECT * FROM user WHERE id = ? AND name = ?' test.deepEqual q.params(), [3, 'foo'] test.done() 'order': (test) -> q = mohair.table('user').order('created DESC, name ASC') test.equal q.sql(), 'SELECT * FROM user ORDER BY created DESC, name ASC' test.deepEqual q.params(), [] test.done() 'limit': (test) -> q = mohair.table('user').limit(10) test.equal q.sql(), 'SELECT * FROM user LIMIT ?' test.deepEqual q.params(), [10] test.done() 'offset': (test) -> q = mohair.table('user').offset(5) test.equal q.sql(), 'SELECT * FROM user OFFSET ?' test.deepEqual q.params(), [5] test.done() 'join': (test) -> q = mohair.table('user') .join('JOIN project ON user.id = project.user_id') test.equal q.sql(), 'SELECT * FROM user JOIN project ON user.id = project.user_id' test.deepEqual q.params(), [] test.done() 'join with object criterion': (test) -> q = mohair.table('user') .join('JOIN project ON user.id = project.user_id', {'project.foo': {$null: true}, 'project.bar': 10}) test.equal q.sql(), 'SELECT * FROM user JOIN project ON user.id = project.user_id AND (project.foo IS NULL AND project.bar = ?)' test.deepEqual q.params(), [10] test.done() 'join with sql criterion': (test) -> q = mohair.table('user') .join('JOIN project ON user.id = project.user_id', 'project.foo = ?', 4) test.equal q.sql(), 'SELECT * FROM user JOIN project ON user.id = project.user_id AND (project.foo = ?)' test.deepEqual q.params(), [4] test.done() 'multiple joins': (test) -> q = mohair.table('user') .join('OUTER JOIN project ON user.id = project.user_id', 'project.foo = ?', 4) .join('INNER JOIN task ON project.id = task.project_id', {'task.bar': 10}) test.equal q.sql(), 'SELECT * FROM user OUTER JOIN project ON user.id = project.user_id AND (project.foo = ?) INNER JOIN task ON project.id = task.project_id AND (task.bar = ?)' test.deepEqual q.params(), [4, 10] test.done() 'group': (test) -> q = mohair.table('user') .select('user.*, count(project.id) AS project_count') .join('JOIN project ON user.id = project.user_id') .group('user.id') test.equal q.sql(), 'SELECT user.*, count(project.id) AS project_count FROM user JOIN project ON user.id = project.user_id GROUP BY user.id' test.deepEqual q.params(), [] test.done() 'everything together': (test) -> q = mohair.table('user') .select('user.*, count(project.id) AS project_count') .where(id: 3) .where('name = ?', 'foo') .join('JOIN project ON user.id = project.user_id') .group('user.id') .order('created DESC, name ASC') .limit(10) .offset(20) test.equal q.sql(), 'SELECT user.*, count(project.id) AS project_count FROM user JOIN project ON user.id = project.user_id WHERE id = ? AND name = ? GROUP BY user.id ORDER BY created DESC, name ASC LIMIT ? OFFSET ?' test.deepEqual q.params(), [3, 'foo', 10, 20] test.done() 'actions overwrite previous actions': (test) -> chain = mohair.table('user') .where(id: 3) .select('name') query = chain.insert(name: 'foo').table('project') test.equal chain.sql(), 'SELECT name FROM user WHERE id = ?' test.deepEqual chain.params(), [3] test.equal query.sql(), 'INSERT INTO project(name) VALUES (?)' test.deepEqual query.params(), ['foo'] test.done() 'immutability': (test) -> visible = mohair.table('project').where(is_visible: true) updateQuery = visible.update({name: 'i am visible'}).where(id: 3) test.equal updateQuery.sql(), 'UPDATE project SET name = ? WHERE is_visible = ? AND id = ?' test.deepEqual updateQuery.params(), ['i am visible', true, 3] deleteQuery = visible.where({name: 'foo'}).delete() test.equal deleteQuery.sql(), 'DELETE FROM project WHERE is_visible = ? AND name = ?' test.deepEqual deleteQuery.params(), [true, 'foo'] test.done() 'escape': 'select': (test) -> query = mohair .escape((string) -> "\"#{string}\"") .table('project') .where(is_visible: true) test.equal query.sql(), 'SELECT * FROM "project" WHERE is_visible = ?' test.deepEqual query.params(), [true] test.done() 'insert': (test) -> query = mohair .escape((string) -> "\"#{string}\"") .table('project') .insert {first_key: 'first_value', second_key: 'second_value'} test.equal query.sql(), 'INSERT INTO "project"("first_key", "second_key") VALUES (?, ?)' test.deepEqual query.params(), ['first_value', 'second_value'] test.done() 'update': (test) -> query = mohair .escape((string) -> "\"#{string}\"") .table('project') .update {first_key: 'first_value', second_key: 'second_value'} test.equal query.sql(), 'UPDATE "project" SET "first_key" = ?, "second_key" = ?' test.deepEqual query.params(), ['first_value', 'second_value'] test.done()