import React from 'react'; import { shallow } from 'enzyme'; import { describe, it } from 'mocha'; import sinon from 'sinon'; import { expect } from 'chai'; import $ from 'jquery'; import { table, defaultQueryEditor, databases, tables } from './fixtures'; import SqlEditorLeftBar from '../../../javascripts/SqlLab/components/SqlEditorLeftBar'; import TableElement from '../../../javascripts/SqlLab/components/TableElement'; global.notify = { error: () => {}, }; describe('SqlEditorLeftBar', () => { const mockedProps = { actions: { queryEditorSetSchema: sinon.stub(), queryEditorSetDb: sinon.stub(), setDatabases: sinon.stub(), addTable: sinon.stub(), }, tables: [table], queryEditor: defaultQueryEditor, height: 0, }; let wrapper; let ajaxStub; beforeEach(() => { ajaxStub = sinon.stub($, 'get'); wrapper = shallow(); }); afterEach(() => { ajaxStub.restore(); }); it('is valid', () => { expect( React.isValidElement(), ).to.equal(true); }); it('renders a TableElement', () => { expect(wrapper.find(TableElement)).to.have.length(1); }); describe('onDatabaseChange', () => { it('should fetch tables', () => { sinon.stub(wrapper.instance(), 'fetchTables'); sinon.stub(wrapper.instance(), 'fetchSchemas'); wrapper.instance().onDatabaseChange({ value: 1, label: 'main' }); expect(wrapper.instance().fetchTables.getCall(0).args[0]).to.equal(1); expect(wrapper.instance().fetchSchemas.getCall(0).args[0]).to.equal(1); wrapper.instance().fetchTables.restore(); wrapper.instance().fetchSchemas.restore(); }); it('should clear tableOptions', () => { wrapper.instance().onDatabaseChange(); expect(wrapper.state().tableOptions).to.deep.equal([]); }); }); describe('getTableNamesBySubStr', () => { it('should handle empty', () => ( wrapper.instance().getTableNamesBySubStr('') .then((data) => { expect(data).to.deep.equal({ options: [] }); }) )); it('should handle table name', () => { const queryEditor = Object.assign({}, defaultQueryEditor, { dbId: 1, schema: 'main', }); const mockTableOptions = { options: [table] }; wrapper.setProps({ queryEditor }); ajaxStub.callsFake(() => { const d = $.Deferred(); d.resolve(mockTableOptions); return d.promise(); }); return wrapper.instance().getTableNamesBySubStr('my table') .then((data) => { expect(ajaxStub.getCall(0).args[0]).to.equal('/superset/tables/1/main/my table'); expect(data).to.deep.equal(mockTableOptions); }); }); }); it('dbMutator should build databases options', () => { const options = wrapper.instance().dbMutator(databases); expect(options).to.deep.equal([ { value: 1, label: 'main' }, { value: 208, label: 'Presto - Gold' }, ]); }); describe('fetchTables', () => { it('should clear table options', () => { wrapper.instance().fetchTables(1); expect(wrapper.state().tableOptions).to.deep.equal([]); expect(wrapper.state().filterOptions).to.be.a('null'); }); it('should fetch table options', () => { ajaxStub.callsFake(() => { const d = $.Deferred(); d.resolve(tables); return d.promise(); }); wrapper.instance().fetchTables(1, 'main', 'birth_names'); expect(ajaxStub.getCall(0).args[0]).to.equal('/superset/tables/1/main/birth_names/'); expect(wrapper.state().tableLength).to.equal(3); }); it('should handle error', () => { ajaxStub.callsFake(() => { const d = $.Deferred(); d.reject('error message'); return d.promise(); }); wrapper.instance().fetchTables(1, 'main', 'birth_names'); expect(wrapper.state().tableOptions).to.deep.equal([]); expect(wrapper.state().tableLength).to.equal(0); }); }); describe('fetchSchemas', () => { it('should fetch schema options', () => { const schemaOptions = { schemas: ['main', 'erf', 'superset'], }; ajaxStub.callsFake(() => { const d = $.Deferred(); d.resolve(schemaOptions); return d.promise(); }); wrapper.instance().fetchSchemas(1); expect(ajaxStub.getCall(0).args[0]).to.equal('/superset/schemas/1/'); expect(wrapper.state().schemaOptions).to.have.length(3); }); it('should handle error', () => { ajaxStub.callsFake(() => { const d = $.Deferred(); d.reject('error message'); return d.promise(); }); wrapper.instance().fetchSchemas(123); expect(wrapper.state().schemaOptions).to.deep.equal([]); }); }); describe('changeTable', () => { beforeEach(() => { sinon.stub(wrapper.instance(), 'fetchTables'); }); afterEach(() => { wrapper.instance().fetchTables.restore(); }); it('test 1', () => { wrapper.instance().changeTable({ value: 'birth_names', label: 'birth_names', }); expect(wrapper.state().tableName).to.equal('birth_names'); }); it('test 2', () => { wrapper.instance().changeTable({ value: 'main.my_table', label: 'my_table', }); expect(wrapper.instance().fetchTables.getCall(0).args[1]).to.equal('main'); }); }); it('changeSchema', () => { sinon.stub(wrapper.instance(), 'fetchTables'); wrapper.instance().changeSchema({ label: 'main', value: 'main' }); expect(wrapper.instance().fetchTables.getCall(0).args[1]).to.equal('main'); wrapper.instance().changeSchema(); expect(wrapper.instance().fetchTables.getCall(1).args[1]).to.be.a('null'); wrapper.instance().fetchTables.restore(); }); });