Skip to content

Commit ec8c00a

Browse files
authored
Merge pull request #806 from classtranscribe/hd/remove-jquery
Remove jQuery from Instructor List (Fix #777 Part 1/2)
2 parents 87d54d5 + cb9d595 commit ec8c00a

File tree

5 files changed

+93
-5
lines changed

5 files changed

+93
-5
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
106106
"@testing-library/jest-dom": "^6.4.5",
107107
"@testing-library/react": "12.1.5",
108+
"@testing-library/user-event": "14.5.2",
108109
"babel-jest": "^26.6.0",
109110
"cross-env": "^7.0.2",
110111
"eslint-config-airbnb": "^18.1.0",

src/components/CTEPubListScreen/components/NewEPubModal.test.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { render, screen, fireEvent } from '@testing-library/react';
1+
import { render, screen } from '@testing-library/react';
22
import { LanguageConstants } from 'components/CTPlayer';
33
import NewEPubModal from './NewEPubModal';
44

@@ -14,7 +14,8 @@ describe('New EPubModal', () => {
1414
onClose: jest.fn(),
1515
onCreate: jest.fn(),
1616
defaultTitle: ""
17-
}
17+
};
18+
1819
test('it renders with no languages', () => {
1920
render(<NewEPubModal {...baseProps} />);
2021

src/screens/Admin/Instructors/InstructorList.jsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import React, { useState, useEffect } from 'react';
2-
import $ from 'jquery';
32
import { Button } from 'semantic-ui-react';
43
import { search } from 'utils';
54
import * as KeyCode from 'keycode-js';
65
import { AdminListItem } from '../Components';
76

87
export default function InstructorList({ instructors, loading, currUni, onInactive }) {
98
const [result, setResult] = useState([]);
9+
const [searchText, setSearchText] = useState("");
1010

1111
useEffect(() => {
1212
setResult(instructors);
@@ -15,7 +15,7 @@ export default function InstructorList({ instructors, loading, currUni, onInacti
1515
const onSearch = (keyCode) => {
1616
if (keyCode === KeyCode.KEY_RETURN) {
1717
setResult(
18-
search.getResults(instructors, $('#inst-filter')[0].value, [
18+
search.getResults(instructors, searchText, [
1919
'firstName',
2020
'lastName',
2121
'email',
@@ -26,7 +26,7 @@ export default function InstructorList({ instructors, loading, currUni, onInacti
2626

2727
const onReset = () => {
2828
setResult(instructors);
29-
$('#inst-filter')[0].value = '';
29+
setSearchText('');
3030
};
3131

3232
return (
@@ -36,6 +36,8 @@ export default function InstructorList({ instructors, loading, currUni, onInacti
3636
<input
3737
id="inst-filter"
3838
placeholder="Name or email"
39+
value={searchText}
40+
onChange={(e) => setSearchText(e.target.value)}
3941
onKeyDown={({ keyCode }) => {
4042
return onSearch(keyCode);
4143
}}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import { render, screen } from '@testing-library/react';
2+
import userEvent from "@testing-library/user-event";
3+
import * as KeyCode from 'keycode-js';
4+
import InstructorList from './InstructorList';
5+
6+
describe('Instructor List', () => {
7+
const universityName = 'University of Test'
8+
const baseProps = {
9+
loading: false,
10+
currUni: { name: universityName, id: 0 },
11+
onInactive: jest.fn()
12+
};
13+
14+
// All instructors have the same univeristy display in common
15+
const numberOfInstructors = () => screen.queryAllByText(`University: ${universityName}`).length
16+
17+
test('it renders', () => {
18+
render(<InstructorList {...baseProps} instructors={[]} />);
19+
20+
expect(numberOfInstructors()).toBe(0);
21+
});
22+
23+
// Note: only setting up fields we use for display, add more as needed
24+
const instructors = [
25+
{ id: 0, firstName: "Harsh", lastName: "Deep", email: "[email protected]" },
26+
{ id: 1, firstName: "Alan", email: "[email protected]" },
27+
{ id: 2, lastName: "Turing", email: "[email protected]" },
28+
]
29+
30+
test('it shows all instructors', () => {
31+
render(<InstructorList {...baseProps} instructors={instructors} />);
32+
33+
expect(numberOfInstructors()).toBe(3);
34+
35+
expect(screen.getByText("Harsh Deep")).toBeVisible();
36+
expect(screen.getByText("Alan")).toBeVisible();
37+
expect(screen.getByText("Unknown Turing")).toBeVisible();
38+
39+
expect(screen.getByText("Email: [email protected]")).toBeVisible();
40+
expect(screen.getByText("Email: [email protected]")).toBeVisible();
41+
expect(screen.getByText("Email: [email protected]")).toBeVisible();
42+
});
43+
44+
test('it filters based on first, last and email and we can reset the filters', async () => {
45+
render(<InstructorList {...baseProps} instructors={instructors} />);
46+
47+
const searchField = screen.getByLabelText("Search:");
48+
const searchButton = screen.getByRole("button", { name: "search"});
49+
const resetButton = screen.getByRole("button", { name: "Reset" });
50+
51+
// First Name
52+
await userEvent.type(searchField, "Harsh");
53+
await userEvent.click(searchButton);
54+
55+
expect(numberOfInstructors()).toBe(1);
56+
expect(screen.getByText("Harsh Deep")).toBeVisible();
57+
58+
// Last Name
59+
await userEvent.clear(searchField);
60+
await userEvent.type(searchField, "Turing");
61+
await userEvent.click(searchButton);
62+
63+
expect(numberOfInstructors()).toBe(1);
64+
expect(screen.getByText("Unknown Turing")).toBeVisible();
65+
66+
// Email
67+
await userEvent.clear(searchField);
68+
await userEvent.type(searchField, "alan@example");
69+
await userEvent.click(searchButton);
70+
71+
expect(numberOfInstructors()).toBe(1);
72+
expect(screen.getByText("Alan")).toBeVisible();
73+
74+
// Reset
75+
await userEvent.click(resetButton);
76+
expect(searchField.value).toBe("");
77+
expect(numberOfInstructors()).toBe(3);
78+
});
79+
});

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3068,6 +3068,11 @@
30683068
"@testing-library/dom" "^8.0.0"
30693069
"@types/react-dom" "<18.0.0"
30703070

3071+
"@testing-library/[email protected]":
3072+
version "14.5.2"
3073+
resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd"
3074+
integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==
3075+
30713076
"@tootallnate/once@1":
30723077
version "1.1.2"
30733078
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"

0 commit comments

Comments
 (0)