/** * External dependencies */ import { render } from '@testing-library/react'; import { useDispatch, useSelect } from '@wordpress/data'; import userEvent from '@testing-library/user-event'; /** * Internal dependencies */ import FavoriteButton from '../'; jest.mock( '@wordpress/data', () => { // Require the original module to not be mocked... const originalModule = jest.requireActual( '@wordpress/data' ); return { __esModule: true, // Use it when dealing with esModules ...originalModule, useDispatch: jest.fn().mockReturnValue( {} ), useSelect: jest.fn().mockReturnValue( {} ), }; } ); describe( 'FavoriteButton', () => { test( 'should not show when favorites are still resolving', () => { useSelect.mockImplementation( () => ( { favorites: [], isResolving: true, } ) ); const { container } = render( ); expect( container.querySelector( '.woocommerce-navigation-favorite-button' ) ).toBeNull(); } ); test( 'should show the empty star when item is not favorited', () => { useSelect.mockImplementation( () => ( { favorites: [], isResolving: false, } ) ); const { container } = render( ); expect( container.querySelector( '.dashicons-star-empty' ) ).not.toBeNull(); } ); test( 'should show the filled star when item is favorited', () => { useSelect.mockImplementation( () => ( { favorites: [ 'my-item' ], isResolving: false, } ) ); const { container } = render( ); expect( container.querySelector( '.dashicons-star-filled' ) ).not.toBeNull(); } ); test( 'should remove the favorite when toggling a favorited item', () => { useSelect.mockImplementation( () => ( { favorites: [ 'my-item' ], isResolving: false, } ) ); const addFavorite = jest.fn(); const removeFavorite = jest.fn(); useDispatch.mockReturnValue( { addFavorite, removeFavorite, } ); const { container } = render( ); userEvent.click( container.querySelector( '.woocommerce-navigation-favorite-button' ) ); expect( addFavorite ).not.toHaveBeenCalled(); expect( removeFavorite ).toHaveBeenCalled(); } ); test( 'should add the favorite when toggling a unfavorited item', () => { useSelect.mockImplementation( () => ( { favorites: [], isResolving: false, } ) ); const addFavorite = jest.fn(); const removeFavorite = jest.fn(); useDispatch.mockReturnValue( { addFavorite, removeFavorite, } ); const { container } = render( ); userEvent.click( container.querySelector( '.woocommerce-navigation-favorite-button' ) ); expect( addFavorite ).toHaveBeenCalled(); expect( removeFavorite ).not.toHaveBeenCalled(); } ); } );