diff --git a/plugins/woocommerce/changelog/add-new-e2e-test-myaccount-downloads b/plugins/woocommerce/changelog/add-new-e2e-test-myaccount-downloads new file mode 100644 index 00000000000..83fb3495de0 --- /dev/null +++ b/plugins/woocommerce/changelog/add-new-e2e-test-myaccount-downloads @@ -0,0 +1,4 @@ +Significance: patch +Type: add + +Add new e2e test for Shopper My Account Downloads section diff --git a/plugins/woocommerce/tests/e2e-pw/tests/shopper/my-account-downloads.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/shopper/my-account-downloads.spec.js new file mode 100644 index 00000000000..37ed0a7e71c --- /dev/null +++ b/plugins/woocommerce/tests/e2e-pw/tests/shopper/my-account-downloads.spec.js @@ -0,0 +1,123 @@ +const { test, expect } = require( '@playwright/test' ); +const wcApi = require( '@woocommerce/woocommerce-rest-api' ).default; + +const randomNum = new Date().getTime().toString(); +const customer = { + username: `customer${ randomNum }`, + password: 'password', + email: `customer${ randomNum }@woocommercecoree2etestsuite.com`, +}; +const product = { + name: 'Downloadable product My Account', + downloadLimit: '1', +}; + +test.describe( 'Customer can manage downloadable file in My Account > Downloads page', () => { + let productId, orderId; + + test.beforeAll( async ( { baseURL } ) => { + const api = new wcApi( { + url: baseURL, + consumerKey: process.env.CONSUMER_KEY, + consumerSecret: process.env.CONSUMER_SECRET, + version: 'wc/v3', + } ); + // add product + await api + .post( 'products', { + name: product.name, + type: 'simple', + regular_price: '9.99', + downloadable: true, + downloads: [ + { + name: 'Test file', + file: `${ baseURL }/test-file/`, + }, + ], + download_limit: 1, + } ) + .then( ( response ) => { + productId = response.data.id; + } ); + // create customer + await api + .post( 'customers', customer ) + .then( ( response ) => ( customer.id = response.data.id ) ); + // create an order + await api + .post( 'orders', { + set_paid: true, + status: 'completed', + billing: { + first_name: 'Jane', + last_name: 'Smith', + email: customer.email, + }, + line_items: [ + { + product_id: productId, + quantity: 1, + }, + ], + } ) + .then( ( response ) => { + orderId = response.data.id; + } ); + // once the order is created, assign it to our existing customer user + await api.put( `orders/${ orderId }`, { + customer_id: customer.id, + } ); + } ); + + test.afterAll( async ( { baseURL } ) => { + const api = new wcApi( { + url: baseURL, + consumerKey: process.env.CONSUMER_KEY, + consumerSecret: process.env.CONSUMER_SECRET, + version: 'wc/v3', + } ); + await api.delete( `products/${ productId }`, { + force: true, + } ); + await api.delete( `orders/${ orderId }`, { force: true } ); + await api.delete( `customers/${ customer.id }`, { force: true } ); + } ); + + test( 'can see downloadable file and click to download it', async ( { + page, + } ) => { + await page.goto( 'my-account/downloads/' ); + // sign in as the "customer" user + await page.locator( '#username' ).fill( customer.username ); + await page.locator( '#password' ).fill( customer.password ); + await page.locator( 'text=Log in' ).click(); + + // verify that the downloadable product exist in downloads + await expect( page.locator( 'h1.entry-title' ) ).toContainText( + 'Downloads' + ); + await expect( page.locator( 'td.download-product' ) ).toContainText( + product.name + ); + await expect( page.locator( 'td.download-remaining' ) ).toContainText( + product.downloadLimit + ); + await expect( + page.locator( '.woocommerce-MyAccount-downloads-file' ) + ).toContainText( 'Test file' ); + + // click to simulate downloading and verify the file doesn't exist anymore in downloads + await page.locator( '.woocommerce-MyAccount-downloads-file' ).click(); + await page.goto( 'my-account/downloads/' ); + await expect( page.locator( '.woocommerce-info' ) ).toContainText( + 'No downloads available yet.' + ); + await expect( page.locator( '.wc-forward' ) ).toContainText( + 'Browse products' + ); + + await page.locator( '.wc-forward' ).click(); + await expect( page.locator( 'h1.page-title' ) ).toContainText( 'Shop' ); + } ); +} );