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

Define end-to-end test experimental features utility as lifecycle helper #22712

Merged
merged 1 commit into from
May 28, 2020

Conversation

aduth
Copy link
Member

@aduth aduth commented May 28, 2020

Related Slack conversation (link requires registration): https://wordpress.slack.com/archives/C02QB2JS7/p1590677131416000

This pull request seeks to resolve intermittent failures of end-to-end tests, where the block directory end-to-end test suite does not currently tear down to reset experimental features to the initial state, causing subsequent tests run in the same container to unexpectedly run with the block directory experiment enabled. This causes builds to fail due to a related issue with ARIA attributes not being applied:

Example: https://travis-ci.com/github/WordPress/gutenberg/jobs/340966385

    Expected page to pass Axe accessibility tests.
    Violations found:
    Rule: "aria-required-attr" (Required ARIA attributes must be provided)
    Help: https://dequeuniversity.com/rules/axe/3.5/aria-required-attr?application=axe-puppeteer
    Affected Nodes:
      .block-directory-downloadable-block-header__title
        Fix ANY of the following:
        - Required ARIA attribute not present: aria-level

Implementation Notes:

The implementation here addresses this by encapsulating the entire lifecycle requirements of enabling experimental features into a single utility, thus avoiding the potential to overlook the need to provide a afterEach tear-down.

The idea here is to promote a pattern that in cases where something should be "activated" before and "deactivated" after a test is run, we should prefer to create a single utility which manages the full lifecycle of the behavior in a test. In this way, it behaves a lot like a React Hook.

Before:

const requiredExperiments = [
	'#gutenberg-full-site-editing',
	'#gutenberg-full-site-editing-demo',
];

beforeAll( async () => {
	await enableExperimentalFeatures( requiredExperiments );
} );

// And _hopefully_:
// afterAll( async () => {
//	await disableExperimentalFeatures( requiredExperiments );
// } );

After:

useExperimentalFeatures( [
	'#gutenberg-full-site-editing',
	'#gutenberg-full-site-editing-demo',
] );

Testing Instructions:

Ensure end-to-end tests pass:

npm run test-e2e packages/e2e-tests/specs/experiments/block-directory-add.test.js

@aduth aduth added [Type] Automated Testing Testing infrastructure changes impacting the execution of end-to-end (E2E) and/or unit tests. [Package] E2E Tests /packages/e2e-tests labels May 28, 2020
@github-actions
Copy link

Size Change: 0 B

Total Size: 1.12 MB

ℹ️ View Unchanged
Filename Size Change
build/a11y/index.js 1.14 kB 0 B
build/annotations/index.js 3.62 kB 0 B
build/api-fetch/index.js 3.4 kB 0 B
build/autop/index.js 2.83 kB 0 B
build/blob/index.js 620 B 0 B
build/block-directory/index.js 6.48 kB 0 B
build/block-directory/style-rtl.css 788 B 0 B
build/block-directory/style.css 788 B 0 B
build/block-editor/index.js 105 kB 0 B
build/block-editor/style-rtl.css 11 kB 0 B
build/block-editor/style.css 11 kB 0 B
build/block-library/editor-rtl.css 7.21 kB 0 B
build/block-library/editor.css 7.21 kB 0 B
build/block-library/index.js 119 kB 0 B
build/block-library/style-rtl.css 7.68 kB 0 B
build/block-library/style.css 7.68 kB 0 B
build/block-library/theme-rtl.css 684 B 0 B
build/block-library/theme.css 686 B 0 B
build/block-serialization-default-parser/index.js 1.88 kB 0 B
build/block-serialization-spec-parser/index.js 3.1 kB 0 B
build/blocks/index.js 48.1 kB 0 B
build/components/index.js 190 kB 0 B
build/components/style-rtl.css 17.1 kB 0 B
build/components/style.css 17.1 kB 0 B
build/compose/index.js 9.31 kB 0 B
build/core-data/index.js 11.4 kB 0 B
build/data-controls/index.js 1.29 kB 0 B
build/data/index.js 8.42 kB 0 B
build/date/index.js 5.47 kB 0 B
build/deprecated/index.js 771 B 0 B
build/dom-ready/index.js 568 B 0 B
build/dom/index.js 3.11 kB 0 B
build/edit-navigation/index.js 6.62 kB 0 B
build/edit-navigation/style-rtl.css 857 B 0 B
build/edit-navigation/style.css 856 B 0 B
build/edit-post/index.js 302 kB 0 B
build/edit-post/style-rtl.css 12.2 kB 0 B
build/edit-post/style.css 12.2 kB 0 B
build/edit-site/index.js 14 kB 0 B
build/edit-site/style-rtl.css 5.52 kB 0 B
build/edit-site/style.css 5.53 kB 0 B
build/edit-widgets/index.js 8.05 kB 0 B
build/edit-widgets/style-rtl.css 4.59 kB 0 B
build/edit-widgets/style.css 4.59 kB 0 B
build/editor/editor-styles-rtl.css 425 B 0 B
build/editor/editor-styles.css 428 B 0 B
build/editor/index.js 44.6 kB 0 B
build/editor/style-rtl.css 5.06 kB 0 B
build/editor/style.css 5.06 kB 0 B
build/element/index.js 4.65 kB 0 B
build/escape-html/index.js 733 B 0 B
build/format-library/index.js 7.71 kB 0 B
build/format-library/style-rtl.css 502 B 0 B
build/format-library/style.css 502 B 0 B
build/hooks/index.js 2.13 kB 0 B
build/html-entities/index.js 622 B 0 B
build/i18n/index.js 3.56 kB 0 B
build/is-shallow-equal/index.js 711 B 0 B
build/keyboard-shortcuts/index.js 2.51 kB 0 B
build/keycodes/index.js 1.94 kB 0 B
build/list-reusable-blocks/index.js 3.12 kB 0 B
build/list-reusable-blocks/style-rtl.css 226 B 0 B
build/list-reusable-blocks/style.css 226 B 0 B
build/media-utils/index.js 5.29 kB 0 B
build/notices/index.js 1.79 kB 0 B
build/nux/index.js 3.4 kB 0 B
build/nux/style-rtl.css 616 B 0 B
build/nux/style.css 613 B 0 B
build/plugins/index.js 2.56 kB 0 B
build/primitives/index.js 1.5 kB 0 B
build/priority-queue/index.js 789 B 0 B
build/redux-routine/index.js 2.85 kB 0 B
build/rich-text/index.js 14.8 kB 0 B
build/server-side-render/index.js 2.68 kB 0 B
build/shortcode/index.js 1.7 kB 0 B
build/token-list/index.js 1.28 kB 0 B
build/url/index.js 4.02 kB 0 B
build/viewport/index.js 1.84 kB 0 B
build/warning/index.js 1.14 kB 0 B
build/wordcount/index.js 1.17 kB 0 B

compressed-size-action

@@ -11,7 +11,7 @@ import {
/**
* Internal dependencies
*/
import { enableExperimentalFeatures } from '../../experimental-features';
import { useExperimentalFeatures } from '../../experimental-features';
Copy link
Member

@gziolo gziolo May 28, 2020

Choose a reason for hiding this comment

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

It reads like React hook because of the use prefix 🙃

Edit: Now I read description, it's intended 👍

Copy link
Member Author

@aduth aduth May 28, 2020

Choose a reason for hiding this comment

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

Yeah, intentional in that the purpose is largely the same in utilities to manage lifecycle. But I grant they are quite different as far as the underlying implementation, and there is some potential for confusion. It feels like the chance of actual conflict is fairly low. I'm open to different naming. In the original Slack conversation, I mentioned withFooEnabled as an example, though there's a similar issue there with how we tend to use with prefixes for higher-order functions. I also don't think that React should hold exclusive rights to this prefix, since it's quite generic.

🤷

It's an internal utility, so it can be changed in the future. I do like the idea of propagating this sort of pattern for the general requirement of test lifecycle utilities, so at some point a pattern should be established if it becomes more commonplace.

Copy link
Member

Choose a reason for hiding this comment

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

It’s totally fine. I like this parallel. I just wanted to emphasize how this concept changed the perception when reading code outside of the React context (it wasn’t intentional to use double meaning here but now I find it funny).

Copy link
Member Author

Choose a reason for hiding this comment

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

I do like the idea of propagating this sort of pattern for the general requirement of test lifecycle utilities

Related: #22804

Copy link
Member

@gziolo gziolo left a comment

Choose a reason for hiding this comment

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

Nice, I double-checked those previously used helpers aren't part of public API – they aren't.

@aduth aduth merged commit feb585c into master May 28, 2020
@aduth aduth deleted the fix/e2e-tear-down-experimental branch May 28, 2020 16:41
@github-actions github-actions bot added this to the Gutenberg 8.3 milestone May 28, 2020
@StevenDufresne
Copy link
Contributor

Awesome. Thanks for this!

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 [Type] Automated Testing Testing infrastructure changes impacting the execution of end-to-end (E2E) and/or unit tests.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants