test(housekeeping): verify polls vertical
CI / runtime-diagnostics (pull_request) Skipped
CI / check (pull_request) Successful in 45s
CI / deploy (pull_request) Skipped
CI / release (pull_request) Skipped

This commit is contained in:
Simo committed 2026-09-02 20:48:35 +02:00
1 parent 766e7e20c8
commit 1f10e15c1c
28 files changed
+275 -51

No files matched your search

@@ -471,6 +471,164 @@ describe("Content query", () => {
expect(queryMocks.execute).toHaveBeenCalledTimes(5);
});
it("rejects a poll detail with 101 questions before loading results", async () => {
queryMocks.execute
.mockResolvedValueOnce([
[{ id: 7, title: "Oversized poll", status: "draft" }],
])
.mockResolvedValueOnce([
Array.from({ length: 101 }, (_, index) => ({
id: index + 1,
question: `Question ${index + 1}`,
type: "single",
sort_order: index,
options: "Yes\nNo",
})),
]);
await expect(
loadProductionContentQuery({
routeId: "content.engagement.poll-detail",
params: { id: "7" },
list: {
...normalizedResponsePage,
search: "",
pageSize: 25,
offset: 0,
},
}),
).rejects.toThrow("poll question limit");
expect(queryMocks.execute).toHaveBeenCalledTimes(2);
});
it("rejects 10001 grouped poll result rows before aggregating them", async () => {
queryMocks.execute
.mockResolvedValueOnce([
[{ id: 7, title: "Oversized results", status: "active" }],
])
.mockResolvedValueOnce([
[
{
id: 21,
question: "Favourite colour?",
type: "single",
sort_order: 0,
options: "Red\nBlue",
},
],
])
.mockResolvedValueOnce([
Array.from({ length: 10_001 }, (_, index) => ({
question_id: 21,
answer: `Choice ${index + 1}`,
answer_count: 1,
})),
]);
await expect(
loadProductionContentQuery({
routeId: "content.engagement.poll-detail",
params: { id: "7" },
list: {
...normalizedResponsePage,
search: "",
pageSize: 25,
offset: 0,
},
}),
).rejects.toThrow("poll aggregate limit");
expect(queryMocks.execute).toHaveBeenCalledTimes(3);
});
it("rejects a poll question with more than 100 parsed options", async () => {
queryMocks.execute
.mockResolvedValueOnce([
[{ id: 7, title: "Oversized options", status: "draft" }],
])
.mockResolvedValueOnce([
[
{
id: 21,
question: "Choose one",
type: "single",
sort_order: 0,
options: Array.from(
{ length: 101 },
(_, index) => `Option ${index + 1}`,
).join("\n"),
},
],
]);
await expect(
loadProductionContentQuery({
routeId: "content.engagement.poll-detail",
params: { id: "7" },
list: {
...normalizedResponsePage,
search: "",
pageSize: 25,
offset: 0,
},
}),
).rejects.toThrow("poll option limit");
expect(queryMocks.execute).toHaveBeenCalledTimes(2);
});
it.each([
["a foreign question", "999"],
["a non-text question", "21"],
])(
"falls back to the first text question for %s",
async (_label, requestedId) => {
queryMocks.execute
.mockResolvedValueOnce([
[{ id: 7, title: "Response fallback", status: "active" }],
])
.mockResolvedValueOnce([
[
{
id: 21,
question: "Favourite colour?",
type: "single",
sort_order: 0,
options: "Red\nBlue",
},
{
id: 22,
question: "What should improve?",
type: "text",
sort_order: 1,
options: "",
},
],
])
.mockResolvedValueOnce([[]])
.mockResolvedValueOnce([[{ total: 0 }]])
.mockResolvedValueOnce([[]]);
const result = await loadProductionContentQuery({
routeId: "content.engagement.poll-detail",
params: { id: "7" },
list: {
...normalizedResponsePage,
search: "",
pageSize: 25,
offset: 0,
responseQuestionId: requestedId,
},
});
expect(result.items[0]?.privatePayload).toMatchObject({
textResponses: { questionId: "22" },
});
expect(JSON.stringify(queryMocks.execute.mock.calls.slice(3))).toContain(
"22",
);
expect(queryMocks.execute).toHaveBeenCalledTimes(5);
},
);
it("returns a valid empty detail result when the selected poll is missing", async () => {
queryMocks.execute.mockResolvedValueOnce([[]]);
@@ -294,6 +294,21 @@ const approvedRuntimeImports = new Map<string, ReadonlySet<string>>([
"src/features/housekeeping/domains/content/queries/content-queries",
]),
],
[
"src/features/housekeeping/domains/content/pages/poll-workflow.tsx",
new Set([
"src/features/housekeeping/domains/content/pages/content-command-form",
"src/features/housekeeping/domains/content/pages/poll-results",
"src/features/housekeeping/domains/content/queries/content-queries",
]),
],
[
"src/features/housekeeping/domains/content/pages/poll-results.tsx",
new Set([
"src/features/housekeeping/domains/content/pages/poll-workflow",
"src/features/housekeeping/domains/content/queries/content-queries",
]),
],
[
"src/features/housekeeping/domains/content/pages/brand.tsx",
new Set([
@@ -328,6 +343,7 @@ const approvedRuntimeImports = new Map<string, ReadonlySet<string>>([
"src/features/housekeeping/domains/content/pages/content-command-form",
"src/features/housekeeping/domains/content/pages/content-page-frame",
"src/features/housekeeping/domains/content/pages/event-workflow",
"src/features/housekeeping/domains/content/pages/poll-workflow",
"src/features/housekeeping/domains/content/queries/content-queries",
]),
],
@@ -300,7 +300,7 @@ export const contentMigrationEntries: readonly MigrationEntry[] = [
targetPath: "/ase-next/content/engagement/polls/:id",
decision: "REBUILD",
capabilities: {
read: [PERMS.POLLS_EDIT],
read: [PERMS.POLLS_VIEW],
mutate: [PERMS.POLLS_EDIT],
},
dependencies: {
+4 -2
View File
@@ -281,10 +281,12 @@
"delete": "الأحداث · حذف"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "سؤال الاستطلاع · حذف"
},
"poll": {
"change": "Poll · Change"
"change": "Poll · Change",
"delete": "استطلاع · حذف"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3525,10 +3525,12 @@
"delete": "Събития · Изтрий"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Въпрос от анкетата · Изтриване"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Анкета · Изтриване"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3525,10 +3525,12 @@
"delete": "Události · Smazat"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Otázka ankety · Smazat"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Anketa · Smazat"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3525,10 +3525,12 @@
"delete": "Begivenheder · Slet"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Spørgsmål i afstemning · Slet"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Afstemning · Slet"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3526,10 +3526,12 @@
"delete": "Ereignisse · Löschen"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Umfragefrage · Löschen"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Umfrage · Löschen"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3525,10 +3525,12 @@
"delete": "Εκδηλώσεις · Διαγραφή"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Ερώτηση δημοσκόπησης · Διαγραφή"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Δημοσκόπηση · Διαγραφή"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3537,10 +3537,12 @@
"delete": "Events · Delete"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Poll question · Delete"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Polls · Delete"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3526,10 +3526,12 @@
"delete": "Eventos · Eliminar"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Pregunta de encuesta · Eliminar"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Encuesta · Eliminar"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -281,10 +281,12 @@
"delete": "Tapahtumat · Poista"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Kyselyn kysymys · Poista"
},
"poll": {
"change": "Poll · Change"
"change": "Poll · Change",
"delete": "Kysely · Poista"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3526,10 +3526,12 @@
"delete": "Événements · Supprimer"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Question du sondage · Supprimer"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Sondage · Supprimer"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3525,10 +3525,12 @@
"delete": "Događaji · Izbriši"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Pitanje ankete · Izbriši"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Anketa · Izbriši"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3525,10 +3525,12 @@
"delete": "Események · Törlés"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Szavazási kérdés · Törlés"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Szavazás · Törlés"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3535,10 +3535,12 @@
"delete": "Eventi · Elimina"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Domanda del sondaggio · Elimina"
},
"poll": {
"change": "Sondaggi · Change"
"change": "Sondaggi · Change",
"delete": "Sondaggi · Elimina"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -281,10 +281,12 @@
"delete": "イベント · 削除"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "アンケートの質問 · 削除"
},
"poll": {
"change": "Poll · Change"
"change": "Poll · Change",
"delete": "アンケート · 削除"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3440,10 +3440,12 @@
"delete": "Evenementen · Verwijderen"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Pollvraag · Verwijderen"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Polls · Verwijderen"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3525,10 +3525,12 @@
"delete": "Arrangementer · Slett"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Spørsmål i avstemning · Slett"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Avstemning · Slett"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3526,10 +3526,12 @@
"delete": "Wydarzenia · Usuń"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Pytanie ankiety · Usuń"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Ankieta · Usuń"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3526,10 +3526,12 @@
"delete": "Eventos · Eliminar"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Pergunta da sondagem · Eliminar"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Sondagem · Eliminar"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3525,10 +3525,12 @@
"delete": "Evenimente · Șterge"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Întrebare de sondaj · Șterge"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Sondaj · Șterge"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3524,10 +3524,12 @@
"delete": "События · Удалить"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Вопрос опроса · Удалить"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Опрос · Удалить"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3525,10 +3525,12 @@
"delete": "Udalosti · Odstrániť"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Otázka ankety · Odstrániť"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Anketa · Odstrániť"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3525,10 +3525,12 @@
"delete": "Događaji · Obriši"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Питање анкете · Избриши"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Анкета · Избриши"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3525,10 +3525,12 @@
"delete": "Evenemang · Ta bort"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Omröstningsfråga · Ta bort"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Omröstning · Ta bort"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3526,10 +3526,12 @@
"delete": "Etkinlikler · Sil"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Anket sorusu · Sil"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Anket · Sil"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"
+4 -2
View File
@@ -3525,10 +3525,12 @@
"delete": "Події · Видалити"
},
"poll-question": {
"change": "Poll Question change · Change"
"change": "Poll Question change · Change",
"delete": "Питання опитування · Видалити"
},
"poll": {
"change": "Polls · Change"
"change": "Polls · Change",
"delete": "Опитування · Видалити"
},
"prefix-blacklist": {
"change": "Prefix Blacklist change · Change"