Skip to content

Conversation

@chad1008
Copy link
Contributor

What?

Add some basic e2e testing for the Autocomplete component, as well as some tests specific to past regressions

Why?

The component currently lacks detailed testing, outside of some user mention tests. Increased testing will allow for safer/more confident updates to the component in the future.

How?

Six tests are implemented in this change:

Implementing all of these tests meant introducing a new/additional completer, for a couple of reasons. First, I wanted to test that a newly-introduced completer functions as expected, and not just test the built-in items like user mentions and the block inserter. Second, one of the tests is specifically looking at handling multiple completers at once.

To accomplish this, a script to add the completer to the editor via a hook as added, along with a small plugin to enqueue that script. The test then enables and disables the plugin as needed.

Testing Instructions

After applying this patch:
npm run test-e2e:watch -- packages/e2e-tests/specs/editor/various/autocomplete.test.js

@chad1008 chad1008 added [Package] E2E Tests /packages/e2e-tests [Feature] Component System WordPress component system labels Jul 25, 2022
@chad1008 chad1008 requested review from ciampo and mirka July 25, 2022 13:24
@chad1008 chad1008 self-assigned this Jul 25, 2022
@chad1008
Copy link
Contributor Author

Question for reviewers:

There's some basic functionality I didn't test here, because it's actually covered in the existing user mention testing suite.

While that suite is currently focused on user mentions, it feels to me like it's more testing some basic Autocomplete functionality that isn't really specific to mentions. Does it make sense to:

  1. Leave everything exactly as it is right now, omitting those basic tests from this new Autocomplete test suite?
  2. Combine those existing tests into the new Autocomplete test suite?
  3. Leave the existing tests as is, and create similar tests in this suite?
  4. Some other approach?

@github-actions
Copy link

github-actions bot commented Jul 25, 2022

Size Change: 0 B

Total Size: 1.26 MB

ℹ️ 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-editor/index.min.js 153 kB
build/block-editor/style-rtl.css 14.6 kB
build/block-editor/style.css 14.6 kB
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 542 B
build/block-library/blocks/button/style.css 542 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 834 B
build/block-library/blocks/comments/editor.css 832 B
build/block-library/blocks/comments/style-rtl.css 632 B
build/block-library/blocks/comments/style.css 630 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.53 kB
build/block-library/blocks/gallery/style.css 1.53 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 736 B
build/block-library/blocks/image/editor.css 737 B
build/block-library/blocks/image/style-rtl.css 627 B
build/block-library/blocks/image/style.css 630 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 423 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 443 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 493 B
build/block-library/blocks/post-comments-form/style.css 493 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/query/editor-rtl.css 365 B
build/block-library/blocks/query/editor.css 364 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 184 B
build/block-library/blocks/social-link/editor.css 184 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.39 kB
build/block-library/blocks/social-links/style.css 1.38 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 235 B
build/block-library/blocks/template-part/editor.css 235 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 1.01 kB
build/block-library/common.css 1 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 10.9 kB
build/block-library/editor.css 10.9 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/index.min.js 184 kB
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-library/style-rtl.css 11.8 kB
build/block-library/style.css 11.8 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/blocks/index.min.js 47.2 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.99 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.69 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.5 kB
build/edit-post/style-rtl.css 6.94 kB
build/edit-post/style.css 6.94 kB
build/edit-site/index.min.js 55 kB
build/edit-site/style-rtl.css 8.21 kB
build/edit-site/style.css 8.19 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 41.3 kB
build/editor/style-rtl.css 3.66 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.39 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.68 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

@ciampo
Copy link
Contributor

ciampo commented Jul 25, 2022

I would either create similar tests in this suite, or add a comment in the spec explaining the absence of some basic tests, and pointing at them in the user-mention suite. Not sure what others would do, though (I don't have much experience with e2e tests in gutenberg).

Also wanted to point out that the some of the CI tasks can't run because of a couple of errors/warnings in the PHP unit tests task

@chad1008
Copy link
Contributor Author

I would either create similar tests in this suite, or add a comment in the spec explaining the absence of some basic tests, and pointing at them in the user-mention suite. Not sure what others would do, though (I don't have much experience with e2e tests in gutenberg)

Thank! I'll think on these two options, and see if others have any input.

Also wanted to point out that the some of the CI tasks can't run because of a couple of errors/warnings in the PHP unit tests task

Good catch, thanks for mentioning. Should be fixed now, I'll monitor the tests 👍

@chad1008 chad1008 marked this pull request as ready for review July 25, 2022 14:12
Copy link
Contributor

@ciampo ciampo left a comment

Choose a reason for hiding this comment

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

Thank you for working on this, @chad1008 !

I'm not very experienced with working in the e2e-tests package, but from what I can gather the way these tests have been set up (i.e. creating an ad-hoc plugin to test the autocomplete functionality in the plugins/ directory) looks correct to me.

Apart from the inline comments, two more observations that come to mind:

  1. It would be interesting to see if these some of these e2e tests would fail once we introduce the changes from #41382 — have you tried this, @chad1008 ?
  2. I realized that the Autocomplete component in the @wordpress/components package is still without unit tests — it would be great if, as a follow-up to this PR, we could add some unit tests to the component too

Copy link
Member

@mirka mirka left a comment

Choose a reason for hiding this comment

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

Just so I understand better, is this because these tests cannot be reliably done in jsdom, or because we actually do want to test it end-to-end in a WP editor context?

If it's the former, we've actually been thinking about setting up something to run Playwright tests in the Storybook environment. I see we don't even have a story yet for Autocomplete, but that would be a nice isolated environment if the "Autocomplete component" is what we actually want to test.

If it's the latter, it might be better to be a bit careful about context/verbiage, because at that level it is not really a test for the "Autocomplete component", but how everything in the editor interacts, e.g. filters, script enqueuing, surrounding keyboard shortcut handlers. In this case I think it makes sense to merge our tests into the user mentions suite, rather than create an entirely new suite. The fact that we're testing in a WP env means that we're far from testing "the Autocomplete component" itself, so we might as well be testing the most important autocomplete functionality in the editor (user mentions).

Both approaches are valid, but I want to know if ideally you would've wanted an isolated Playwright test in Storybook, rather than a full-blown WordPress E2E. It will inform our decision on if/when to invest in a Storybook Playwright setup.

@chad1008
Copy link
Contributor Author

@ciampo Thanks for all of the feedback (and the reminders to avoid hard-coded classnames)! They've now all be replaced with role-based selectors that look for relevant text content for the given test.

@mirka Your questions are (as always) extremely thought provoking! My goal with these tests was honestly pretty narrowly scoped... I really only wanted to implement tests to protect against the two regressions I mentioned at the top. The e2e environment was just where I got them working first. (That sounds pretty feeble when I write it out like that, thanks for helping me think about it a little more critically!) The rest of the test suite was added out of a desire for thoroughness.

When it comes to the two tests I started this PR for, I think e2e makes sense, because they deal with how the component interacts with its neighbors, including another instance of the same autocomplete component.

On the other tests that deal just with option rendering and selection though, I can see your point... it might make sense to take another pass at some unit tests and move some of these to that environment instead.

Both approaches are valid, but I want to know if ideally you would've wanted an isolated Playwright test in Storybook, rather than a full-blown WordPress E2E. It will inform our decision on if/when to invest in a Storybook Playwright setup.

I don't (yet) have a strong preference here... it's definitely the kind of thing I current defer to, and learn from, the more experienced opinions of folks like yourself and @ciampo on. I'd say if a more isolated Storybook setup is a better fit, I'm happy to work on adapting them to that kind of setup.

@ciampo
Copy link
Contributor

ciampo commented Jul 27, 2022

@ciampo Thanks for all of the feedback (and the reminders to avoid hard-coded classnames)! They've now all be replaced with role-based selectors that look for relevant text content for the given test.

Have you already pushed those changes? I'm currently not seeing new commits since my last review

I think e2e makes sense, because they deal with how the component interacts with its neighbors, including another instance of the same autocomplete component.

Have you verified that it's effectively another instance, or that multiple "completers" can't be tested with the same Autocomplete instance? I'm not very familiar with the component, but from a first look at the README, it seems like the component accepts an array of completers as the completers prop, potentially allowing for multiple completers to be tested with the same instance of Autocomplete

Both approaches are valid, but I want to know if ideally you would've wanted an isolated Playwright test in Storybook, rather than a full-blown WordPress E2E. It will inform our decision on if/when to invest in a Storybook Playwright setup.

I subscribe to @mirka 's words — as a rule of thumb, we should prioritize writing unit tests (which, thanks to testing-library, often become small integration tests) when possible, as they can provide a good amount fo confidence while sill being relatively inexpensive to run (inspiration from this article).

Since the main intention was to prevent regressions related to #41724 and #41709, what you could do is:

  • attempt to rewrite the e2e tests from this PR as unit tests specifically for the Autocomplete component
  • in order to make sure that those unit tests are effectively preventing those specific regressions, you should try to temporarily apply on your local machine the changes from Components: refactor Autocomplete to pass exhaustive-deps #41382 — with those changes applied, the tests checking for those regressions should fail (while they would normally pass).

As @mirka said, as we try to write these unit tests, let's keep an eye on any potential js-dom limitation that we may find, as it can inform our priorities regarding the setup of a Storybook Playwright env.

@mirka
Copy link
Member

mirka commented Jul 27, 2022

I briefly looked into creating an isolated story for the Autocomplete component. Turns out, it is tightly coupled with the editor implementation (the RichText implementation, to be exact) so it doesn't make sense to do unit tests at the component level! Theoretically we could mock stuff, but it's likely not worth the effort. The code snippet in the readme suggests that it works as an independent component, but it doesn't. The snippet is lacking some editor-dependent props that it requires to function.

So, given that it's a pretty tightly coupled component to begin with, I think it makes sense to test it in the realm/scope of integration or E2E, rather than at the component unit level. I'd even prefer to move the component to the @wordpress/block-editor package, but that's another topic 😄

@chad1008 chad1008 force-pushed the add/Autocomplete-e2e-tests branch from ff0412f to aa8f5b5 Compare July 28, 2022 13:02
@chad1008
Copy link
Contributor Author

Have you already pushed those changes? I'm currently not seeing new commits since my last review
- @ciampo

Yikes, sorry about that. Changes are now actually pushed.

Have you verified that it's effectively another instance, or that multiple "completers" can't be tested with the same Autocomplete instance?
- @ciampo

Poor choice of words on my part - you're right, it's one Autocompleter with multiple completers added to the array. The issue was with activating more than one of those completers within a single block, which is what we're now testing for.

I briefly looked into creating an isolated story for the Autocomplete component. Turns out, it is tightly coupled with the editor implementation (the RichText implementation, to be exact) so it doesn't make sense to do unit tests at the component level
- @mirka

Thank you for looking into that! I wasn't yet sure if my issues preparing tests at the unit-test level were due to my lack of experience or some limitation beyond my control. You saved me a bunch of experimentation here 🙇

@mirka, does it still feel like it makes sense to merge these into the existing user mention suite?

@chad1008
Copy link
Contributor Author

It would be interesting to see if these some of these e2e tests would fail once we introduce the changes from #41382 — have you tried this, @chad1008 ?

Sadly, no. I should have. I've tried it now, and for some reason they don't fail. I can test the behavior manually on the exact same build and my manual interactions fail, but the test sails right through without a hitch. Will require further investigation.

@mirka
Copy link
Member

mirka commented Jul 28, 2022

@mirka, does it still feel like it makes sense to merge these into the existing user mention suite?

I trust your decision since you have more context. But from my limited context, yes, I think I would try to merge it into a single suite. Just because, in E2E we need to be prudent about not writing too many tests so it's generally more efficient to test as many things at once if you can.

But whichever way you decide (merge into Autocomplete suite, merge into User Mentions suite, or keep separate), I wouldn't say either approach is clearly bad though.

@ciampo
Copy link
Contributor

ciampo commented Jul 29, 2022

Sadly, no. I should have. I've tried it now, and for some reason they don't fail. I can test the behavior manually on the exact same build and my manual interactions fail, but the test sails right through without a hitch. Will require further investigation.

Yeah, we should definitely make sure that these new test would be able to flag such regressions!

@chad1008
Copy link
Contributor Author

chad1008 commented Aug 2, 2022

Update: This got a little more complex!

While working to make sure the two regressions were actually caught by the new tests, I found there were more specific than I'd originally realized! The don't affect a really basic completer like the one I've created with our test plugin.

I think that a basic completer is still good to have test for, so I went in a new direction. Since I've pivoted a bit, I spun up a new PR:
#42905

That's very much a draft at the moment and not ready for review, but I wanted to keep everyone on this thread in the loop.

PS oh, and hopefully I didn't take @mirka's advice to test as many things at once as possible too seriously!

@ciampo
Copy link
Contributor

ciampo commented Aug 5, 2022

Just to understand, is #42905 a new take on this PR or are they both ideally supposed to be merged?

@chad1008
Copy link
Contributor Author

Just to understand, is #42905 a new take on this PR or are they both ideally supposed to be merged?

#42905 is a completely different take. It felt like enough of a different direction that it made sense to start fresh.

@ciampo
Copy link
Contributor

ciampo commented Aug 30, 2022

Just to understand, is #42905 a new take on this PR or are they both ideally supposed to be merged?

#42905 is a completely different take. It felt like enough of a different direction that it made sense to start fresh.

Gotcha — should we close this PR, then?

@chad1008
Copy link
Contributor Author

Yep, done. I mostly kept this one open in case you looked at the new one and said "I hate this." 😆

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Feature] Component System WordPress component system [Package] E2E Tests /packages/e2e-tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants