initial commit

This commit is contained in:
chungyeong
2026-02-19 17:28:58 +09:00
commit 02970df6af
34 changed files with 5673 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
"use strict";
const test = require("node:test");
const assert = require("node:assert/strict");
const { InMemoryDashboardStore } = require("../src/dashboardStore");
test("in-memory store persists watch, poll result, events and controls", async () => {
const store = new InMemoryDashboardStore();
await store.init();
await store.saveWatch({
id: "watch-1",
rawInput: "인천->마드리드",
searchParams: { segments: [{ from: "ICN", to: "MAD" }] },
alertRules: { targetPrice: 1300000, notifyOnPriceChange: true },
pollingEnabled: true,
alertsEnabled: true,
createdAt: "2026-02-19T00:00:00.000Z",
updatedAt: "2026-02-19T00:00:00.000Z",
lastSnapshot: null,
lastError: null,
});
await store.savePollResult("watch-1", {
snapshot: {
polledAt: "2026-02-19T00:01:00.000Z",
bestPrice: 1295000,
currency: "KRW",
bestOffer: { provider: "mock" },
offers: [{ provider: "mock", price: 1295000, currency: "KRW" }],
},
});
await store.saveEvent({
watchId: "watch-1",
eventType: "target_price",
observedAt: "2026-02-19T00:01:00.000Z",
payload: {
currentBestPrice: 1295000,
previousBestPrice: 1310000,
currency: "KRW",
},
});
const watches = await store.listWatches();
const events = await store.listEvents(5);
assert.equal(watches.length, 1);
assert.equal(watches[0].lastSnapshot.bestPrice, 1295000);
assert.equal(events.length, 1);
assert.equal(events[0].eventType, "target_price");
const controlsBefore = await store.getGlobalControls();
assert.equal(controlsBefore.crawlingEnabled, true);
assert.equal(controlsBefore.alertsEnabled, true);
await store.setGlobalControls({
crawlingEnabled: false,
alertsEnabled: false,
});
const controlsAfter = await store.getGlobalControls();
assert.equal(controlsAfter.crawlingEnabled, false);
assert.equal(controlsAfter.alertsEnabled, false);
});