Files
AITrader/tests/alpaca-bars.spec.ts
T

41 lines
1.7 KiB
TypeScript

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);
});
});