1import type { Page } from "@playwright/test";
2import type { Api } from "../../../helpers/api";
3import { raiseTicket } from "../../../helpers/factories";
4import { expect, test, uid, usePersona } from "../../../helpers/fixtures";
5import { createArticle, createCategory } from "../../../helpers/portal";
6
7usePersona("customer");
8
9test.describe("ticket origin", () => {
10 test("a ticket raised from an article records that article", async ({ page, api }) => {
11 const category = await createCategory(api);
12 const article = await createArticle(api, category.name);
13
14 await page.goto(`/help/articles/${article.name}`);
15 await page.getByRole("link", { name: "here", exact: true }).click();
16 const origin = await submitTicket(page, api);
17
18 expect(origin.entry_point).toBe("Article");
19 expect(origin.source_article).toBe(article.name);
20 });
21
22 test("a ticket raised from my tickets records the ticket list", async ({ page, api }) => {
23 await page.goto("/help/my-tickets");
24 await page.getByRole("button", { name: "Raise a ticket" }).click();
25
26 expect((await submitTicket(page, api)).entry_point).toBe("Ticket List");
27 });
28
29 test("a ticket raised from a closed ticket records the closed ticket", async ({
30 page,
31 api,
32 apiAs,
33 }) => {
34 const closed = await raiseTicket(await apiAs("customer"));
35 await api.update("OD Ticket", closed.name, { status: "Closed" });
36
37 await page.goto(`/help/my-tickets/${closed.name}`);
38 await page.getByRole("button", { name: "Raise a ticket" }).click();
39
40 expect((await submitTicket(page, api)).entry_point).toBe("Closed Ticket");
41 });
42
43 test("a ticket raised from search records the search text", async ({ page, api }) => {
44 const query = `nothing matches ${uid()}`;
45
46 await page.goto(`/help/my-tickets/new?from=search&q=${encodeURIComponent(query)}`);
47 await expect(page.getByPlaceholder("A short description")).toHaveValue(query);
48 const origin = await submitTicket(page, api, { keepSubject: true });
49
50 expect(origin.entry_point).toBe("Search");
51 expect(origin.source_search).toBe(query);
52 });
53
54 test("a ticket raised without a known link is direct", async ({ page, api }) => {
55 await page.goto("/help/my-tickets/new");
56
57 expect((await submitTicket(page, api)).entry_point).toBe("Direct");
58 });
59});
60
61async function submitTicket(page: Page, api: Api, { keepSubject = false } = {}) {
62 await expect(page).toHaveURL(/\/help\/my-tickets\/new/);
63 const subjectField = page.getByPlaceholder("A short description");
64 if (!keepSubject) await subjectField.fill(`E2E origin ${uid()}`);
65 const subject = await subjectField.inputValue();
66 await page.locator(".ProseMirror").fill("Where did this start?");
67 await page.getByRole("button", { name: "Create ticket" }).click();
68 await expect(page).toHaveURL(/\/help\/my-tickets\/\d+$/);
69
70 const [ticket] = await api.list("OD Ticket", {
71 filters: { subject },
72 fields: ["entry_point", "source_article", "source_search"],
73 });
74 return ticket;
75}
76