/**
* External dependencies
*/
import React from 'react';
import { render, fireEvent, screen } from '@testing-library/react';
import '@testing-library/jest-dom/extend-expect';
/**
* Internal dependencies
*/
import { ConfirmationModal } from '../confirmation-modal';
// Mock the necessary external dependencies
jest.mock( '@wordpress/components', () => ( {
Modal: jest.fn( ( { title, children, onRequestClose } ) => (
{ title }
{ children }
) ),
Button: jest.fn( ( { children, onClick } ) => (
) ),
} ) );
describe( 'ConfirmationModal', () => {
let formRef, saveButtonRef;
const mockSelectComingSoon = ( value ) => {
// Set up form data
const input = document.createElement( 'input' );
input.name = 'woocommerce_coming_soon';
input.value = value;
formRef.current.appendChild( input );
};
const fireSubmitEvent = () => {
// Simulate form submission
const submitEvent = new Event( 'submit', {
bubbles: true,
cancelable: true,
} );
fireEvent( formRef.current, submitEvent );
};
beforeEach( () => {
formRef = { current: document.createElement( 'form' ) };
saveButtonRef = { current: document.createElement( 'button' ) };
formRef.current.appendChild( saveButtonRef.current );
document.body.appendChild( formRef.current );
} );
afterEach( () => {
document.body.removeChild( formRef.current );
} );
it( 'should prompt the modal if current setting is live and submit the form', () => {
const currentSetting = { woocommerce_coming_soon: 'no' };
render(
);
const submitListener = jest.fn();
formRef.current.onsubmit = submitListener;
mockSelectComingSoon( 'yes' );
fireSubmitEvent();
// Confirm modal is prompted
expect(
screen.getByText( 'Confirm switch to ‘Coming soon’ mode' )
).toBeInTheDocument();
// Simulate confirming submission
fireEvent.click( screen.getByText( 'Switch' ) );
// Ensure the form is submitted
expect( submitListener ).toHaveBeenCalled();
} );
it( 'should prompt the modal if current setting is not set', () => {
render(
);
mockSelectComingSoon( 'yes' );
fireSubmitEvent();
// Confirm that the modal is not prompted
expect(
screen.queryByText( 'Confirm switch to ‘Coming soon’ mode' )
).toBeInTheDocument();
} );
it( 'should not prompt the modal if current setting is already "coming soon"', () => {
const currentSetting = { woocommerce_coming_soon: 'yes' };
render(
);
mockSelectComingSoon( 'yes' );
fireSubmitEvent();
// Confirm that the modal is not prompted
expect(
screen.queryByText( 'Confirm switch to ‘Coming soon’ mode' )
).not.toBeInTheDocument();
} );
it( 'should close the modal on cancel', () => {
const currentSetting = { woocommerce_coming_soon: 'no' };
render(
);
mockSelectComingSoon( 'yes' );
fireSubmitEvent();
// Confirm modal is prompted
expect(
screen.getByText( 'Confirm switch to ‘Coming soon’ mode' )
).toBeInTheDocument();
// Simulate canceling the modal
fireEvent.click( screen.getByText( 'Cancel' ) );
// Confirm that the modal is closed
expect(
screen.queryByText( 'Confirm switch to ‘Coming soon’ mode' )
).not.toBeInTheDocument();
} );
it( 'should handle the save button correctly', () => {
const currentSetting = { woocommerce_coming_soon: 'no' };
saveButtonRef.current.name = 'save';
saveButtonRef.current.value = 'Save changes';
render(
);
mockSelectComingSoon( 'yes' );
fireSubmitEvent();
// Confirm modal is prompted
expect(
screen.getByText( 'Confirm switch to ‘Coming soon’ mode' )
).toBeInTheDocument();
// Simulate confirming submission
fireEvent.click( screen.getByText( 'Switch' ) );
// Check that the hidden input with "save" has been added to the form
const hiddenInput =
formRef.current.querySelector( 'input[name="save"]' );
expect( hiddenInput ).toBeInTheDocument();
expect( hiddenInput.value ).toBe( 'Save changes' );
} );
} );