alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
84 lines (72 loc) • 2.5 kB
text/typescript
import { $module, Alepha } from "alepha";
import { DateTimeProvider } from "alepha/datetime";
import { $repository } from "alepha/orm";
import { AlephaOrmPostgres } from "alepha/orm/postgres";
import { describe, it } from "vitest";
import { $audit, AlephaApiAudits, AuditJobs, audits } from "../index.ts";
/**
* Audit type with a dedicated 7-day retention, to exercise the per-type
* override path through the real `$audit` registry.
*/
class ShortAudits {
audit = $audit({
type: "av-job-short",
description: "Short-lived audit type for retention tests",
actions: ["x"],
retentionDays: 7,
});
}
class Db {
audits = $repository(audits);
}
const alepha = Alepha.create()
.with(AlephaOrmPostgres)
.with(AlephaApiAudits)
.with($module({ name: "test.audits.jobs", services: [ShortAudits] }));
const db = alepha.inject(Db);
describe("AuditJobs", () => {
it("prunes expired entries by default and per-type retention", async ({
expect,
}) => {
const time = alepha.inject(DateTimeProvider);
const jobs = alepha.inject(AuditJobs);
// Ensure the $audit holder is initialized so its type is registered.
alepha.inject(ShortAudits);
const defaultType = "av-job-default";
await db.audits.deleteMany({ type: { eq: defaultType } });
await db.audits.deleteMany({ type: { eq: "av-job-short" } });
// Default-retention type (90d global default): one old, one recent.
await db.audits.create({
type: defaultType,
action: "x",
createdAt: time.now().subtract(120, "day").toISOString(),
});
await db.audits.create({
type: defaultType,
action: "x",
createdAt: time.nowISOString(),
});
// Dedicated 7-day type: one beyond its window, one within.
await db.audits.create({
type: "av-job-short",
action: "x",
createdAt: time.now().subtract(30, "day").toISOString(),
});
await db.audits.create({
type: "av-job-short",
action: "x",
createdAt: time.nowISOString(),
});
await jobs.cleanExpired.trigger();
const remainingDefault = await db.audits.findMany({
where: { type: { eq: defaultType } },
});
const remainingShort = await db.audits.findMany({
where: { type: { eq: "av-job-short" } },
});
// Old default-type entry pruned (120d > 90d), recent kept.
expect(remainingDefault.length).toBe(1);
// 30d entry pruned by the 7-day override, recent kept.
expect(remainingShort.length).toBe(1);
});
});