69 lines
2.3 KiB
TypeScript
69 lines
2.3 KiB
TypeScript
import { describe, expect, it } from "bun:test";
|
|
import { DEFAULT_SYNTHETIC_CONTROL_STATE } from "@islandflow/types";
|
|
import {
|
|
buildSyntheticDerivedStatus,
|
|
createRollingSyntheticProfileHits,
|
|
getSyntheticBackendDisabledReason,
|
|
getSyntheticProfileHitCounts,
|
|
recordSyntheticProfileHit,
|
|
resolveSyntheticBackendMode
|
|
} from "../src/synthetic-control";
|
|
|
|
describe("synthetic control backend mode", () => {
|
|
it("detects synthetic, mixed, and live hosted modes", () => {
|
|
expect(resolveSyntheticBackendMode("synthetic", "synthetic")).toBe("synthetic");
|
|
expect(resolveSyntheticBackendMode("synthetic", "alpaca")).toBe("mixed");
|
|
expect(resolveSyntheticBackendMode("alpaca", "alpaca")).toBe("live");
|
|
});
|
|
|
|
it("provides a useful disabled reason for non-synthetic modes", () => {
|
|
expect(getSyntheticBackendDisabledReason("mixed")).toContain("both hosted ingest adapters");
|
|
expect(getSyntheticBackendDisabledReason("live")).toContain("not synthetic");
|
|
});
|
|
});
|
|
|
|
describe("synthetic control rolling status", () => {
|
|
it("tracks public-profile hits inside the rolling coverage window", () => {
|
|
const hits = createRollingSyntheticProfileHits();
|
|
|
|
recordSyntheticProfileHit(hits, {
|
|
primary_profile_id: "event_driven",
|
|
source_ts: 1_000
|
|
});
|
|
recordSyntheticProfileHit(hits, {
|
|
primary_profile_id: "event_driven",
|
|
source_ts: 60_000
|
|
});
|
|
recordSyntheticProfileHit(hits, {
|
|
primary_profile_id: "arbitrage",
|
|
source_ts: 70_000
|
|
});
|
|
|
|
expect(getSyntheticProfileHitCounts(hits, 11 * 60_000, 10)).toEqual({
|
|
institutional_directional: 0,
|
|
retail_whale: 0,
|
|
event_driven: 1,
|
|
vol_seller: 0,
|
|
arbitrage: 1,
|
|
hedge_reactive: 0
|
|
});
|
|
});
|
|
|
|
it("builds derived status from the shared session engine", () => {
|
|
const hits = createRollingSyntheticProfileHits();
|
|
recordSyntheticProfileHit(hits, {
|
|
primary_profile_id: "hedge_reactive",
|
|
source_ts: Date.parse("2026-01-14T18:00:00Z")
|
|
});
|
|
|
|
const derived = buildSyntheticDerivedStatus(
|
|
Date.parse("2026-01-14T18:05:00Z"),
|
|
DEFAULT_SYNTHETIC_CONTROL_STATE,
|
|
hits
|
|
);
|
|
|
|
expect(derived.coverage_window_minutes).toBe(20);
|
|
expect(derived.focus_symbols.length).toBeGreaterThan(0);
|
|
expect(derived.profile_hit_counts.hedge_reactive).toBe(1);
|
|
});
|
|
});
|