diff --git a/src/__mocks__/next-auth/client.js b/src/__mocks__/next-auth/client.js index f4acfaa8..06779b13 100644 --- a/src/__mocks__/next-auth/client.js +++ b/src/__mocks__/next-auth/client.js @@ -1,17 +1,9 @@ +import { userSession } from '../../utils/testUtil'; + const client = jest.genMockFromModule('next-auth/client'); const useSession = jest.fn(() => [ - { - user: { - name: 'Test User', - email: 'test@email.com', - groups: [{ - id: 'abcd1234', name: 'Test Group', ownerName: 'Test User', memberCount: 2, role: 'owner', - }], - role: 'user', - }, - expires: '2881-10-05T14:48:00.000', - }, + userSession, false]); client.useSession = useSession; diff --git a/src/__tests__/groups/[id]/edit.test.js b/src/__tests__/groups/[id]/edit.test.js index 056aa87a..b9ca3417 100644 --- a/src/__tests__/groups/[id]/edit.test.js +++ b/src/__tests__/groups/[id]/edit.test.js @@ -4,6 +4,7 @@ import { render, wait } from '@testing-library/react'; import EditGroup from '../../../pages/groups/[id]/edit'; +import { group } from '../../../utils/testUtil'; jest.mock('next/router', () => ({ @@ -17,18 +18,6 @@ jest.mock('next/router', () => ({ })); describe('Group Edit Page', () => { - const group = { - id: 'abcd1234', - name: 'Test Group', - members: [{ - id: '1', - email: 'test@email.com', - name: 'Test User', - role: 'owner', - }], - inviteUrl: '', - }; - it('renders group card', async () => { const { getByTestId } = render(); const cardBody = getByTestId('groupedit-card-body'); diff --git a/src/__tests__/groups/[id]/index.test.js b/src/__tests__/groups/[id]/index.test.js index e9ea36eb..a051a28c 100644 --- a/src/__tests__/groups/[id]/index.test.js +++ b/src/__tests__/groups/[id]/index.test.js @@ -4,6 +4,7 @@ import { render, wait } from '@testing-library/react'; import ViewGroup from '../../../pages/groups/[id]/index'; +import { group } from '../../../utils/testUtil'; jest.mock('next/router', () => ({ useRouter() { @@ -16,17 +17,6 @@ jest.mock('next/router', () => ({ })); describe('Group View Page', () => { - const group = { - id: 'abcd1234', - name: 'Test Group', - members: [{ - id: '1', - email: 'test@email.com', - name: 'Test User', - role: 'owner', - }], - }; - it('renders group card', async () => { const { getByTestId } = render(); const cardBody = getByTestId('groupview-card-body'); diff --git a/src/__tests__/user/editprofile.test.js b/src/__tests__/user/editprofile.test.js index 64790238..c9a88fc4 100644 --- a/src/__tests__/user/editprofile.test.js +++ b/src/__tests__/user/editprofile.test.js @@ -4,6 +4,7 @@ import { render, wait } from '@testing-library/react'; import EditProfile from '../../pages/user/[slug]/editprofile'; +import { user } from '../../utils/testUtil'; jest.mock('next/router', () => ({ useRouter() { @@ -16,14 +17,7 @@ jest.mock('next/router', () => ({ })); test('renders edit profile card', async () => { - const { getAllByText } = render(); + const { getAllByText } = render(); const textElements = getAllByText(/Edit Profile/); await wait(() => { expect(textElements[1]).toBeInTheDocument(); @@ -31,14 +25,7 @@ test('renders edit profile card', async () => { }); test('renders edit profile form', async () => { - const { getAllByRole } = render(); + const { getAllByRole } = render(); const textboxElements = getAllByRole('textbox'); await wait(() => { expect(textboxElements).toHaveLength(4); @@ -46,14 +33,7 @@ test('renders edit profile form', async () => { }); test('renders submit button', async () => { - const { getByTestId } = render(); + const { getByTestId } = render(); const submitButton = getByTestId('editprofile-submit-button'); await wait(() => { expect(submitButton).toBeInTheDocument(); diff --git a/src/components/Admin/AdminHeader/AdminHeader.js b/src/components/Admin/AdminHeader/AdminHeader.js index 69cf4ecf..97ddf1b6 100644 --- a/src/components/Admin/AdminHeader/AdminHeader.js +++ b/src/components/Admin/AdminHeader/AdminHeader.js @@ -9,6 +9,7 @@ const AdminHeader = ({ activeKey, setKey }) => ( justify activeKey={activeKey} onSelect={(k) => setKey(k)} + data-testid="admin-tabs" > diff --git a/src/components/Admin/AdminHeader/AdminHeader.test.js b/src/components/Admin/AdminHeader/AdminHeader.test.js new file mode 100644 index 00000000..45431105 --- /dev/null +++ b/src/components/Admin/AdminHeader/AdminHeader.test.js @@ -0,0 +1,17 @@ +/** + * @jest-environment jsdom + */ + +import { render } from '@testing-library/react'; +import AdminHeader from './AdminHeader'; + +test('renders admin header tabs (key=dashboard)', async () => { + const { getByTestId } = render( + , + ); + const adminTabs = getByTestId('admin-tabs'); + expect(adminTabs).toBeInTheDocument(); +}); diff --git a/src/components/Admin/AdminPanel/AdminPanel.js b/src/components/Admin/AdminPanel/AdminPanel.js index bebfc483..f0c27c13 100644 --- a/src/components/Admin/AdminPanel/AdminPanel.js +++ b/src/components/Admin/AdminPanel/AdminPanel.js @@ -59,7 +59,7 @@ const AdminPanel = ({ useEffect(() => { fetchData('sortState'); }, [sortState]); return ( - + {listLoading && activeKey !== 'dashboard' && ( diff --git a/src/components/Admin/AdminPanel/AdminPanel.test.js b/src/components/Admin/AdminPanel/AdminPanel.test.js new file mode 100644 index 00000000..4072fc3e --- /dev/null +++ b/src/components/Admin/AdminPanel/AdminPanel.test.js @@ -0,0 +1,21 @@ +/** + * @jest-environment jsdom + */ + +import { render } from '@testing-library/react'; +import AdminPanel from './AdminPanel'; +import { adminUserSession } from '../../../utils/testUtil'; + +test('renders admin panel', async () => { + const { getByTestId } = render( + , + ); + const adminPanel = getByTestId('admin-panel'); + expect(adminPanel).toBeInTheDocument(); +}); diff --git a/src/components/Admin/AdminRoleBadge/AdminRoleBadge.test.js b/src/components/Admin/AdminRoleBadge/AdminRoleBadge.test.js new file mode 100644 index 00000000..5a380298 --- /dev/null +++ b/src/components/Admin/AdminRoleBadge/AdminRoleBadge.test.js @@ -0,0 +1,12 @@ +/** + * @jest-environment jsdom + */ + +import { render } from '@testing-library/react'; +import AdminRoleBadge from './AdminRoleBadge'; + +test('renders admin role badge', async () => { + const { getByTestId } = render(); + const roleBadge = getByTestId('admin-role-badge'); + expect(roleBadge).toBeInTheDocument(); +}); diff --git a/src/components/Admin/Document/AdminDocumentTable/AdminDocumentTable.js b/src/components/Admin/Document/AdminDocumentTable/AdminDocumentTable.js index 2fca35be..29ad55e0 100644 --- a/src/components/Admin/Document/AdminDocumentTable/AdminDocumentTable.js +++ b/src/components/Admin/Document/AdminDocumentTable/AdminDocumentTable.js @@ -48,23 +48,23 @@ const AdminDocumentTable = ({ document, alerts, setAlerts }) => { size="sm" variant="light" style={{ borderCollapse: 'unset' }} + data-testid="admin-doc-view" > View Document -
+ View full document Modify document Delete document -
+ diff --git a/src/components/Admin/Document/AdminDocumentTable/AdminDocumentTable.test.js b/src/components/Admin/Document/AdminDocumentTable/AdminDocumentTable.test.js new file mode 100644 index 00000000..7c14aaab --- /dev/null +++ b/src/components/Admin/Document/AdminDocumentTable/AdminDocumentTable.test.js @@ -0,0 +1,19 @@ +/** + * @jest-environment jsdom + */ + +import { render } from '@testing-library/react'; +import AdminDocumentTable from './AdminDocumentTable'; +import { document } from '../../../../utils/testUtil'; + +test('renders admin doc view', async () => { + const { getByTestId } = render( + , + ); + const docView = getByTestId('admin-doc-view'); + expect(docView).toBeInTheDocument(); +}); diff --git a/src/components/Admin/Group/AdminGroupTable/AdminGroupTable.js b/src/components/Admin/Group/AdminGroupTable/AdminGroupTable.js index a4d0d593..0b3dc026 100644 --- a/src/components/Admin/Group/AdminGroupTable/AdminGroupTable.js +++ b/src/components/Admin/Group/AdminGroupTable/AdminGroupTable.js @@ -33,22 +33,22 @@ const AdminGroupTable = ({ group, alerts, setAlerts }) => { size="sm" variant="light" style={{ borderCollapse: 'unset' }} + data-testid="admin-group-view" > View Group -
+ Modify group Delete group -
+ diff --git a/src/components/Admin/Group/AdminGroupTable/AdminGroupTable.test.js b/src/components/Admin/Group/AdminGroupTable/AdminGroupTable.test.js new file mode 100644 index 00000000..7ef4e470 --- /dev/null +++ b/src/components/Admin/Group/AdminGroupTable/AdminGroupTable.test.js @@ -0,0 +1,19 @@ +/** + * @jest-environment jsdom + */ + +import { render } from '@testing-library/react'; +import AdminGroupTable from './AdminGroupTable'; +import { group } from '../../../../utils/testUtil'; + +test('renders admin group view', async () => { + const { getByTestId } = render( + , + ); + const groupTable = getByTestId('admin-group-view'); + expect(groupTable).toBeInTheDocument(); +}); diff --git a/src/components/Admin/SortableHeader/SortableHeader.js b/src/components/Admin/SortableHeader/SortableHeader.js index 498b5299..2f39d560 100644 --- a/src/components/Admin/SortableHeader/SortableHeader.js +++ b/src/components/Admin/SortableHeader/SortableHeader.js @@ -11,6 +11,7 @@ const SortableHeader = (props) => { }); }} style={{ cursor: 'pointer' }} + data-testid="sortable-header" > {children} {' '} diff --git a/src/components/Admin/SortableHeader/SortableHeader.test.js b/src/components/Admin/SortableHeader/SortableHeader.test.js new file mode 100644 index 00000000..31726248 --- /dev/null +++ b/src/components/Admin/SortableHeader/SortableHeader.test.js @@ -0,0 +1,26 @@ +/** + * @jest-environment jsdom + */ + +import { render } from '@testing-library/react'; +import { ArrowUp } from 'react-bootstrap-icons'; +import SortableHeader from './SortableHeader'; + +test('renders sortable header (no children)', async () => { + const { getByTestId } = render( + + + + )} + /> + + +
, + ); + const sortableHeader = getByTestId('sortable-header'); + expect(sortableHeader).toBeInTheDocument(); +}); diff --git a/src/components/Admin/User/AdminUserList/AdminUserList.test.js b/src/components/Admin/User/AdminUserList/AdminUserList.test.js index c1fe5ad7..e93bfd03 100644 --- a/src/components/Admin/User/AdminUserList/AdminUserList.test.js +++ b/src/components/Admin/User/AdminUserList/AdminUserList.test.js @@ -6,7 +6,7 @@ import { render } from '@testing-library/react'; import { ArrowUp } from 'react-bootstrap-icons'; import AdminUserList from './AdminUserList'; -test('renders groups table (empty list)', async () => { +test('renders users table (empty list)', async () => { const { getByTestId } = render( ( size="sm" variant="light" style={{ border: '1px solid gray', borderCollapse: 'separate' }} + data-testid="admin-annotation" > diff --git a/src/components/Admin/User/AdminUserTable/AdminAnnotation/AdminAnnotation.test.js b/src/components/Admin/User/AdminUserTable/AdminAnnotation/AdminAnnotation.test.js new file mode 100644 index 00000000..94a78b86 --- /dev/null +++ b/src/components/Admin/User/AdminUserTable/AdminAnnotation/AdminAnnotation.test.js @@ -0,0 +1,17 @@ +/** + * @jest-environment jsdom + */ + +import { render } from '@testing-library/react'; +import AdminAnnotation from './AdminAnnotation'; +import { annotation } from '../../../../../utils/testUtil'; + +test('renders annotation', async () => { + const { getByTestId } = render( + , + ); + const adminAnnotation = getByTestId('admin-annotation'); + expect(adminAnnotation).toBeInTheDocument(); +}); diff --git a/src/components/DocumentForm/DocumentForm.test.js b/src/components/DocumentForm/DocumentForm.test.js index 38fc9667..0033c6d3 100644 --- a/src/components/DocumentForm/DocumentForm.test.js +++ b/src/components/DocumentForm/DocumentForm.test.js @@ -4,30 +4,10 @@ import { render } from '@testing-library/react'; import DocumentForm from './DocumentForm'; +import { document, userSession } from '../../utils/testUtil'; // Mock session -const session = { - user: { - id: 'testestestest', - name: 'Test User', - email: 'test@email.com', - groups: [{ - id: 'abcd1234', name: 'Test Group', ownerName: 'Test User', memberCount: 2, role: 'owner', - }], - }, - expires: '2881-10-05T14:48:00.000', -}; - -// Mock document -const document = { - _id: 'documenttestid', - title: 'test', - state: 'draft', - contributors: [], - createdAt: '2881-10-05T14:48:00.000', - owner: 'testestestest', - groups: [], -}; +const session = userSession; describe('document form', () => { test('renders with mode = new', async () => { diff --git a/src/components/DocumentList/DocumentList.test.js b/src/components/DocumentList/DocumentList.test.js index 61f965e2..66db83af 100644 --- a/src/components/DocumentList/DocumentList.test.js +++ b/src/components/DocumentList/DocumentList.test.js @@ -4,17 +4,7 @@ import { render } from '@testing-library/react'; import DocumentList from './DocumentList'; - -// Mock document -const document = { - _id: 'documenttestid', - title: 'test', - contributors: [], - createdAt: '2881-10-05T14:48:00.000', - state: 'draft', - owner: 'testestestest', - groups: [], -}; +import { document } from '../../utils/testUtil'; describe('document list', () => { test('renders with a mocked document', async () => { diff --git a/src/components/DocumentMetadata/DocumentMetadata.test.js b/src/components/DocumentMetadata/DocumentMetadata.test.js index 243fb2cf..11caf787 100644 --- a/src/components/DocumentMetadata/DocumentMetadata.test.js +++ b/src/components/DocumentMetadata/DocumentMetadata.test.js @@ -5,17 +5,7 @@ import { render } from '@testing-library/react'; import { Formik } from 'formik'; import DocumentMetadata from './DocumentMetadata'; - -// Mock document -const values = { - _id: 'documenttestid', - title: 'test', - contributors: [], - createdAt: '2881-10-05T14:48:00.000', - state: 'draft', - owner: 'testestestest', - groups: [], -}; +import { document } from '../../utils/testUtil'; describe('document metadata form', () => { @@ -26,11 +16,11 @@ describe('document metadata form', () => {
)} diff --git a/src/components/DocumentStatusSelect/DocumentStatusSelect.test.js b/src/components/DocumentStatusSelect/DocumentStatusSelect.test.js index 1b91b5cd..8dc4d424 100644 --- a/src/components/DocumentStatusSelect/DocumentStatusSelect.test.js +++ b/src/components/DocumentStatusSelect/DocumentStatusSelect.test.js @@ -5,18 +5,7 @@ import { render } from '@testing-library/react'; import { Formik } from 'formik'; import DocumentStatusSelect from './DocumentStatusSelect'; - -// Mock document -const values = { - _id: 'documenttestid', - title: 'test', - contributors: [], - createdAt: '2881-10-05T14:48:00.000', - state: 'draft', - owner: 'testestestest', - groups: [], -}; - +import { document, userSession } from '../../utils/testUtil'; describe('document status select', () => { test('renders with jest context and mocked values', async () => { @@ -25,20 +14,10 @@ describe('document status select', () => { {(props) => (
)} diff --git a/src/utils/testUtil.js b/src/utils/testUtil.js new file mode 100644 index 00000000..b846e25c --- /dev/null +++ b/src/utils/testUtil.js @@ -0,0 +1,134 @@ +const document = { + _id: 'documenttestid', + title: 'test', + state: 'draft', + contributors: [], + createdAt: '2881-10-05T14:48:00.000', + updatedAt: '2881-10-05T14:48:00.000', + owner: 'testestestest', + groups: [], +}; + +const user = { + id: '1', + name: 'Test User', + firstName: 'Test', + lastName: 'User', + email: 'test@email.com', + affiliation: 'Jest Tests', + groups: [{ + id: 'abcd1234', name: 'Test Group', ownerName: 'Test User', memberCount: 2, role: 'owner', + }], + createdAt: '2881-10-05T14:48:00.000', + updatedAt: '2881-10-05T14:48:00.000', +}; + +const group = { + id: 'abcd1234', + name: 'Test Group', + members: [{ + id: '1', + email: 'test@email.com', + name: 'Test User', + role: 'owner', + }], + inviteUrl: '', + createdAt: '2881-10-05T14:48:00.000', + updatedAt: '2881-10-05T14:48:00.000', +}; + +const annotation = { + _id: '123456', + type: 'Annotation', + creator: { + id: '1', + name: 'Test User', + email: 'test@email.com', + }, + permissions: { + groups: [ + '4321bcda', + ], + documentOwner: false, + private: true, + }, + created: '2020-11-17T23:08:10.332Z', + modified: '2020-11-18T06:20:39.163Z', + body: { + type: 'TextualBody', + value: 'Test body', + tags: ['test0', 'test1'], + format: 'text/html', + language: 'en', + }, + target: { + document: { + slug: '', + id: '987654321', + title: 'Test', + owner: '1', + groups: [ + '4321bcda', + ], + resourceType: 'Book', + contributors: [ + { + name: 'Fake Author', + }, + { + type: 'Editor', + name: 'Fake Editor', + }, + { + type: 'Translator', + name: 'Fake Tanslator', + }, + ], + rightsStatus: 'Copyrighted', + state: 'published', + createdAt: '2020-11-16T23:08:38.074Z', + updatedAt: '2020-11-18T06:20:19.894Z', + format: 'text/html', + }, + selector: { + type: 'TextQuoteSelector', + exact: 'This reading sees identity politics as emerging from a historical moment that opposes the development of a mass anti-capitalist politics', + prefix: 'ass-based politics. ', + suffix: ', and, being symptom', + }, + }, +}; + +const adminUserSession = { + user: { + name: 'Admin User', + email: 'admin@email.com', + groups: [{ + id: 'abcd1234', name: 'Test Group', ownerName: 'Test User', memberCount: 2, role: 'owner', + }], + role: 'admin', + }, + expires: '2881-10-05T14:48:00.000', +}; + +const userSession = { + user: { + name: 'Test User', + email: 'test@email.com', + groups: [{ + id: 'abcd1234', name: 'Test Group', ownerName: 'Test User', memberCount: 2, role: 'owner', + }], + role: 'user', + }, + expires: '2881-10-05T14:48:00.000', +}; + + +export { + adminUserSession, + annotation, + document, + group, + user, + userSession, +};