@@ -3,31 +3,95 @@ import userEvent from '@testing-library/user-event';
33import SpecifyLearnerField from './SpecifyLearnerField' ;
44import messages from './messages' ;
55import { renderWithIntl } from '@src/testUtils' ;
6+ import { useCourseInfo , useLearner } from '@src/data/apiHook' ;
7+
8+ jest . mock ( '@src/data/apiHook' , ( ) => ( {
9+ useCourseInfo : jest . fn ( ) ,
10+ useLearner : jest . fn ( ) ,
11+ } ) ) ;
12+
13+ const mockLearnerData = {
14+ username : 'testuser' ,
15+ fullName : 'Test User' ,
16+ email : 'test@email.com' ,
17+ } ;
618
719describe ( 'SpecifyLearnerField' , ( ) => {
8- it ( 'renders label and input' , ( ) => {
9- renderWithIntl ( < SpecifyLearnerField onChange = { jest . fn ( ) } /> ) ;
10- expect ( screen . getByText ( messages . specifyLearner . defaultMessage ) ) . toBeInTheDocument ( ) ;
11- expect ( screen . getByPlaceholderText ( messages . specifyLearnerPlaceholder . defaultMessage ) ) . toBeInTheDocument ( ) ;
12- } ) ;
20+ describe ( 'when learner is found' , ( ) => {
21+ beforeEach ( ( ) => {
22+ jest . resetAllMocks ( ) ;
23+ ( useCourseInfo as jest . Mock ) . mockReturnValue ( { data : { permissions : { admin : true , dataResearcher : false } } } ) ;
24+ ( useLearner as jest . Mock ) . mockReturnValue ( {
25+ data : mockLearnerData ,
26+ refetch : jest . fn ( ) ,
27+ error : null ,
28+ } ) ;
29+ } ) ;
30+ it ( 'renders label and input' , ( ) => {
31+ renderWithIntl ( < SpecifyLearnerField onClickSelect = { jest . fn ( ) } /> ) ;
32+ expect ( screen . getByText ( messages . specifyLearner . defaultMessage ) ) . toBeInTheDocument ( ) ;
33+ expect ( screen . getByPlaceholderText ( messages . specifyLearnerPlaceholder . defaultMessage ) ) . toBeInTheDocument ( ) ;
34+ } ) ;
1335
14- it ( 'renders select button' , ( ) => {
15- renderWithIntl ( < SpecifyLearnerField onChange = { jest . fn ( ) } /> ) ;
16- expect ( screen . getByText ( messages . select . defaultMessage ) ) . toBeInTheDocument ( ) ;
17- } ) ;
36+ it ( 'renders select button' , ( ) => {
37+ renderWithIntl ( < SpecifyLearnerField onClickSelect = { jest . fn ( ) } /> ) ;
38+ expect ( screen . getByText ( messages . select . defaultMessage ) ) . toBeInTheDocument ( ) ;
39+ } ) ;
1840
19- it ( 'calls onChange when input changes' , async ( ) => {
20- const handleChange = jest . fn ( ) ;
21- renderWithIntl ( < SpecifyLearnerField onChange = { handleChange } /> ) ;
22- const input = screen . getByPlaceholderText ( messages . specifyLearnerPlaceholder . defaultMessage ) ;
23- const user = userEvent . setup ( ) ;
24- await user . type ( input , 'testuser' ) ;
25- expect ( handleChange ) . toHaveBeenCalled ( ) ;
41+ it ( 'calls onClickSelect when clicking select' , async ( ) => {
42+ const handleClick = jest . fn ( ) ;
43+ renderWithIntl ( < SpecifyLearnerField onClickSelect = { handleClick } /> ) ;
44+ const input = screen . getByPlaceholderText ( messages . specifyLearnerPlaceholder . defaultMessage ) ;
45+ const user = userEvent . setup ( ) ;
46+ await user . type ( input , mockLearnerData . username ) ;
47+ const button = screen . getByText ( messages . select . defaultMessage ) ;
48+ await user . click ( button ) ;
49+ expect ( handleClick ) . toHaveBeenCalledWith ( mockLearnerData . username ) ;
50+ } ) ;
51+
52+ it ( 'input has correct name attribute' , ( ) => {
53+ renderWithIntl ( < SpecifyLearnerField onClickSelect = { jest . fn ( ) } /> ) ;
54+ const input = screen . getByPlaceholderText ( messages . specifyLearnerPlaceholder . defaultMessage ) ;
55+ expect ( input ) . toHaveAttribute ( 'name' , 'emailOrUsername' ) ;
56+ } ) ;
57+
58+ it ( 'shows learner info and change button after select' , async ( ) => {
59+ const handleClick = jest . fn ( ) ;
60+ renderWithIntl ( < SpecifyLearnerField onClickSelect = { handleClick } /> ) ;
61+ const input = screen . getByPlaceholderText ( messages . specifyLearnerPlaceholder . defaultMessage ) ;
62+ const user = userEvent . setup ( ) ;
63+ await user . type ( input , mockLearnerData . username ) ;
64+ const button = screen . getByText ( messages . select . defaultMessage ) ;
65+ await user . click ( button ) ;
66+ expect ( screen . getByText ( mockLearnerData . username ) ) . toBeInTheDocument ( ) ;
67+ expect ( screen . getByText ( mockLearnerData . fullName ) ) . toBeInTheDocument ( ) ;
68+ expect ( screen . getByText ( mockLearnerData . email ) ) . toBeInTheDocument ( ) ;
69+ expect ( screen . getByRole ( 'button' , { name : messages . change . defaultMessage } ) ) . toBeInTheDocument ( ) ;
70+ } ) ;
2671 } ) ;
2772
28- it ( 'input has correct name attribute' , ( ) => {
29- renderWithIntl ( < SpecifyLearnerField onChange = { jest . fn ( ) } /> ) ;
30- const input = screen . getByPlaceholderText ( messages . specifyLearnerPlaceholder . defaultMessage ) ;
31- expect ( input ) . toHaveAttribute ( 'name' , 'emailOrUsername' ) ;
73+ describe ( 'when learner not found' , ( ) => {
74+ beforeEach ( ( ) => {
75+ jest . resetAllMocks ( ) ;
76+ ( useCourseInfo as jest . Mock ) . mockReturnValue ( { data : { permissions : { admin : true , dataResearcher : false } } } ) ;
77+ ( useLearner as jest . Mock ) . mockReturnValue ( {
78+ data : { } ,
79+ refetch : jest . fn ( ) ,
80+ error : { isAxiosError : true , response : { status : 404 } } ,
81+ } ) ;
82+ } ) ;
83+
84+ it ( 'shows error message if learner not found' , async ( ) => {
85+ renderWithIntl ( < SpecifyLearnerField onClickSelect = { jest . fn ( ) } /> ) ;
86+ const input = screen . getByPlaceholderText ( messages . specifyLearnerPlaceholder . defaultMessage ) ;
87+ const user = userEvent . setup ( ) ;
88+ await user . type ( input , mockLearnerData . username ) ;
89+ const button = screen . getByText ( messages . select . defaultMessage ) ;
90+ await user . click ( button ) ;
91+ const staticPart = messages . learnerNotFound . defaultMessage . split ( ':' ) [ 0 ] ;
92+ expect (
93+ screen . getByText ( new RegExp ( staticPart + ':' ) )
94+ ) . toBeInTheDocument ( ) ;
95+ } ) ;
3296 } ) ;
3397} ) ;
0 commit comments