homeio
PublikFork dari doctor-io/homeio
merge-notifications.test.ts
import { describe, expect, it } from "vitest";
import { mergeNotifications } from "@/modules/system/components/status-bar/use-status-bar-data";
import type { Notification } from "@/modules/system/components/status-bar/types";
import type { NotificationRecord } from "@/lib/shared/contracts/notifications";
function persisted(id: string, title: string, createdAt: string): NotificationRecord {
return {
id,
title,
body: "",
kind: "info",
read: false,
createdAt,
} as NotificationRecord;
}
function ephemeral(id: string, title: string, createdAt: string): Notification {
return { id, title, message: "", time: "", createdAt, read: true };
}
describe("mergeNotifications", () => {
it("orders the two sources together, not one after the other", () => {
// Each list arrives sorted, so concatenating them left yesterday's app
// events above a snapshot from minutes ago.
const merged = mergeNotifications(
[
persisted("a", "App Redeployed", "2026-09-09T20:25:00.000Z"),
persisted("b", "App Installed", "2026-09-09T20:23:00.000Z"),
],
[
ephemeral("system-snapshot", "System Snapshot", "2026-09-10T21:49:00.000Z"),
ephemeral("session", "Active Session", "2026-09-10T21:48:00.000Z"),
],
);
expect(merged.map((item) => item.title)).toEqual([
"System Snapshot",
"Active Session",
"App Redeployed",
"App Installed",
]);
});
it("lets the persisted copy win when both sources carry an id", () => {
const merged = mergeNotifications(
[persisted("shared", "From the server", "2026-09-10T10:00:00.000Z")],
[ephemeral("shared", "From the client", "2026-09-10T11:00:00.000Z")],
);
expect(merged).toHaveLength(1);
expect(merged[0].title).toBe("From the server");
});
it("keeps the newest when there are more than fit", () => {
const many = Array.from({ length: 25 }, (_, index) =>
ephemeral(`e${index}`, `Event ${index}`, new Date(2026, 0, 1, 0, index).toISOString()),
);
const merged = mergeNotifications([], many);
expect(merged).toHaveLength(20);
expect(merged[0].title).toBe("Event 24");
});
});