From c16627940096ececef2fe18fd9a2786d8aabb2ff Mon Sep 17 00:00:00 2001 From: Manuel Miranda Date: Fri, 14 Jun 2024 18:43:12 +0700 Subject: [PATCH] Responsive side bar (#957) --- public/books/demo.sqlite.gz | Bin 19343 -> 20446 bytes .../__snapshots__/layout.test.tsx.snap | 2 +- .../components/buttons/FormButton.test.tsx | 121 +- .../components/buttons/ImportButton.test.tsx | 55 +- .../__snapshots__/FormButton.test.tsx.snap | 72 - .../__snapshots__/ImportButton.test.tsx.snap | 59 +- src/__tests__/components/ui/Modal.test.tsx | 102 + .../ui/__snapshots__/Modal.test.tsx.snap | 35 + src/__tests__/layout/LeftSideBar.test.tsx | 4 + .../__snapshots__/LeftSideBar.test.tsx.snap | 263 +- .../layout/__snapshots__/Topbar.test.tsx.snap | 4 +- src/app/dashboard/layout.tsx | 2 +- src/components/buttons/FormButton.tsx | 65 +- src/components/buttons/ImportButton.tsx | 54 +- src/components/onboarding/Onboarding.tsx | 7 +- src/components/tables/InvestmentsTable.tsx | 2 +- src/components/ui/Modal.tsx | 65 + src/css/globals.css | 2 +- src/layout/LeftSidebar.tsx | 29 +- src/layout/Menu.tsx | 6 +- src/layout/Topbar.tsx | 4 +- yarn.lock | 4679 +++++++---------- 22 files changed, 2458 insertions(+), 3174 deletions(-) delete mode 100644 src/__tests__/components/buttons/__snapshots__/FormButton.test.tsx.snap create mode 100644 src/__tests__/components/ui/Modal.test.tsx create mode 100644 src/__tests__/components/ui/__snapshots__/Modal.test.tsx.snap create mode 100644 src/components/ui/Modal.tsx diff --git a/public/books/demo.sqlite.gz b/public/books/demo.sqlite.gz index 23c89ad8d68d5af534682be56c7da92d3c311d9a..457da2bbe99e37edf21994cc41d5509ced2a9b19 100644 GIT binary patch literal 20446 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 literal 19343 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 cF&eqmu
jest.fn( +jest.mock('@/components/ui/Modal', () => jest.fn( (props: React.PropsWithChildren) => (
{props.children} @@ -24,102 +24,7 @@ describe('FormButton', () => { jest.clearAllMocks(); }); - it('renders hidden modal on mount', async () => { - const mockClone = jest.spyOn(React, 'cloneElement'); - const c = ; - const { container } = render( - - - New - - )} - > - {c} - , - ); - - expect(Modal).toHaveBeenLastCalledWith( - expect.objectContaining({ - isOpen: false, - }), - {}, - ); - - expect(mockClone).toBeCalledWith(c, { onSave: expect.any(Function) }); - expect(container).toMatchSnapshot(); - }); - - it('opens modal when clicking the button', async () => { - render( - - - New - - )} - > - - , - ); - - const button = await screen.findByRole('button', { name: /new/i }); - fireEvent.click(button); - - await screen.findByText('submit form'); - const modal = await screen.findByTestId('Modal'); - expect(Modal).toHaveBeenLastCalledWith( - expect.objectContaining({ - isOpen: true, - }), - {}, - ); - expect(modal).toMatchSnapshot(); - }); - - it('closes modal when clicking the X button', async () => { - render( - - - New - - )} - > - - , - ); - - const button = await screen.findByRole('button', { name: /new/i }); - fireEvent.click(button); - - await screen.findByText('submit form'); - await screen.findByTestId('Modal'); - expect(Modal).toHaveBeenLastCalledWith( - expect.objectContaining({ - isOpen: true, - }), - {}, - ); - - const xButton = screen.getByRole('button', { name: 'X' }); - fireEvent.click(xButton); - - expect(Modal).toHaveBeenLastCalledWith( - expect.objectContaining({ - isOpen: false, - }), - {}, - ); - }); - - it('on form save closes modal and saves', async () => { + it('renders as expected', async () => { const mockSave = jest.fn(() => Promise.resolve()); render( @@ -137,17 +42,17 @@ describe('FormButton', () => { , ); - // open modal to prove that onSave closes it - const button = await screen.findByRole('button', { name: /new/i }); - fireEvent.click(button); - fireEvent.click(screen.getByText('submit form')); - expect(mockSave).toBeCalledTimes(1); - - expect(Modal).toHaveBeenLastCalledWith( - expect.objectContaining({ - isOpen: false, - }), + expect(mockSave).toHaveBeenCalledTimes(1); + + expect(Modal).toHaveBeenCalledWith( + { + showClose: true, + className: 'modal card', + triggerClassName: 'btn btn-primary', + triggerContent: expect.anything(), + children: expect.anything(), + }, {}, ); }); diff --git a/src/__tests__/components/buttons/ImportButton.test.tsx b/src/__tests__/components/buttons/ImportButton.test.tsx index 774e8eb7..d452808a 100644 --- a/src/__tests__/components/buttons/ImportButton.test.tsx +++ b/src/__tests__/components/buttons/ImportButton.test.tsx @@ -1,14 +1,12 @@ import React from 'react'; import { render, - screen, - fireEvent, } from '@testing-library/react'; -import Modal from 'react-modal'; import ImportButton from '@/components/buttons/ImportButton'; +import Modal from '@/components/ui/Modal'; -jest.mock('react-modal', () => jest.fn( +jest.mock('@/components/ui/Modal', () => jest.fn( (props: React.PropsWithChildren) => (
{props.children} @@ -29,51 +27,20 @@ describe('ImportButton', () => { jest.clearAllMocks(); }); - it('renders hidden modal on mount', async () => { + it('renders as expected', async () => { const { container } = render(); - expect(Modal).toBeCalledWith( - expect.objectContaining({ - isOpen: false, - }), + expect(Modal).toHaveBeenCalledWith( + { + showClose: true, + className: 'modal bg-background-800', + triggerClassName: 'btn btn-primary', + triggerContent: expect.anything(), + children: expect.anything(), + }, {}, ); expect(container).toMatchSnapshot(); }); - - it('opens modal when clicking the button', async () => { - render(); - - const button = await screen.findByRole('button', { name: 'Import' }); - fireEvent.click(button); - - const modal = await screen.findByTestId('Modal'); - expect(Modal).toBeCalledWith( - expect.objectContaining({ - isOpen: true, - }), - {}, - ); - expect(modal).toMatchSnapshot(); - }); - - it('closes modal when clicking the X button', async () => { - render(); - - const button = await screen.findByRole('button', { name: 'Import' }); - fireEvent.click(button); - - await screen.findByTestId('Modal'); - - const xButton = screen.getByRole('button', { name: 'X' }); - fireEvent.click(xButton); - - expect(Modal).toHaveBeenLastCalledWith( - expect.objectContaining({ - isOpen: false, - }), - {}, - ); - }); }); diff --git a/src/__tests__/components/buttons/__snapshots__/FormButton.test.tsx.snap b/src/__tests__/components/buttons/__snapshots__/FormButton.test.tsx.snap deleted file mode 100644 index 445ace6c..00000000 --- a/src/__tests__/components/buttons/__snapshots__/FormButton.test.tsx.snap +++ /dev/null @@ -1,72 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`FormButton opens modal when clicking the button 1`] = ` -
- - - Add - -
- -
-
-`; - -exports[`FormButton renders hidden modal on mount 1`] = ` -
-
- - - Add - -
- -
-
- -
-`; diff --git a/src/__tests__/components/buttons/__snapshots__/ImportButton.test.tsx.snap b/src/__tests__/components/buttons/__snapshots__/ImportButton.test.tsx.snap index 9a33cce1..a32af05f 100644 --- a/src/__tests__/components/buttons/__snapshots__/ImportButton.test.tsx.snap +++ b/src/__tests__/components/buttons/__snapshots__/ImportButton.test.tsx.snap @@ -1,39 +1,10 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`ImportButton opens modal when clicking the button 1`] = ` -
- -
-
-
-
-
-`; - -exports[`ImportButton renders hidden modal on mount 1`] = ` +exports[`ImportButton renders as expected 1`] = `
-
@@ -45,33 +16,5 @@ exports[`ImportButton renders hidden modal on mount 1`] = ` />
-
`; diff --git a/src/__tests__/components/ui/Modal.test.tsx b/src/__tests__/components/ui/Modal.test.tsx new file mode 100644 index 00000000..3f1d7d33 --- /dev/null +++ b/src/__tests__/components/ui/Modal.test.tsx @@ -0,0 +1,102 @@ +import React from 'react'; +import RModal from 'react-modal'; +import { fireEvent, render, screen } from '@testing-library/react'; + +import Modal from '@/components/ui/Modal'; + +jest.mock('react-modal', () => jest.fn( + (props: React.PropsWithChildren) => ( +
+ {props.children} +
+ ), +)); + +describe('Modal', () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it('renders hidden modal on mount with trigger', async () => { + const { container } = render( + open} + > + + , + ); + + expect(RModal).toHaveBeenLastCalledWith( + expect.objectContaining({ + isOpen: false, + }), + {}, + ); + + expect(container).toMatchSnapshot(); + }); + + it('opens modal when clicking the trigger', async () => { + render( + open} + > + + , + ); + + const button = await screen.findByText('open'); + fireEvent.click(button); + + await screen.findByText('submit form'); + const modal = await screen.findByTestId('RModal'); + expect(RModal).toHaveBeenLastCalledWith( + expect.objectContaining({ + isOpen: true, + }), + {}, + ); + expect(modal).toMatchSnapshot(); + }); + + it('closes modal when clicking the X button', async () => { + render( + open} + showClose + > + + , + ); + + const button = await screen.findByText('open'); + fireEvent.click(button); + + await screen.findByText('submit form'); + await screen.findByTestId('RModal'); + expect(RModal).toHaveBeenLastCalledWith( + expect.objectContaining({ + isOpen: true, + }), + {}, + ); + + const xButton = screen.getByRole('button', { name: 'X' }); + fireEvent.click(xButton); + + expect(RModal).toHaveBeenLastCalledWith( + expect.objectContaining({ + isOpen: false, + }), + {}, + ); + }); +}); + +function TestComponent({ + onSave = () => {}, +}: { + onSave?: Function, +}): JSX.Element { + return ; +} diff --git a/src/__tests__/components/ui/__snapshots__/Modal.test.tsx.snap b/src/__tests__/components/ui/__snapshots__/Modal.test.tsx.snap new file mode 100644 index 00000000..dde30357 --- /dev/null +++ b/src/__tests__/components/ui/__snapshots__/Modal.test.tsx.snap @@ -0,0 +1,35 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Modal opens modal when clicking the trigger 1`] = ` +
+ +
+`; + +exports[`Modal renders hidden modal on mount with trigger 1`] = ` +
+
+ +
+ +
+`; diff --git a/src/__tests__/layout/LeftSideBar.test.tsx b/src/__tests__/layout/LeftSideBar.test.tsx index 0a3c73d9..b266d151 100644 --- a/src/__tests__/layout/LeftSideBar.test.tsx +++ b/src/__tests__/layout/LeftSideBar.test.tsx @@ -12,6 +12,10 @@ jest.mock('next/link', () => jest.fn( ), )); +jest.mock('@/components/ui/Modal', () => jest.fn( + () =>
, +)); + jest.mock('next/navigation', () => ({ usePathname: jest.fn(), })); diff --git a/src/__tests__/layout/__snapshots__/LeftSideBar.test.tsx.snap b/src/__tests__/layout/__snapshots__/LeftSideBar.test.tsx.snap index 6113f83c..de3211c3 100644 --- a/src/__tests__/layout/__snapshots__/LeftSideBar.test.tsx.snap +++ b/src/__tests__/layout/__snapshots__/LeftSideBar.test.tsx.snap @@ -2,77 +2,49 @@ exports[`LeftSidebar renders as expected 1`] = `
-
- + + + +
`; diff --git a/src/__tests__/layout/__snapshots__/Topbar.test.tsx.snap b/src/__tests__/layout/__snapshots__/Topbar.test.tsx.snap index deb55202..f977418f 100644 --- a/src/__tests__/layout/__snapshots__/Topbar.test.tsx.snap +++ b/src/__tests__/layout/__snapshots__/Topbar.test.tsx.snap @@ -3,10 +3,10 @@ exports[`Topbar renders as expected 1`] = `