datajunction-ui
Version:
DataJunction UI
133 lines (115 loc) • 4.13 kB
JSX
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: vi.fn(),
unlinkDimension: vi.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 = vi.fn();
mockDjClient.DataJunctionAPI.linkDimension.mockReturnValue({
status: 200,
json: { message: 'Success' },
});
// Render the component - start with no dimensions
const { getByLabelText, getByText, getByTestId } = render(
<DJClientContext.Provider value={mockDjClient}>
<LinkDimensionPopover
column={column}
dimensionNodes={[]}
node={node}
options={options}
onSubmit={onSubmitMock}
/>
</DJClientContext.Provider>,
);
// Open the popover
fireEvent.click(getByLabelText('LinkDimension'));
// Click on a dimension to add it
const linkDimension = getByTestId('link-dimension');
fireEvent.keyDown(linkDimension.firstChild, { key: 'ArrowDown' });
await waitFor(() => {
expect(screen.getByText('Dimension 2')).toBeInTheDocument();
});
fireEvent.click(screen.getByText('Dimension 2'));
// Now save (this will link dimension2)
fireEvent.click(getByText('Save'));
// Expect linkDimension to be called with success message
await waitFor(() => {
expect(mockDjClient.DataJunctionAPI.linkDimension).toHaveBeenCalledWith(
'default.node1',
'column1',
'default.dimension2',
);
expect(getByText('Saved!')).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 = vi.fn();
mockDjClient.DataJunctionAPI.linkDimension.mockReturnValue({
status: 500,
json: { message: 'Failed due to nonexistent dimension' },
});
// Render the component - start with no dimensions to test adding one that fails
const { getByLabelText, getByText, getByTestId } = render(
<DJClientContext.Provider value={mockDjClient}>
<LinkDimensionPopover
column={column}
dimensionNodes={[]}
node={node}
options={options}
onSubmit={onSubmitMock}
/>
</DJClientContext.Provider>,
);
// Open the popover
fireEvent.click(getByLabelText('LinkDimension'));
// Click on a dimension to add it
const linkDimension = getByTestId('link-dimension');
fireEvent.keyDown(linkDimension.firstChild, { key: 'ArrowDown' });
await waitFor(() => {
expect(screen.getByText('Dimension 2')).toBeInTheDocument();
});
fireEvent.click(screen.getByText('Dimension 2'));
// Now save (this will attempt to link dimension2 which will fail)
fireEvent.click(getByText('Save'));
// Expect linkDimension to be called with failure message
await waitFor(() => {
expect(mockDjClient.DataJunctionAPI.linkDimension).toHaveBeenCalledWith(
'default.node1',
'column1',
'default.dimension2',
);
// The linkDimension failure message should be shown
expect(
getByText('Failed due to nonexistent dimension'),
).toBeInTheDocument();
});
});
});