test(plans): harden route navigation coverage
This commit is contained in:
parent
11e2837bc9
commit
26dfb575be
@ -53,6 +53,16 @@ vi.mock('../../views/SettingsView', () => ({
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
describe('AppShell routing fallback', () => {
|
describe('AppShell routing fallback', () => {
|
||||||
|
it('renders the plans view directly on the canonical /plans route', async () => {
|
||||||
|
render(
|
||||||
|
<MemoryRouter initialEntries={['/plans']}>
|
||||||
|
<AppShell />
|
||||||
|
</MemoryRouter>,
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(await screen.findByText('Simple view')).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
it('keeps /simple as a redirect alias to the plans view', async () => {
|
it('keeps /simple as a redirect alias to the plans view', async () => {
|
||||||
render(
|
render(
|
||||||
<MemoryRouter initialEntries={['/simple?setupId=setup-1']}>
|
<MemoryRouter initialEntries={['/simple?setupId=setup-1']}>
|
||||||
|
|||||||
84
web/src/views/PortfolioView.dom.test.tsx
Normal file
84
web/src/views/PortfolioView.dom.test.tsx
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
// @vitest-environment jsdom
|
||||||
|
import { render, screen } from '@testing-library/react';
|
||||||
|
import userEvent from '@testing-library/user-event';
|
||||||
|
import { MemoryRouter } from 'react-router-dom';
|
||||||
|
import { describe, expect, it, vi } from 'vitest';
|
||||||
|
import { PortfolioView } from './PortfolioView';
|
||||||
|
|
||||||
|
const navigateMock = vi.fn();
|
||||||
|
|
||||||
|
vi.mock('react-router-dom', async () => {
|
||||||
|
const actual = await vi.importActual<typeof import('react-router-dom')>('react-router-dom');
|
||||||
|
return {
|
||||||
|
...actual,
|
||||||
|
useNavigate: () => navigateMock,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
vi.mock('../context/AppContext', () => ({
|
||||||
|
useAppContext: () => ({
|
||||||
|
botState: {
|
||||||
|
symbols: {},
|
||||||
|
alerts: [],
|
||||||
|
positions: [],
|
||||||
|
orders: [],
|
||||||
|
history: [],
|
||||||
|
settings: {
|
||||||
|
executionMode: 'Paper',
|
||||||
|
riskPerTrade: 0.01,
|
||||||
|
totalCapital: 1000,
|
||||||
|
maxOpenTrades: 3,
|
||||||
|
isAlgoEnabled: true,
|
||||||
|
enabledRules: [],
|
||||||
|
},
|
||||||
|
uptime: 1000,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock('../tabs/PositionsTab', () => ({
|
||||||
|
PositionsTab: ({ onManageHolding }: any) => (
|
||||||
|
<div>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => onManageHolding?.({
|
||||||
|
symbol: 'AAPL',
|
||||||
|
tradeId: 'TRD-AAPL',
|
||||||
|
planEntryId: 'setup-aapl',
|
||||||
|
}, 'open-plan')}
|
||||||
|
>
|
||||||
|
open linked plan
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => onManageHolding?.({
|
||||||
|
symbol: 'MSFT',
|
||||||
|
tradeId: 'TRD-MSFT',
|
||||||
|
}, 'create-exit-plan')}
|
||||||
|
>
|
||||||
|
create exit plan
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
}));
|
||||||
|
|
||||||
|
vi.mock('../tabs/HistoryTab', () => ({
|
||||||
|
HistoryTab: () => <div>History tab</div>,
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('PortfolioView navigation', () => {
|
||||||
|
it('navigates to the canonical plans route for exact plan drill-in and new exit plans', async () => {
|
||||||
|
const user = userEvent.setup();
|
||||||
|
render(
|
||||||
|
<MemoryRouter>
|
||||||
|
<PortfolioView />
|
||||||
|
</MemoryRouter>,
|
||||||
|
);
|
||||||
|
|
||||||
|
await user.click(screen.getByRole('button', { name: 'open linked plan' }));
|
||||||
|
expect(navigateMock).toHaveBeenCalledWith('/plans?setupId=setup-aapl');
|
||||||
|
|
||||||
|
await user.click(screen.getByRole('button', { name: 'create exit plan' }));
|
||||||
|
expect(navigateMock).toHaveBeenCalledWith('/plans?mode=sell&symbol=MSFT&tradeId=TRD-MSFT');
|
||||||
|
});
|
||||||
|
});
|
||||||
Loading…
Reference in New Issue
Block a user