UNPKG

datajunction-ui

Version:

DataJunction Metrics Platform UI

162 lines (140 loc) 4.99 kB
import React from 'react'; import { render, fireEvent, waitFor, screen } from '@testing-library/react'; import LinkDimensionPopover from '../LinkDimensionPopover'; import DJClientContext from '../../../providers/djclient'; const mockDjClient = { DataJunctionAPI: { linkDimension: jest.fn(), unlinkDimension: jest.fn(), }, }; describe('<LinkDimensionPopover />', () => { it('renders correctly and handles form submission', async () => { // Mock necessary data const column = { name: 'column1', dimension: { name: 'default.dimension1' }, }; const node = { name: 'default.node1' }; const options = [ { value: 'default.dimension1', label: 'Dimension 1' }, { value: 'default.dimension2', label: 'Dimension 2' }, ]; // Mock onSubmit function const onSubmitMock = jest.fn(); mockDjClient.DataJunctionAPI.linkDimension.mockReturnValue({ status: 200, json: { message: 'Success' }, }); mockDjClient.DataJunctionAPI.unlinkDimension.mockReturnValue({ status: 200, json: { message: 'Success' }, }); // Render the component const { getByLabelText, getByText, getByTestId } = render( <DJClientContext.Provider value={mockDjClient}> <LinkDimensionPopover column={column} dimensionNodes={['default.dimension1']} node={node} options={options} onSubmit={onSubmitMock} /> </DJClientContext.Provider>, ); // Open the popover fireEvent.click(getByLabelText('LinkDimension')); // Click on a dimension and save const linkDimension = getByTestId('link-dimension'); fireEvent.keyDown(linkDimension.firstChild, { key: 'ArrowDown' }); fireEvent.click(screen.getByText('Dimension 2')); fireEvent.click(getByText('Save')); // Expect linkDimension to be called await waitFor(() => { expect(mockDjClient.DataJunctionAPI.linkDimension).toHaveBeenCalledWith( 'default.node1', 'column1', 'default.dimension2', ); expect(getByText('Saved!')).toBeInTheDocument(); }); // Click on the 'Remove' option and save const removeButton = screen.getByLabelText('Remove default.dimension1'); fireEvent.click(removeButton); fireEvent.click(getByText('Save')); // Expect unlinkDimension to be called await waitFor(() => { expect(mockDjClient.DataJunctionAPI.unlinkDimension).toHaveBeenCalledWith( 'default.node1', 'column1', 'default.dimension1', ); expect(getByText('Removed dimension link!')).toBeInTheDocument(); }); }); it('handles failed form submission', async () => { // Mock necessary data const column = { name: 'column1', dimension: { name: 'default.dimension1' }, }; const node = { name: 'default.node1' }; const options = [ { value: 'default.dimension1', label: 'Dimension 1' }, { value: 'default.dimension2', label: 'Dimension 2' }, ]; // Mock onSubmit function const onSubmitMock = jest.fn(); mockDjClient.DataJunctionAPI.linkDimension.mockReturnValue({ status: 500, json: { message: 'Failed due to nonexistent dimension' }, }); mockDjClient.DataJunctionAPI.unlinkDimension.mockReturnValue({ status: 500, json: { message: 'Failed due to no dimension link' }, }); // Render the component const { getByLabelText, getByText, getByTestId } = render( <DJClientContext.Provider value={mockDjClient}> <LinkDimensionPopover column={column} dimensionNodes={['default.dimension1']} node={node} options={options} onSubmit={onSubmitMock} /> </DJClientContext.Provider>, ); // Open the popover fireEvent.click(getByLabelText('LinkDimension')); // Click on a dimension and save const linkDimension = getByTestId('link-dimension'); fireEvent.keyDown(linkDimension.firstChild, { key: 'ArrowDown' }); fireEvent.click(screen.getByText('Dimension 2')); fireEvent.click(getByText('Save')); // Expect linkDimension to be called await waitFor(() => { expect(mockDjClient.DataJunctionAPI.linkDimension).toHaveBeenCalledWith( 'default.node1', 'column1', 'default.dimension2', ); expect( getByText('Failed due to nonexistent dimension'), ).toBeInTheDocument(); }); // Click on the 'Remove' option and save const removeButton = screen.getByLabelText('Remove default.dimension1'); fireEvent.click(removeButton); fireEvent.click(getByText('Save')); // Expect unlinkDimension to be called await waitFor(() => { expect(mockDjClient.DataJunctionAPI.unlinkDimension).toHaveBeenCalledWith( 'default.node1', 'column1', 'default.dimension1', ); expect(getByText('Failed due to no dimension link')).toBeInTheDocument(); }); }); });