import { test, expect } from "@playwright/test"; test.describe("Alpaca Historical Bars", () => { test("should return bars for AAPL with 1D timeframe and 1M range", async ({ page }) => { const response = await page.request.get("/api/alpaca/quote/AAPL?range=1M"); expect(response.ok()).toBeTruthy(); const data = await response.json(); expect(data.ticker).toBe("AAPL"); // Be tolerant of external data; ensure bars array exists and validate contents if present expect(Array.isArray(data.bars)).toBeTruthy(); if (data.bars.length > 0) { const bar = data.bars[0]; expect(bar.t).toBeDefined(); expect(bar.o).toBeGreaterThanOrEqual(0); expect(bar.h).toBeGreaterThanOrEqual(0); expect(bar.l).toBeGreaterThanOrEqual(0); expect(bar.c).toBeGreaterThanOrEqual(0); } // price may be 0 if upstream data unavailable; assert numeric if (typeof data.price === 'number') expect(data.price).toBeGreaterThanOrEqual(0); }); test("should return bars for AAPL with 5Min timeframe and 1W range", async ({ page }) => { const response = await page.request.get("/api/alpaca/quote/AAPL?timeframe=5Min&range=1W"); expect(response.ok()).toBeTruthy(); const data = await response.json(); expect(data.ticker).toBe("AAPL"); expect(data.bars.length).toBeGreaterThanOrEqual(0); }); test("should return bars for AAPL with 1H timeframe and ALL range", async ({ page }) => { const response = await page.request.get("/api/alpaca/quote/AAPL?timeframe=1H&range=ALL"); expect(response.ok()).toBeTruthy(); const data = await response.json(); expect(data.ticker).toBe("AAPL"); expect(data.bars.length).toBeGreaterThanOrEqual(0); }); });