UNPKG

mysql-composer

Version:

A simple nodejs mysql syntax composer for insert and update syntax.

297 lines (272 loc) 9.88 kB
const expect = require('chai').expect const Composer = require('../lib/index') const mysql = require('mysql') describe('#Composer',function(){ var mockConnection = { query:function(sql,callback){ callback(null,'mockData') }, escape:mysql.escape, beginTransaction:function(callback){ callback() }, rollback:function(callback){ callback() }, commit:function(callback){ callback() } } var composer = new Composer(mockConnection) describe('#insert',function(){ it('should throw error when table is not provided',function(){ var fn = function(){ composer.insert({ data:{ type:1 }, ignore:true },function(err){ }) } expect(fn).to.throw(Error) }) it('should throw error when data is not provided',function(){ var fn = function(){ composer.insert({ table:'name', ignore:true },function(err){ }) } expect(fn).to.throw(Error) }) it('should throw error when data is an empty object',function(){ var fn = function(){ composer.insert({ table:'name', ignore:true, data:{ } },function(err){ }) } expect(fn).to.throw(Error) }) it('should throw error when a updated field is not in data keys',function(){ var fn = function(){ composer.insert({ table:'name', ignore:true, onDuplicateKeyUpdate:{ field3:'value3' }, data:{ field1:'value1', field2:'value2' } },function(err){ }) } expect(fn).to.throw(Error) }) it('should be a correct insert syntax with ignore',function(){ composer.insert({ table:'name', data:{ field1:'value1', field2:'value2' } },function(err,result){ },function(sql){ expect(sql).to.satisfy(function(sql){ var striped = sql.trim().replace(/\s+/g," ") return striped == "insert ignore into `name` (`field1`,`field2`) values ('value1','value2')" }) }) }) it('should be a correct insert syntax without ignore',function(){ composer.insert({ table:'name', ignore:false, data:{ field1:'value1', field2:'value2' } },function(err,result){ },function(sql){ expect(sql).to.satisfy(function(sql){ var striped = sql.trim().replace(/\s+/g," ") return striped == "insert into `name` (`field1`,`field2`) values ('value1','value2')" }) }) }) it('should be a correct insert syntax with on duplicate key update clause',function(){ composer.insert({ table:'name', ignore:false, onDuplicateKeyUpdate:{ field1:'value1', }, data:{ field1:'value1', field2:'value2' } },function(err,result){ },function(sql){ expect(sql).to.satisfy(function(sql){ var striped = sql.trim().replace(/\s+/g," ") return striped == "insert into `name` (`field1`,`field2`) values ('value1','value2') on duplicate key update `field1`='value1'" }) }) }) it('should be a correct insert syntax with on duplicate key update clause that use arithmetic string to compute new value',function(){ composer.insert({ table:'name', ignore:false, onDuplicateKeyUpdate:{ field1:function(){ return 'field1+1 mod 2+field2/2-4*3+5%4' }, }, data:{ field1:'value1', field2:'value2' } },function(err,result){ },function(sql){ expect(sql).to.satisfy(function(sql){ var striped = sql.trim().replace(/\s+/g," ") return striped == "insert into `name` (`field1`,`field2`) values ('value1','value2') on duplicate key update `field1`=`field1`+1 mod 2+`field2`/2-4*3+5%4" }) }) }) it('should return a promise when callback is not provided',function(){ var p = composer.insert({ table:'name', data:{ field1:'value1', field2:'value2' } }) expect(p).to.satisfy(function(p){ return typeof p.then === 'function' }) }) }) describe('#update',function(){ it('should throw error when table is not provided',function(){ var fn = function(){ composer.update({ data:{ type:1 }, ignore:true },function(err){ }) } expect(fn).to.throw(Error) }) it('should throw error when data is not provided',function(){ var fn = function(){ composer.update({ table:'name', ignore:true, where:'1' },function(err){ }) } expect(fn).to.throw(Error) }) it('should throw error when data is an empty object',function(){ var fn = function(){ composer.update({ table:'name', ignore:true, data:{ }, where:'1' },function(err){ }) } expect(fn).to.throw(Error) }) it('should throw error without where clause',function(){ var fn = function() { composer.update({ table: 'name', data: { field1: 'value1', field2: 'value2' } }, function (err, sql) { }) } expect(fn).to.throw(Error) }) it('should be a correct update syntax with where clause',function(){ composer.update({ table:'name', where:'`id`=2', data:{ field1:'value1', field2:'value2' } },function(err,result){ },function(sql){ expect(sql).to.satisfy(function(sql){ var striped = sql.trim().replace(/\s+/g," ") // throw new Error(sql) return striped == "update `name` set `field1`='value1',`field2`='value2' where `id`=2" }) }) }) it('should return a promise when callback is not provided',function(){ var p = composer.update({ table:'name', where:'id=2', data:{ field1:'value1', field2:'value2' } }) expect(p).to.satisfy(function(p){ return typeof p.then === 'function' }) }) }) describe('#query',function(){ it('should return a promise when callback is not provided',function(){ var p = composer.query('select 1 from users') expect(p).to.satisfy(function(p){ return typeof p.then === 'function' }) }) }) describe('#transaction',function(){ describe('#beginTransaction',function(){ it('should return a promise when callback is not provided',function(){ var p = composer.beginTransaction() expect(p).to.satisfy(function(p){ return typeof p.then === 'function' }) }) }) describe('#rollback',function(){ it('should return a promise when callback is not provided',function(){ var p = composer.beginTransaction() expect(p).to.satisfy(function(p){ return typeof p.then === 'function' }) }) }) describe('#commit',function(){ it('should return a promise when callback is not provided',function(){ var p = composer.beginTransaction() expect(p).to.satisfy(function(p){ return typeof p.then === 'function' }) }) }) }) })