blob: 9b3b3a6b575383f8b2ac8693086fafb3e926a8fa [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import type { Column, GridApi } from 'ag-grid-community';
import {
render,
waitFor,
screen,
userEvent,
} from 'spec/helpers/testing-library';
import { HeaderMenu, type HeaderMenuProps } from './HeaderMenu';
jest.mock('src/utils/copy', () => jest.fn().mockImplementation(f => f()));
const mockInvisibleColumn = {
getColId: jest.fn().mockReturnValue('column2'),
getColDef: jest.fn().mockReturnValue({ headerName: 'column2' }),
getDataAsCsv: jest.fn().mockReturnValue('csv'),
} as any as Column;
const mockInvisibleColumn3 = {
getColId: jest.fn().mockReturnValue('column3'),
getColDef: jest.fn().mockReturnValue({ headerName: 'column3' }),
getDataAsCsv: jest.fn().mockReturnValue('csv'),
} as any as Column;
const mockGridApi = {
autoSizeColumns: jest.fn(),
autoSizeAllColumns: jest.fn(),
getColumn: jest.fn().mockReturnValue({
getColDef: jest.fn().mockReturnValue({}),
}),
getColumns: jest.fn().mockReturnValue([]),
getDataAsCsv: jest.fn().mockReturnValue('csv'),
exportDataAsCsv: jest.fn().mockReturnValue('csv'),
getAllDisplayedColumns: jest.fn().mockReturnValue([]),
setColumnsPinned: jest.fn(),
setColumnsVisible: jest.fn(),
setColumnVisible: jest.fn(),
moveColumns: jest.fn(),
} as any as GridApi;
const mockedProps = {
colId: 'column1',
invisibleColumns: [],
api: mockGridApi,
onVisibleChange: jest.fn(),
};
afterEach(() => {
(mockGridApi.getDataAsCsv as jest.Mock).mockClear();
(mockGridApi.setColumnsPinned as jest.Mock).mockClear();
(mockGridApi.setColumnsVisible as jest.Mock).mockClear();
(mockGridApi.setColumnsVisible as jest.Mock).mockClear();
(mockGridApi.setColumnsPinned as jest.Mock).mockClear();
(mockGridApi.autoSizeColumns as jest.Mock).mockClear();
(mockGridApi.autoSizeAllColumns as jest.Mock).mockClear();
(mockGridApi.moveColumns as jest.Mock).mockClear();
});
const setup = (props: HeaderMenuProps = mockedProps) => {
const wrapper = render(<HeaderMenu {...props} />);
const dropdownTrigger = wrapper.getByTestId('dropdown-trigger');
userEvent.click(dropdownTrigger);
return wrapper;
};
test('renders copy data', async () => {
const { getByText } = setup();
userEvent.click(getByText('Copy'));
await waitFor(() =>
expect(mockGridApi.getDataAsCsv).toHaveBeenCalledTimes(1),
);
expect(mockGridApi.getDataAsCsv).toHaveBeenCalledWith({
columnKeys: [mockedProps.colId],
suppressQuotes: true,
});
});
test('renders buttons pinning both sides', () => {
const { queryByText, getByText } = setup();
expect(queryByText('Pin Left')).toBeInTheDocument();
expect(queryByText('Pin Right')).toBeInTheDocument();
userEvent.click(getByText('Pin Left'));
expect(mockGridApi.setColumnsPinned).toHaveBeenCalledTimes(1);
expect(mockGridApi.setColumnsPinned).toHaveBeenCalledWith(
[mockedProps.colId],
'left',
);
userEvent.click(getByText('Pin Right'));
expect(mockGridApi.setColumnsPinned).toHaveBeenLastCalledWith(
[mockedProps.colId],
'right',
);
});
test('renders unpin on pinned left', () => {
const { queryByText, getByText } = setup({
...mockedProps,
pinnedLeft: true,
});
expect(queryByText('Pin Left')).not.toBeInTheDocument();
expect(queryByText('Unpin')).toBeInTheDocument();
userEvent.click(getByText('Unpin'));
expect(mockGridApi.setColumnsPinned).toHaveBeenCalledTimes(1);
expect(mockGridApi.setColumnsPinned).toHaveBeenCalledWith(
[mockedProps.colId],
null,
);
});
test('renders unpin on pinned right', () => {
const { queryByText } = setup({ ...mockedProps, pinnedRight: true });
expect(queryByText('Pin Right')).not.toBeInTheDocument();
expect(queryByText('Unpin')).toBeInTheDocument();
});
test('renders autosize column', async () => {
const { getByText } = setup();
userEvent.click(getByText('Autosize Column'));
await waitFor(() =>
expect(mockGridApi.autoSizeColumns).toHaveBeenCalledTimes(1),
);
});
test('renders unhide when invisible column exists', async () => {
const { queryByText, getByText } = setup({
...mockedProps,
invisibleColumns: [mockInvisibleColumn],
});
expect(queryByText('Unhide')).toBeInTheDocument();
userEvent.click(getByText('Unhide'));
const unhideColumnsButton = await screen.findByText('column2');
userEvent.click(unhideColumnsButton);
expect(mockGridApi.setColumnsVisible).toHaveBeenCalledTimes(1);
expect(mockGridApi.setColumnsVisible).toHaveBeenCalledWith(['column2'], true);
});
// eslint-disable-next-line no-restricted-globals -- TODO: Migrate from describe blocks
describe('for main menu', () => {
test('renders Copy to Clipboard', async () => {
const { getByText } = setup({ ...mockedProps, isMain: true });
userEvent.click(getByText('Copy the current data'));
await waitFor(() =>
expect(mockGridApi.getDataAsCsv).toHaveBeenCalledTimes(1),
);
expect(mockGridApi.getDataAsCsv).toHaveBeenCalledWith({
columnKeys: [],
columnSeparator: '\t',
suppressQuotes: true,
});
});
test('renders Download to CSV', async () => {
const { getByText } = setup({ ...mockedProps, isMain: true });
userEvent.click(getByText('Download to CSV'));
await waitFor(() =>
expect(mockGridApi.exportDataAsCsv).toHaveBeenCalledTimes(1),
);
expect(mockGridApi.exportDataAsCsv).toHaveBeenCalledWith({
columnKeys: [],
});
});
test('renders autosize column', async () => {
const { getByText } = setup({ ...mockedProps, isMain: true });
userEvent.click(getByText('Autosize all columns'));
await waitFor(() =>
expect(mockGridApi.autoSizeAllColumns).toHaveBeenCalledTimes(1),
);
});
test('renders all unhide all hidden columns when multiple invisible columns exist', async () => {
setup({
...mockedProps,
isMain: true,
invisibleColumns: [mockInvisibleColumn, mockInvisibleColumn3],
});
userEvent.click(screen.getByText('Unhide'));
const unhideColumnsButton = await screen.findByText(`All 2 hidden columns`);
userEvent.click(unhideColumnsButton);
expect(mockGridApi.setColumnsVisible).toHaveBeenCalledTimes(1);
expect(mockGridApi.setColumnsVisible).toHaveBeenCalledWith(
[mockInvisibleColumn, mockInvisibleColumn3],
true,
);
});
test('reset columns configuration', async () => {
const { getByText } = setup({
...mockedProps,
isMain: true,
invisibleColumns: [mockInvisibleColumn],
});
userEvent.click(getByText('Reset columns'));
await waitFor(() =>
expect(mockGridApi.setColumnsVisible).toHaveBeenCalledTimes(1),
);
expect(mockGridApi.setColumnsVisible).toHaveBeenCalledWith(
[mockInvisibleColumn],
true,
);
expect(mockGridApi.setColumnsPinned).toHaveBeenCalledTimes(1);
expect(mockGridApi.setColumnsPinned).toHaveBeenCalledWith([], null);
expect(mockGridApi.moveColumns).toHaveBeenCalledTimes(1);
});
});