Skip to content

BorderBoxControl test: wait for color picker popover to appear - #46632

Open
jsnajdr wants to merge 2 commits into
trunkfrom
cleanup/border-box-control-test
Open

BorderBoxControl test: wait for color picker popover to appear#46632
jsnajdr wants to merge 2 commits into
trunkfrom
cleanup/border-box-control-test

Conversation

@jsnajdr

@jsnajdr jsnajdr commented Dec 18, 2022

Copy link
Copy Markdown
Member

Cleans up the BorderBoxControl unit tests where we're testing the "Style" section of the color picker popover:

Screenshot 2022-12-18 at 9 54 39

Namely, that it doesn't appear when disabled with the enableStyle={ false } prop. This test needs to wait for popover positioning in order to avoid act() warnings.

I'm also refactoring the "split view" test to use a for loop.

@jsnajdr jsnajdr added the [Package] Components /packages/components label Dec 18, 2022
@jsnajdr
jsnajdr requested a review from tyxla December 18, 2022 09:15
@jsnajdr
jsnajdr requested a review from ajitbohra as a code owner December 18, 2022 09:15
@jsnajdr jsnajdr self-assigned this Dec 18, 2022
@github-actions

github-actions Bot commented Dec 18, 2022

Copy link
Copy Markdown

Size Change: +417 B (0%)

Total Size: 1.32 MB

Filename Size Change
build/block-editor/index.min.js 182 kB -2 B (0%)
build/block-library/blocks/table/style-rtl.css 651 B +15 B (+2%)
build/block-library/blocks/table/style.css 650 B +15 B (+2%)
build/block-library/blocks/table/theme-rtl.css 157 B -27 B (-15%) 👏
build/block-library/blocks/table/theme.css 157 B -27 B (-15%) 👏
build/block-library/blocks/verse/style-rtl.css 99 B +12 B (+14%) ⚠️
build/block-library/blocks/verse/style.css 99 B +12 B (+14%) ⚠️
build/block-library/index.min.js 198 kB +360 B (0%)
build/block-library/style-rtl.css 12.4 kB +24 B (0%)
build/block-library/style.css 12.4 kB +25 B (0%)
build/block-library/theme-rtl.css 698 B -18 B (-3%)
build/block-library/theme.css 703 B -18 B (-2%)
build/edit-post/index.min.js 34.7 kB +37 B (0%)
build/edit-site/index.min.js 64.8 kB +9 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/annotations/index.min.js 2.78 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 7.16 kB
build/block-directory/style-rtl.css 1.04 kB
build/block-directory/style.css 1.04 kB
build/block-editor/content-rtl.css 2.71 kB
build/block-editor/content.css 2.71 kB
build/block-editor/default-editor-styles-rtl.css 403 B
build/block-editor/default-editor-styles.css 403 B
build/block-editor/style-rtl.css 14.7 kB
build/block-editor/style.css 14.7 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 90 B
build/block-library/blocks/archives/style.css 90 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 122 B
build/block-library/blocks/audio/style.css 122 B
build/block-library/blocks/audio/theme-rtl.css 138 B
build/block-library/blocks/audio/theme.css 138 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 84 B
build/block-library/blocks/avatar/style.css 84 B
build/block-library/blocks/block/editor-rtl.css 305 B
build/block-library/blocks/block/editor.css 305 B
build/block-library/blocks/button/editor-rtl.css 485 B
build/block-library/blocks/button/editor.css 485 B
build/block-library/blocks/button/style-rtl.css 532 B
build/block-library/blocks/button/style.css 532 B
build/block-library/blocks/buttons/editor-rtl.css 337 B
build/block-library/blocks/buttons/editor.css 337 B
build/block-library/blocks/buttons/style-rtl.css 332 B
build/block-library/blocks/buttons/style.css 332 B
build/block-library/blocks/calendar/style-rtl.css 239 B
build/block-library/blocks/calendar/style.css 239 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 100 B
build/block-library/blocks/categories/style.css 100 B
build/block-library/blocks/code/editor-rtl.css 53 B
build/block-library/blocks/code/editor.css 53 B
build/block-library/blocks/code/style-rtl.css 121 B
build/block-library/blocks/code/style.css 121 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 199 B
build/block-library/blocks/comment-template/style.css 198 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 840 B
build/block-library/blocks/comments/editor.css 839 B
build/block-library/blocks/comments/style-rtl.css 637 B
build/block-library/blocks/comments/style.css 636 B
build/block-library/blocks/cover/editor-rtl.css 612 B
build/block-library/blocks/cover/editor.css 613 B
build/block-library/blocks/cover/style-rtl.css 1.57 kB
build/block-library/blocks/cover/style.css 1.56 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 138 B
build/block-library/blocks/embed/theme.css 138 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 353 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 984 B
build/block-library/blocks/gallery/editor.css 988 B
build/block-library/blocks/gallery/style-rtl.css 1.55 kB
build/block-library/blocks/gallery/style.css 1.55 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 654 B
build/block-library/blocks/group/editor.css 654 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 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 829 B
build/block-library/blocks/image/editor.css 828 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 137 B
build/block-library/blocks/image/theme.css 137 B
build/block-library/blocks/latest-comments/style-rtl.css 298 B
build/block-library/blocks/latest-comments/style.css 298 B
build/block-library/blocks/latest-posts/editor-rtl.css 213 B
build/block-library/blocks/latest-posts/editor.css 212 B
build/block-library/blocks/latest-posts/style-rtl.css 478 B
build/block-library/blocks/latest-posts/style.css 478 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 507 B
build/block-library/blocks/media-text/style.css 505 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 716 B
build/block-library/blocks/navigation-link/editor.css 715 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 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation/editor-rtl.css 2.15 kB
build/block-library/blocks/navigation/editor.css 2.16 kB
build/block-library/blocks/navigation/style-rtl.css 2.23 kB
build/block-library/blocks/navigation/style.css 2.21 kB
build/block-library/blocks/navigation/view-modal.min.js 2.81 kB
build/block-library/blocks/navigation/view.min.js 447 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 376 B
build/block-library/blocks/page-list/editor.css 376 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 174 B
build/block-library/blocks/paragraph/editor.css 174 B
build/block-library/blocks/paragraph/style-rtl.css 279 B
build/block-library/blocks/paragraph/style.css 281 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 501 B
build/block-library/blocks/post-comments-form/style.css 501 B
build/block-library/blocks/post-date/style-rtl.css 61 B
build/block-library/blocks/post-date/style.css 61 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 586 B
build/block-library/blocks/post-featured-image/editor.css 584 B
build/block-library/blocks/post-featured-image/style-rtl.css 318 B
build/block-library/blocks/post-featured-image/style.css 318 B
build/block-library/blocks/post-navigation-link/style-rtl.css 153 B
build/block-library/blocks/post-navigation-link/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 96 B
build/block-library/blocks/post-terms/style.css 96 B
build/block-library/blocks/post-title/style-rtl.css 100 B
build/block-library/blocks/post-title/style.css 100 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 135 B
build/block-library/blocks/pullquote/editor.css 135 B
build/block-library/blocks/pullquote/style-rtl.css 326 B
build/block-library/blocks/pullquote/style.css 325 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 288 B
build/block-library/blocks/query-pagination/style.css 284 B
build/block-library/blocks/query-title/style-rtl.css 63 B
build/block-library/blocks/query-title/style.css 63 B
build/block-library/blocks/query/editor-rtl.css 440 B
build/block-library/blocks/query/editor.css 440 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 409 B
build/block-library/blocks/search/style.css 406 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 234 B
build/block-library/blocks/separator/style.css 234 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 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 490 B
build/block-library/blocks/site-logo/editor.css 490 B
build/block-library/blocks/site-logo/style-rtl.css 203 B
build/block-library/blocks/site-logo/style.css 203 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 116 B
build/block-library/blocks/site-title/editor.css 116 B
build/block-library/blocks/site-title/style-rtl.css 57 B
build/block-library/blocks/site-title/style.css 57 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.4 kB
build/block-library/blocks/social-links/style.css 1.39 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 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 457 B
build/block-library/blocks/table/editor.css 457 B
build/block-library/blocks/tag-cloud/style-rtl.css 251 B
build/block-library/blocks/tag-cloud/style.css 253 B
build/block-library/blocks/template-part/editor-rtl.css 404 B
build/block-library/blocks/template-part/editor.css 404 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/video/editor-rtl.css 691 B
build/block-library/blocks/video/editor.css 694 B
build/block-library/blocks/video/style-rtl.css 179 B
build/block-library/blocks/video/style.css 179 B
build/block-library/blocks/video/theme-rtl.css 139 B
build/block-library/blocks/video/theme.css 139 B
build/block-library/classic-rtl.css 162 B
build/block-library/classic.css 162 B
build/block-library/common-rtl.css 1.05 kB
build/block-library/common.css 1.05 kB
build/block-library/editor-elements-rtl.css 75 B
build/block-library/editor-elements.css 75 B
build/block-library/editor-rtl.css 11.7 kB
build/block-library/editor.css 11.7 kB
build/block-library/elements-rtl.css 54 B
build/block-library/elements.css 54 B
build/block-library/reset-rtl.css 478 B
build/block-library/reset.css 478 B
build/block-serialization-default-parser/index.min.js 1.13 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 50.4 kB
build/components/index.min.js 204 kB
build/components/style-rtl.css 11.6 kB
build/components/style.css 11.6 kB
build/compose/index.min.js 12.3 kB
build/core-data/index.min.js 15.9 kB
build/customize-widgets/index.min.js 11.7 kB
build/customize-widgets/style-rtl.css 1.41 kB
build/customize-widgets/style.css 1.41 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.16 kB
build/date/index.min.js 32.1 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.71 kB
build/edit-navigation/index.min.js 16.2 kB
build/edit-navigation/style-rtl.css 4.11 kB
build/edit-navigation/style.css 4.12 kB
build/edit-post/classic-rtl.css 571 B
build/edit-post/classic.css 571 B
build/edit-post/style-rtl.css 7.45 kB
build/edit-post/style.css 7.44 kB
build/edit-site/style-rtl.css 9.06 kB
build/edit-site/style.css 9.06 kB
build/edit-widgets/index.min.js 16.8 kB
build/edit-widgets/style-rtl.css 4.46 kB
build/edit-widgets/style.css 4.46 kB
build/editor/index.min.js 44.1 kB
build/editor/style-rtl.css 3.69 kB
build/editor/style.css 3.68 kB
build/element/index.min.js 4.93 kB
build/escape-html/index.min.js 548 B
build/experiments/index.min.js 882 B
build/format-library/index.min.js 7.2 kB
build/format-library/style-rtl.css 598 B
build/format-library/style.css 597 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.79 kB
build/keycodes/index.min.js 1.86 kB
build/list-reusable-blocks/index.min.js 2.13 kB
build/list-reusable-blocks/style-rtl.css 865 B
build/list-reusable-blocks/style.css 865 B
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 977 B
build/plugins/index.min.js 1.95 kB
build/preferences-persistence/index.min.js 2.23 kB
build/preferences/index.min.js 1.35 kB
build/primitives/index.min.js 960 B
build/priority-queue/index.min.js 1.59 kB
build/react-i18n/index.min.js 702 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.75 kB
build/reusable-blocks/index.min.js 2.26 kB
build/reusable-blocks/style-rtl.css 283 B
build/reusable-blocks/style.css 283 B
build/rich-text/index.min.js 10.7 kB
build/server-side-render/index.min.js 2.09 kB
build/shortcode/index.min.js 1.52 kB
build/style-engine/index.min.js 1.53 kB
build/token-list/index.min.js 650 B
build/url/index.min.js 3.7 kB
build/vendors/inert-polyfill.min.js 2.48 kB
build/vendors/react-dom.min.js 41.8 kB
build/vendors/react.min.js 4.02 kB
build/viewport/index.min.js 1.09 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.27 kB
build/widgets/style-rtl.css 1.21 kB
build/widgets/style.css 1.21 kB
build/wordcount/index.min.js 1.06 kB

compressed-size-action

@jsnajdr

jsnajdr commented Dec 18, 2022

Copy link
Copy Markdown
Member Author

It's interesting that the "Split view rendering should omit style options" test takes 3.5s to finish:

Split view rendering
  ✓ should render split view by default when mixed values provided (383 ms)
  ✓ should render correct width values in appropriate inputs (186 ms)
  ✓ should render split view correctly when starting with flat border (254 ms)
  ✓ should omit style options when requested (3438 ms)

And that makes it time out sometimes, because the Jest limit is 5s per test. My initial profiling shows that it's some big inefficiency inside jsdom, when calling getComputedStyle on an element. The test uses fake timers, so there is no real waiting for timeouts etc, it's all CPU-bound.


for ( let i = 0; i < colorButtons.length; i++ ) {
// Click on the color button to show the color picker popover.
await user.click( colorButtons[ 0 ] );

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Did you mean:

Suggested change
await user.click( colorButtons[ 0 ] );
await user.click( colorButtons[ i ] );

assertStyleOptionsMissing();
await user.click( colorButtons[ 3 ] );
// Click again to hide the popover.
await user.click( colorButtons[ 0 ] );

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Same as above:

Suggested change
await user.click( colorButtons[ 0 ] );
await user.click( colorButtons[ i ] );


function assertStyleOptionsMissing() {
const styleLabel = screen.queryByText( 'Style' );
const solidButton = screen.queryByRole( 'button', {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We should be able to shave ~8-10% of the test time by reducing the number of queries to look for style buttons. So, changing this:

				const solidButton = screen.queryByRole( 'button', {
					name: 'Solid',
				} );
				const dashedButton = screen.queryByRole( 'button', {
					name: 'Dashed',
				} );
				const dottedButton = screen.queryByRole( 'button', {
					name: 'Dotted',
				} );
				expect( styleLabel ).not.toBeInTheDocument();
				expect( solidButton ).not.toBeInTheDocument();
				expect( dashedButton ).not.toBeInTheDocument();
				expect( dottedButton ).not.toBeInTheDocument();

to:

				const styleButton = screen.queryByRole( 'button', {
					name: /(Solid)|(Dashed)|(Dotted)/,
				} );

				expect( styleButton ).not.toBeInTheDocument();

This exists in another test, so we could improve it there as well.

Comment on lines +301 to +305
await waitFor( () =>
expect(
getWrappingPopoverElement( colorPickerButton )
).toBePositionedPopover()
);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This seems to be the most expensive part - taking more or less 1/3 of the test time. Maybe this is a signal that the optimization should be done with the animation itself in the popover component? Should we try massaging the waitFor options (see https://testing-library.com/docs/dom-testing-library/api-async#waitfor)? Or perhaps when we use fake timers we should disable animations - not something I'd recommend TBH.

Comment on lines +298 to +300
const colorPickerButton = screen.getByRole( 'button', {
name: 'Custom color picker.',
} );

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I've noticed that queries themselves tend to be slow. But making hidden: true in order to disable additional work to exclude invisible elements makes this twice faster.

I've ran this:

				console.time( 'without hidden' );
				const colorPickerButton = screen.getByRole( 'button', {
					name: 'Custom color picker.',
				} );
				console.timeEnd( 'without hidden' );

				console.time( 'with hidden' );
				screen.getByRole( 'button', {
					name: 'Custom color picker.',
					hidden: true,
				} );
				console.timeEnd( 'with hidden' );

and got these results:

  console.time
    without hidden: 89 ms

      at Object.<anonymous> (packages/components/src/border-box-control/test/index.js:304:13)

  console.time
    with hidden: 42 ms

      at Object.<anonymous> (packages/components/src/border-box-control/test/index.js:311:13)

  console.time
    without hidden: 98 ms

      at Object.<anonymous> (packages/components/src/border-box-control/test/index.js:304:13)

  console.time
    with hidden: 37 ms

      at Object.<anonymous> (packages/components/src/border-box-control/test/index.js:311:13)

  console.time
    without hidden: 70 ms

      at Object.<anonymous> (packages/components/src/border-box-control/test/index.js:304:13)

  console.time
    with hidden: 36 ms

      at Object.<anonymous> (packages/components/src/border-box-control/test/index.js:311:13)

  console.time
    without hidden: 71 ms

      at Object.<anonymous> (packages/components/src/border-box-control/test/index.js:304:13)

  console.time
    with hidden: 34 ms

      at Object.<anonymous> (packages/components/src/border-box-control/test/index.js:311:13)

So adding hidden: true for all queries here should also improve the situation.

That being said, I wonder if we should enable it globally:

https://testing-library.com/docs/dom-testing-library/api-configuration#defaulthidden

That's likely going to cause some issues in tests where we assume that the hidden elements will be excluded. But it might end up making the tests run faster.

WDYT?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Seems that anything that checks visibility, be it getByRole with hidden: true or the popover wait (but does it really check visibility of anything?) is ridiculously show. That's because there's plenty of window.getComputedStyle() calls, and each takes approx 30ms. That's a lot of time for something that traverses a tree and looks for object properties. In the profiler, flame chart view like this is typical:

Screenshot 2022-12-19 at 8 18 28

We can "optimize" our tests to avoid visibility tests, but having to do that is really silly, the test author shouldn't worry about that at all.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I agree. Ideally, the testing framework should be responsible for that, and since testing-library doesn't do that, we can enable it for the entire project as I linked above. While that's not perfect, it could at least solve the "the test author shouldn't worry about that at all." problem to some degree.

@jsnajdr

jsnajdr commented Dec 19, 2022

Copy link
Copy Markdown
Member Author

Pushed a commit implementing @tyxla's suggestions: use the i loop variable for buttons, merge style button queries into one.

Before enabling hidden: false or anything similar, I'd rather first look at what's the matter with jsdom's window.getComputedStyle.

@tyxla

tyxla commented Dec 19, 2022

Copy link
Copy Markdown
Member

I wonder if we can find a good substitute for jsdom, which could solve many of those problems (or who knows, create new ones 😅 )

@tyxla

tyxla commented Dec 19, 2022

Copy link
Copy Markdown
Member

In any case, the performance of getComputedStyle() is a known perf bottleneck in jsdom: jsdom/jsdom#3234

@jsnajdr

jsnajdr commented Dec 19, 2022

Copy link
Copy Markdown
Member Author

In any case, the performance of getComputedStyle() is a known perf bottleneck

Thanks for finding and posting the link 🙂

I wonder if we can find a good substitute for jsdom

jsdom is quite a big and ambitious project, I don't think anyone is writing an alternative implementation just for fun 🙂

@tyxla

tyxla commented Dec 19, 2022

Copy link
Copy Markdown
Member

FWIW, despite the optimizations, that test seems to still be timing out (as seen in the latest build). Locally, on trunk, that test seems to be 40-50% faster than on this branch.

@jsnajdr

jsnajdr commented Dec 20, 2022

Copy link
Copy Markdown
Member Author

Did some analysis of getComputedStyle slowness today: jsdom/jsdom#3234 (comment)

The jsdom implementation could be 10x faster if it internally cached the computed styles.

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

Labels

[Package] Components /packages/components

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants