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 : "harsh@example.com" } ,
26+ { id : 1 , firstName : "Alan" , email : "alan@example.com" } ,
27+ { id : 2 , lastName : "Turing" , email : "turing@example.com" } ,
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: harsh@example.com" ) ) . toBeVisible ( ) ;
40+ expect ( screen . getByText ( "Email: alan@example.com" ) ) . toBeVisible ( ) ;
41+ expect ( screen . getByText ( "Email: harsh@example.com" ) ) . 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+ } ) ;
0 commit comments