From fbafc726a4aefa32cf4836ca513f619c78547fc6 Mon Sep 17 00:00:00 2001 From: Matthew Russell Date: Fri, 27 Oct 2023 06:21:14 -0700 Subject: [PATCH] feat(candles-chart): combine overlays and studies into indicators dropdown (#5129) --- .../src/lib/candles-menu.spec.tsx | 76 ++++++++++++++++--- libs/candles-chart/src/lib/candles-menu.tsx | 14 +--- .../src/lib/use-candles-chart-settings.ts | 2 +- 3 files changed, 66 insertions(+), 26 deletions(-) diff --git a/libs/candles-chart/src/lib/candles-menu.spec.tsx b/libs/candles-chart/src/lib/candles-menu.spec.tsx index 9289581bd..a2964685a 100644 --- a/libs/candles-chart/src/lib/candles-menu.spec.tsx +++ b/libs/candles-chart/src/lib/candles-menu.spec.tsx @@ -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 { CandlesMenu } from './candles-menu'; +import { + useCandlesChartSettingsStore, + DEFAULT_CHART_SETTINGS, +} from './use-candles-chart-settings'; +import { Overlay, Study, overlayLabels, studyLabels } from 'pennant'; describe('CandlesMenu', () => { - it('should render with the correct default studies', async () => { - render(); - + const openDropdown = async () => { await userEvent.click( 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(); + + 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(); + + 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(); await userEvent.click( screen.getByRole('button', { - name: 'Overlays', + name: 'Indicators', }) ); - expect(await screen.findByRole('menu')).toBeInTheDocument(); - expect(screen.getByText('Moving average')).toHaveAttribute( + const menu = within(await screen.findByRole('menu')); + + 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', 'checked' ); diff --git a/libs/candles-chart/src/lib/candles-menu.tsx b/libs/candles-chart/src/lib/candles-menu.tsx index cc5b62e40..06d83fbb3 100644 --- a/libs/candles-chart/src/lib/candles-menu.tsx +++ b/libs/candles-chart/src/lib/candles-menu.tsx @@ -107,7 +107,7 @@ export const CandlesMenu = () => { trigger={ - {t('Overlays')} + {t('Indicators')} } @@ -132,18 +132,6 @@ export const CandlesMenu = () => { ))} - - - - - {t('Studies')} - - - } - > - {Object.values(Study).map((study) => (