// eslint-disable-next-line import/named import { render, screen } from '@testing-library/react'; import WCShippingPlugin from './index'; import { getConfig } from '../../utils'; import { ADDRESS_TYPES } from '../../data/constants'; // Mock dependencies jest.mock( '../../utils', () => ( { getConfig: jest.fn(), } ) ); jest.mock( '../../data/address', () => ( { addressStore: {}, registerAddressStore: jest.fn(), } ) ); jest.mock( '../../data/label-purchase', () => ( { labelPurchaseStore: {}, registerLabelPurchaseStore: jest.fn(), } ) ); jest.mock( '../../components/label-purchase/label-purchase-tabs', () => ( { LabelPurchaseTabs: jest.fn( () =>
Label Purchase Tabs
), } ) ); jest.mock( '../../effects/label-purchase', () => ( { LabelPurchaseEffects: jest.fn( () => null ), } ) ); jest.mock( '../../components/address-step/address_step', () => ( { AddressStep: jest.fn( ( { type, onCompleteCallback, onCancelCallback } ) => (
Address Step
{ type }
) ), } ) ); describe( 'WCShippingPlugin', () => { beforeEach( () => { jest.clearAllMocks(); } ); describe( 'Default mode (label-purchase)', () => { it( 'should render label purchase component when mode is not specified', () => { ( getConfig as jest.Mock ).mockReturnValue( { order: { id: 123 }, } ); render( ); expect( screen.getByText( 'Label Purchase Tabs' ) ).toBeInTheDocument(); } ); it( 'should render label purchase component when mode is explicitly set to label-purchase', () => { ( getConfig as jest.Mock ).mockReturnValue( { order: { id: 123 }, mode: 'label-purchase', } ); render( ); expect( screen.getByText( 'Label Purchase Tabs' ) ).toBeInTheDocument(); } ); } ); describe( 'Address editor mode', () => { it( 'should render AddressStep component when mode is address-editor', () => { ( getConfig as jest.Mock ).mockReturnValue( { mode: 'address-editor', order: { id: 123, shipping_address: { address_1: '123 Main St', city: 'Test City', }, }, accountSettings: { storeOptions: { origin_country: 'US', }, }, } ); render( ); expect( screen.getByTestId( 'address-step' ) ).toBeInTheDocument(); expect( screen.getByText( 'Address Step' ) ).toBeInTheDocument(); } ); it( 'should pass correct address type to AddressStep', () => { ( getConfig as jest.Mock ).mockReturnValue( { mode: 'address-editor', order: { id: 123, shipping_address: { address_1: '123 Main St' }, }, accountSettings: { storeOptions: { origin_country: 'US', }, }, } ); render( ); expect( screen.getByTestId( 'address-type' ) ).toHaveTextContent( ADDRESS_TYPES.DESTINATION ); } ); it( 'should use address from config.address when order.shipping_address is not available', () => { const mockAddress = { address: '456 Test Ave', city: 'Test Town' }; ( getConfig as jest.Mock ).mockReturnValue( { mode: 'address-editor', address: mockAddress, order: { id: 123, }, accountSettings: { storeOptions: { origin_country: 'GB', }, }, } ); render( ); expect( screen.getByTestId( 'address-step' ) ).toBeInTheDocument(); } ); it( 'should default to US when origin country is not provided', () => { ( getConfig as jest.Mock ).mockReturnValue( { mode: 'address-editor', order: { id: 123, shipping_address: { address_1: '123 Main St' }, }, } ); render( ); expect( screen.getByTestId( 'address-step' ) ).toBeInTheDocument(); } ); } ); describe( 'Callback invocation', () => { it( 'should invoke onAddressComplete callback when address is completed', () => { const mockOnAddressComplete = jest.fn(); ( getConfig as jest.Mock ).mockReturnValue( { mode: 'address-editor', order: { id: 123, shipping_address: { address_1: '123 Main St' }, }, accountSettings: { storeOptions: { origin_country: 'US', }, }, onAddressComplete: mockOnAddressComplete, } ); render( ); const completeButton = screen.getByText( 'Complete' ); completeButton.click(); expect( mockOnAddressComplete ).toHaveBeenCalledWith( { test: 'address', } ); } ); it( 'should invoke onAddressCancel callback when address is cancelled', () => { const mockOnAddressCancel = jest.fn(); ( getConfig as jest.Mock ).mockReturnValue( { mode: 'address-editor', order: { id: 123, shipping_address: { address_1: '123 Main St' }, }, accountSettings: { storeOptions: { origin_country: 'US', }, }, onAddressCancel: mockOnAddressCancel, } ); render( ); const cancelButton = screen.getByText( 'Cancel' ); cancelButton.click(); expect( mockOnAddressCancel ).toHaveBeenCalled(); } ); it( 'should not throw error when callbacks are not provided', () => { ( getConfig as jest.Mock ).mockReturnValue( { mode: 'address-editor', order: { id: 123, shipping_address: { address_1: '123 Main St' }, }, accountSettings: { storeOptions: { origin_country: 'US', }, }, } ); expect( () => render( ) ).not.toThrow(); } ); } ); } );