woocommerce/plugins/woocommerce-admin/client/wp-admin-scripts/print-shipping-label-banner/dismiss-modal/test/index.js

170 lines
4.2 KiB
JavaScript
Raw Normal View History

/**
* External dependencies
*/
Allow packages to be built in isolation. (https://github.com/woocommerce/woocommerce-admin/pull/7286) * Use yarn instead of npm. In prep for workspaces, since we're locked to npm < 7. See: https://github.com/woocommerce/woocommerce-admin/pull/7126#issue-661287749 * Initial workspace creation. * Add initial tsc build to @woocommerce/number. * Attempt to build experimental package. * Try currency package. * Define all packages as workspaces. * Use tsconfig common to packages. * Fix currency package build. * Build csv-export with tsc. * Try to build customer-effort-score with tsc. * Fix JSX pragma. * Build data package with tsc. * Build date package with tsc. * Build experimental package with tsc. * Try to build explat package with tsc. * Build navigation package with tsc. * Build notices package with tsc. * Build onboarding package with tsc. * Build components package with tsc. * Swap in package JS build into main script. * Fix experimental package build. * Try per-package css build with components. * Try to run components package tests in isolation. Broken on JSX in test files not being transformed. * Move @woocommerce/wc-admin-settings into a package. * Try to fix components package tests. Fails because we aren't setting up the jest/jest-dom globals. * Move JS test code to reusable (private) package. * Enable incremental TS builds. * Use workspaces to run JS tests. * Use new jest configs for update snapshot scripts. * Fix style builds. * Fix package version in components. * Fix client test debug and watch scripts. * Update yarn lock. * Update test-staged behavior. * Try to fix storybook. * Fix storybook. * Update more npm commands to yarn. * Add changelog. * Fix lint errors. * Update packages readme script references. * Clean up unused gitignore match. * Fix another npm command. * Fix JS builds on watch. * Fix start script. * Fix start scripts for packages. * Use tsc to build packages before tests * yarn -> npm. # Conflicts: # package-lock.json # package.json * Fix linter error. * Remove workspace definitions. * Fix missing Fragment import. * Fix package lock. * Fix missing reference. * Only build commonjs module for js-tests helper. * Remove errant dependency from components. * Remove noop scripts. * Fix package JS build before testing. * Revert noisy formatting changes. * Fix precommit and test scripts. * Fix minimum expected recommended extension count. Japan test case breaks this. * Revert babel config changes. * chore(release): publish - @woocommerce/components@7.2.0 - @woocommerce/csv-export@1.4.0 - @woocommerce/currency@3.2.0 - @woocommerce/customer-effort-score@1.1.0 - @woocommerce/data@1.4.0 - @woocommerce/date@3.1.0 - @woocommerce/dependency-extraction-webpack-plugin@1.7.0 - @woocommerce/eslint-plugin@1.3.0 - @woocommerce/experimental@1.5.0 - @woocommerce/explat@1.1.0 - @woocommerce/js-tests@1.1.0 - @woocommerce/navigation@6.1.0 - @woocommerce/notices@3.1.0 - @woocommerce/number@2.2.0 - @woocommerce/onboarding@1.1.0 - @woocommerce/tracks@1.1.0 - @woocommerce/wc-admin-settings@1.1.0 * Add script for running 'start' in a package. * Remove yarn from gitignore. * Update package changelogs, prep versions for release. * Try to fix E2E tests after main merge. * Some cleanup. * Add changelog. Co-authored-by: Paul Sealock <psealock@gmail.com>
2021-07-14 20:38:57 +00:00
import { createElement, Fragment } from '@wordpress/element';
2020-10-15 12:41:39 +00:00
import { render, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
/**
* Internal dependencies
*/
import { DismissModal } from '../index.js';
describe( 'Option Save events in DismissModal', () => {
const spyUpdateOptions = jest.fn();
2020-10-15 12:41:39 +00:00
test( 'Should save permanent dismissal', async () => {
const { getByRole } = render(
<Fragment>
<div id="woocommerce-admin-print-label" />
<DismissModal
visible={ true }
onClose={ jest.fn() }
onCloseAll={ jest.fn() }
trackElementClicked={ jest.fn() }
updateOptions={ spyUpdateOptions }
/>
</Fragment>
);
2020-10-15 12:41:39 +00:00
userEvent.click( getByRole( 'button', { name: "I don't need this" } ) );
await waitFor( () =>
expect( spyUpdateOptions ).toHaveBeenCalledWith( {
woocommerce_shipping_dismissed_timestamp: -1,
} )
);
} );
2020-10-15 12:41:39 +00:00
test( 'Should save temporary dismissal', async () => {
// Mock Date.now() so a known timestamp will be saved.
const mockDate = 123456;
const realDateNow = Date.now.bind( global.Date );
global.Date.now = jest.fn( () => mockDate );
2020-10-15 12:41:39 +00:00
const { getByRole } = render(
<Fragment>
<div id="woocommerce-admin-print-label" />
<DismissModal
visible={ true }
onClose={ jest.fn() }
onCloseAll={ jest.fn() }
trackElementClicked={ jest.fn() }
updateOptions={ spyUpdateOptions }
/>
</Fragment>
);
userEvent.click( getByRole( 'button', { name: 'Remind me later' } ) );
await waitFor( () =>
expect( spyUpdateOptions ).toHaveBeenCalledWith( {
woocommerce_shipping_dismissed_timestamp: mockDate,
} )
);
// Restore Date.now().
global.Date.now = realDateNow;
} );
} );
describe( 'Tracking events in DismissModal', () => {
const trackElementClicked = jest.fn();
2020-10-15 12:41:39 +00:00
it( 'should record an event when user clicks "I don\'t need this"', async () => {
const { getByRole } = render(
<Fragment>
<div id="woocommerce-admin-print-label" />
<DismissModal
visible={ true }
onClose={ jest.fn() }
onCloseAll={ jest.fn() }
trackElementClicked={ trackElementClicked }
updateOptions={ jest.fn() }
/>
</Fragment>
);
2020-10-15 12:41:39 +00:00
userEvent.click( getByRole( 'button', { name: "I don't need this" } ) );
await waitFor( () =>
expect( trackElementClicked ).toHaveBeenCalledWith(
'shipping_banner_dismiss_modal_close_forever'
)
);
} );
2020-10-15 12:41:39 +00:00
it( 'should record an event when user clicks "Remind me later"', async () => {
const { getByRole } = render(
<Fragment>
<div id="woocommerce-admin-print-label" />
<DismissModal
visible={ true }
onClose={ jest.fn() }
onCloseAll={ jest.fn() }
trackElementClicked={ trackElementClicked }
updateOptions={ jest.fn() }
/>
</Fragment>
);
userEvent.click( getByRole( 'button', { name: 'Remind me later' } ) );
await waitFor( () =>
expect( trackElementClicked ).toHaveBeenCalledWith(
'shipping_banner_dismiss_modal_remind_me_later'
)
);
} );
} );
describe( 'Dismissing modal', () => {
2020-10-15 12:41:39 +00:00
test( 'Should hide the banner by clicking permanent dismissal', async () => {
const { getByRole, getByTestId } = render(
<Fragment>
<div
id="woocommerce-admin-print-label"
data-testid="print-label"
/>
<DismissModal
visible={ true }
onClose={ jest.fn() }
onCloseAll={ jest.fn() }
trackElementClicked={ jest.fn() }
updateOptions={ jest.fn() }
/>
</Fragment>
);
2020-10-15 12:41:39 +00:00
userEvent.click( getByRole( 'button', { name: "I don't need this" } ) );
2020-10-15 12:41:39 +00:00
await waitFor( () =>
expect( getByTestId( 'print-label' ) ).not.toBeVisible()
);
} );
2020-10-15 12:41:39 +00:00
test( 'Should hide the banner by clicking temporary dismissal', async () => {
const { getByRole, getByTestId } = render(
<Fragment>
<div
id="woocommerce-admin-print-label"
data-testid="print-label"
/>
<DismissModal
visible={ true }
onClose={ jest.fn() }
onCloseAll={ jest.fn() }
trackElementClicked={ jest.fn() }
updateOptions={ jest.fn() }
/>
</Fragment>
);
userEvent.click( getByRole( 'button', { name: 'Remind me later' } ) );
2020-10-15 12:41:39 +00:00
await waitFor( () =>
expect( getByTestId( 'print-label' ) ).not.toBeVisible()
);
} );
} );