feat(candles-chart): combine overlays and studies into indicators dropdown (#5129)

This commit is contained in:
Matthew Russell 2023-10-27 06:21:14 -07:00 committed by GitHub
parent dd1890d8c6
commit fbafc726a4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 66 additions and 26 deletions

View File

@ -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'
); );

View File

@ -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}

View File

@ -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],