From 7c23fdb7aeb7bbc14548517ab104c8783c3a6f1f Mon Sep 17 00:00:00 2001 From: Yury Saukou Date: Wed, 18 Dec 2024 13:47:48 +0400 Subject: [PATCH] add unit tests --- .../FieldClaimingDate.test.js | 7 ++- .../DelayClaimActionMenuItem.test.js | 48 +++++++++++++++ .../MarkUnreceivableActionMenuItem.test.js | 53 +++++++++++++++++ .../SendClaimActionMenuItem.test.js | 48 +++++++++++++++ .../SendClaimsModal/SendClaimsModal.test.js | 7 ++- .../hooks/useClaimsSend/useClaimsSend.test.js | 59 +++++++++++++++++++ .../usePiecesStatusBatchUpdate.test.js | 44 ++++++++++++++ 7 files changed, 264 insertions(+), 2 deletions(-) create mode 100644 lib/claiming/components/menu-items/DelayClaimActionMenuItem/DelayClaimActionMenuItem.test.js create mode 100644 lib/claiming/components/menu-items/MarkUnreceivableActionMenuItem/MarkUnreceivableActionMenuItem.test.js create mode 100644 lib/claiming/components/menu-items/SendClaimActionMenuItem/SendClaimActionMenuItem.test.js create mode 100644 lib/claiming/hooks/useClaimsSend/useClaimsSend.test.js create mode 100644 lib/hooks/usePiecesStatusBatchUpdate/usePiecesStatusBatchUpdate.test.js diff --git a/lib/claiming/components/FieldClaimingDate/FieldClaimingDate.test.js b/lib/claiming/components/FieldClaimingDate/FieldClaimingDate.test.js index f839362c..fe10532e 100644 --- a/lib/claiming/components/FieldClaimingDate/FieldClaimingDate.test.js +++ b/lib/claiming/components/FieldClaimingDate/FieldClaimingDate.test.js @@ -1,6 +1,11 @@ +/* Developed collaboratively using AI (GitHub Copilot) */ + +import { + render, + screen, +} from '@testing-library/react'; import { MemoryRouter } from 'react-router-dom'; -import { render, screen } from '@testing-library/react'; import stripesFinalForm from '@folio/stripes/final-form'; import { FieldClaimingDate } from './FieldClaimingDate'; diff --git a/lib/claiming/components/menu-items/DelayClaimActionMenuItem/DelayClaimActionMenuItem.test.js b/lib/claiming/components/menu-items/DelayClaimActionMenuItem/DelayClaimActionMenuItem.test.js new file mode 100644 index 00000000..45bdf8bd --- /dev/null +++ b/lib/claiming/components/menu-items/DelayClaimActionMenuItem/DelayClaimActionMenuItem.test.js @@ -0,0 +1,48 @@ +/* Developed collaboratively using AI (GitHub Copilot) */ + +import { + render, + screen, +} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import { DelayClaimActionMenuItem } from './DelayClaimActionMenuItem'; + +const defaultProps = { + onClick: jest.fn(), +}; + +const renderComponent = (props = {}) => render( + , +); + +describe('DelayClaimActionMenuItem', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should call onClick when button is clicked', async () => { + renderComponent(); + + await userEvent.click(screen.getByTestId('delay-claim-button')); + + expect(defaultProps.onClick).toHaveBeenCalledTimes(1); + }); + + it('should be disabled when disabled prop is true', () => { + renderComponent({ disabled: true }); + + expect(screen.getByTestId('delay-claim-button')).toBeDisabled(); + }); + + it('should not call onClick when button is disabled and clicked', async () => { + renderComponent({ disabled: true }); + + await userEvent.click(screen.getByTestId('delay-claim-button')); + + expect(defaultProps.onClick).not.toHaveBeenCalled(); + }); +}); diff --git a/lib/claiming/components/menu-items/MarkUnreceivableActionMenuItem/MarkUnreceivableActionMenuItem.test.js b/lib/claiming/components/menu-items/MarkUnreceivableActionMenuItem/MarkUnreceivableActionMenuItem.test.js new file mode 100644 index 00000000..fdfbdea6 --- /dev/null +++ b/lib/claiming/components/menu-items/MarkUnreceivableActionMenuItem/MarkUnreceivableActionMenuItem.test.js @@ -0,0 +1,53 @@ +/* Developed collaboratively using AI (GitHub Copilot) */ + +import { + render, + screen, +} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import { MarkUnreceivableActionMenuItem } from './MarkUnreceivableActionMenuItem'; + +const defaultProps = { + onClick: jest.fn(), + disabled: false, +}; + +const renderComponent = (props = {}) => render( + , +); + +describe('MarkUnreceivableActionMenuItem', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should render the button', () => { + renderComponent(); + + expect(screen.getByTestId('unreceivable-button')).toBeInTheDocument(); + }); + + it('should call onClick when button is clicked', async () => { + renderComponent(); + + await userEvent.click(screen.getByTestId('unreceivable-button')); + + expect(defaultProps.onClick).toHaveBeenCalledTimes(1); + }); + + it('should disable the button when disabled prop is true', () => { + renderComponent({ disabled: true }); + + expect(screen.getByTestId('unreceivable-button')).toBeDisabled(); + }); + + it('should enable the button when disabled prop is false', () => { + renderComponent({ disabled: false }); + + expect(screen.getByTestId('unreceivable-button')).toBeEnabled(); + }); +}); diff --git a/lib/claiming/components/menu-items/SendClaimActionMenuItem/SendClaimActionMenuItem.test.js b/lib/claiming/components/menu-items/SendClaimActionMenuItem/SendClaimActionMenuItem.test.js new file mode 100644 index 00000000..d2ed2015 --- /dev/null +++ b/lib/claiming/components/menu-items/SendClaimActionMenuItem/SendClaimActionMenuItem.test.js @@ -0,0 +1,48 @@ +/* Developed collaboratively using AI (GitHub Copilot) */ + +import { + render, + screen, +} from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import { SendClaimActionMenuItem } from './SendClaimActionMenuItem'; + +const defaultProps = { + onClick: jest.fn(), +}; + +const renderComponent = (props = {}) => render( + , +); + +describe('SendClaimActionMenuItem', () => { + it('should render the button', () => { + renderComponent(); + + expect(screen.getByTestId('send-claim-button')).toBeInTheDocument(); + }); + + it('should call onClick when button is clicked', async () => { + renderComponent(); + + await userEvent.click(screen.getByTestId('send-claim-button')); + + expect(defaultProps.onClick).toHaveBeenCalled(); + }); + + it('should disable the button when disabled prop is true', () => { + renderComponent({ disabled: true }); + + expect(screen.getByTestId('send-claim-button')).toBeDisabled(); + }); + + it('should enable the button when disabled prop is false', () => { + renderComponent({ disabled: false }); + + expect(screen.getByTestId('send-claim-button')).not.toBeDisabled(); + }); +}); diff --git a/lib/claiming/components/modals/SendClaimsModal/SendClaimsModal.test.js b/lib/claiming/components/modals/SendClaimsModal/SendClaimsModal.test.js index ab712ff7..fe6be2ce 100644 --- a/lib/claiming/components/modals/SendClaimsModal/SendClaimsModal.test.js +++ b/lib/claiming/components/modals/SendClaimsModal/SendClaimsModal.test.js @@ -1,4 +1,7 @@ -import { render, screen } from '@testing-library/react'; +import { + render, + screen, +} from '@testing-library/react'; import user from '@testing-library/user-event'; import { MemoryRouter } from 'react-router-dom'; @@ -41,10 +44,12 @@ describe('SendClaimsModal', () => { const saveBtn = screen.getByRole('button', { name: 'stripes-acq-components.FormFooter.save' }); await user.click(saveBtn); + expect(screen.getByText('stripes-acq-components.validation.required')).toBeInTheDocument(); await user.type(screen.getByPlaceholderText(FORMAT), today.format(FORMAT)); await user.click(saveBtn); + expect(screen.getByText('stripes-acq-components.validation.dateAfter')).toBeInTheDocument(); }); diff --git a/lib/claiming/hooks/useClaimsSend/useClaimsSend.test.js b/lib/claiming/hooks/useClaimsSend/useClaimsSend.test.js new file mode 100644 index 00000000..3fe8939b --- /dev/null +++ b/lib/claiming/hooks/useClaimsSend/useClaimsSend.test.js @@ -0,0 +1,59 @@ +/* Developed collaboratively using AI (GitHub Copilot) */ + +import { renderHook } from '@testing-library/react-hooks'; +import { + QueryClient, + QueryClientProvider, +} from 'react-query'; + +import { useOkapiKy } from '@folio/stripes/core'; + +import { SEND_CLAIMS_API } from '../../../constants'; +import { useClaimsSend } from './useClaimsSend'; + +const queryClient = new QueryClient(); +const wrapper = ({ children }) => ( + + {children} + +); + +describe('useClaimsSend', () => { + const kyPostMock = jest.fn(); + + beforeEach(() => { + useOkapiKy.mockReturnValue({ + post: kyPostMock, + }); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should call ky.post with correct arguments when sendClaims is called', async () => { + const { result } = renderHook(() => useClaimsSend(), { wrapper }); + const data = { claim: 'test' }; + + kyPostMock.mockReturnValue({ + json: jest.fn().mockResolvedValue({}), + }); + + await result.current.sendClaims({ data }); + + expect(kyPostMock).toHaveBeenCalledWith(SEND_CLAIMS_API, { json: data }); + }); + + it('should handle errors when sendClaims is called', async () => { + const { result } = renderHook(() => useClaimsSend(), { wrapper }); + + const data = { claim: 'test' }; + const error = new Error('Failed to send claims'); + + kyPostMock.mockReturnValue({ + json: jest.fn().mockRejectedValue(error), + }); + + await expect(result.current.sendClaims({ data })).rejects.toThrow(error); + }); +}); diff --git a/lib/hooks/usePiecesStatusBatchUpdate/usePiecesStatusBatchUpdate.test.js b/lib/hooks/usePiecesStatusBatchUpdate/usePiecesStatusBatchUpdate.test.js new file mode 100644 index 00000000..9d3378a8 --- /dev/null +++ b/lib/hooks/usePiecesStatusBatchUpdate/usePiecesStatusBatchUpdate.test.js @@ -0,0 +1,44 @@ +/* Developed collaboratively using AI (GitHub Copilot) */ + +import { renderHook } from '@testing-library/react-hooks'; +import { + QueryClient, + QueryClientProvider, +} from 'react-query'; + +import { useOkapiKy } from '@folio/stripes/core'; + +import { PIECES_BATCH_STATUS_API } from '../../constants'; +import { usePiecesStatusBatchUpdate } from './usePiecesStatusBatchUpdate'; + +const queryClient = new QueryClient(); +const wrapper = ({ children }) => ( + + {children} + +); + +describe('usePiecesStatusBatchUpdate', () => { + const kyMock = { + put: jest.fn(() => ({ + json: jest.fn(), + })), + }; + + beforeEach(() => { + useOkapiKy.mockReturnValue(kyMock); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should call ky.put with correct arguments', async () => { + const { result } = renderHook(() => usePiecesStatusBatchUpdate(), { wrapper }); + const data = { status: 'Received' }; + + await result.current.updatePiecesStatus({ data }); + + expect(kyMock.put).toHaveBeenCalledWith(PIECES_BATCH_STATUS_API, { json: data }); + }); +});