97 lines
2.6 KiB
TypeScript
97 lines
2.6 KiB
TypeScript
import { stringify } from "superjson";
|
|
import { describe, expect, it } from "vitest";
|
|
|
|
import type { Session } from "@homarr/auth";
|
|
import { createId } from "@homarr/common";
|
|
import { eq } from "@homarr/db";
|
|
import { boards, sectionCollapseStates, sections, users } from "@homarr/db/schema";
|
|
import { createDb } from "@homarr/db/test";
|
|
|
|
import { sectionRouter } from "../section/section-router";
|
|
|
|
const userId = createId();
|
|
const session = {
|
|
user: {
|
|
id: userId,
|
|
permissions: [],
|
|
colorScheme: "light",
|
|
},
|
|
expires: new Date().toISOString(),
|
|
} satisfies Session;
|
|
|
|
const createCallerAsync = async () => {
|
|
const db = createDb();
|
|
const boardId = createId();
|
|
|
|
await db.insert(users).values({ id: userId });
|
|
await db.insert(boards).values({
|
|
id: boardId,
|
|
name: createId(),
|
|
creatorId: userId,
|
|
});
|
|
|
|
return {
|
|
boardId,
|
|
db,
|
|
caller: sectionRouter.createCaller({
|
|
db,
|
|
deviceType: undefined,
|
|
session,
|
|
}),
|
|
};
|
|
};
|
|
|
|
describe("changeCollapsed", () => {
|
|
it("preserves collapse support for legacy categories", async () => {
|
|
const { boardId, caller, db } = await createCallerAsync();
|
|
const sectionId = createId();
|
|
await db.insert(sections).values({
|
|
id: sectionId,
|
|
boardId,
|
|
kind: "category",
|
|
name: "Media",
|
|
xOffset: 0,
|
|
yOffset: 0,
|
|
});
|
|
|
|
await caller.changeCollapsed({ sectionId, collapsed: true });
|
|
|
|
const state = await db.query.sectionCollapseStates.findFirst({
|
|
where: eq(sectionCollapseStates.sectionId, sectionId),
|
|
});
|
|
expect(state?.collapsed).toBe(true);
|
|
});
|
|
|
|
it("creates and updates collapse state for an enabled dynamic section", async () => {
|
|
const { boardId, caller, db } = await createCallerAsync();
|
|
const sectionId = createId();
|
|
await db.insert(sections).values({
|
|
id: sectionId,
|
|
boardId,
|
|
kind: "dynamic",
|
|
options: stringify({ collapsible: true }),
|
|
});
|
|
|
|
await caller.changeCollapsed({ sectionId, collapsed: true });
|
|
await caller.changeCollapsed({ sectionId, collapsed: false });
|
|
|
|
const states = await db.query.sectionCollapseStates.findMany({
|
|
where: eq(sectionCollapseStates.sectionId, sectionId),
|
|
});
|
|
expect(states).toHaveLength(1);
|
|
expect(states[0]?.collapsed).toBe(false);
|
|
});
|
|
|
|
it("rejects a dynamic section when collapsing is disabled", async () => {
|
|
const { boardId, caller, db } = await createCallerAsync();
|
|
const sectionId = createId();
|
|
await db.insert(sections).values({
|
|
id: sectionId,
|
|
boardId,
|
|
kind: "dynamic",
|
|
});
|
|
|
|
await expect(caller.changeCollapsed({ sectionId, collapsed: true })).rejects.toThrow("Section cannot be collapsed");
|
|
});
|
|
});
|