import { test } from "node:test"; import assert from "node:assert/strict"; import { calculateBucketUsage } from "../lib/shared/bucket-usage"; const today = "2026-02-11"; test("calculateBucketUsage matches tag subset", () => { const bucket = { tags: ["groceries", "weekly"], necessity: "BOTH" as const, windowDays: 30 }; const entries = [ { amountDollars: 20, occurredAt: "2026-02-10", necessity: "NECESSARY" as const, tags: ["groceries", "weekly", "extra"], entryType: "SPENDING" as const }, { amountDollars: 15, occurredAt: "2026-02-10", necessity: "NECESSARY" as const, tags: ["groceries"], entryType: "SPENDING" as const } ]; const result = calculateBucketUsage(bucket, entries, today); assert.equal(result.totalUsage, 20); assert.equal(result.matchedCount, 1); }); test("calculateBucketUsage ignores non-spending entries", () => { const bucket = { tags: ["rent"], necessity: "BOTH" as const, windowDays: 30 }; const entries = [ { amountDollars: 500, occurredAt: "2026-02-10", necessity: "NECESSARY" as const, tags: ["rent"], entryType: "INCOME" as const } ]; const result = calculateBucketUsage(bucket, entries, today); assert.equal(result.totalUsage, 0); assert.equal(result.matchedCount, 0); }); test("calculateBucketUsage applies windowDays filtering", () => { const bucket = { tags: [], necessity: "BOTH" as const, windowDays: 3 }; const entries = [ { amountDollars: 10, occurredAt: "2026-02-11", necessity: "NECESSARY" as const, tags: [], entryType: "SPENDING" as const }, { amountDollars: 10, occurredAt: "2026-02-09", necessity: "NECESSARY" as const, tags: [], entryType: "SPENDING" as const }, { amountDollars: 10, occurredAt: "2026-02-08", necessity: "NECESSARY" as const, tags: [], entryType: "SPENDING" as const } ]; const result = calculateBucketUsage(bucket, entries, today); assert.equal(result.totalUsage, 20); assert.equal(result.matchedCount, 2); }); test("calculateBucketUsage accepts all when bucket necessity is BOTH", () => { const bucket = { tags: [], necessity: "BOTH" as const, windowDays: 30 }; const entries = [ { amountDollars: 12, occurredAt: "2026-02-10", necessity: "NECESSARY" as const, tags: [], entryType: "SPENDING" as const }, { amountDollars: 8, occurredAt: "2026-02-10", necessity: "UNNECESSARY" as const, tags: [], entryType: "SPENDING" as const } ]; const result = calculateBucketUsage(bucket, entries, today); assert.equal(result.totalUsage, 20); assert.equal(result.matchedCount, 2); }); test("calculateBucketUsage halves BOTH entries when bucket not BOTH", () => { const bucket = { tags: [], necessity: "NECESSARY" as const, windowDays: 30 }; const entries = [ { amountDollars: 10, occurredAt: "2026-02-10", necessity: "BOTH" as const, tags: [], entryType: "SPENDING" as const }, { amountDollars: 10, occurredAt: "2026-02-10", necessity: "UNNECESSARY" as const, tags: [], entryType: "SPENDING" as const } ]; const result = calculateBucketUsage(bucket, entries, today); assert.equal(result.totalUsage, 5); assert.equal(result.matchedCount, 1); });