import React from 'react'; import { render, fireEvent } from '@testing-library/react'; import '@testing-library/jest-dom'; import { useFetch } from '../../../helpers/fetch/FetchProvider'; import { SaveStar } from '../SaveStar'; jest.mock('../../../helpers/fetch/FetchProvider', () => ({ ...jest.requireActual('../../../helpers/fetch/FetchProvider'), useFetch: jest.fn() })); const articleId = '12345'; const saved = { data: { isBookmarked: true } }; const unsaved = { data: { isBookmarked: false } }; describe('SaveStar', () => { afterEach(() => { jest.resetAllMocks(); }); it('should render the initial loading state correctly', () => { (useFetch as jest.Mock).mockReturnValue({ loading: true }); const { asFragment, getByText } = render( ); expect(getByText('Save')); expect(asFragment()).toMatchSnapshot(); }); it('should render the unsaved state', async () => { (useFetch as jest.Mock).mockReturnValue(unsaved); const { asFragment, getByText } = render( ); expect(getByText('Save')); expect(asFragment()).toMatchSnapshot(); }); it('should render the saved state', () => { (useFetch as jest.Mock).mockReturnValue(saved); const { asFragment, getByText } = render( ); expect(getByText('Saved')); expect(asFragment()).toMatchSnapshot(); }); it('should move from unsaved to saved state', async () => { (useFetch as jest.Mock) .mockReturnValueOnce(unsaved) .mockReturnValueOnce(saved); const { baseElement, getByText } = render(); expect(getByText('Save')); const button = baseElement.querySelector('button') as HTMLButtonElement; fireEvent.click(button); await expect(getByText('Saved')); }); });