131 lines
5.0 KiB
TypeScript
131 lines
5.0 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import { test } from "node:test";
|
|
|
|
import { UniqueID } from "@repo/rdx-ddd";
|
|
|
|
import type { MailboxContext } from "../application/mailbox.repository";
|
|
import { mapMailboxInput, mapMailboxUseInput } from "../application/mailbox-input.mapper";
|
|
import { MailboxPersistenceMapper } from "../infrastructure/persistence/mailbox-persistence.mapper";
|
|
|
|
import { Mailbox } from "./mailbox.aggregate";
|
|
import { MailboxUse } from "./mailbox-use.aggregate";
|
|
import { MailboxUseValues } from "./value-objects/mailbox-use-values.vo";
|
|
import { MailboxValues } from "./value-objects/mailbox-values.vo";
|
|
|
|
const company = UniqueID.generateNewID();
|
|
const actor = UniqueID.generateNewID();
|
|
const person = UniqueID.generateNewID();
|
|
const now = "2026-10-05T10:00:00.000Z";
|
|
const fields = {
|
|
address: "Ana@Example.test",
|
|
kind: "corporate" as const,
|
|
context: null,
|
|
accountId: null,
|
|
active: true,
|
|
notes: null,
|
|
};
|
|
function values(data = fields) {
|
|
const r = MailboxValues.create(data);
|
|
assert.ok(r.isSuccess);
|
|
return r.data;
|
|
}
|
|
function create() {
|
|
const r = Mailbox.create(company, values(), actor, now);
|
|
assert.ok(r.isSuccess);
|
|
return r.data;
|
|
}
|
|
const box = create();
|
|
const ctx: MailboxContext = {
|
|
mailboxes: [box],
|
|
uses: [],
|
|
people: [{ id: person, active: true }],
|
|
items: [],
|
|
actors: new Map(),
|
|
today: "2026-10-05",
|
|
};
|
|
const period = {
|
|
mailboxId: box.id.toPrimitive(),
|
|
personId: person.toPrimitive(),
|
|
startDate: "2026-10-01",
|
|
endDate: null,
|
|
};
|
|
function useValues(
|
|
data: { mailboxId: string; personId: string; startDate: string; endDate: string | null } = period
|
|
) {
|
|
const r = MailboxUseValues.create(data);
|
|
assert.ok(r.isSuccess);
|
|
return r.data;
|
|
}
|
|
test("Buzón: identidad, dirección única, cuenta opcional, ámbito y cambios auditados", () => {
|
|
assert.equal(box.id.toPrimitive()[14], "7");
|
|
assert.equal(box.values.address.toPrimitive(), "ana@example.test");
|
|
const noOp = box.update(values(), actor, now);
|
|
assert.ok(noOp.isSuccess);
|
|
assert.equal(noOp.data, box);
|
|
const changed = box.update(values({ ...fields, active: false }), actor, now);
|
|
assert.ok(changed.isSuccess);
|
|
assert.equal(changed.data.history.length, 2);
|
|
assert.equal(changed.data.history[0]?.values.active, true);
|
|
assert.equal(mapMailboxInput(fields, ctx).isSuccess, false);
|
|
assert.ok(mapMailboxInput(fields, ctx, box).isSuccess);
|
|
assert.equal(
|
|
mapMailboxInput({ ...fields, accountId: actor.toPrimitive() }, ctx).isSuccess,
|
|
false
|
|
);
|
|
const external = MailboxValues.create({ ...fields, kind: "external" });
|
|
assert.ok(external.isSuccess);
|
|
assert.equal(box.update(external.data, actor, now).isSuccess, false);
|
|
});
|
|
test("Uso de buzón: fechas inclusiva/exclusiva, mismo día, solapes, varias personas e historial", () => {
|
|
const value = useValues();
|
|
assert.equal(value.current("2026-10-01"), true);
|
|
assert.equal(value.current("2026-09-30"), false);
|
|
const closed = useValues({ ...period, endDate: "2026-10-05" });
|
|
assert.equal(closed.current("2026-10-05"), false);
|
|
assert.equal(closed.overlaps(useValues({ ...period, startDate: "2026-10-05" })), false);
|
|
assert.equal(closed.overlaps(useValues({ ...period, startDate: "2026-10-04" })), true);
|
|
assert.equal(value.overlaps(useValues({ ...period, endDate: period.startDate })), false);
|
|
assert.equal(MailboxUseValues.create({ ...period, endDate: "2026-09-30" }).isSuccess, false);
|
|
const result = MailboxUse.create(company, value, actor, now);
|
|
assert.ok(result.isSuccess);
|
|
assert.equal(mapMailboxUseInput(period, { ...ctx, uses: [result.data] }).isSuccess, false);
|
|
assert.ok(
|
|
mapMailboxUseInput(
|
|
{ ...period, personId: actor.toPrimitive() },
|
|
{ ...ctx, people: [{ id: actor, active: true }], uses: [result.data] }
|
|
).isSuccess
|
|
);
|
|
const update = result.data.update(closed, actor, now);
|
|
assert.ok(update.isSuccess);
|
|
assert.ok(update.data.id.equals(result.data.id));
|
|
assert.equal(update.data.history.length, 2);
|
|
assert.equal(update.data.update(value, actor, now).isSuccess, false);
|
|
assert.ok(
|
|
mapMailboxUseInput(
|
|
{ ...period, endDate: "2026-10-05" },
|
|
{ ...ctx, people: [{ id: person, active: false }] },
|
|
result.data
|
|
).isSuccess
|
|
);
|
|
});
|
|
test("Buzones: mapper conserva identidad y revisiones, rechaza corrupción", () => {
|
|
const mapper = new MailboxPersistenceMapper();
|
|
const stored = mapper.toPersistence(box);
|
|
const root = {
|
|
...stored,
|
|
accountId: null,
|
|
addressKey: `${company.toPrimitive()}:ana@example.test`,
|
|
};
|
|
const restored = mapper.toDomain(root, stored.revisions);
|
|
assert.ok(restored.id.equals(box.id));
|
|
assert.throws(() => mapper.toDomain({ ...root, addressKey: "invalid" }, stored.revisions));
|
|
const use = MailboxUse.create(company, useValues(), actor, now);
|
|
assert.ok(use.isSuccess);
|
|
const rows = mapper.toPersistence(use.data);
|
|
const useRoot = { ...rows, mailboxId: box.id.toPrimitive(), personId: person.toPrimitive() };
|
|
assert.ok(mapper.toUseDomain(useRoot, rows.revisions).id.equals(use.data.id));
|
|
assert.throws(() =>
|
|
mapper.toUseDomain({ ...useRoot, personId: actor.toPrimitive() }, rows.revisions)
|
|
);
|
|
});
|