diff --git a/src/components/GradesView/EditModal/OverrideTable/ReasonInput/__snapshots__/index.test.jsx.snap b/src/components/GradesView/EditModal/OverrideTable/ReasonInput/__snapshots__/index.test.jsx.snap
deleted file mode 100644
index 153368f..0000000
--- a/src/components/GradesView/EditModal/OverrideTable/ReasonInput/__snapshots__/index.test.jsx.snap
+++ /dev/null
@@ -1,11 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`ReasonInput component render snapshot 1`] = `
-
-`;
diff --git a/src/components/GradesView/EditModal/OverrideTable/ReasonInput/index.test.jsx b/src/components/GradesView/EditModal/OverrideTable/ReasonInput/index.test.jsx
index fe1e03f..7f652b1 100644
--- a/src/components/GradesView/EditModal/OverrideTable/ReasonInput/index.test.jsx
+++ b/src/components/GradesView/EditModal/OverrideTable/ReasonInput/index.test.jsx
@@ -1,37 +1,34 @@
-import React from 'react';
-import { shallow } from '@edx/react-unit-test-utils';
-
-import { Form } from '@openedx/paragon';
+import { render, screen } from '@testing-library/react';
import useReasonInputData from './hooks';
import ReasonInput from '.';
jest.mock('./hooks', () => jest.fn());
+jest.unmock('@openedx/paragon');
+jest.unmock('react');
+
const hookProps = {
- ref: 'reason-input-ref',
+ ref: jest.fn().mockName('hook.ref'),
onChange: jest.fn().mockName('hook.onChange'),
value: 'test-value',
};
useReasonInputData.mockReturnValue(hookProps);
-let el;
describe('ReasonInput component', () => {
beforeEach(() => {
jest.clearAllMocks();
- el = shallow();
+ render();
});
describe('behavior', () => {
it('initializes hook data', () => {
expect(useReasonInputData).toHaveBeenCalled();
});
});
- describe('render', () => {
- test('snapshot', () => {
- expect(el.snapshot).toMatchSnapshot();
- const control = el.instance.findByType(Form.Control)[0];
- expect(control.props.value).toEqual(hookProps.value);
- expect(control.props.onChange).toEqual(hookProps.onChange);
+ describe('renders', () => {
+ it('input correctly', () => {
+ expect(screen.getByRole('textbox')).toBeInTheDocument();
+ expect(screen.getByRole('textbox')).toHaveValue(hookProps.value);
});
});
});
diff --git a/src/components/GradesView/EditModal/OverrideTable/__snapshots__/index.test.jsx.snap b/src/components/GradesView/EditModal/OverrideTable/__snapshots__/index.test.jsx.snap
deleted file mode 100644
index 4437a1a..0000000
--- a/src/components/GradesView/EditModal/OverrideTable/__snapshots__/index.test.jsx.snap
+++ /dev/null
@@ -1,25 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`OverrideTable component render snapshot 1`] = `
-,
- "date": {
- "formatted": 2000-01-01T00:00:00.000Z,
- },
- "reason": ,
- },
- ]
- }
- itemCount={3}
-/>
-`;
diff --git a/src/components/GradesView/EditModal/OverrideTable/index.test.jsx b/src/components/GradesView/EditModal/OverrideTable/index.test.jsx
index 0c94811..712420a 100644
--- a/src/components/GradesView/EditModal/OverrideTable/index.test.jsx
+++ b/src/components/GradesView/EditModal/OverrideTable/index.test.jsx
@@ -1,65 +1,65 @@
import React from 'react';
-import { shallow } from '@edx/react-unit-test-utils';
+import { render, screen } from '@testing-library/react';
+import { IntlProvider } from '@edx/frontend-platform/i18n';
-import { DataTable } from '@openedx/paragon';
-
-import { formatDateForDisplay } from 'utils';
-
-import AdjustedGradeInput from './AdjustedGradeInput';
-import ReasonInput from './ReasonInput';
import useOverrideTableData from './hooks';
import OverrideTable from '.';
+jest.unmock('@openedx/paragon');
+jest.unmock('react');
+jest.unmock('@edx/frontend-platform/i18n');
+
jest.mock('utils', () => ({
+ ...jest.requireActual('utils'),
formatDateForDisplay: (date) => ({ formatted: date }),
}));
jest.mock('./hooks', () => jest.fn());
-jest.mock('./AdjustedGradeInput', () => 'AdjustedGradeInput');
-jest.mock('./ReasonInput', () => 'ReasonInput');
const hookProps = {
hide: false,
data: [
- { test: 'data' },
- { andOther: 'test-data' },
+ { filename: 'data' },
+ { resultsSummary: 'test-data' },
],
- columns: 'test-columns',
+ columns: [{
+ Header: 'Gradebook',
+ accessor: 'filename',
+ },
+ {
+ Header: 'Download Summary',
+ accessor: 'resultsSummary',
+ }],
};
-useOverrideTableData.mockReturnValue(hookProps);
-let el;
describe('OverrideTable component', () => {
beforeEach(() => {
jest
.clearAllMocks()
.useFakeTimers('modern')
.setSystemTime(new Date('2000-01-01').getTime());
- el = shallow();
});
- describe('behavior', () => {
+ describe('hooks', () => {
it('initializes hook data', () => {
+ useOverrideTableData.mockReturnValue(hookProps);
+ render();
expect(useOverrideTableData).toHaveBeenCalled();
});
});
- describe('render', () => {
- test('null render if hide', () => {
- useOverrideTableData.mockReturnValueOnce({ ...hookProps, hide: true });
- el = shallow();
- expect(el.isEmptyRender()).toEqual(true);
+ describe('behavior', () => {
+ it('null render if hide', () => {
+ useOverrideTableData.mockReturnValue({ ...hookProps, hide: true });
+ render();
+ expect(screen.queryByRole('table')).toBeNull();
});
- test('snapshot', () => {
- expect(el.snapshot).toMatchSnapshot();
- const table = el.instance.findByType(DataTable)[0];
- expect(table.props.columns).toEqual(hookProps.columns);
- const data = [...table.props.data];
- const inputRow = data.pop();
- const formattedDate = formatDateForDisplay(new Date());
- expect(data).toEqual(hookProps.data);
- expect(inputRow).toMatchObject({
- adjustedGrade: ,
- date: formattedDate,
- reason: ,
- });
+ it('renders table with correct data', () => {
+ useOverrideTableData.mockReturnValue(hookProps);
+ render();
+ const table = screen.getByRole('table');
+ expect(table).toBeInTheDocument();
+ expect(screen.getByText(hookProps.columns[0].Header)).toBeInTheDocument();
+ expect(screen.getByText(hookProps.columns[1].Header)).toBeInTheDocument();
+ expect(screen.getByText(hookProps.data[0].filename)).toBeInTheDocument();
+ expect(screen.getByText(hookProps.data[1].resultsSummary)).toBeInTheDocument();
});
});
});
diff --git a/src/components/GradesView/EditModal/__snapshots__/index.test.jsx.snap b/src/components/GradesView/EditModal/__snapshots__/index.test.jsx.snap
deleted file mode 100644
index 46a0c51..0000000
--- a/src/components/GradesView/EditModal/__snapshots__/index.test.jsx.snap
+++ /dev/null
@@ -1,91 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`EditModal component render with error snapshot 1`] = `
-
-
-
-
-
- test-error
-
-
-
- Showing most recent actions (max 5). To see more, please contact support
-
-
- Note: Once you save, your changes will be visible to students.
-
-
-
-
-
-
- Cancel
-
-
-
-
-
-`;
-
-exports[`EditModal component render without error snapshot 1`] = `
-
-
-
-
-
-
-
- Showing most recent actions (max 5). To see more, please contact support
-
-
- Note: Once you save, your changes will be visible to students.
-
-
-
-
-
-
- Cancel
-
-
-
-
-
-`;
diff --git a/src/components/GradesView/EditModal/index.test.jsx b/src/components/GradesView/EditModal/index.test.jsx
index 3468096..2dcb384 100644
--- a/src/components/GradesView/EditModal/index.test.jsx
+++ b/src/components/GradesView/EditModal/index.test.jsx
@@ -1,126 +1,106 @@
-import React from 'react';
-import { shallow } from '@edx/react-unit-test-utils';
+import { render, screen } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
+import { IntlProvider } from '@edx/frontend-platform/i18n';
-import {
- ActionRow,
- ModalDialog,
-} from '@openedx/paragon';
-import { useIntl } from '@edx/frontend-platform/i18n';
-
-import { formatMessage } from 'testUtils';
-
-import ModalHeaders from './ModalHeaders';
-import OverrideTable from './OverrideTable';
import useEditModalData from './hooks';
import EditModal from '.';
import messages from './messages';
jest.mock('./hooks', () => jest.fn());
-jest.mock('./ModalHeaders', () => 'ModalHeaders');
-jest.mock('./OverrideTable', () => 'OverrideTable');
+jest.mock('./ModalHeaders', () => jest.fn(() => ModalHeaders
));
+jest.mock('./OverrideTable', () => jest.fn(() => OverrideTable
));
+
+jest.unmock('@openedx/paragon');
+jest.unmock('react');
+jest.unmock('@edx/frontend-platform/i18n');
const hookProps = {
onClose: jest.fn().mockName('hooks.onClose'),
error: 'test-error',
handleAdjustedGradeClick: jest.fn().mockName('hooks.handleAdjustedGradeClick'),
- isOpen: 'test-is-open',
+ isOpen: true,
};
-useEditModalData.mockReturnValue(hookProps);
-let el;
describe('EditModal component', () => {
beforeEach(() => {
jest.clearAllMocks();
- el = shallow();
});
describe('behavior', () => {
- it('initializes intl hook', () => {
- expect(useIntl).toHaveBeenCalled();
- });
it('initializes component hooks', () => {
+ useEditModalData.mockReturnValue(hookProps);
+ render();
expect(useEditModalData).toHaveBeenCalled();
});
});
- describe('render', () => {
- test('modal props', () => {
- const modalProps = el.instance.findByType(ModalDialog)[0].props;
- expect(modalProps.title).toEqual(formatMessage(messages.title));
- expect(modalProps.isOpen).toEqual(hookProps.isOpen);
- expect(modalProps.onClose).toEqual(hookProps.onClose);
- });
- const loadBody = () => {
- const body = el.instance.findByType(ModalDialog)[0].children[0];
- const { children } = body.children[0];
- return { body, children };
+ describe('renders', () => {
+ const testModal = () => {
+ it('modal properly', () => {
+ const modal = screen.getByRole('dialog', { title: messages.title.defaultMessage });
+ expect(modal).toBeInTheDocument();
+ });
+ it('triggers onClose when closed', async () => {
+ const user = userEvent.setup();
+ const closeButton = screen.getByRole('button', { name: messages.closeText.defaultMessage });
+ await user.click(closeButton);
+ expect(hookProps.onClose).toHaveBeenCalled();
+ });
};
const testBody = () => {
- test('type', () => {
- const { body } = loadBody();
- expect(body.type).toEqual('ModalDialog.Body');
+ it('headers row', () => {
+ const headers = screen.getByText('ModalHeaders');
+ expect(headers).toBeInTheDocument();
});
- test('headers row', () => {
- const { children } = loadBody();
- expect(children[0]).toMatchObject(shallow());
+ it('table row', () => {
+ const table = screen.getByText('OverrideTable');
+ expect(table).toBeInTheDocument();
});
- test('table row', () => {
- const { children } = loadBody();
- expect(children[2]).toMatchObject(shallow());
- });
- test('messages', () => {
- const { children } = loadBody();
- expect(children[3].children[0].el).toEqual(formatMessage(messages.visibility));
- expect(children[4].children[0].el).toEqual(formatMessage(messages.saveVisibility));
+ it('messages', () => {
+ const visibilityMessage = screen.getByText(messages.visibility.defaultMessage);
+ const saveVisibilityMessage = screen.getByText(messages.saveVisibility.defaultMessage);
+ expect(visibilityMessage).toBeInTheDocument();
+ expect(saveVisibilityMessage).toBeInTheDocument();
});
};
const testFooter = () => {
- let footer;
- beforeEach(() => {
- footer = el.instance.findByType(ModalDialog)[0].children;
+ it('adjusted grade button', async () => {
+ const user = userEvent.setup();
+ const saveGradeButton = screen.getByRole('button', { name: messages.saveGrade.defaultMessage });
+ expect(saveGradeButton).toBeInTheDocument();
+ await user.click(saveGradeButton);
+ expect(hookProps.handleAdjustedGradeClick).toHaveBeenCalled();
});
- test('type', () => {
- expect(footer[1].type).toEqual('ModalDialog.Footer');
- });
- test('contains action row', () => {
- expect(footer[1].children[0].type).toEqual('ActionRow');
- });
- test('close button', () => {
- const button = footer[1].findByType(ActionRow)[0].children[0];
- expect(button.children[0].el).toEqual(formatMessage(messages.closeText));
- expect(button.type).toEqual('ModalDialog.CloseButton');
- });
- test('adjusted grade button', () => {
- const button = footer[1].findByType(ActionRow)[0].children[1];
- expect(button.children[0].el).toEqual(formatMessage(messages.saveGrade));
- expect(button.type).toEqual('Button');
- expect(button.props.onClick).toEqual(hookProps.handleAdjustedGradeClick);
+ it('close button', async () => {
+ const user = userEvent.setup();
+ const cancelButton = screen.getByRole('button', { name: messages.closeText.defaultMessage });
+ expect(cancelButton).toBeInTheDocument();
+ await user.click(cancelButton);
+ expect(hookProps.onClose).toHaveBeenCalled();
});
};
describe('without error', () => {
beforeEach(() => {
useEditModalData.mockReturnValueOnce({ ...hookProps, error: undefined });
- el = shallow();
- });
- test('snapshot', () => {
- expect(el.snapshot).toMatchSnapshot();
+ render();
});
+ testModal();
testBody();
testFooter();
test('alert row', () => {
- const alert = loadBody().children[1];
- expect(alert.type).toEqual('Alert');
- expect(alert.props.show).toEqual(false);
+ const alert = screen.queryByRole('alert');
+ expect(alert).toBeNull();
});
});
describe('with error', () => {
- test('snapshot', () => {
- expect(el.snapshot).toMatchSnapshot();
+ beforeEach(() => {
+ useEditModalData.mockReturnValue(hookProps);
+ render();
});
+ testModal();
testBody();
test('alert row', () => {
- const alert = loadBody().children[1];
- expect(alert.type).toEqual('Alert');
- expect(alert.props.show).toEqual(true);
- expect(alert.children[0].el).toEqual(hookProps.error);
+ const alert = screen.getByRole('alert');
+ expect(alert).toBeInTheDocument();
+ expect(alert).toHaveTextContent(hookProps.error);
});
testFooter();
});
diff --git a/src/components/GradesView/FilterBadges/FilterBadge.test.jsx b/src/components/GradesView/FilterBadges/FilterBadge.test.jsx
index 45dbec8..36369f4 100644
--- a/src/components/GradesView/FilterBadges/FilterBadge.test.jsx
+++ b/src/components/GradesView/FilterBadges/FilterBadge.test.jsx
@@ -1,10 +1,10 @@
import React from 'react';
-import { shallow } from '@edx/react-unit-test-utils';
+import { render, screen } from '@testing-library/react';
import { useIntl } from '@edx/frontend-platform/i18n';
import { formatMessage } from 'testUtils';
-import { Button } from '@openedx/paragon';
import { selectors } from 'data/redux/hooks';
+import userEvent from '@testing-library/user-event';
import FilterBadge from './FilterBadge';
jest.mock('@openedx/paragon', () => ({
@@ -18,7 +18,10 @@ jest.mock('data/redux/hooks', () => ({
},
}));
-const handleClose = jest.fn(filters => ({ handleClose: filters }));
+jest.unmock('@openedx/paragon');
+jest.unmock('react');
+
+const handleClose = jest.fn();
const filterName = 'test-filter-name';
const hookProps = {
@@ -32,12 +35,11 @@ const hookProps = {
};
selectors.root.useFilterBadgeConfig.mockReturnValue(hookProps);
-let el;
describe('FilterBadge', () => {
- beforeEach(() => {
- el = shallow();
- });
- describe('behavior', () => {
+ describe('hooks', () => {
+ beforeEach(() => {
+ render();
+ });
it('initializes intl hook', () => {
expect(useIntl).toHaveBeenCalled();
});
@@ -46,49 +48,42 @@ describe('FilterBadge', () => {
});
});
describe('render', () => {
- const testDisplayName = () => {
- test('formatted display name appears on badge', () => {
- expect(el.instance.findByTestId('display-name')[0].children[0].el).toEqual(formatMessage(hookProps.displayName));
- });
- };
- const testCloseButton = () => {
- test('close button forwards close method', () => {
- expect(el.instance.findByType(Button)[0].props.onClick).toEqual(handleClose(hookProps.connectedFilters));
- });
- };
- test('empty render if isDefault', () => {
+ it('empty render if isDefault', () => {
selectors.root.useFilterBadgeConfig.mockReturnValueOnce({
...hookProps,
isDefault: true,
});
- el = shallow();
- expect(el.isEmptyRender()).toEqual(true);
+ render();
+ expect(screen.queryByText(hookProps.displayName)).toBeNull();
});
describe('hide Value', () => {
- beforeEach(() => {
+ it('renders display name, value is not shown and close button has correct behavior', async () => {
selectors.root.useFilterBadgeConfig.mockReturnValueOnce({
...hookProps,
hideValue: true,
});
- el = shallow();
- });
- testDisplayName();
- testCloseButton();
- test('snapshot', () => {
- expect(el.snapshot).toMatchSnapshot();
- });
- test('value is note present in the badge', () => {
- expect(el.instance.findByTestId('filter-value')[0].children).toHaveLength(0);
+ render();
+ const user = userEvent.setup();
+ expect(screen.getByTestId('display-name')).toHaveTextContent(formatMessage(hookProps.displayName));
+ expect(screen.queryByTestId('filter-value')).toHaveTextContent('');
+ const button = screen.getByRole('button', { name: /close/i });
+ await user.click(button);
+ expect(handleClose).toHaveBeenCalledWith(hookProps.connectedFilters);
});
});
describe('do not hide value', () => {
- testDisplayName();
- testCloseButton();
- test('snapshot', () => {
- expect(el.snapshot).toMatchSnapshot();
- });
- test('value is present in the badge', () => {
- expect(el.instance.findByTestId('filter-value')[0].children[0].el).toBe(`: ${hookProps.value}`);
+ it('renders display name and value, and close button has correct behavior', async () => {
+ selectors.root.useFilterBadgeConfig.mockReturnValueOnce({
+ ...hookProps,
+ hideValue: false,
+ });
+ render();
+ const user = userEvent.setup();
+ expect(screen.getByTestId('display-name')).toHaveTextContent(formatMessage(hookProps.displayName));
+ expect(screen.getByTestId('filter-value')).toHaveTextContent(`: ${hookProps.value}`);
+ const button = screen.getByRole('button', { name: /close/i });
+ await user.click(button);
+ expect(handleClose).toHaveBeenCalledWith(hookProps.connectedFilters);
});
});
});
diff --git a/src/components/GradesView/FilterBadges/__snapshots__/FilterBadge.test.jsx.snap b/src/components/GradesView/FilterBadges/__snapshots__/FilterBadge.test.jsx.snap
deleted file mode 100644
index 84bc9ac..0000000
--- a/src/components/GradesView/FilterBadges/__snapshots__/FilterBadge.test.jsx.snap
+++ /dev/null
@@ -1,75 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`FilterBadge render do not hide value snapshot 1`] = `
-
-
-
- a common name
-
-
- : a common value
-
-
-
-
-
-`;
-
-exports[`FilterBadge render hide Value snapshot 1`] = `
-
-
-
- a common name
-
-
-
-
-
-
-`;
diff --git a/src/components/GradesView/FilterBadges/__snapshots__/test.jsx.snap b/src/components/GradesView/FilterBadges/__snapshots__/test.jsx.snap
deleted file mode 100644
index 5d97e37..0000000
--- a/src/components/GradesView/FilterBadges/__snapshots__/test.jsx.snap
+++ /dev/null
@@ -1,21 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`FilterBadges component snapshot - has a filterbadge with handleClose for each filter in badgeOrder 1`] = `
-
-
-
-
-
-`;
diff --git a/src/components/GradesView/FilterBadges/test.jsx b/src/components/GradesView/FilterBadges/test.jsx
index 652fc67..71843ae 100644
--- a/src/components/GradesView/FilterBadges/test.jsx
+++ b/src/components/GradesView/FilterBadges/test.jsx
@@ -1,11 +1,13 @@
+/* eslint-disable import/no-extraneous-dependencies */
/* eslint-disable import/no-named-as-default */
import React from 'react';
-import { shallow } from '@edx/react-unit-test-utils';
+import { render, screen } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
import FilterBadges from '.';
-import FilterBadge from './FilterBadge';
-jest.mock('./FilterBadge', () => 'FilterBadge');
+jest.unmock('@openedx/paragon');
+jest.unmock('react');
const order = ['filter1', 'filter2', 'filter3'];
jest.mock('data/constants/filters', () => ({
@@ -13,24 +15,24 @@ jest.mock('data/constants/filters', () => ({
badgeOrder: order,
}));
+// eslint-disable-next-line react/button-has-type
+jest.mock('./FilterBadge', () => jest.fn(({ filterName, handleClose }) => ));
+
+const handleClose = jest.fn();
+
describe('FilterBadges', () => {
describe('component', () => {
- let el;
- let handleClose;
- beforeEach(() => {
- handleClose = jest.fn().mockName('this.props.handleClose');
- el = shallow();
- });
- test('snapshot - has a filterbadge with handleClose for each filter in badgeOrder', () => {
- expect(el.snapshot).toMatchSnapshot();
- });
- test('has a filterbadge with handleClose for each filter in badgeOrder', () => {
- const badgeProps = el.instance.findByType(FilterBadge).map(badgeEl => badgeEl.props);
- // key prop is not rendered by react
- expect(badgeProps[0]).toMatchObject({ filterName: order[0], handleClose });
- expect(badgeProps[1]).toMatchObject({ filterName: order[1], handleClose });
- expect(badgeProps[2]).toMatchObject({ filterName: order[2], handleClose });
- expect(badgeProps.length).toEqual(3);
+ it('has a filterbadge with handleClose for each filter in badgeOrder', async () => {
+ render();
+ const user = userEvent.setup();
+ const badge1 = screen.getByText(order[0]);
+ const badge2 = screen.getByText(order[1]);
+ const badge3 = screen.getByText(order[2]);
+ expect(badge1).toBeInTheDocument();
+ expect(badge2).toBeInTheDocument();
+ expect(badge3).toBeInTheDocument();
+ await user.click(badge1);
+ expect(handleClose).toHaveBeenCalled();
});
});
});
diff --git a/src/components/GradesView/GradebookTable/__snapshots__/index.test.jsx.snap b/src/components/GradesView/GradebookTable/__snapshots__/index.test.jsx.snap
deleted file mode 100644
index 0f09cf0..0000000
--- a/src/components/GradesView/GradebookTable/__snapshots__/index.test.jsx.snap
+++ /dev/null
@@ -1,32 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`GradebookTable snapshot 1`] = `
-
-
-
-
-
-
-
-`;
diff --git a/src/components/GradesView/GradebookTable/index.test.jsx b/src/components/GradesView/GradebookTable/index.test.jsx
index 00cbb99..46f06ee 100644
--- a/src/components/GradesView/GradebookTable/index.test.jsx
+++ b/src/components/GradesView/GradebookTable/index.test.jsx
@@ -1,39 +1,46 @@
-import React from 'react';
-import { shallow } from '@edx/react-unit-test-utils';
-
-import { DataTable } from '@openedx/paragon';
+import { render, screen } from '@testing-library/react';
+import { IntlProvider } from '@edx/frontend-platform/i18n';
import useGradebookTableData from './hooks';
import GradebookTable from '.';
jest.mock('./hooks', () => jest.fn());
+jest.unmock('@openedx/paragon');
+jest.unmock('react');
+jest.unmock('@edx/frontend-platform/i18n');
+
const hookProps = {
- columns: ['some', 'columns'],
- data: ['some', 'data'],
+ columns: [{ Header: 'Username', accessor: 'username' }, { Header: 'Email', accessor: 'email' }, { Header: 'Total Grade', accessor: 'totalGrade' }],
+ data: [{ username: 'instructor', email: 'instructor@example.com', totalGrade: '100' }, { username: 'student', email: 'student@example.com', totalGrade: '90' }],
grades: ['a', 'few', 'grades'],
nullMethod: jest.fn().mockName('hooks.nullMethod'),
emptyContent: 'empty-table-content',
};
-useGradebookTableData.mockReturnValue(hookProps);
-let el;
describe('GradebookTable', () => {
- beforeEach(() => {
- jest.clearAllMocks();
- el = shallow();
+ it('renders Datatable correctly', () => {
+ useGradebookTableData.mockReturnValue(hookProps);
+ render();
+ expect(useGradebookTableData).toHaveBeenCalled();
+ const headers = screen.getAllByRole('columnheader');
+ expect(headers).toHaveLength(3);
+ expect(headers[0]).toHaveTextContent(hookProps.columns[0].Header);
+ expect(headers[1]).toHaveTextContent(hookProps.columns[1].Header);
+ expect(headers[2]).toHaveTextContent(hookProps.columns[2].Header);
+ const rows = screen.getAllByRole('row');
+ expect(rows).toHaveLength(3);
+ expect(screen.getByText(hookProps.data[0].username)).toBeInTheDocument();
+ expect(screen.getByText(hookProps.data[0].email)).toBeInTheDocument();
+ expect(screen.getByText(hookProps.data[0].totalGrade)).toBeInTheDocument();
});
- test('snapshot', () => {
- expect(el.snapshot).toMatchSnapshot();
- });
- test('Datatable props', () => {
- const datatable = el.instance.findByType(DataTable)[0];
- const { props } = datatable;
- expect(props.columns).toEqual(hookProps.columns);
- expect(props.data).toEqual(hookProps.data);
- expect(props.itemCount).toEqual(hookProps.grades.length);
- expect(props.RowStatusComponent).toEqual(hookProps.nullMethod);
- expect(datatable.children[2].type).toEqual('DataTable.EmptyTable');
- expect(datatable.children[2].props.content).toEqual(hookProps.emptyContent);
+ it('renders empty table content when no data is available', () => {
+ useGradebookTableData.mockReturnValue({
+ ...hookProps,
+ data: [],
+ grades: [],
+ });
+ render();
+ expect(screen.getByText(hookProps.emptyContent)).toBeInTheDocument();
});
});