From 7bab365a71fb84a1b8313fc4fed32c2331b53f93 Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Tue, 4 Jul 2023 18:39:34 +0400 Subject: [PATCH 1/4] Migrate flaky PostPublishButton e2e tests to Playwright --- .../editor/various/publish-button.spec.js | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 test/e2e/specs/editor/various/publish-button.spec.js diff --git a/test/e2e/specs/editor/various/publish-button.spec.js b/test/e2e/specs/editor/various/publish-button.spec.js new file mode 100644 index 00000000000000..a686a57acee85f --- /dev/null +++ b/test/e2e/specs/editor/various/publish-button.spec.js @@ -0,0 +1,72 @@ +/** + * WordPress dependencies + */ +const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); + +test.describe( 'Post publish button', () => { + test.beforeEach( async ( { admin, page } ) => { + await admin.createNewPost(); + await page.evaluate( () => { + window.wp.data.dispatch( 'core/editor' ).disablePublishSidebar(); + } ); + } ); + + test.afterEach( async ( { page } ) => { + await page.evaluate( () => { + window.wp.data.dispatch( 'core/editor' ).enablePublishSidebar(); + } ); + } ); + + test( 'should be disabled when post is not saveable', async ( { + page, + } ) => { + await expect( + page + .getByRole( 'region', { name: 'Editor top bar' } ) + .getByRole( 'button', { name: 'Publish' } ) + ).toBeDisabled(); + } ); + + test( 'should be disabled when post is being saved', async ( { + editor, + page, + } ) => { + await editor.canvas.type( + 'role=textbox[name="Add title"i]', + 'Test post' + ); + + const topBar = page.getByRole( 'region', { name: 'Editor top bar' } ); + await expect( + topBar.getByRole( 'button', { name: 'Publish' } ) + ).toBeEnabled(); + + await topBar.getByRole( 'button', { name: 'Save draft' } ).click(); + await expect( + topBar.getByRole( 'button', { name: 'Publish' } ) + ).toBeDisabled(); + } ); + + test( 'should be disabled when metabox is being saved', async ( { + editor, + page, + } ) => { + await editor.canvas.type( + 'role=textbox[name="Add title"i]', + 'Test post' + ); + + const topBar = page.getByRole( 'region', { name: 'Editor top bar' } ); + await expect( + topBar.getByRole( 'button', { name: 'Publish' } ) + ).toBeEnabled(); + + await page.evaluate( () => { + window.wp.data.dispatch( 'core/edit-post' ).requestMetaBoxUpdates(); + } ); + + await expect( + topBar.getByRole( 'button', { name: 'Publish' } ) + ).toBeDisabled(); + } ); +} ); From 57a9c4c3b4549e3b087cbf8f648396b448a69d02 Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Tue, 4 Jul 2023 18:42:23 +0400 Subject: [PATCH 2/4] Remove old test file --- .../editor/various/publish-button.test.js | 46 ------------------- 1 file changed, 46 deletions(-) delete mode 100644 packages/e2e-tests/specs/editor/various/publish-button.test.js diff --git a/packages/e2e-tests/specs/editor/various/publish-button.test.js b/packages/e2e-tests/specs/editor/various/publish-button.test.js deleted file mode 100644 index 90ef0950e535bb..00000000000000 --- a/packages/e2e-tests/specs/editor/various/publish-button.test.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * WordPress dependencies - */ -import { - arePrePublishChecksEnabled, - disablePrePublishChecks, - enablePrePublishChecks, - createNewPost, - canvas, -} from '@wordpress/e2e-test-utils'; - -describe( 'PostPublishButton', () => { - let werePrePublishChecksEnabled; - beforeEach( async () => { - await createNewPost(); - werePrePublishChecksEnabled = await arePrePublishChecksEnabled(); - if ( werePrePublishChecksEnabled ) { - await disablePrePublishChecks(); - } - } ); - - afterEach( async () => { - if ( werePrePublishChecksEnabled ) { - await enablePrePublishChecks(); - } - } ); - - it( 'should be disabled when post is not saveable', async () => { - const publishButton = await page.$( - '.editor-post-publish-button[aria-disabled="true"]' - ); - expect( publishButton ).not.toBeNull(); - } ); - - it( 'should be disabled when post is being saved', async () => { - await canvas().type( '.editor-post-title__input', 'E2E Test Post' ); // Make it saveable. - expect( - await page.$( '.editor-post-publish-button[aria-disabled="true"]' ) - ).toBeNull(); - - await page.click( '.editor-post-save-draft' ); - expect( - await page.$( '.editor-post-publish-button[aria-disabled="true"]' ) - ).not.toBeNull(); - } ); -} ); From 271d6019d7ecdde01151f675578d3f8a24ba356e Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Thu, 12 Oct 2023 14:57:46 +0400 Subject: [PATCH 3/4] Fix locators --- .../editor/various/publish-button.spec.js | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/test/e2e/specs/editor/various/publish-button.spec.js b/test/e2e/specs/editor/various/publish-button.spec.js index a686a57acee85f..6a6dda6b5f1039 100644 --- a/test/e2e/specs/editor/various/publish-button.spec.js +++ b/test/e2e/specs/editor/various/publish-button.spec.js @@ -31,10 +31,11 @@ test.describe( 'Post publish button', () => { editor, page, } ) => { - await editor.canvas.type( - 'role=textbox[name="Add title"i]', - 'Test post' - ); + await editor.canvas + .getByRole( 'textbox', { + name: 'Add title', + } ) + .fill( 'Test post' ); const topBar = page.getByRole( 'region', { name: 'Editor top bar' } ); await expect( @@ -51,10 +52,11 @@ test.describe( 'Post publish button', () => { editor, page, } ) => { - await editor.canvas.type( - 'role=textbox[name="Add title"i]', - 'Test post' - ); + await editor.canvas + .getByRole( 'textbox', { + name: 'Add title', + } ) + .fill( 'Test post' ); const topBar = page.getByRole( 'region', { name: 'Editor top bar' } ); await expect( From 73d5d883a4633330d3c1da0b3e69c8aa0d791b0e Mon Sep 17 00:00:00 2001 From: George Mamadashvili Date: Wed, 1 Nov 2023 17:25:57 +0400 Subject: [PATCH 4/4] Try deferring the requests --- .../editor/various/publish-button.spec.js | 63 ++++++++++++++----- 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/test/e2e/specs/editor/various/publish-button.spec.js b/test/e2e/specs/editor/various/publish-button.spec.js index 6a6dda6b5f1039..b1e4b07a28580f 100644 --- a/test/e2e/specs/editor/various/publish-button.spec.js +++ b/test/e2e/specs/editor/various/publish-button.spec.js @@ -3,23 +3,21 @@ */ const { test, expect } = require( '@wordpress/e2e-test-utils-playwright' ); -test.describe( 'Post publish button', () => { - test.beforeEach( async ( { admin, page } ) => { - await admin.createNewPost(); - await page.evaluate( () => { - window.wp.data.dispatch( 'core/editor' ).disablePublishSidebar(); - } ); - } ); - - test.afterEach( async ( { page } ) => { - await page.evaluate( () => { - window.wp.data.dispatch( 'core/editor' ).enablePublishSidebar(); - } ); +function defer() { + let resolve; + const deferred = new Promise( ( res ) => { + resolve = res; } ); + deferred.resolve = resolve; + return deferred; +} +test.describe( 'Post publish button', () => { test( 'should be disabled when post is not saveable', async ( { + admin, page, } ) => { + await admin.createNewPost(); await expect( page .getByRole( 'region', { name: 'Editor top bar' } ) @@ -28,9 +26,11 @@ test.describe( 'Post publish button', () => { } ); test( 'should be disabled when post is being saved', async ( { + admin, editor, page, } ) => { + await admin.createNewPost(); await editor.canvas .getByRole( 'textbox', { name: 'Add title', @@ -42,17 +42,36 @@ test.describe( 'Post publish button', () => { topBar.getByRole( 'button', { name: 'Publish' } ) ).toBeEnabled(); + const postId = new URL( page.url() ).searchParams.get( 'post' ); + const deferred = defer(); + + await page.route( + ( url ) => + url.searchParams.has( + 'rest_route', + encodeURIComponent( `/wp/v2/posts/${ postId }` ) + ), + async ( route ) => { + await deferred; + await route.continue(); + } + ); + await topBar.getByRole( 'button', { name: 'Save draft' } ).click(); await expect( topBar.getByRole( 'button', { name: 'Publish' } ) ).toBeDisabled(); + deferred.resolve(); } ); test( 'should be disabled when metabox is being saved', async ( { - editor, + admin, page, + requestUtils, } ) => { - await editor.canvas + await requestUtils.activatePlugin( 'gutenberg-test-plugin-meta-box' ); + await admin.createNewPost(); + await page .getByRole( 'textbox', { name: 'Add title', } ) @@ -63,12 +82,22 @@ test.describe( 'Post publish button', () => { topBar.getByRole( 'button', { name: 'Publish' } ) ).toBeEnabled(); - await page.evaluate( () => { - window.wp.data.dispatch( 'core/edit-post' ).requestMetaBoxUpdates(); - } ); + const deferred = defer(); + await page.route( + ( url ) => url.searchParams.has( 'meta-box-loader', 1 ), + async ( route ) => { + await deferred; + await route.continue(); + } + ); + + await topBar.getByRole( 'button', { name: 'Save draft' } ).click(); await expect( topBar.getByRole( 'button', { name: 'Publish' } ) ).toBeDisabled(); + deferred.resolve(); + + await requestUtils.deactivatePlugin( 'gutenberg-test-plugin-meta-box' ); } ); } );