1
19import { test, expect } from "../fixtures";
20import { createPage } from "../utils/api";
21import type { PageDto } from "../fixtures";
22
23interface TemplateDto {
24 id: string;
25 name: string;
26 category: string | null;
27 description: string | null;
28}
29
30async function makeTemplate(
31 api: import("@playwright/test").APIRequestContext,
32 wsId: string,
33 name: string,
34 category: string,
35 description: string
36): Promise<TemplateDto> {
37 const src = (await createPage(api, wsId, { title: name })) as PageDto;
38 const res = await api.post(`/api/v1/pages/${src.id}/templates`, {
39 data: { name, category, description }
40 });
41 expect(res.status(), await res.text()).toBe(201);
42 return (await res.json()) as TemplateDto;
43}
44
45test.describe("Templates directory — T-141 (search + category)", () => {
46 test("category filter, name search, description, and Clear", async ({
47 authPage,
48 api,
49 freshWorkspace
50 }) => {
51 const ws = await freshWorkspace("Template Dir Space");
52 const meeting = await makeTemplate(api, ws.id, "Standup Notes", "meetings", "Daily team standup");
53 const incident = await makeTemplate(api, ws.id, "Incident Report", "engineering", "Post-incident writeup");
54
55 await authPage.goto(`/w/${ws.slug}/templates`);
56 await expect(authPage.getByTestId(`template-item-${meeting.id}`)).toBeVisible({ timeout: 15_000 });
57
58
59 await expect(authPage.getByTestId(`template-desc-${meeting.id}`)).toHaveText("Daily team standup");
60 await expect(authPage.getByTestId(`template-desc-${incident.id}`)).toHaveText("Post-incident writeup");
61
62
63
64
65
66 const select = authPage.getByTestId("template-category");
67 const options = await select.locator("option").allInnerTexts();
68 expect(options).toEqual(expect.arrayContaining(["All categories", "engineering", "meetings"]));
69
70
71 await select.selectOption("meetings");
72 await expect(authPage.getByTestId(`template-item-${meeting.id}`)).toBeVisible();
73 await expect(authPage.getByTestId(`template-item-${incident.id}`)).toHaveCount(0);
74
75 await expect(authPage.getByTestId(`template-category-badge-${meeting.id}`)).toHaveText("meetings");
76
77
78
79
80 await select.selectOption("");
81 const search = authPage.getByTestId("template-search");
82 await search.fill("incident");
83 await expect(authPage.getByTestId(`template-item-${incident.id}`)).toBeVisible();
84 await expect(authPage.getByTestId(`template-item-${meeting.id}`)).toHaveCount(0);
85
86
87 await authPage.getByTestId("template-clear-filters").click();
88 await expect(search).toHaveValue("");
89 await expect(select).toHaveValue("");
90 await expect(authPage.getByTestId(`template-item-${meeting.id}`)).toBeVisible();
91 await expect(authPage.getByTestId(`template-item-${incident.id}`)).toBeVisible();
92 });
93});
94