feat(candles-chart): combine overlays and studies into indicators dropdown (#5129)
This commit is contained in:
parent
dd1890d8c6
commit
fbafc726a4
@ -1,31 +1,83 @@
|
|||||||
import { render, screen } from '@testing-library/react';
|
import { render, screen, within } from '@testing-library/react';
|
||||||
import userEvent from '@testing-library/user-event';
|
import userEvent from '@testing-library/user-event';
|
||||||
import { CandlesMenu } from './candles-menu';
|
import { CandlesMenu } from './candles-menu';
|
||||||
|
import {
|
||||||
|
useCandlesChartSettingsStore,
|
||||||
|
DEFAULT_CHART_SETTINGS,
|
||||||
|
} from './use-candles-chart-settings';
|
||||||
|
import { Overlay, Study, overlayLabels, studyLabels } from 'pennant';
|
||||||
|
|
||||||
describe('CandlesMenu', () => {
|
describe('CandlesMenu', () => {
|
||||||
it('should render with the correct default studies', async () => {
|
const openDropdown = async () => {
|
||||||
render(<CandlesMenu />);
|
|
||||||
|
|
||||||
await userEvent.click(
|
await userEvent.click(
|
||||||
screen.getByRole('button', {
|
screen.getByRole('button', {
|
||||||
name: 'Studies',
|
name: 'Indicators',
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
expect(await screen.findByRole('menu')).toBeInTheDocument();
|
};
|
||||||
expect(screen.getByText('Volume')).toHaveAttribute('data-state', 'checked');
|
|
||||||
expect(screen.getByText('MACD')).toHaveAttribute('data-state', 'checked');
|
beforeEach(() => {
|
||||||
|
// clear store each time to avoid conditional testing of defaults
|
||||||
|
useCandlesChartSettingsStore.setState({ overlays: [], studies: [] });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render with the correct default overlays', async () => {
|
it.each(Object.values(Overlay))('can set %s overlay', async (overlay) => {
|
||||||
|
render(<CandlesMenu />);
|
||||||
|
|
||||||
|
await openDropdown();
|
||||||
|
|
||||||
|
const menu = within(await screen.findByRole('menu'));
|
||||||
|
|
||||||
|
await userEvent.click(menu.getByText(overlayLabels[overlay as Overlay]));
|
||||||
|
|
||||||
|
// re-open the dropdown
|
||||||
|
await openDropdown();
|
||||||
|
|
||||||
|
expect(screen.getByText(overlayLabels[overlay as Overlay])).toHaveAttribute(
|
||||||
|
'data-state',
|
||||||
|
'checked'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it.each(Object.values(Study))('can set %s study', async (study) => {
|
||||||
|
render(<CandlesMenu />);
|
||||||
|
|
||||||
|
await openDropdown();
|
||||||
|
|
||||||
|
const menu = within(await screen.findByRole('menu'));
|
||||||
|
|
||||||
|
await userEvent.click(menu.getByText(studyLabels[study as Study]));
|
||||||
|
|
||||||
|
// re-open the dropdown
|
||||||
|
await openDropdown();
|
||||||
|
|
||||||
|
expect(screen.getByText(studyLabels[study as Study])).toHaveAttribute(
|
||||||
|
'data-state',
|
||||||
|
'checked'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render with the correct default studies and overlays', async () => {
|
||||||
|
useCandlesChartSettingsStore.setState(DEFAULT_CHART_SETTINGS);
|
||||||
|
|
||||||
render(<CandlesMenu />);
|
render(<CandlesMenu />);
|
||||||
|
|
||||||
await userEvent.click(
|
await userEvent.click(
|
||||||
screen.getByRole('button', {
|
screen.getByRole('button', {
|
||||||
name: 'Overlays',
|
name: 'Indicators',
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
expect(await screen.findByRole('menu')).toBeInTheDocument();
|
const menu = within(await screen.findByRole('menu'));
|
||||||
expect(screen.getByText('Moving average')).toHaveAttribute(
|
|
||||||
|
expect(menu.getByText(studyLabels.volume)).toHaveAttribute(
|
||||||
|
'data-state',
|
||||||
|
'checked'
|
||||||
|
);
|
||||||
|
expect(menu.getByText(studyLabels.macd)).toHaveAttribute(
|
||||||
|
'data-state',
|
||||||
|
'checked'
|
||||||
|
);
|
||||||
|
expect(menu.getByText(overlayLabels.movingAverage)).toHaveAttribute(
|
||||||
'data-state',
|
'data-state',
|
||||||
'checked'
|
'checked'
|
||||||
);
|
);
|
||||||
|
@ -107,7 +107,7 @@ export const CandlesMenu = () => {
|
|||||||
trigger={
|
trigger={
|
||||||
<TradingDropdownTrigger className={triggerClasses}>
|
<TradingDropdownTrigger className={triggerClasses}>
|
||||||
<TradingButton {...triggerButtonProps}>
|
<TradingButton {...triggerButtonProps}>
|
||||||
{t('Overlays')}
|
{t('Indicators')}
|
||||||
</TradingButton>
|
</TradingButton>
|
||||||
</TradingDropdownTrigger>
|
</TradingDropdownTrigger>
|
||||||
}
|
}
|
||||||
@ -132,18 +132,6 @@ export const CandlesMenu = () => {
|
|||||||
<TradingDropdownItemIndicator />
|
<TradingDropdownItemIndicator />
|
||||||
</TradingDropdownCheckboxItem>
|
</TradingDropdownCheckboxItem>
|
||||||
))}
|
))}
|
||||||
</TradingDropdownContent>
|
|
||||||
</TradingDropdown>
|
|
||||||
<TradingDropdown
|
|
||||||
trigger={
|
|
||||||
<TradingDropdownTrigger className={triggerClasses}>
|
|
||||||
<TradingButton {...triggerButtonProps}>
|
|
||||||
{t('Studies')}
|
|
||||||
</TradingButton>
|
|
||||||
</TradingDropdownTrigger>
|
|
||||||
}
|
|
||||||
>
|
|
||||||
<TradingDropdownContent align={contentAlign}>
|
|
||||||
{Object.values(Study).map((study) => (
|
{Object.values(Study).map((study) => (
|
||||||
<TradingDropdownCheckboxItem
|
<TradingDropdownCheckboxItem
|
||||||
key={study}
|
key={study}
|
||||||
|
@ -24,7 +24,7 @@ const STUDY_ORDER: Study[] = [
|
|||||||
Study.VOLUME,
|
Study.VOLUME,
|
||||||
];
|
];
|
||||||
|
|
||||||
const DEFAULT_CHART_SETTINGS = {
|
export const DEFAULT_CHART_SETTINGS = {
|
||||||
interval: Interval.I15M,
|
interval: Interval.I15M,
|
||||||
type: ChartType.CANDLE,
|
type: ChartType.CANDLE,
|
||||||
overlays: [Overlay.MOVING_AVERAGE],
|
overlays: [Overlay.MOVING_AVERAGE],
|
||||||
|
Loading…
Reference in New Issue
Block a user