1- import renderer from "react-test-renderer" ;
1+ import "@testing-library/jest-dom" ;
2+ import { act , render , screen } from "@testing-library/react" ;
3+ import userEvent from "@testing-library/user-event" ;
24
35import ProjectSpeakersList , {
4- AddSpeakerListItem ,
56 ProjectSpeakersId ,
6- SpeakerListItem ,
77} from "components/ProjectUsers/ProjectSpeakersList" ;
88import { randomSpeaker } from "types/project" ;
99
10- // Dialog uses portals, which are not supported in react-test-renderer.
11- jest . mock ( "@mui/material/Dialog" , ( ) =>
12- jest . requireActual ( "@mui/material/Container" )
13- ) ;
14-
1510jest . mock ( "backend" , ( ) => ( {
1611 createSpeaker : ( name : string , projectId ?: string ) =>
1712 mockCreateSpeaker ( name , projectId ) ,
@@ -21,8 +16,7 @@ jest.mock("backend", () => ({
2116 updateSpeakerName : ( speakerId : string , name : string , projectId ?: string ) =>
2217 mockUpdateSpeakerName ( speakerId , name , projectId ) ,
2318} ) ) ;
24- // Mock "i18n", else `Error: connect ECONNREFUSED ::1:80`
25- jest . mock ( "i18n" , ( ) => ( { } ) ) ;
19+ jest . mock ( "i18n" , ( ) => ( { } ) ) ; // else `thrown: "Error: AggregateError`
2620
2721const mockCreateSpeaker = jest . fn ( ) ;
2822const mockDeleteSpeaker = jest . fn ( ) ;
@@ -32,13 +26,9 @@ const mockUpdateSpeakerName = jest.fn();
3226const mockProjId = "mock-project-id" ;
3327const mockSpeakers = [ randomSpeaker ( ) , randomSpeaker ( ) , randomSpeaker ( ) ] ;
3428
35- let testRenderer : renderer . ReactTestRenderer ;
36-
37- const renderProjectSpeakersList = async (
38- projId = mockProjId
39- ) : Promise < void > => {
40- await renderer . act ( async ( ) => {
41- testRenderer = renderer . create ( < ProjectSpeakersList projectId = { projId } /> ) ;
29+ const renderProjectSpeakersList = async ( ) : Promise < void > => {
30+ await act ( async ( ) => {
31+ render ( < ProjectSpeakersList projectId = { mockProjId } /> ) ;
4232 } ) ;
4333} ;
4434
@@ -50,93 +40,66 @@ beforeEach(() => {
5040} ) ;
5141
5242describe ( "ProjectSpeakersList" , ( ) => {
53- it ( "shows right number of speakers and an item to add a speaker" , async ( ) => {
43+ it ( "shows list item for each speakers, +1 for add-a- speaker" , async ( ) => {
5444 await renderProjectSpeakersList ( ) ;
55- expect ( testRenderer . root . findAllByType ( SpeakerListItem ) ) . toHaveLength (
56- mockSpeakers . length
45+ expect ( screen . queryAllByRole ( "listitem" ) ) . toHaveLength (
46+ mockSpeakers . length + 1
5747 ) ;
58- expect ( testRenderer . root . findByType ( AddSpeakerListItem ) ) . toBeTruthy ( ) ;
5948 } ) ;
6049
6150 it ( "updates speaker name if changed" , async ( ) => {
6251 await renderProjectSpeakersList ( ) ;
52+ const speaker = mockSpeakers [ 0 ] ;
6353
6454 // Click the button to edit speaker
65- const editButton = testRenderer . root . findByProps ( {
66- id : `${ ProjectSpeakersId . ButtonEditPrefix } ${ mockSpeakers [ 0 ] . id } ` ,
67- } ) ;
68- await renderer . act ( ( ) => {
69- editButton . props . onClick ( ) ;
70- } ) ;
71-
72- // Submit the current name with extra whitespace
73- const mockEvent = {
74- preventDefault : jest . fn ( ) ,
75- target : { value : `\t\t${ mockSpeakers [ 0 ] . name } ` } ,
76- } ;
77- await renderer . act ( ( ) => {
78- testRenderer . root
79- . findByProps ( { id : ProjectSpeakersId . TextFieldEdit } )
80- . props . onChange ( mockEvent ) ;
81- } ) ;
82- await renderer . act ( ( ) => {
83- testRenderer . root
84- . findByProps ( { id : ProjectSpeakersId . ButtonEditConfirm } )
85- . props . onClick ( ) ;
86- } ) ;
55+ const editButton = screen . getByTestId (
56+ `${ ProjectSpeakersId . ButtonEditPrefix } ${ speaker . id } `
57+ ) ;
58+ await userEvent . click ( editButton ) ;
59+
60+ // Add whitespace to the current name
61+ await userEvent . type (
62+ screen . getByTestId ( ProjectSpeakersId . TextFieldEdit ) ,
63+ " "
64+ ) ;
65+ await userEvent . click (
66+ screen . getByTestId ( ProjectSpeakersId . ButtonEditConfirm )
67+ ) ;
8768
8869 // Ensure no name update was submitted
8970 expect ( mockUpdateSpeakerName ) . not . toHaveBeenCalled ( ) ;
9071
9172 // Click the button to edit speaker
92- await renderer . act ( ( ) => {
93- editButton . props . onClick ( ) ;
94- } ) ;
95-
96- // Submit a new name
97- const name = "Mr. Different" ;
98- mockEvent . target . value = name ;
99- await renderer . act ( ( ) => {
100- testRenderer . root
101- . findByProps ( { id : ProjectSpeakersId . TextFieldEdit } )
102- . props . onChange ( mockEvent ) ;
103- } ) ;
104- await renderer . act ( ( ) => {
105- testRenderer . root
106- . findByProps ( { id : ProjectSpeakersId . ButtonEditConfirm } )
107- . props . onClick ( ) ;
108- } ) ;
73+ await userEvent . click ( editButton ) ;
74+
75+ // Add non-whitespace
76+ await userEvent . type (
77+ screen . getByTestId ( ProjectSpeakersId . TextFieldEdit ) ,
78+ "!"
79+ ) ;
80+ await userEvent . click (
81+ screen . getByTestId ( ProjectSpeakersId . ButtonEditConfirm )
82+ ) ;
10983
11084 // Ensure the name update was submitted
111- expect ( mockUpdateSpeakerName . mock . calls [ 0 ] [ 1 ] ) . toEqual ( name ) ;
85+ expect ( mockUpdateSpeakerName . mock . calls [ 0 ] [ 1 ] ) . toEqual ( ` ${ speaker . name } !` ) ;
11286 } ) ;
11387
11488 it ( "trims whitespace when adding a speaker" , async ( ) => {
11589 await renderProjectSpeakersList ( ) ;
11690
11791 // Click the button to add a speaker
118- await renderer . act ( ( ) => {
119- testRenderer . root
120- . findByProps ( { id : ProjectSpeakersId . ButtonAdd } )
121- . props . onClick ( ) ;
122- } ) ;
92+ await userEvent . click ( screen . getByTestId ( ProjectSpeakersId . ButtonAdd ) ) ;
12393
12494 // Submit the name of the speaker with extra whitespace
12595 const name = "Ms. Nym" ;
126- const mockEvent = {
127- preventDefault : jest . fn ( ) ,
128- target : { value : ` ${ name } \t ` } ,
129- } ;
130- await renderer . act ( ( ) => {
131- testRenderer . root
132- . findByProps ( { id : ProjectSpeakersId . TextFieldAdd } )
133- . props . onChange ( mockEvent ) ;
134- } ) ;
135- await renderer . act ( ( ) => {
136- testRenderer . root
137- . findByProps ( { id : ProjectSpeakersId . ButtonAddConfirm } )
138- . props . onClick ( ) ;
139- } ) ;
96+ await userEvent . type (
97+ screen . getByTestId ( ProjectSpeakersId . TextFieldAdd ) ,
98+ ` ${ name } \t `
99+ ) ;
100+ await userEvent . click (
101+ screen . getByTestId ( ProjectSpeakersId . ButtonAddConfirm )
102+ ) ;
140103
141104 // Ensure new speaker was submitted with trimmed name
142105 expect ( mockCreateSpeaker . mock . calls [ 0 ] [ 0 ] ) . toEqual ( name ) ;
0 commit comments