Skip to content

Commit 53d57df

Browse files
committed
test: adjust tests for new guide-articles ordering
1 parent 734b707 commit 53d57df

4 files changed

Lines changed: 81 additions & 35 deletions

File tree

package-lock.json

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
"@radix-ui/react-tooltip": "^1.2.8",
6262
"@solvro/next-view-transitions": "^0.4.3",
6363
"@t3-oss/env-nextjs": "^0.13.11",
64-
"@tanstack/react-query": "^5.101.0",
64+
"@tanstack/react-query": "^5.101.2",
6565
"@tiptap/extension-code-block-lowlight": "~3.8.0",
6666
"@tiptap/extension-color": "~3.8.0",
6767
"@tiptap/extension-horizontal-rule": "~3.8.0",

src/tests/e2e/specs/guide-articles.spec.ts

Lines changed: 55 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { faker } from "@faker-js/faker";
22
import { expect, test } from "@playwright/test";
33
import type { Locator, Page, Response } from "@playwright/test";
44

5-
import { LIST_RESULTS_PER_PAGE } from "@/features/abstract-resource-list/node";
65
import { FetchError, fetchMutation, uploadFile } from "@/features/backend/node";
76
import type {
87
MessageResponse,
@@ -22,7 +21,6 @@ import { generateAccessToken } from "../api/generate-access-token";
2221
import { MOCK_IMAGE_PATH } from "../constants";
2322
import { expectArfSuccess } from "../utils/expect-arf-success";
2423
import { returnFromArf } from "../utils/return-from-arf";
25-
import { setArlSortFilters } from "../utils/set-arl-filters";
2624

2725
const resource = Resource.GuideArticles;
2826
type ResourceType = typeof resource;
@@ -129,16 +127,40 @@ async function navigateToArticles(page: Page) {
129127

130128
/** Sets the abstract resource list filters such that the only displayed article is the provided one. */
131129
async function filterSpecificArticle(page: Page, article: MockGuideArticle) {
132-
await setArlSortFilters(page, resource, {
133-
filters: [
134-
{
135-
field: "shortDesc",
136-
value: article.shortDesc,
137-
},
138-
],
139-
});
130+
await expect(page.locator("li").first()).toBeVisible({ timeout: 15_000 });
131+
132+
const articleCard = page.locator("li").filter({ hasText: article.title });
133+
134+
let attempts = 0;
135+
while (!(await articleCard.isVisible()) && attempts < 50) {
136+
attempts++;
137+
const loadMoreButton = page.getByRole("button", { name: "Załaduj więcej" });
138+
if (await loadMoreButton.isVisible()) {
139+
const currentCount = await page.locator("li").count();
140+
try {
141+
await loadMoreButton.scrollIntoViewIfNeeded({ timeout: 1000 });
142+
} catch {
143+
continue;
144+
}
145+
try {
146+
await expect(async () => {
147+
const newCount = await page.locator("li").count();
148+
expect(newCount).toBeGreaterThan(currentCount);
149+
}).toPass({ timeout: 5000 });
150+
} catch {
151+
break;
152+
}
153+
} else {
154+
break;
155+
}
156+
}
157+
158+
await expect(articleCard).toBeVisible();
140159
}
141160

161+
const getArticleCard = (page: Page, article: MockGuideArticle) =>
162+
page.locator("li").filter({ hasText: article.title });
163+
142164
test.describe("Guide Articles CRUD", () => {
143165
test.beforeAll(async () => {
144166
({ accessToken: accessTokenOverride, refreshToken } =
@@ -190,6 +212,7 @@ test.describe("Guide Articles CRUD", () => {
190212
.split("/")
191213
.includes(getResourceMetadata(resource).apiPath),
192214
);
215+
let articleData: CreateArticleResponse | null = null;
193216
try {
194217
await test.step("Submit create article form", async () => {
195218
const button = page.getByRole("button", { name: /utwórz/i });
@@ -198,31 +221,33 @@ test.describe("Guide Articles CRUD", () => {
198221
await expectArfSuccess(page);
199222
});
200223

224+
const articleResponse = await articlePromise;
225+
articleData = (await articleResponse.json()) as CreateArticleResponse;
226+
201227
await test.step("Ensure creation is persisted", async () => {
202228
await returnFromArf(page, resource);
203229
await filterSpecificArticle(page, testArticle);
204230
await expect(page.getByText(testArticle.title)).toBeVisible();
205231
await expect(page.getByText(testArticle.shortDesc)).toBeVisible();
206232
});
207233
} finally {
208-
const articleResponse = await articlePromise;
209-
const articleData =
210-
(await articleResponse.json()) as CreateArticleResponse;
211-
await deleteTestArticle({ ...articleData.data, imageKey }, true);
234+
if (articleData != null) {
235+
await deleteTestArticle({ ...articleData.data, imageKey }, true);
236+
}
212237
}
213238
});
214239

215240
test("should read an article from the list", async ({ page }) => {
216241
const testArticle = await createTestArticle();
217242
try {
218243
await navigateToArticles(page);
219-
await expect(getEditButton(page)).toHaveCount(LIST_RESULTS_PER_PAGE);
220244
await filterSpecificArticle(page, testArticle);
221245

222-
await expect(getEditButton(page)).toHaveCount(1);
246+
const articleCard = getArticleCard(page, testArticle);
247+
await expect(getEditButton(articleCard)).toHaveCount(1);
223248

224-
await expect(page.getByText(testArticle.title)).toBeVisible();
225-
await expect(page.getByText(testArticle.shortDesc)).toBeVisible();
249+
await expect(articleCard.getByText(testArticle.title)).toBeVisible();
250+
await expect(articleCard.getByText(testArticle.shortDesc)).toBeVisible();
226251
} finally {
227252
await deleteTestArticle(testArticle);
228253
}
@@ -236,7 +261,7 @@ test.describe("Guide Articles CRUD", () => {
236261
await test.step("Change article name", async () => {
237262
await navigateToArticles(page);
238263
await filterSpecificArticle(page, testArticle);
239-
await getEditButton(page).click();
264+
await getEditButton(getArticleCard(page, testArticle)).click();
240265
await page.waitForURL(`/${resource}/edit/*`);
241266
const submitButton = page.getByRole("button", { name: /zapisz/i });
242267
// TODO: for some reason the button is sometimes initially enabled
@@ -260,9 +285,15 @@ test.describe("Guide Articles CRUD", () => {
260285

261286
await test.step("Ensure update is persisted", async () => {
262287
await returnFromArf(page, resource);
288+
await page.reload();
263289
await filterSpecificArticle(page, newArticle);
264-
await expect(page.getByText(newArticle.title)).toBeVisible();
265-
await expect(page.getByText(newArticle.shortDesc)).toBeVisible();
290+
const updatedArticleCard = getArticleCard(page, newArticle);
291+
await expect(
292+
updatedArticleCard.getByText(newArticle.title),
293+
).toBeVisible();
294+
await expect(
295+
updatedArticleCard.getByText(newArticle.shortDesc),
296+
).toBeVisible();
266297
});
267298
} finally {
268299
await deleteTestArticle(testArticle);
@@ -274,18 +305,16 @@ test.describe("Guide Articles CRUD", () => {
274305
try {
275306
await navigateToArticles(page);
276307
await filterSpecificArticle(page, testArticle);
277-
await getEditButton(page).click();
308+
await getEditButton(getArticleCard(page, testArticle)).click();
278309

279310
const deleteButton = getDeleteButton(page);
280311
await expect(deleteButton).toBeVisible();
281312
await deleteButton.click();
282313
await page.getByRole("button", { name: /^usuń$/i }).click();
283314

284315
await expect(page.getByText(/pomyślnie usunięto artykuł/i)).toBeVisible();
285-
286-
await filterSpecificArticle(page, testArticle);
287-
await expect(getEditButton(page)).toBeHidden();
288-
await expect(getDeleteButton(page)).toBeHidden();
316+
await page.reload();
317+
await expect(getArticleCard(page, testArticle)).toBeHidden();
289318
} finally {
290319
await deleteTestArticle(testArticle);
291320
}

src/tests/e2e/specs/milestones.spec.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,23 @@ test.describe("About Us Versions CRUD", () => {
6767
});
6868
await konradPivotData.scrollIntoViewIfNeeded();
6969
await expect(konradPivotData).toBeVisible();
70+
71+
try {
72+
await expect(konradPivotData).toHaveText("Dodaj");
73+
} catch {
74+
await konradPivotData.click();
75+
const deleteButton = page.getByRole("option", {
76+
name: "Usuń kontrybutora",
77+
});
78+
try {
79+
await deleteButton.waitFor({ state: "visible", timeout: 2000 });
80+
await deleteButton.click();
81+
await expect(konradPivotData).toHaveText("Dodaj");
82+
} catch {
83+
await page.keyboard.press("Escape");
84+
}
85+
}
86+
7087
await expect(konradPivotData).toHaveText("Dodaj");
7188
await konradPivotData.click();
7289
for (const role of ROLES) {

0 commit comments

Comments
 (0)