diff --git a/test/servers/ManageServers.test.tsx b/test/servers/ManageServers.test.tsx new file mode 100644 index 00000000..c860bb9e --- /dev/null +++ b/test/servers/ManageServers.test.tsx @@ -0,0 +1,93 @@ +import { Mock } from 'ts-mockery'; +import { shallow, ShallowWrapper } from 'enzyme'; +import { Button } from 'reactstrap'; +import ServersExporter from '../../src/servers/services/ServersExporter'; +import { ManageServers as createManageServers } from '../../src/servers/ManageServers'; +import { ServersMap, ServerWithId } from '../../src/servers/data'; +import SearchField from '../../src/utils/SearchField'; +import { Result } from '../../src/utils/Result'; + +describe('', () => { + const exportServers = jest.fn(); + const serversExporter = Mock.of({ exportServers }); + const ImportServersBtn = () => null; + const ManageServersRow = () => null; + const useStateFlagTimeout = jest.fn().mockReturnValue([ false, jest.fn() ]); + const ManageServers = createManageServers(serversExporter, ImportServersBtn, useStateFlagTimeout, ManageServersRow); + let wrapper: ShallowWrapper; + const createServerMock = (value: string, autoConnect = false) => Mock.of( + { id: value, name: value, url: value, autoConnect }, + ); + const createWrapper = (servers: ServersMap = {}) => { + wrapper = shallow(); + + return wrapper; + }; + + afterEach(jest.clearAllMocks); + afterEach(() => wrapper?.unmount()); + + it('shows search field which allows searching servers, affecting te amount of rendered rows', () => { + const wrapper = createWrapper({ + foo: createServerMock('foo'), + bar: createServerMock('bar'), + baz: createServerMock('baz'), + }); + const searchBar = wrapper.find(SearchField); + + expect(wrapper.find(ManageServersRow)).toHaveLength(3); + expect(wrapper.find('tbody').find('tr')).toHaveLength(0); + + searchBar.simulate('change', 'foo'); + expect(wrapper.find(ManageServersRow)).toHaveLength(1); + expect(wrapper.find('tbody').find('tr')).toHaveLength(0); + + searchBar.simulate('change', 'ba'); + expect(wrapper.find(ManageServersRow)).toHaveLength(2); + expect(wrapper.find('tbody').find('tr')).toHaveLength(0); + + searchBar.simulate('change', 'invalid'); + expect(wrapper.find(ManageServersRow)).toHaveLength(0); + expect(wrapper.find('tbody').find('tr')).toHaveLength(1); + }); + + it.each([ + [ createServerMock('foo'), 3 ], + [ createServerMock('foo', true), 4 ], + ])('shows different amount of columns if there are at least one auto-connect server', (server, expectedCols) => { + const wrapper = createWrapper({ server }); + const row = wrapper.find(ManageServersRow); + + expect(wrapper.find('th')).toHaveLength(expectedCols); + expect(row.prop('hasAutoConnect')).toEqual(server.autoConnect); + }); + + it.each([ + [{}, 1 ], + [{ foo: createServerMock('foo') }, 2 ], + ])('shows export button if the list of servers is not empty', (servers, expectedButtons) => { + const wrapper = createWrapper(servers); + const exportBtn = wrapper.find(Button); + + expect(exportBtn).toHaveLength(expectedButtons); + }); + + it('allows exporting servers when clicking on button', () => { + const wrapper = createWrapper({ foo: createServerMock('foo') }); + const exportBtn = wrapper.find(Button).first(); + + expect(exportServers).not.toHaveBeenCalled(); + exportBtn.simulate('click'); + expect(exportServers).toHaveBeenCalled(); + }); + + it('shows an error message if an error occurs while importing servers', () => { + useStateFlagTimeout.mockReturnValue([ true, jest.fn() ]); + + const wrapper = createWrapper({ foo: createServerMock('foo') }); + const result = wrapper.find(Result); + + expect(result).toHaveLength(1); + expect(result.prop('type')).toEqual('error'); + }); +});