@@ -2,7 +2,6 @@ import { faker } from "@faker-js/faker";
22import { expect , test } from "@playwright/test" ;
33import type { Locator , Page , Response } from "@playwright/test" ;
44
5- import { LIST_RESULTS_PER_PAGE } from "@/features/abstract-resource-list/node" ;
65import { FetchError , fetchMutation , uploadFile } from "@/features/backend/node" ;
76import type {
87 MessageResponse ,
@@ -22,7 +21,6 @@ import { generateAccessToken } from "../api/generate-access-token";
2221import { MOCK_IMAGE_PATH } from "../constants" ;
2322import { expectArfSuccess } from "../utils/expect-arf-success" ;
2423import { returnFromArf } from "../utils/return-from-arf" ;
25- import { setArlSortFilters } from "../utils/set-arl-filters" ;
2624
2725const resource = Resource . GuideArticles ;
2826type 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. */
131129async 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+
142164test . 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 : / u t w ó r z / 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 : / z a p i s z / 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 : / ^ u s u ń $ / i } ) . click ( ) ;
283314
284315 await expect ( page . getByText ( / p o m y ś l n i e u s u n i ę t o a r t y k u ł / 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 }
0 commit comments