import { render, fireEvent, cleanup, screen, mockMatchMedia } from '../test-utils'; import Nudge from '.'; mockMatchMedia(); describe('Nudge', () => { const defaultProps = { title: 'A nudge title', link: 'CTA', href: '#', onClick: jest.fn(), onDismiss: jest.fn(), }; afterEach(cleanup); it('renders a title', () => { render(); const title = screen.getByText('A nudge title'); expect(title).toBeInTheDocument(); }); it('renders a link to the passed href', () => { render(); const link = screen.getByText('CTA'); expect(link).toBeInTheDocument(); expect(link).toHaveAttribute('href', defaultProps.href); }); it('calls onClick prop when the link is clicked', () => { render(); const link = screen.getByText('CTA'); fireEvent.click(link); expect(defaultProps.onClick).toHaveBeenCalledTimes(1); }); it('calls onDismiss prop when close button is clicked', () => { render(); const closeButton = screen.getByLabelText('Close'); fireEvent.click(closeButton); expect(defaultProps.onDismiss).toHaveBeenCalledTimes(1); }); describe('Nudge persistance', () => { beforeEach(() => { jest.resetAllMocks(); }); it('does NOT render a nudge if localStorage has been set with the id of the nudge', () => { jest.spyOn(Storage.prototype, 'getItem').mockReturnValue('["CAKE","TEST"]'); render(); expect(screen.queryByText('A nudge title')).not.toBeInTheDocument(); }); it('does NOT render a nudge if localStorage has been set with the id of the nudge AND calls is previously dismissed with TRUE', () => { jest.spyOn(Storage.prototype, 'getItem').mockReturnValue('["CAKE","TEST"]'); const isPreviouslyDismissed = jest.fn(); render( , ); expect(screen.queryByText('A nudge title')).not.toBeInTheDocument(); expect(isPreviouslyDismissed).toHaveBeenCalledWith(true); }); it('shows a nudge if localStorage has been set with a different id for a different nudge and calls is previously dismissed with FALSE', () => { mockMatchMedia(); jest.spyOn(Storage.prototype, 'getItem').mockReturnValue('["BANANA"]'); const isPreviouslyDismissed = jest.fn(); render( , ); expect(screen.getByText('A nudge title')).toBeInTheDocument(); expect(isPreviouslyDismissed).toHaveBeenCalledWith(false); }); it('calls local storage with updated dismissed nudges value', () => { mockMatchMedia(); jest.spyOn(Storage.prototype, 'getItem').mockReturnValue('["BANANA"]'); const setItem = jest.spyOn(Storage.prototype, 'setItem'); render(); expect(screen.getByText('A nudge title')).toBeInTheDocument(); const closeButton = screen.getByLabelText('Close'); fireEvent.click(closeButton); expect(defaultProps.onDismiss).toHaveBeenCalledTimes(1); expect(setItem).toHaveBeenCalledWith('dismissedNudges', '["BANANA","TEST"]'); }); }); });