import React from 'react' import { ReservedTokensInputBlock } from '../../../src/components/Common/ReservedTokensInputBlock' import { VALIDATION_TYPES } from '../../../src/utils/constants' import Adapter from 'enzyme-adapter-react-15' import { configure, mount } from 'enzyme' import { reservedTokenStore, tokenStore } from '../../../src/stores' const { VALID, INVALID } = VALIDATION_TYPES const stores = { reservedTokenStore, tokenStore } configure({ adapter: new Adapter() }) jest.mock('react-dropzone', () => () => Dropzone) describe('ReservedTokensInputBlock', () => { describe('render', () => { it(`should render the component for tokens`, () => { // Given const wrapper = mount() // When wrapper.find('#tokens').simulate('change') // Then expect(wrapper).toMatchSnapshot('tokens') }) it(`should render the component for percentage`, () => { // Given const wrapper = mount() // When wrapper.find('#percentage').simulate('change') // Then expect(wrapper).toMatchSnapshot('percentage') }) }) describe('Address field', () => { const testCases = [ { value: '0x123', expected: false }, { value: '0x90F8bF6A479f320EAD074411A4B0E7944EA8C9C1', expected: false }, { value: '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1', expected: true }, { value: '0X90f8bf6a479f320ead074411a4b0e7944ea8c9c1', expected: true }, { value: '0x90F8BF6A479F320EAD074411A4B0E7944EA8C9C1', expected: true }, { value: '0X90F8BF6A479F320EAD074411A4B0E7944EA8C9C1', expected: true } ] testCases.forEach(testCase => { const action = testCase.expected ? 'pass' : 'fail' const validity = testCase.expected ? VALID : INVALID it(`Should ${action} for '${testCase.value}'`, () => { const wrapper = mount() const componentInstance = wrapper.find(ReservedTokensInputBlock).instance().wrappedInstance const handleAddressChange = jest.spyOn(componentInstance, 'handleAddressChange') wrapper.update() wrapper .find('input[type="text"]') .at(0) .simulate('change', { target: { value: testCase.value } }) expect(handleAddressChange).toHaveBeenCalledTimes(1) expect(handleAddressChange).toHaveBeenCalledWith(testCase.value) expect(componentInstance.state.validation.address.pristine).toBeFalsy() expect(componentInstance.state.validation.address.valid).toBe(validity) }) }) }) describe('Dimension selection', () => { it('Should set "tokens" as selected dimension', () => { const wrapper = mount() const componentInstance = wrapper.find(ReservedTokensInputBlock).instance().wrappedInstance const updateReservedTokenInput = jest.spyOn(componentInstance, 'updateReservedTokenInput') wrapper.update() wrapper.find('#tokens').simulate('change') expect(updateReservedTokenInput).toHaveBeenCalledWith('tokens', 'dim') expect(updateReservedTokenInput).toHaveBeenCalledTimes(1) expect(componentInstance.state.dim).toBe('tokens') }) it('Should set "percentage" as selected dimension', () => { const wrapper = mount() const componentInstance = wrapper.find(ReservedTokensInputBlock).instance().wrappedInstance const updateReservedTokenInput = jest.spyOn(componentInstance, 'updateReservedTokenInput') wrapper.update() wrapper.find('#percentage').simulate('change') expect(updateReservedTokenInput).toHaveBeenCalledWith('percentage', 'dim') expect(updateReservedTokenInput).toHaveBeenCalledTimes(1) expect(componentInstance.state.dim).toBe('percentage') }) it('Should set "tokens" as selected dimension after selecting percentage', () => { const wrapper = mount() const componentInstance = wrapper.find(ReservedTokensInputBlock).instance().wrappedInstance const updateReservedTokenInput = jest.spyOn(componentInstance, 'updateReservedTokenInput') wrapper.update() wrapper.find('#percentage').simulate('change') expect(updateReservedTokenInput).toHaveBeenCalledWith('percentage', 'dim') expect(updateReservedTokenInput).toHaveBeenCalledTimes(1) expect(componentInstance.state.dim).toBe('percentage') wrapper.find('#tokens').simulate('change') expect(updateReservedTokenInput).toHaveBeenCalledWith('tokens', 'dim') expect(updateReservedTokenInput).toHaveBeenCalledTimes(2) expect(componentInstance.state.dim).toBe('tokens') }) }) describe('Value field', () => { describe('tokens', () => { const testCases = [ { value: '0', expected: false }, { value: '-10', expected: false }, { value: -10, expected: false }, { value: 123.1234, expected: false }, { value: '10', expected: true }, { value: 10, expected: true }, { value: '0.1', expected: true }, { value: '1e-3', expected: true }, { value: '1.3', expected: true } ] testCases.forEach(testCase => { const action = testCase.expected ? 'pass' : 'fail' const validity = testCase.expected ? VALID : INVALID const calledWith = { value: testCase.value, pristine: false, valid: validity } it(`Should ${action} for '${testCase.value}' with ${tokenStore.decimals} decimals`, () => { const wrapper = mount() const componentInstance = wrapper.find(ReservedTokensInputBlock).instance().wrappedInstance const handleValueChange = jest.spyOn(componentInstance, 'handleValueChange') wrapper.update() wrapper.find('#tokens').simulate('change') wrapper .find('input[type="number"]') .at(0) .simulate('change', { target: { value: testCase.value } }) expect(handleValueChange).toHaveBeenCalledTimes(1) expect(handleValueChange).toHaveBeenCalledWith(calledWith) }) }) }) describe('percentage', () => { const testCases = [ { value: '0', expected: false }, { value: '-10', expected: false }, { value: -10, expected: false }, { value: '10', expected: true }, { value: 10, expected: true }, { value: '0.1', expected: true }, { value: '1e-3', expected: true }, { value: '1.3', expected: true }, { value: 123.1234, expected: true } ] testCases.forEach(testCase => { const action = testCase.expected ? 'pass' : 'fail' const validity = testCase.expected ? VALID : INVALID const calledWith = { value: testCase.value, pristine: false, valid: validity } it(`Should ${action} for '${testCase.value}'`, () => { const wrapper = mount() const componentInstance = wrapper.find(ReservedTokensInputBlock).instance().wrappedInstance const handleValueChange = jest.spyOn(componentInstance, 'handleValueChange') wrapper.update() wrapper.find('#percentage').simulate('change') wrapper .find('input[type="number"]') .at(0) .simulate('change', { target: { value: testCase.value } }) expect(handleValueChange).toHaveBeenCalledTimes(2) expect(handleValueChange).toHaveBeenCalledWith({ value: '', pristine: true, valid: VALID }) expect(handleValueChange).toHaveBeenCalledWith(calledWith) }) }) }) }) describe('Callbacks', () => { describe('addReservedTokensItem', () => { const testCases = [ { value: { addr: '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1', dim: 'tokens', val: '120' }, expected: true }, { value: { addr: '0x0000000000000000000000000000000000000001', dim: 'tokens', val: '0.001' }, expected: true }, { value: { addr: '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1', dim: 'tokens', val: '' }, expected: false }, { value: { addr: '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1', dim: 'tokens', val: '0' }, expected: false }, { value: { addr: '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1', dim: 'tokens', val: '120.1234' }, expected: false }, { value: { addr: '', dim: 'tokens', val: '120' }, expected: false }, { value: { addr: '0x90f8bf6a4', dim: 'tokens', val: '120' }, expected: false }, { value: { addr: '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c10x90f8bf6a479f320ead074411a4b0e7944ea8c9c1', dim: 'tokens', val: '120' }, expected: false }, { value: { addr: '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1', dim: 'percentage', val: '120' }, expected: true }, { value: { addr: '0x0000000000000000000000000000000000000012', dim: 'percentage', val: '120.123' }, expected: true }, { value: { addr: '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1', dim: 'percentage', val: '' }, expected: false }, { value: { addr: '', dim: 'percentage', val: '120.123' }, expected: false }, { value: { addr: '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1', dim: 'percentage', val: '0' }, expected: false } ] testCases.forEach(testCase => { const action = testCase.expected ? 'call' : 'not call' it(`Should ${action} addReservedTokensItem callback for: ${JSON.stringify(testCase.value)}`, () => { const { tokens } = reservedTokenStore const storedTokens = testCase.expected ? tokens.length + 1 : tokens.length const wrapper = mount() wrapper.find(`#${testCase.value.dim}`).simulate('change') wrapper .find('input[type="text"]') .at(0) .simulate('change', { target: { value: testCase.value.addr } }) wrapper .find('input[type="number"]') .at(0) .simulate('change', { target: { value: testCase.value.val } }) wrapper.find('ButtonPlus').simulate('click') const { value } = testCase value.val = testCase.value.val === '' ? '' : parseFloat(testCase.value.val) expect(reservedTokenStore.tokens.length).toBe(storedTokens) }) }) }) describe('clearAll', () => { afterEach(() => { reservedTokenStore.clearAll() }) it('Should show the "Clear all" button if there are tokens"', () => { const wrapper = mount() const testCase = { value: { addr: '0x0000000000000000000000000000000000000012', dim: 'percentage', val: '120.123' } } wrapper.find(`#${testCase.value.dim}`).simulate('change') wrapper .find('input[type="text"]') .at(0) .simulate('change', { target: { value: testCase.value.addr } }) wrapper .find('input[type="number"]') .at(0) .simulate('change', { target: { value: testCase.value.val } }) wrapper.find('ButtonPlus').simulate('click') const clearAllButton = wrapper.find('ButtonCSV').find('.sw-ButtonCSV-clearall') expect(clearAllButton).toHaveLength(1) }) it('Should not show the "Clear all" button if there are no tokens"', () => { const wrapper = mount() const clearAllButton = wrapper.find('.sw-ReservedTokensListControls_Button-clearall') expect(clearAllButton).toHaveLength(0) }) }) }) })