UNPKG

sql-cli

Version:

Cross platform command line interface for SQL Server

144 lines (122 loc) 5.38 kB
var proxyquire = require('proxyquire').noPreserveCache(), Q = require('q'), _ = require('underscore'), utils = require('./utils'); describe('SqlCli', () => { var prompt, dbservice, options, invoker, resultWriter, messages, exit, cli, promptEventHandlers; function setup() { prompt = { addCommand: jasmine.createSpy(), on: jasmine.createSpy() }; promptEventHandlers = {}; dbservice = {}; options = {}; invoker = { commands: [] }; prompt.on.andCallFake((event, handler)=>promptEventHandlers[event]=handler); resultWriter = { create: jasmine.createSpy() }; messages = {}; exit = jasmine.createSpy(); var SqlCli = proxyquire('../lib/cli', { './prompt': jasmine.createSpy().andReturn(prompt), './mssqldb': jasmine.createSpy().andReturn(dbservice), './options': jasmine.createSpy().andReturn(options), './commands': { Invoker: jasmine.createSpy().andReturn(invoker) }, './resultwriter': resultWriter, './messages': jasmine.createSpy().andReturn(messages), '../external/exit': exit }); cli = new SqlCli(); options.init = jasmine.createSpy().andReturn(Promise.resolve()); options.getConnectionInfo = jasmine.createSpy().andReturn({}); options.args = {}; messages.connecting = jasmine.createSpy(); } describe('run', () => { beforeEach(() => { setup(); }); it('assumes interactive mode if query is not specified', done => { options.args = {}; testInteractiveMode(true, done); }); it('assumes non-interactive mode if query is specified', done => { options.args = { query: '.tables' }; testInteractiveMode(false, done); }); it('exits on connection error', done => { var err = jasmine.any(Object); dbservice.connect = jasmine.createSpy().andReturn(Q.reject(err)); messages.connectionerror = jasmine.createSpy(); exit.andCallFake(code => { expect(code).toEqual(-1); expect(messages.connectionerror).toHaveBeenCalledWith(err); done(); }); cli.run([], {}); }); it('runs the command if specified in query argument', done => { var command = '.tables'; options.args = { query: command }; dbservice.connect = jasmine.createSpy().andReturn(Q()); invoker.run = line => { expect(line).toEqual(command); done(); }; cli.run([], {}); }); it('combines commands if ends with slash', done => { options.args = {}; dbservice.connect = jasmine.createSpy().andReturn(Q()); var commands = ['select 1\\', 'from dual']; invoker.run = jasmine.createSpy().andReturn(Q()); messages.connected = jasmine.createSpy(); messages.welcome = jasmine.createSpy(); var nextFuncs = [code => { promptEventHandlers['line'](commands[0]); }, code => { promptEventHandlers['line'](commands[1]); expect(invoker.run).toHaveBeenCalledWith('select 1\r\nfrom dual'); expect(invoker.run.callCount).toEqual(1); done(); }]; prompt.next = jasmine.createSpy().andCallFake(code => { var impl = nextFuncs.shift(); impl(code); }); cli.run([], {}); }); it('does not exit if command returns an error', done => { options.args = {}; dbservice.connect = jasmine.createSpy().andReturn(Q()); var err = new Error(); var command = '.tables'; invoker.run = jasmine.createSpy().andReturn(Q.reject(err)); messages.connected = jasmine.createSpy(); messages.welcome = jasmine.createSpy(); messages.error = jasmine.createSpy(); var nextFuncs = [code => { promptEventHandlers['line'](command); expect(invoker.run).toHaveBeenCalledWith(command); }, code => { expect(messages.error).toHaveBeenCalledWith(err); expect(code).toEqual(-1); done(); }]; prompt.next = jasmine.createSpy().andCallFake(code => { var impl = nextFuncs.shift(); impl(code); }); cli.run([], {}); }); function testInteractiveMode(expectedValue, done) { dbservice.connect = jasmine.createSpy().andReturn(Q()); cli.run([], {}).then(()=> { expect(messages.interactiveMode).toEqual(expectedValue); done(); }); } }); });