From 52a5aae89c013c972efd2736a72c7c8f60262be7 Mon Sep 17 00:00:00 2001 From: Ryan Mathis Date: Tue, 15 Jun 2021 12:53:47 -0700 Subject: [PATCH 01/11] Implemented tests --- ui/package.json | 51 +++++++++- ui/src/app/core/components/AdminRoute.test.js | 41 ++++++++ ui/src/app/core/components/Footer.js | 4 +- ui/src/app/core/components/Footer.test.js | 12 +++ ui/src/app/core/components/Header.test.js | 27 ++++++ .../app/core/components/UserConfirmation.js | 4 +- .../core/components/UserConfirmation.test.js | 95 +++++++++++++++++++ ui/src/app/core/hooks/utils.js | 5 - ui/src/app/core/user/SessionModal.test.js | 18 ++++ ui/src/app/core/user/UserContext.test.js | 47 +++++++++ ui/src/app/core/utility/array_move.test.js | 4 + .../app/core/utility/is_valid_regex.test.js | 4 + ui/src/app/core/utility/read_file_contents.js | 3 - .../core/utility/read_file_contents.test.js | 46 +++++++++ ui/src/app/core/utility/window.js | 3 + ui/src/app/i18n/components/translate.test.js | 13 +++ ui/src/app/i18n/context/I18n.provider.js | 14 ++- ui/src/app/i18n/context/I18n.provider.test.js | 51 ++++++++++ ui/src/app/i18n/hooks.test.js | 11 +++ ui/src/app/metadata/view/MetadataUpload.js | 2 - 20 files changed, 436 insertions(+), 19 deletions(-) create mode 100644 ui/src/app/core/components/AdminRoute.test.js create mode 100644 ui/src/app/core/components/Footer.test.js create mode 100644 ui/src/app/core/components/Header.test.js create mode 100644 ui/src/app/core/components/UserConfirmation.test.js delete mode 100644 ui/src/app/core/hooks/utils.js create mode 100644 ui/src/app/core/user/SessionModal.test.js create mode 100644 ui/src/app/core/user/UserContext.test.js create mode 100644 ui/src/app/core/utility/read_file_contents.test.js create mode 100644 ui/src/app/core/utility/window.js create mode 100644 ui/src/app/i18n/components/translate.test.js create mode 100644 ui/src/app/i18n/context/I18n.provider.test.js diff --git a/ui/package.json b/ui/package.json index 1046146a3..728b8a0f6 100644 --- a/ui/package.json +++ b/ui/package.json @@ -42,7 +42,7 @@ "start": "react-scripts start", "build": "GENERATE_SOURCEMAP=true react-scripts build", "buildProd": "react-scripts build && npm run copy", - "test": "react-scripts test", + "test": "react-scripts test 00==", "eject": "react-scripts eject", "build:static": "sass src/static.scss ./build/unsecured/static.css", "copy:static": "node ./build", @@ -51,8 +51,53 @@ "jest": { "collectCoverageFrom": [ "src/**/*.{js,jsx}", - "!src/test/**/*.*" - ] + "!src/testing/**/*.*", + "!src/*.js" + ], + "coverageThreshold": { + "global": { + "branches": 0, + "functions": 0, + "lines": 0, + "statements": 0 + }, + "./src/app/i18n/": { + "branches": 80, + "functions": 80, + "lines": 80, + "statements": 80 + }, + "./src/app/core/": { + "branches": 80, + "functions": 80, + "lines": 80, + "statements": 80 + }, + "./src/app/metadata/domain/": { + "branches": 80, + "functions": 80, + "lines": 80, + "statements": 80 + }, + "./src/app/metadata/hooks/": { + "branches": 80, + "functions": 80, + "lines": 80, + "statements": 80 + }, + "./src/app/metadata/contention/": { + "branches": 80, + "functions": 80, + "lines": 80, + "statements": 80 + }, + "./src/app/metadata/component/": { + "branches": 80, + "functions": 80, + "lines": 80, + "statements": 80 + } + } }, "eslintConfig": { "extends": [ diff --git a/ui/src/app/core/components/AdminRoute.test.js b/ui/src/app/core/components/AdminRoute.test.js new file mode 100644 index 000000000..92033faae --- /dev/null +++ b/ui/src/app/core/components/AdminRoute.test.js @@ -0,0 +1,41 @@ +import React from 'react'; +import { act, render, fireEvent, waitFor, screen } from '@testing-library/react'; +import { BrowserRouter, MemoryRouter, Route } from 'react-router-dom'; +import { AdminRoute } from './AdminRoute'; + +const mockIsAdmin = jest.fn(); + +jest.mock('../user/UserContext', () => ({ + useIsAdmin: () => mockIsAdmin() +})); + +const renderWithRouter = (ui, { route = '/' } = {}) => { + window.history.pushState({}, 'Test page', route) + + return render(ui, { wrapper: BrowserRouter }) +} + +describe('AdminRoute user is admin', () => { + beforeEach(() => { + mockIsAdmin.mockReturnValue(true); + }); + + it('should render the component if user is an admin', () => { + render(hi there, { wrapper: MemoryRouter }); + expect(screen.getByText('hi there')).toBeInTheDocument(); + }); +}); + +describe('AdminRoute user is NOT admin', () => { + beforeEach(() => { + mockIsAdmin.mockReturnValue(false); + }); + + it('should redirect the user to the dashboard if not admin', () => { + renderWithRouter( + hi there + 'dashboard' } /> + , {route: '/foo'}); + expect(screen.getByText('dashboard')).toBeInTheDocument(); + }); +}); \ No newline at end of file diff --git a/ui/src/app/core/components/Footer.js b/ui/src/app/core/components/Footer.js index 2d4c6fbca..86279afba 100644 --- a/ui/src/app/core/components/Footer.js +++ b/ui/src/app/core/components/Footer.js @@ -16,7 +16,7 @@ function FooterLink ({ link }) { ); } -export default function Footer () { +export function Footer () { return ( ); } + +export default Footer; \ No newline at end of file diff --git a/ui/src/app/core/components/Footer.test.js b/ui/src/app/core/components/Footer.test.js new file mode 100644 index 000000000..8f9453338 --- /dev/null +++ b/ui/src/app/core/components/Footer.test.js @@ -0,0 +1,12 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import { Footer } from './Footer'; + +jest.mock('../../i18n/hooks', () => ({ + useTranslation: (value) => value +})); + +it('should display the footer', () => { + render(