/** * External dependencies */ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; /** * Internal dependencies */ import { useCampaigns } from './useCampaigns'; import { Campaigns } from './Campaigns'; jest.mock( './useCampaigns', () => ( { useCampaigns: jest.fn(), } ) ); describe( 'Campaigns component', () => { it( 'renders a TablePlaceholder when loading is in progress', () => { ( useCampaigns as jest.Mock ).mockReturnValue( { loading: true, error: undefined, data: undefined, meta: undefined, } ); const { container } = render( ); const tablePlaceholder = container.querySelector( 'div.woocommerce-table__table.is-loading' ); expect( tablePlaceholder ).toBeInTheDocument(); } ); it( 'renders an error message when loading is done and data is undefined', () => { ( useCampaigns as jest.Mock ).mockReturnValue( { loading: false, error: {}, data: undefined, meta: undefined, } ); render( ); expect( screen.getByText( 'An unexpected error occurred.' ) ).toBeInTheDocument(); } ); it( 'renders an info message when loading is done and data is an empty array', () => { ( useCampaigns as jest.Mock ).mockReturnValue( { loading: false, error: undefined, data: [], meta: { total: 0, }, } ); render( ); expect( screen.getByText( 'Advertise with marketing campaigns' ) ).toBeInTheDocument(); } ); it( 'renders a table with campaign info and without pagination when loading is done and data is an array with length no more than page size', () => { ( useCampaigns as jest.Mock ).mockReturnValue( { loading: false, error: undefined, data: [ { id: `google-listings-and-ads|111`, title: 'Campaign 111', description: '', cost: `USD 111`, manageUrl: 'https://wc1.test/wp-admin/admin.php?page=wc-admin&path=/google/dashboard&subpath=/campaigns/edit&programId=111', icon: 'https://woocommerce.com/wp-content/uploads/2021/06/woo-GoogleListingsAds-jworee.png', channelName: 'Google Listings and Ads', channelSlug: 'google-listings-and-ads', }, ], meta: { total: 1, }, } ); const { container } = render( ); expect( screen.getByText( 'Campaign 111' ) ).toBeInTheDocument(); expect( screen.getByText( 'USD 111' ) ).toBeInTheDocument(); const pagination = container.querySelector( '.woocommerce-pagination' ); expect( pagination ).not.toBeInTheDocument(); } ); it( 'renders a table with campaign info and with pagination when loading is done and data is an array with length more than page size', async () => { ( useCampaigns as jest.Mock ).mockReturnValue( { loading: false, error: undefined, data: [ { id: `google-listings-and-ads|111`, title: 'Campaign 111', description: '', cost: `USD 111`, manageUrl: 'https://wc1.test/wp-admin/admin.php?page=wc-admin&path=/google/dashboard&subpath=/campaigns/edit&programId=111', icon: 'https://woocommerce.com/wp-content/uploads/2021/06/woo-GoogleListingsAds-jworee.png', channelName: 'Google Listings and Ads', channelSlug: 'google-listings-and-ads', }, { id: `google-listings-and-ads|222`, title: 'Campaign 222', description: '', cost: `USD 222`, manageUrl: 'https://wc1.test/wp-admin/admin.php?page=wc-admin&path=/google/dashboard&subpath=/campaigns/edit&programId=222', icon: 'https://woocommerce.com/wp-content/uploads/2021/06/woo-GoogleListingsAds-jworee.png', channelName: 'Google Listings and Ads', channelSlug: 'google-listings-and-ads', }, { id: `google-listings-and-ads|333`, title: 'Campaign 333', description: '', cost: `USD 333`, manageUrl: 'https://wc1.test/wp-admin/admin.php?page=wc-admin&path=/google/dashboard&subpath=/campaigns/edit&programId=333', icon: 'https://woocommerce.com/wp-content/uploads/2021/06/woo-GoogleListingsAds-jworee.png', channelName: 'Google Listings and Ads', channelSlug: 'google-listings-and-ads', }, { id: `google-listings-and-ads|444`, title: 'Campaign 444', description: '', cost: `USD 444`, manageUrl: 'https://wc1.test/wp-admin/admin.php?page=wc-admin&path=/google/dashboard&subpath=/campaigns/edit&programId=444', icon: 'https://woocommerce.com/wp-content/uploads/2021/06/woo-GoogleListingsAds-jworee.png', channelName: 'Google Listings and Ads', channelSlug: 'google-listings-and-ads', }, { id: `google-listings-and-ads|555`, title: 'Campaign 555', description: '', cost: `USD 555`, manageUrl: 'https://wc1.test/wp-admin/admin.php?page=wc-admin&path=/google/dashboard&subpath=/campaigns/edit&programId=555', icon: 'https://woocommerce.com/wp-content/uploads/2021/06/woo-GoogleListingsAds-jworee.png', channelName: 'Google Listings and Ads', channelSlug: 'google-listings-and-ads', }, { id: `google-listings-and-ads|666`, title: 'Campaign 666', description: '', cost: `USD 666`, manageUrl: 'https://wc1.test/wp-admin/admin.php?page=wc-admin&path=/google/dashboard&subpath=/campaigns/edit&programId=666', icon: 'https://woocommerce.com/wp-content/uploads/2021/06/woo-GoogleListingsAds-jworee.png', channelName: 'Google Listings and Ads', channelSlug: 'google-listings-and-ads', }, ], meta: { total: 6, }, } ); render( ); // Campaign info. expect( screen.getByText( 'Campaign 111' ) ).toBeInTheDocument(); expect( screen.getByText( 'USD 111' ) ).toBeInTheDocument(); // Pagination. expect( screen.getByText( 'Page 1 of 2' ) ).toBeInTheDocument(); // Click on the next button to go to next page. await userEvent.click( screen.getByRole( 'button', { name: 'Next Page' } ) ); // Campaign info in the second page. expect( screen.getByText( 'Campaign 666' ) ).toBeInTheDocument(); expect( screen.getByText( 'USD 666' ) ).toBeInTheDocument(); } ); } );