woocommerce/plugins/woocommerce-admin/client/homescreen/activity-panel/reviews/test/index.js

172 lines
4.6 KiB
JavaScript
Raw Normal View History

/**
* External dependencies
*/
import { render, screen, fireEvent } from '@testing-library/react';
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 { getByTextWithMarkup } from '@woocommerce/js-tests';
/**
* Internal dependencies
*/
import { ReviewsPanel } from '../';
const REVIEW = {
id: 10,
date_created: '2020-11-20T18:24:41',
date_created_gmt: '2020-11-20T18:24:41',
product_id: 45,
status: 'hold',
reviewer: 'Reviewer',
reviewer_email: 'test@test.ca',
review: '<p>It is an average hat</p>\n',
rating: 3,
verified: false,
_embedded: {
up: [
{
id: 45,
name: 'Cap',
slug: 'cap',
permalink: 'https://one.wordpress.test/product/cap/',
description:
'Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.',
short_description: 'This is a simple product.',
images: [
{
id: 74,
date_created: '2020-11-20T17:28:47',
date_created_gmt: '2020-11-20T17:28:47',
date_modified: '2020-11-20T17:28:47',
date_modified_gmt: '2020-11-20T17:28:47',
src:
'https://one.wordpress.test/wp-content/uploads/2020/11/cap-2-1.jpg',
name: 'cap-2-1.jpg',
alt: '',
},
],
},
],
},
};
jest.mock( '../checkmark-circle-icon', () =>
jest.fn().mockImplementation( () => '[checkmark-circle-icon]' )
);
describe( 'ReviewsPanel', () => {
it( 'should render an empty review card', () => {
render(
<ReviewsPanel
hasUnapprovedReviews={ false }
isError={ false }
isRequesting={ false }
reviews={ [] }
createNotice={ () => {} }
/>
);
expect( screen.queryByRole( 'section' ) ).toBeNull();
} );
it( 'should render a review card with title <name> reviewed <product name>', () => {
render(
<ReviewsPanel
hasUnapprovedReviews={ true }
isError={ false }
isRequesting={ false }
reviews={ [ REVIEW ] }
createNotice={ () => {} }
/>
);
expect( getByTextWithMarkup( 'Reviewer reviewed Cap' ) ).not.toBeNull();
} );
it( 'should render checkmark circle icon in the review title, if review is verfied owner', () => {
render(
<ReviewsPanel
hasUnapprovedReviews={ true }
isError={ false }
isRequesting={ false }
reviews={ [ { ...REVIEW, verified: true } ] }
createNotice={ () => {} }
/>
);
const header = screen.getByRole( 'heading', { level: 3 } );
expect( header.innerHTML ).toMatch( /\[checkmark-circle-icon\]/ );
} );
describe( 'review actions', () => {
it( 'should render a review card with approve, mark as spam, and delete buttons', () => {
render(
<ReviewsPanel
hasUnapprovedReviews={ true }
isError={ false }
isRequesting={ false }
reviews={ [ REVIEW ] }
createNotice={ () => {} }
/>
);
expect( screen.queryByText( 'Approve' ) ).toBeInTheDocument();
expect( screen.queryByText( 'Mark as spam' ) ).toBeInTheDocument();
expect( screen.queryByText( 'Delete' ) ).toBeInTheDocument();
} );
it( 'should trigger updateReview with status approved when Approve is clicked', () => {
const clickHandler = jest.fn( () => {
return Promise.resolve();
} );
render(
<ReviewsPanel
hasUnapprovedReviews={ true }
isError={ false }
isRequesting={ false }
reviews={ [ REVIEW ] }
updateReview={ clickHandler }
createNotice={ () => {} }
/>
);
fireEvent.click( screen.getByText( 'Approve' ) );
expect( clickHandler ).toHaveBeenCalledWith( REVIEW.id, {
status: 'approved',
} );
} );
it( 'should trigger updateReview with status spam when Mark as spam is clicked', () => {
const clickHandler = jest.fn( () => {
return Promise.resolve();
} );
render(
<ReviewsPanel
hasUnapprovedReviews={ true }
isError={ false }
isRequesting={ false }
reviews={ [ REVIEW ] }
updateReview={ clickHandler }
createNotice={ () => {} }
/>
);
fireEvent.click( screen.getByText( 'Mark as spam' ) );
expect( clickHandler ).toHaveBeenCalledWith( REVIEW.id, {
status: 'spam',
} );
} );
it( 'should trigger deleteReview with review id when delete is clicked', () => {
const clickHandler = jest.fn( () => {
return Promise.resolve();
} );
render(
<ReviewsPanel
hasUnapprovedReviews={ true }
isError={ false }
isRequesting={ false }
reviews={ [ REVIEW ] }
deleteReview={ clickHandler }
createNotice={ () => {} }
/>
);
fireEvent.click( screen.getByText( 'Delete' ) );
expect( clickHandler ).toHaveBeenCalledWith( REVIEW.id );
} );
} );
} );