woocommerce/plugins/woocommerce-admin/client/analytics/components/report-summary/test/index.js

145 lines
3.7 KiB
JavaScript
Raw Normal View History

/**
* External dependencies
*/
2020-10-15 12:41:39 +00:00
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
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 } from '@wordpress/element';
/**
* Internal dependencies
*/
import { ReportSummary } from '../';
describe( 'ReportSummary', () => {
function renderChart(
type,
primaryValue,
secondaryValue,
isError = false,
isRequesting = false,
props
) {
const selectedChart = {
Correcting and clarifying analytics terms and calculations (https://github.com/woocommerce/woocommerce-admin/pull/3104) * Relabel Net Revenue to Net Sales, revert previous refund work on Gross revenue and rename to total sales. Update the orer of all the things * Add gross sales calculation to revenue stats endpoint. * Restore coupon_total when updating order stats. * Wire up gross sales to revenue report. * Fix revenue report refunds calculation when there are no refunds. * update net sales labels and cases in order, product and category tables * Subtract refunded shipping and taxes from gross sales. * pluses to minuses to fix the gross revenue and refund totals when refunding * Add gross_sales to revenue stats orderby enum. * Change refund labels to Returns * Remove usage of defunct coupon_total column. * Store refunded amount in stats table. * Rename "gross_total" column to "total_sales". * Net total for refund orders can be used instead of a new column. * Rename gross_revenue to total_sales. * Coalesce coupons total in order stats query. SUM()ing all nulls gives null, not zero. * Use segmentation selections to backfill missing data. Fo when report columns and segmentation columns don't match. * Remove errant gross_sales from expected interval test data. * Fix gross sales tests for revenue/stats. * Move missing segment fills back to their original locations. * Fix remaining tests failing because of gross sales. * Fix db upgrade function rename of gross_total column. * Fix linter errors.
2019-11-22 15:06:14 +00:00
key: 'total_sales',
label: 'Total Sales',
type,
};
const charts = [ selectedChart ];
const endpoint = 'revenue';
const query = {};
const summaryData = {
totals: {
primary: {
Correcting and clarifying analytics terms and calculations (https://github.com/woocommerce/woocommerce-admin/pull/3104) * Relabel Net Revenue to Net Sales, revert previous refund work on Gross revenue and rename to total sales. Update the orer of all the things * Add gross sales calculation to revenue stats endpoint. * Restore coupon_total when updating order stats. * Wire up gross sales to revenue report. * Fix revenue report refunds calculation when there are no refunds. * update net sales labels and cases in order, product and category tables * Subtract refunded shipping and taxes from gross sales. * pluses to minuses to fix the gross revenue and refund totals when refunding * Add gross_sales to revenue stats orderby enum. * Change refund labels to Returns * Remove usage of defunct coupon_total column. * Store refunded amount in stats table. * Rename "gross_total" column to "total_sales". * Net total for refund orders can be used instead of a new column. * Rename gross_revenue to total_sales. * Coalesce coupons total in order stats query. SUM()ing all nulls gives null, not zero. * Use segmentation selections to backfill missing data. Fo when report columns and segmentation columns don't match. * Remove errant gross_sales from expected interval test data. * Fix gross sales tests for revenue/stats. * Move missing segment fills back to their original locations. * Fix remaining tests failing because of gross sales. * Fix db upgrade function rename of gross_total column. * Fix linter errors.
2019-11-22 15:06:14 +00:00
total_sales: primaryValue,
},
secondary: {
Correcting and clarifying analytics terms and calculations (https://github.com/woocommerce/woocommerce-admin/pull/3104) * Relabel Net Revenue to Net Sales, revert previous refund work on Gross revenue and rename to total sales. Update the orer of all the things * Add gross sales calculation to revenue stats endpoint. * Restore coupon_total when updating order stats. * Wire up gross sales to revenue report. * Fix revenue report refunds calculation when there are no refunds. * update net sales labels and cases in order, product and category tables * Subtract refunded shipping and taxes from gross sales. * pluses to minuses to fix the gross revenue and refund totals when refunding * Add gross_sales to revenue stats orderby enum. * Change refund labels to Returns * Remove usage of defunct coupon_total column. * Store refunded amount in stats table. * Rename "gross_total" column to "total_sales". * Net total for refund orders can be used instead of a new column. * Rename gross_revenue to total_sales. * Coalesce coupons total in order stats query. SUM()ing all nulls gives null, not zero. * Use segmentation selections to backfill missing data. Fo when report columns and segmentation columns don't match. * Remove errant gross_sales from expected interval test data. * Fix gross sales tests for revenue/stats. * Move missing segment fills back to their original locations. * Fix remaining tests failing because of gross sales. * Fix db upgrade function rename of gross_total column. * Fix linter errors.
2019-11-22 15:06:14 +00:00
total_sales: secondaryValue,
},
},
isError,
isRequesting,
};
2020-10-15 12:41:39 +00:00
return render(
<ReportSummary
charts={ charts }
endpoint={ endpoint }
query={ query }
selectedChart={ selectedChart }
summaryData={ summaryData }
{ ...props }
/>
);
}
2020-10-15 12:41:39 +00:00
test( 'should set the correct prop values for the SummaryNumber components', async () => {
renderChart( 'number', 1000.5, 500.25 );
2020-10-15 12:41:39 +00:00
expect( screen.getByText( '1,000.5' ) ).toBeInTheDocument();
const delta = screen.getByText( '100%' );
expect( delta ).toBeInTheDocument();
2020-10-15 12:41:39 +00:00
userEvent.hover( delta );
const tooltip = await screen.findByText( 'Previous Year: 500.25' );
expect( tooltip ).toBeInTheDocument();
2020-10-15 12:41:39 +00:00
userEvent.unhover( delta );
expect( screen.queryByText( 'Previous Year: 500.25' ) ).toBeNull();
} );
2020-10-15 12:41:39 +00:00
test( 'should format currency numbers properly', async () => {
renderChart( 'currency', 1000.5, 500.25 );
expect( screen.getByText( '$1,000.50' ) ).toBeInTheDocument();
const delta = screen.getByText( '100%' );
expect( delta ).toBeInTheDocument();
2020-10-15 12:41:39 +00:00
userEvent.hover( delta );
const tooltip = await screen.findByText( 'Previous Year: $500.25' );
expect( tooltip ).toBeInTheDocument();
userEvent.unhover( delta );
expect( screen.queryByText( 'Previous Year: $500.25' ) ).toBeNull();
} );
2020-10-15 12:41:39 +00:00
test( 'should format average numbers properly', async () => {
renderChart( 'average', 1000.5, 500.25 );
expect( screen.getByText( '1001' ) ).toBeInTheDocument();
const delta = screen.getByText( '100%' );
expect( delta ).toBeInTheDocument();
2020-10-15 12:41:39 +00:00
userEvent.hover( delta );
const tooltip = await screen.findByText( 'Previous Year: 500' );
expect( tooltip ).toBeInTheDocument();
userEvent.unhover( delta );
expect( screen.queryByText( 'Previous Year: 500' ) ).toBeNull();
} );
2020-10-15 12:41:39 +00:00
test( 'should not break if secondary value is 0', async () => {
renderChart( 'number', 1000.5, 0 );
expect( screen.getByText( '1,000.5' ) ).toBeInTheDocument();
const delta = screen.getByText( '0%' );
expect( delta ).toBeInTheDocument();
userEvent.hover( delta );
const tooltip = await screen.findByText( 'Previous Year: 0' );
expect( tooltip ).toBeInTheDocument();
2020-10-15 12:41:39 +00:00
userEvent.unhover( delta );
expect( screen.queryByText( 'Previous Year: 0' ) ).toBeNull();
} );
2020-10-15 12:41:39 +00:00
test( 'should show 0s when displaying an empty search', async () => {
renderChart( 'number', null, undefined );
expect( screen.getAllByText( 'N/A' ) ).not.toBeNull();
2020-10-15 12:41:39 +00:00
const delta = screen.getByLabelText( 'No change from Previous Year:' );
expect( delta ).toBeInTheDocument();
} );
test( 'should display ReportError when isError is true', () => {
2020-10-15 12:41:39 +00:00
renderChart( 'number', null, null, true );
2020-10-15 12:41:39 +00:00
expect(
screen.getByText(
'There was an error getting your stats. Please try again.'
)
).toBeInTheDocument();
} );
test( 'should display SummaryListPlaceholder when isRequesting is true', () => {
2020-10-15 12:41:39 +00:00
const { container } = renderChart( 'number', null, null, false, true );
2020-10-15 12:41:39 +00:00
expect(
container.querySelector( '.woocommerce-summary.is-placeholder' )
).toBeInTheDocument();
} );
} );