1+ import { test , expect } from '@playwright/test' ;
2+
3+ const STORE_FRONT_URL = process . env . STORE_FRONT_URL || 'http://' ;
4+
5+ test . describe ( 'store-front tests' , ( ) => {
6+ test . skip ( STORE_FRONT_URL === 'http://' , 'STORE_FRONT_URL is not set' ) ;
7+
8+ test ( 'has title' , async ( { page } ) => {
9+ await page . goto ( STORE_FRONT_URL ) ;
10+ await expect ( page ) . toHaveTitle ( / C o n t o s o P e t S t o r e / ) ;
11+ } ) ;
12+
13+ test ( 'has products and cart links' , async ( { page } ) => {
14+ await page . goto ( STORE_FRONT_URL ) ;
15+ await page . getByRole ( 'link' , { name : / P r o d u c t s / } ) . click ( ) ;
16+ await page . getByRole ( 'link' , { name : / C a r t / } ) . click ( ) ;
17+ } ) ;
18+
19+ test ( 'can navigate to product details and add one to cart' , async ( { page } ) => {
20+ await page . goto ( STORE_FRONT_URL ) ;
21+
22+ await page . locator ( '.product-list .product-card' ) . first ( ) . click ( )
23+ await expect ( page . url ( ) ) . toContain ( 'product' )
24+ await expect ( page . locator ( '.product-info h2' ) ) . toHaveText ( "Contoso Catnip's Friend" ) ;
25+
26+ const cartLink = page . getByRole ( 'link' , { name : / C a r t \( \d + \) / } ) ;
27+ const initialCartCount = parseInt ( ( await cartLink . textContent ( ) || '' ) . match ( / \d + / ) ?. [ 0 ] || '0' ) ;
28+
29+ await page . getByRole ( 'button' , { name : / A d d t o C a r t / } ) . click ( ) ;
30+ await expect ( cartLink ) . toHaveText ( `Cart (${ initialCartCount + 1 } )` ) ;
31+ } ) ;
32+
33+ test ( 'can add one to cart from home page' , async ( { page } ) => {
34+ await page . goto ( STORE_FRONT_URL ) ;
35+
36+ await expect ( page . locator ( '.product-list' ) ) . toBeVisible ( ) ;
37+
38+ const cartLink = page . getByRole ( 'link' , { name : / C a r t \( \d + \) / } ) ;
39+ const initialCartCount = parseInt ( ( await cartLink . textContent ( ) || '' ) . match ( / \d + / ) ?. [ 0 ] || '0' ) ;
40+
41+ const firstProduct = page . locator ( '.product-list .product-controls' ) . first ( ) ;
42+ await firstProduct . getByRole ( 'button' , { name : / A d d t o C a r t / } ) . click ( ) ;
43+
44+ await expect ( cartLink ) . toHaveText ( `Cart (${ initialCartCount + 1 } )` ) ;
45+ } ) ;
46+
47+ test ( 'can add multiple items to cart from home page' , async ( { page } ) => {
48+ await page . goto ( STORE_FRONT_URL ) ;
49+
50+ await expect ( page . locator ( '.product-list' ) ) . toBeVisible ( ) ;
51+
52+ const cartLink = page . getByRole ( 'link' , { name : / C a r t \( \d + \) / } ) ;
53+ const initialCartCount = parseInt ( ( await cartLink . textContent ( ) || '' ) . match ( / \d + / ) ?. [ 0 ] || '0' ) ;
54+
55+ const firstProduct = page . locator ( '.product-list .product-controls' ) . first ( ) ;
56+ await firstProduct . getByRole ( 'button' , { name : / A d d t o C a r t / } ) . click ( ) ;
57+
58+ const lastProduct = page . locator ( '.product-list .product-controls' ) . last ( ) ;
59+ await lastProduct . getByRole ( 'button' , { name : / A d d t o C a r t / } ) . click ( ) ;
60+
61+ await expect ( cartLink ) . toHaveText ( `Cart (${ initialCartCount + 2 } )` ) ;
62+ } ) ;
63+
64+ test ( 'can place an order' , async ( { page } ) => {
65+ await page . goto ( STORE_FRONT_URL ) ;
66+
67+ await expect ( page . locator ( '.product-list' ) ) . toBeVisible ( ) ;
68+
69+ const firstProduct = page . locator ( '.product-list .product-controls' ) . first ( ) ;
70+ await firstProduct . getByRole ( 'button' , { name : / A d d t o C a r t / } ) . click ( ) ;
71+
72+ const lastProduct = page . locator ( '.product-list .product-controls' ) . last ( ) ;
73+ await lastProduct . getByRole ( 'button' , { name : / A d d t o C a r t / } ) . click ( ) ;
74+
75+ await page . getByRole ( 'link' , { name : / C a r t \( \d + \) / } ) . click ( ) ;
76+ await page . getByRole ( 'button' , { name : 'Checkout' } ) . click ( ) ;
77+
78+ page . on ( 'dialog' , async dialog => {
79+ expect ( dialog . message ( ) ) . toContain ( 'Order submitted successfully' ) ;
80+ await dialog . accept ( ) ;
81+ } ) ;
82+ } ) ;
83+ } ) ;
0 commit comments