fiddy/apps/web/__tests__/bucket-usage.test.ts
Nico f8e426542d
Some checks failed
Build & Deploy Fiddy (Dokploy) / build (push) Has been cancelled
Build & Deploy Fiddy (Dokploy) / deploy (push) Has been cancelled
feat: implement schedules pivot, scheduler service, and dokploy deploy flow
2026-02-15 17:10:58 -08:00

66 lines
3.1 KiB
TypeScript

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