blob: f46b151c7a3d495a567f8e8dc8214a77945b94d2 [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 { screen, render } from '@superset-ui/core/spec';
import { Button, DropdownContainer, Icons } from '..';
const generateItems = (n: number) =>
Array.from({ length: n }).map((_, i) => ({
id: `el-${i + 1}`,
element: <Button>{`Element ${i + 1}`}</Button>,
}));
const ITEMS = generateItems(10);
beforeEach(() => {
// Reset any mocks
jest.restoreAllMocks();
// Mock ResizeObserver globally
global.ResizeObserver = jest.fn().mockImplementation(() => ({
observe: jest.fn(),
unobserve: jest.fn(),
disconnect: jest.fn(),
}));
});
test('renders children', () => {
render(<DropdownContainer items={generateItems(3)} />);
expect(screen.getByText('Element 1')).toBeInTheDocument();
expect(screen.getByText('Element 2')).toBeInTheDocument();
expect(screen.getByText('Element 3')).toBeInTheDocument();
});
test('renders children with custom horizontal spacing', () => {
render(<DropdownContainer items={ITEMS} style={{ gap: 20 }} />);
expect(screen.getByTestId('container')).toHaveStyle('gap: 20px');
});
test('does not render a dropdown button when not overflowing', () => {
render(<DropdownContainer items={generateItems(3)} />);
expect(screen.queryByText('More')).not.toBeInTheDocument();
});
test('renders component with dropdown trigger icon prop without error', () => {
render(
<DropdownContainer
items={generateItems(5)}
dropdownTriggerIcon={<Icons.LinkOutlined />}
/>,
);
// Component should render without error
expect(screen.getByText('Element 1')).toBeInTheDocument();
});
test('renders component with dropdown trigger text prop without error', () => {
const customText = 'Custom text';
render(
<DropdownContainer
items={generateItems(5)}
dropdownTriggerText={customText}
/>,
);
// Component should render without error
expect(screen.getByText('Element 1')).toBeInTheDocument();
});
test('renders component with dropdown trigger count prop without error', () => {
const customCount = 99;
render(
<DropdownContainer
items={generateItems(5)}
dropdownTriggerCount={customCount}
/>,
);
// Component should render without error
expect(screen.getByText('Element 1')).toBeInTheDocument();
});
test('renders component with dropdown style prop without error', () => {
render(
<DropdownContainer items={generateItems(5)} dropdownStyle={{ gap: 20 }} />,
);
// Component should render without error
expect(screen.getByText('Element 1')).toBeInTheDocument();
});
test('renders component with onOverflowingStateChange prop without error', () => {
const onOverflowingStateChange = jest.fn();
render(
<DropdownContainer
items={generateItems(5)}
onOverflowingStateChange={onOverflowingStateChange}
/>,
);
// Component should render without error
expect(screen.getByText('Element 1')).toBeInTheDocument();
});
test('renders component with custom dropdown content prop without error', () => {
const customDropdownContent = <div>Custom content</div>;
render(
<DropdownContainer
items={generateItems(5)}
dropdownContent={() => customDropdownContent}
/>,
);
// Component should render without error
expect(screen.getByText('Element 1')).toBeInTheDocument();
});
test('renders component with dropdown trigger tooltip prop without error', () => {
render(
<DropdownContainer
items={generateItems(5)}
dropdownTriggerTooltip="Test tooltip"
/>,
);
// Component should render without error
expect(screen.getByText('Element 1')).toBeInTheDocument();
});
// Tests that can work without complex overflow mocking
test('container has correct test id', () => {
render(<DropdownContainer items={generateItems(3)} />);
expect(screen.getByTestId('container')).toBeInTheDocument();
});
test('renders all provided items when not overflowing', () => {
const items = generateItems(3);
render(<DropdownContainer items={items} />);
items.forEach((item, index) => {
expect(screen.getByText(`Element ${index + 1}`)).toBeInTheDocument();
});
});
test('accepts custom style props', () => {
const customStyle = { backgroundColor: 'red', padding: '10px' };
render(<DropdownContainer items={generateItems(2)} style={customStyle} />);
const container = screen.getByTestId('container');
expect(container).toHaveStyle('background-color: red');
expect(container).toHaveStyle('padding: 10px');
});
// Integration test that doesn't rely on specific overflow behavior
test('component renders and functions without throwing errors', () => {
const onOverflowingStateChange = jest.fn();
expect(() => {
render(
<DropdownContainer
items={generateItems(10)}
onOverflowingStateChange={onOverflowingStateChange}
dropdownTriggerText="More items"
dropdownTriggerTooltip="Click to see more"
style={{ gap: 10 }}
dropdownStyle={{ gap: 5 }}
/>,
);
}).not.toThrow();
// Basic functionality test
expect(screen.getByText('Element 1')).toBeInTheDocument();
});