11import { test , expect } from '@playwright/test' ;
22
33test . describe ( 'API Integration' , ( ) => {
4- test ( 'should fetch dogs from API' , async ( { page } ) => {
5- // Mock successful API response
6- await page . route ( '/api/dogs' , route => {
7- route . fulfill ( {
8- status : 200 ,
9- contentType : 'application/json' ,
10- body : JSON . stringify ( [
11- { id : 1 , name : 'Buddy' , breed : 'Golden Retriever' } ,
12- { id : 2 , name : 'Luna' , breed : 'Husky' } ,
13- { id : 3 , name : 'Max' , breed : 'Labrador' }
14- ] )
15- } ) ;
16- } ) ;
17-
4+ test ( 'should render dogs from the mock API on the homepage' , async ( { page } ) => {
185 await page . goto ( '/' ) ;
19-
20- // Check that mocked dogs are displayed
21- await expect ( page . getByText ( 'Buddy' ) ) . toBeVisible ( ) ;
22- await expect ( page . getByText ( 'Golden Retriever' ) ) . toBeVisible ( ) ;
23- await expect ( page . getByText ( 'Luna' ) ) . toBeVisible ( ) ;
24- await expect ( page . getByText ( 'Husky' ) ) . toBeVisible ( ) ;
25- await expect ( page . getByText ( 'Max' ) ) . toBeVisible ( ) ;
26- await expect ( page . getByText ( 'Labrador' ) ) . toBeVisible ( ) ;
6+
7+ const dogCards = page . getByTestId ( 'dog-card' ) ;
8+ await expect ( dogCards ) . toHaveCount ( 3 ) ;
9+
10+ await expect ( page . getByTestId ( 'dog-name' ) . nth ( 0 ) ) . toHaveText ( 'Buddy' ) ;
11+ await expect ( page . getByTestId ( 'dog-breed' ) . nth ( 0 ) ) . toHaveText ( 'Golden Retriever' ) ;
12+
13+ await expect ( page . getByTestId ( 'dog-name' ) . nth ( 1 ) ) . toHaveText ( 'Luna' ) ;
14+ await expect ( page . getByTestId ( 'dog-breed' ) . nth ( 1 ) ) . toHaveText ( 'Husky' ) ;
15+
16+ await expect ( page . getByTestId ( 'dog-name' ) . nth ( 2 ) ) . toHaveText ( 'Max' ) ;
17+ await expect ( page . getByTestId ( 'dog-breed' ) . nth ( 2 ) ) . toHaveText ( 'German Shepherd' ) ;
2718 } ) ;
2819
29- test ( 'should handle empty dog list' , async ( { page } ) => {
30- // Mock empty API response
31- await page . route ( '/api/dogs' , route => {
32- route . fulfill ( {
33- status : 200 ,
34- contentType : 'application/json' ,
35- body : JSON . stringify ( [ ] )
36- } ) ;
37- } ) ;
20+ test ( 'should render dog details from the mock API' , async ( { page } ) => {
21+ await page . goto ( '/dog/1' ) ;
3822
39- await page . goto ( '/' ) ;
40-
41- // Check that empty state message is displayed
42- await expect ( page . getByText ( 'No dogs available at the moment' ) ) . toBeVisible ( ) ;
23+ await expect ( page . getByTestId ( 'dog-details' ) ) . toBeVisible ( ) ;
24+ await expect ( page . getByTestId ( 'dog-name' ) ) . toHaveText ( 'Buddy' ) ;
25+ await expect ( page . getByTestId ( 'dog-breed' ) ) . toContainText ( 'Golden Retriever' ) ;
26+ await expect ( page . getByTestId ( 'dog-age' ) ) . toContainText ( '3' ) ;
27+ await expect ( page . getByTestId ( 'dog-gender' ) ) . toContainText ( 'Male' ) ;
28+ await expect ( page . getByTestId ( 'dog-status' ) ) . toHaveText ( 'Available' ) ;
4329 } ) ;
4430
45- test ( 'should handle network errors' , async ( { page } ) => {
46- // Mock network error
47- await page . route ( '/api/dogs' , route => {
48- route . abort ( 'failed' ) ;
49- } ) ;
31+ test ( 'should return 404 details for non-existent dog' , async ( { page } ) => {
32+ await page . goto ( '/dog/99999' ) ;
33+
34+ await expect ( page . getByTestId ( 'error-message' ) ) . toBeVisible ( ) ;
35+ await expect ( page . getByTestId ( 'error-message' ) ) . toContainText ( 'not found' ) ;
36+ } ) ;
5037
38+ test ( 'should link from dog card to detail page' , async ( { page } ) => {
5139 await page . goto ( '/' ) ;
52-
53- // Check that error message is displayed
54- await expect ( page . getByText ( / E r r o r : / ) ) . toBeVisible ( { timeout : 10000 } ) ;
40+
41+ const firstCard = page . getByTestId ( 'dog-card' ) . first ( ) ;
42+ await firstCard . click ( ) ;
43+
44+ await expect ( page ) . toHaveURL ( / \/ d o g \/ 1 $ / ) ;
45+ await expect ( page . getByTestId ( 'dog-details' ) ) . toBeVisible ( ) ;
5546 } ) ;
56- } ) ;
47+ } ) ;
0 commit comments