152 lines
5.1 KiB
TypeScript
152 lines
5.1 KiB
TypeScript
import { HttpResponse, http } from 'msw'
|
|
import {
|
|
mockAnalytics,
|
|
mockAuthResponse,
|
|
mockBond,
|
|
mockBondHistory,
|
|
mockBrokerAccounts,
|
|
mockBrokerEvents,
|
|
mockBrokerOperations,
|
|
mockBrokerPortfolio,
|
|
mockBrokerPositions,
|
|
mockCandles,
|
|
mockDividends,
|
|
mockEventsSummary,
|
|
mockPortfolioDetail,
|
|
mockPortfolios,
|
|
mockPositions,
|
|
mockScreenerItems,
|
|
mockSearchResults,
|
|
mockShare,
|
|
mockShareHistory,
|
|
mockUser,
|
|
} from './data'
|
|
import { envelope } from './utils'
|
|
|
|
const API = '/api/v1'
|
|
|
|
export const handlers = [
|
|
http.get(`${API}/health`, () =>
|
|
HttpResponse.json(
|
|
envelope({ status: 'ok', timestamp: new Date().toISOString(), uptime: 12345 }),
|
|
),
|
|
),
|
|
|
|
http.get(`${API}/auth/me`, () => HttpResponse.json(envelope(mockUser))),
|
|
http.patch(`${API}/auth/me`, () => HttpResponse.json(envelope({ ...mockUser, name: 'Updated' }))),
|
|
http.post(`${API}/auth/login`, () => HttpResponse.json(envelope(mockAuthResponse))),
|
|
http.post(`${API}/auth/register`, () => HttpResponse.json(envelope(mockAuthResponse))),
|
|
http.post(`${API}/auth/refresh`, () => HttpResponse.json(envelope(mockAuthResponse))),
|
|
http.post(`${API}/auth/logout`, () => HttpResponse.json(envelope({ message: 'Logged out' }))),
|
|
|
|
http.get(`${API}/securities/search`, ({ request }) => {
|
|
const url = new URL(request.url)
|
|
const q = url.searchParams.get('q') || ''
|
|
if (q.length < 2) return HttpResponse.json(envelope([]))
|
|
const filtered = mockSearchResults.filter(
|
|
(r) =>
|
|
r.secid.toLowerCase().includes(q.toLowerCase()) ||
|
|
r.shortName.toLowerCase().includes(q.toLowerCase()),
|
|
)
|
|
return HttpResponse.json(envelope(filtered))
|
|
}),
|
|
|
|
http.get(`${API}/securities/shares/:secid`, ({ params }) => {
|
|
const { secid } = params
|
|
if (secid === 'NOTFOUND') return new HttpResponse(null, { status: 404 })
|
|
return HttpResponse.json(envelope({ ...mockShare, secid }))
|
|
}),
|
|
http.get(`${API}/securities/shares/:secid/marketdata`, () =>
|
|
HttpResponse.json(envelope(mockShare.marketData)),
|
|
),
|
|
http.get(`${API}/securities/shares/:secid/dividends`, () =>
|
|
HttpResponse.json(envelope(mockDividends)),
|
|
),
|
|
http.get(`${API}/securities/shares/:secid/history`, () =>
|
|
HttpResponse.json(envelope(mockShareHistory)),
|
|
),
|
|
http.get(`${API}/securities/shares/:secid/candles`, () =>
|
|
HttpResponse.json(envelope(mockCandles)),
|
|
),
|
|
|
|
http.get(`${API}/securities/bonds/:secid`, ({ params }) => {
|
|
const { secid } = params
|
|
if (secid === 'NOTFOUND') return new HttpResponse(null, { status: 404 })
|
|
return HttpResponse.json(envelope({ ...mockBond, secid }))
|
|
}),
|
|
http.get(`${API}/securities/bonds/:secid/marketdata`, () =>
|
|
HttpResponse.json(envelope(mockBond.marketData)),
|
|
),
|
|
http.get(`${API}/securities/bonds/:secid/history`, () =>
|
|
HttpResponse.json(envelope(mockBondHistory)),
|
|
),
|
|
http.get(`${API}/securities/bonds/:secid/candles`, () =>
|
|
HttpResponse.json(envelope(mockCandles)),
|
|
),
|
|
|
|
http.get(`${API}/securities/screener`, () =>
|
|
HttpResponse.json(
|
|
envelope({
|
|
items: mockScreenerItems,
|
|
total: mockScreenerItems.length,
|
|
page: 1,
|
|
pageSize: 20,
|
|
totalPages: 1,
|
|
}),
|
|
),
|
|
),
|
|
|
|
http.get(`${API}/portfolios`, () => HttpResponse.json(envelope(mockPortfolios))),
|
|
http.post(`${API}/portfolios`, () => HttpResponse.json(envelope(mockPortfolios[0]))),
|
|
http.get(`${API}/portfolios/:id`, () => HttpResponse.json(envelope(mockPortfolioDetail))),
|
|
http.patch(`${API}/portfolios/:id`, () => HttpResponse.json(envelope(mockPortfolios[0]))),
|
|
http.delete(`${API}/portfolios/:id`, () => HttpResponse.json(envelope(null))),
|
|
http.post(`${API}/portfolios/:id/positions`, () => HttpResponse.json(envelope(mockPositions[0]))),
|
|
http.patch(`${API}/portfolios/:id/positions/:positionId`, () =>
|
|
HttpResponse.json(envelope(mockPositions[0])),
|
|
),
|
|
http.delete(`${API}/portfolios/:id/positions/:positionId`, () =>
|
|
HttpResponse.json(envelope(null)),
|
|
),
|
|
http.get(`${API}/portfolios/:id/analytics`, () => HttpResponse.json(envelope(mockAnalytics))),
|
|
|
|
http.get(`${API}/broker/accounts`, () => HttpResponse.json(envelope(mockBrokerAccounts))),
|
|
http.get(`${API}/broker/accounts/:accountId/portfolio`, () =>
|
|
HttpResponse.json(envelope(mockBrokerPortfolio)),
|
|
),
|
|
http.get(`${API}/broker/accounts/:accountId/positions`, () =>
|
|
HttpResponse.json(
|
|
envelope({
|
|
accountId: '2084014113',
|
|
items: mockBrokerPositions,
|
|
nextCursor: null,
|
|
hasNext: false,
|
|
asOf: '2024-06-01T10:00:00Z',
|
|
}),
|
|
),
|
|
),
|
|
http.get(`${API}/broker/accounts/:accountId/operations`, () =>
|
|
HttpResponse.json(
|
|
envelope({
|
|
accountId: '2084014113',
|
|
items: mockBrokerOperations,
|
|
nextCursor: null,
|
|
hasNext: false,
|
|
asOf: '2024-06-01T10:00:00Z',
|
|
}),
|
|
),
|
|
),
|
|
http.get(`${API}/broker/accounts/:accountId/events`, () =>
|
|
HttpResponse.json(
|
|
envelope({
|
|
items: mockBrokerEvents,
|
|
summary: mockEventsSummary,
|
|
asOf: '2024-06-01T10:00:00Z',
|
|
}),
|
|
),
|
|
),
|
|
http.post(`${API}/broker/accounts/:accountId/operations/sync`, () =>
|
|
HttpResponse.json(envelope({ upserted: 5 })),
|
|
),
|
|
]
|