Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

E2E Tests: Migrate Comments block test to Playwright #39826

Merged
merged 23 commits into from
Jul 8, 2022

Conversation

ockham
Copy link
Contributor

@ockham ockham commented Mar 28, 2022

What?

Migrate Comments block e2e tests to Playwright.

Why?

Playwright infrastructure was recently added to Gutenberg (as covered on make.wp.org/core); here's a list of all e2e tests that need migrating.

The Comments block e2e test was only added recently (#39502), so our memory is still fresh, making it a good candidate for migration 🙂

How?

Following migration instructions found here.

Specifically, we're introducing new utilities to deleteAllComments (via REST API) and to setOption (via wp-admin).

Testing Instructions

Verify that the new e2e test passes (check CI). To test locally:

npm run test-e2e:playwright -- test/e2e/specs/editor/blocks/comments.spec.js

To run in interactive mode, append --headed.

TODO

  • Add utility to create new comment (via REST API).
  • Use more semantic selectors/locators and assertions, if possible.
  • Add Changelog entries to packages/e2e-test-utils-playwright. (Still unreleased, so not required)

@ockham ockham added the [Package] E2E Tests /packages/e2e-tests label Mar 28, 2022
@@ -0,0 +1,32 @@
/**
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

params: {
per_page: 100,
// All possible statuses.
status: 'unapproved,approved,spam,trash',
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@github-actions
Copy link

github-actions bot commented Mar 28, 2022

Size Change: -215 B (0%)

Total Size: 1.25 MB

Filename Size Change
build/block-editor/index.min.js 152 kB -62 B (0%)
build/block-editor/style-rtl.css 14.5 kB -3 B (0%)
build/block-editor/style.css 14.5 kB -1 B (0%)
build/block-library/blocks/query/editor-rtl.css 365 B -4 B (-1%)
build/block-library/blocks/query/editor.css 364 B -5 B (-1%)
build/block-library/editor-rtl.css 10.2 kB +4 B (0%)
build/block-library/editor.css 10.2 kB +5 B (0%)
build/blocks/index.min.js 47 kB -149 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 982 B
build/annotations/index.min.js 2.76 kB
build/api-fetch/index.min.js 2.26 kB
build/autop/index.min.js 2.14 kB
build/blob/index.min.js 475 B
build/block-directory/index.min.js 6.58 kB
build/block-directory/style-rtl.css 990 B
build/block-directory/style.css 991 B
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 103 B
build/block-library/blocks/audio/style.css 103 B
build/block-library/blocks/audio/theme-rtl.css 110 B
build/block-library/blocks/audio/theme.css 110 B
build/block-library/blocks/avatar/editor-rtl.css 116 B
build/block-library/blocks/avatar/editor.css 116 B
build/block-library/blocks/avatar/style-rtl.css 59 B
build/block-library/blocks/avatar/style.css 59 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 441 B
build/block-library/blocks/button/editor.css 441 B
build/block-library/blocks/button/style-rtl.css 543 B
build/block-library/blocks/button/style.css 543 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-content/style-rtl.css 92 B
build/block-library/blocks/comment-content/style.css 92 B
build/block-library/blocks/comment-template/style-rtl.css 187 B
build/block-library/blocks/comment-template/style.css 185 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-title/editor-rtl.css 75 B
build/block-library/blocks/comments-title/editor.css 75 B
build/block-library/blocks/comments/editor-rtl.css 95 B
build/block-library/blocks/comments/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 615 B
build/block-library/blocks/cover/editor.css 616 B
build/block-library/blocks/cover/style-rtl.css 1.55 kB
build/block-library/blocks/cover/style.css 1.55 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 410 B
build/block-library/blocks/embed/style.css 410 B
build/block-library/blocks/embed/theme-rtl.css 110 B
build/block-library/blocks/embed/theme.css 110 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 253 B
build/block-library/blocks/file/style.css 254 B
build/block-library/blocks/file/view.min.js 346 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 948 B
build/block-library/blocks/gallery/editor.css 950 B
build/block-library/blocks/gallery/style-rtl.css 1.5 kB
build/block-library/blocks/gallery/style.css 1.49 kB
build/block-library/blocks/gallery/theme-rtl.css 108 B
build/block-library/blocks/gallery/theme.css 108 B
build/block-library/blocks/group/editor-rtl.css 333 B
build/block-library/blocks/group/editor.css 333 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 76 B
build/block-library/blocks/heading/style.css 76 B
build/block-library/blocks/html/editor-rtl.css 327 B
build/block-library/blocks/html/editor.css 329 B
build/block-library/blocks/image/editor-rtl.css 738 B
build/block-library/blocks/image/editor.css 737 B
build/block-library/blocks/image/style-rtl.css 524 B
build/block-library/blocks/image/style.css 530 B
build/block-library/blocks/image/theme-rtl.css 110 B
build/block-library/blocks/image/theme.css 110 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 463 B
build/block-library/blocks/latest-posts/style.css 462 B
build/block-library/blocks/list/style-rtl.css 88 B
build/block-library/blocks/list/style.css 88 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 705 B
build/block-library/blocks/navigation-link/editor.css 703 B
build/block-library/blocks/navigation-link/style-rtl.css 115 B
build/block-library/blocks/navigation-link/style.css 115 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 296 B
build/block-library/blocks/navigation-submenu/editor.css 295 B
build/block-library/blocks/navigation-submenu/view.min.js 402 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.96 kB
build/block-library/blocks/navigation/style.css 1.95 kB
build/block-library/blocks/navigation/view-modal.min.js 2.78 kB
build/block-library/blocks/navigation/view.min.js 423 B
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 260 B
build/block-library/blocks/paragraph/style.css 260 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/editor-rtl.css 96 B
build/block-library/blocks/post-comments-form/editor.css 96 B
build/block-library/blocks/post-comments-form/style-rtl.css 495 B
build/block-library/blocks/post-comments-form/style.css 495 B
build/block-library/blocks/post-comments/editor-rtl.css 77 B
build/block-library/blocks/post-comments/editor.css 77 B
build/block-library/blocks/post-comments/style-rtl.css 632 B
build/block-library/blocks/post-comments/style.css 630 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 605 B
build/block-library/blocks/post-featured-image/editor.css 605 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 282 B
build/block-library/blocks/post-template/style.css 282 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 370 B
build/block-library/blocks/pullquote/style.css 370 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/quote/style-rtl.css 213 B
build/block-library/blocks/quote/style.css 213 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 385 B
build/block-library/blocks/search/style.css 386 B
build/block-library/blocks/search/theme-rtl.css 114 B
build/block-library/blocks/search/theme.css 114 B
build/block-library/blocks/separator/editor-rtl.css 146 B
build/block-library/blocks/separator/editor.css 146 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 464 B
build/block-library/blocks/shortcode/editor.css 464 B
build/block-library/blocks/site-logo/editor-rtl.css 708 B
build/block-library/blocks/site-logo/editor.css 708 B
build/block-library/blocks/site-logo/style-rtl.css 192 B
build/block-library/blocks/site-logo/style.css 192 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 322 B
build/block-library/blocks/spacer/editor.css 322 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 494 B
build/block-library/blocks/table/editor.css 494 B
build/block-library/blocks/table/style-rtl.css 611 B
build/block-library/blocks/table/style.css 609 B
build/block-library/blocks/table/theme-rtl.css 175 B
build/block-library/blocks/table/theme.css 175 B
build/block-library/blocks/tag-cloud/style-rtl.css 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 149 B
build/block-library/blocks/template-part/editor.css 149 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 561 B
build/block-library/blocks/video/editor.css 563 B
build/block-library/blocks/video/style-rtl.css 159 B
build/block-library/blocks/video/style.css 159 B
build/block-library/blocks/video/theme-rtl.css 110 B
build/block-library/blocks/video/theme.css 110 B
build/block-library/common-rtl.css 987 B
build/block-library/common.css 984 B
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 183 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 11.5 kB
build/block-library/style.css 11.5 kB
build/block-library/theme-rtl.css 695 B
build/block-library/theme.css 700 B
build/block-serialization-default-parser/index.min.js 1.11 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/components/index.min.js 230 kB
build/components/style-rtl.css 14 kB
build/components/style.css 14 kB
build/compose/index.min.js 11.7 kB
build/core-data/index.min.js 14.7 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.4 kB
build/customize-widgets/style.css 1.4 kB
build/data-controls/index.min.js 653 B
build/data/index.min.js 7.95 kB
build/date/index.min.js 32 kB
build/deprecated/index.min.js 507 B
build/dom-ready/index.min.js 324 B
build/dom/index.min.js 4.66 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 4.02 kB
build/edit-navigation/style.css 4.03 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 30.4 kB
build/edit-post/style-rtl.css 6.97 kB
build/edit-post/style.css 6.97 kB
build/edit-site/index.min.js 52.1 kB
build/edit-site/style-rtl.css 8.23 kB
build/edit-site/style.css 8.21 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.35 kB
build/edit-widgets/style.css 4.35 kB
build/editor/index.min.js 39.4 kB
build/editor/style-rtl.css 3.65 kB
build/editor/style.css 3.65 kB
build/element/index.min.js 4.27 kB
build/escape-html/index.min.js 537 B
build/format-library/index.min.js 6.75 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.64 kB
build/html-entities/index.min.js 448 B
build/i18n/index.min.js 3.77 kB
build/is-shallow-equal/index.min.js 527 B
build/keyboard-shortcuts/index.min.js 1.78 kB
build/keycodes/index.min.js 1.38 kB
build/list-reusable-blocks/index.min.js 1.74 kB
build/list-reusable-blocks/style-rtl.css 835 B
build/list-reusable-blocks/style.css 835 B
build/media-utils/index.min.js 2.93 kB
build/notices/index.min.js 953 B
build/nux/index.min.js 2.05 kB
build/nux/style-rtl.css 732 B
build/nux/style.css 728 B
build/plugins/index.min.js 1.94 kB
build/preferences-persistence/index.min.js 2.22 kB
build/preferences/index.min.js 1.3 kB
build/primitives/index.min.js 933 B
build/priority-queue/index.min.js 612 B
build/react-i18n/index.min.js 696 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.22 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.53 kB
build/token-list/index.min.js 644 B
build/url/index.min.js 3.61 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 268 B
build/widgets/index.min.js 7.19 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@ockham ockham force-pushed the migrate/comments-query-loop-e2e-to-playwright branch from 20bb3a2 to e532479 Compare March 29, 2022 10:59
@ockham
Copy link
Contributor Author

ockham commented Mar 29, 2022

Rebased (to include #39818, which has now been merged).

@ockham ockham force-pushed the migrate/comments-query-loop-e2e-to-playwright branch 3 times, most recently from 408ccf1 to 884a2f3 Compare April 13, 2022 17:38
@ockham ockham force-pushed the migrate/comments-query-loop-e2e-to-playwright branch from 884a2f3 to 51ec368 Compare July 6, 2022 14:59
@ockham ockham changed the title E2E Tests: Migrate Comments Query Loop test to Playwright E2E Tests: Migrate Comments block test to Playwright Jul 6, 2022
@ockham
Copy link
Contributor Author

ockham commented Jul 6, 2022

This PR is currently blocked because of the following problem:

In beforeAll and afterAll, we'd like to set some WP options (page_comments, comments_per_page, default_comments_page). (I haven't seen any prior art in the Playwright-based e2e tests.) Unfortunately, these aren't exposed by WordPress' REST API (only few options are), so we do this by navigating to the options.php page in wp-admin to change them via their corresponding input fields.

The problem is however that this kind of navigation isn't allowed in beforeAll and afterAll. (I think the reason is that Playwright wants to encourage using only REST API-based setup and teardown.)

Error: "context" and "page" fixtures are not supported in beforeAll. Use browser.newContext() instead.

(I'm not sure if browser.newContext() is really relevant or helpful here.)

Some potential solutions and/or workarounds I can think of:

  • Set these options from each individual test. A really bad option IMO, since doing this via navigation is a performance bottleneck that we don't want to repeat needlessly, plus it might not be the most stable thing.
  • Expose these settings via the REST API by writing a small WP plugin. The "small plugin for testing purposes" technique is something we've been doing for the Puppeteer-based tests. I'm not sure how viable this is.
  • ???

Maybe our Playwright experts in residence can advise here 😅 cc/ @kevin940726 @noisysocks

@kevin940726
Copy link
Member

I had the same question before, but the Playwright team convinced me ;)

Set these options from each individual test. A really bad option IMO, since doing this via navigation is a performance bottleneck that we don't want to repeat needlessly, plus it might not be the most stable thing.

Going to each individual page to set those options is already a performance bottleneck 😅. Doing this per test case is not that bad as a temporary solution IMO.

Expose these settings via the REST API by writing a small WP plugin. The "small plugin for testing purposes" technique is something we've been doing for the Puppeteer-based tests. I'm not sure how viable this is.

Believe it or not, we don't have a REST API for logging in a user either 😆. We used to do something similar in Puppeteer to create a plugin to help log the test user in.

We don't have REST APIs for activating or deactivating themes either. What we do is open the network panel in the devtool to find the undocumented requests. I think we can try similar things here for setting the settings.

If that doesn't work, I think it might not be a bad idea to start creating an official API for that? For a temporary solution before that is merged, we can always change beforeAll to beforeEach. WDYT?

@ockham
Copy link
Contributor Author

ockham commented Jul 7, 2022

Thanks for your reply @kevin940726! It's quite helpful to get a better grasp of how things are done with Playwright (and how we can work around the shortcomings of WP's REST API).

We don't have REST APIs for activating or deactivating themes either. What we do is open the network panel in the devtool to find the undocumented requests. I think we can try similar things here for setting the settings.

I'm afraid there really might not be an endpoint for the settings; the wp-admin screen just POSTs the form to options.php, using the familiar WP nonce technique for authorization. Not sure that's something we can emulate in Playwright 😕

If that doesn't work, I think it might not be a bad idea to start creating an official API for that?

Yeah, I think it'd be a good idea to expose these things through the REST API 👍

For a temporary solution before that is merged, we can always change beforeAll to beforeEach. WDYT?

Ah, that's great, I didn't think of that! I gave it a try locally, seems to work fine! Thanks a lot! 🙌

@ockham ockham force-pushed the migrate/comments-query-loop-e2e-to-playwright branch from 48331d7 to 088c372 Compare July 8, 2022 10:00
@ockham ockham requested review from kevin940726 and a team July 8, 2022 14:10
@ockham
Copy link
Contributor Author

ockham commented Jul 8, 2022

Okay, I’m setting this to „Ready for review“. I really like how Playwright allowed me to get rid of a bunch of boilerplate and overhead; it makes e2e tests a lot easier on the eye!

@ockham ockham marked this pull request as ready for review July 8, 2022 14:10
@ockham ockham requested review from ntwb, nerrad and ajitbohra as code owners July 8, 2022 14:10
Copy link
Contributor

@cbravobernal cbravobernal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@ockham
Copy link
Contributor Author

ockham commented Jul 8, 2022

Thanks @c4rl0sbr4v0!

I'm going to merge this, hoping that this will fix the intermittent errors we were seeing with the Puppeteer-based tests (see e.g. #42164), and to prevent this from getting stale in case we want to add or modify e2e tests for the Comments block with some other PR(s).

I'd be grateful if @kevin940726 could maybe have a look and leave some notes if there's anything that isn't following best practices; I'd be happy to address in a follow-up 😊

@ockham ockham merged commit 0af4bc7 into trunk Jul 8, 2022
@ockham ockham deleted the migrate/comments-query-loop-e2e-to-playwright branch July 8, 2022 16:44
@github-actions github-actions bot added this to the Gutenberg 13.7 milestone Jul 8, 2022
Copy link
Member

@kevin940726 kevin940726 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for your hard work! I left some suggestions about the best practices. Overall it looks good!

*/
import type { Admin } from './';

export async function setOption( this: Admin, setting: string, value: string ) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally, I wouldn't put this inside e2e-test-utils-playwright since it's just a temporary solution for one test suite. Breaking changes will be made once the REST options API is implemented.

Instead, I would put this inside the comments test file to make it clear that it's an internal API.

@@ -29,4 +29,9 @@ export async function publishPost( this: Editor ) {
await this.page.click(
'role=region[name="Editor publish"i] >> role=button[name="Publish"i]'
);

const urlString = await this.page.inputValue( 'text="Post address"' );
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Normally, we would prefer role selectors over text selectors if they're available.

this.rest( {
method: 'POST',
path: '/wp/v2/comments',
data: comment,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we have the id field of the comment data yet before creating it?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, why couldn't we call /wp/v2/users/me here to get the current user id to pass it into the data? So that we don't have to create another util getCurrentUser for this.

* @param {} comment Comment.
*/
export async function createComment( this: RequestUtils, comment: Comment ) {
this.rest( {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing await here?

We should probably return the response of the API too to capture the created comment id.

await admin.createNewPost();
await editor.insertBlock( { name: 'core/comments' } );
await expect(
await page.locator( 'text="No results found."' )
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

locator doesn't return a promise.


// We check that there is a previous comments page link.
await expect(
await page.locator( 'text="Older Comments"' )
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

locator doesn't return a promise.

// We check that there is a previous comments page link.
await expect(
await page.locator( 'text="Older Comments"' )
).toHaveCount( 1 );
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's use toBeVisible() rather than arbitrary toHaveCount( 1 ).

).toHaveCount( 1 );
await expect(
await page.locator( 'text="Newer Comments"' )
).toHaveCount( 0 );
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here, let's use toBeHidden().

Comment on lines +83 to +101
await page.click( 'text="Older Comments"' );

// We check that there are a previous and a next link.
await expect(
await page.locator( 'text="Older Comments"' )
).toHaveCount( 1 );
await expect(
await page.locator( 'text="Newer Comments"' )
).toHaveCount( 1 );

await page.click( 'text="Older Comments"' );

// We check that there is only have a next link
await expect(
await page.locator( 'text="Older Comments"' )
).toHaveCount( 0 );
await expect(
await page.locator( 'text="Newer Comments"' )
).toHaveCount( 1 );
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto.

} );

test.afterAll( async ( { requestUtils } ) => {
await requestUtils.deleteAllComments();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why aren't we deleting comments after each test instead?

@ockham
Copy link
Contributor Author

ockham commented Jul 11, 2022

Thanks for your hard work! I left some suggestions about the best practices. Overall it looks good!

Thanks a lot for your guidance @kevin940726!

I'll be AFK for most of this week. I had a thought, maybe someone else from @WordPress/frontend-dx could file a PR to address your feedback in order to familiarize themselves with Playwright? I think it should be doable with a half-day. The PR desc has links to documentation and contains information how to run Playwright-based e2e tests locally.

Otherwise, I'll work on this next week 😄

@DAreRodz
Copy link
Contributor

Hey, @ockham, thanks for the ping! I don't mind opening a new PR to apply @kevin940726's suggestions and learn more about Playwright. I can take care of that. 😊

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
[Package] E2E Tests /packages/e2e-tests
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants