1
- import { shallow } from '@edx/react-unit-test-utils' ;
1
+ import { render , screen } from '@testing-library/react' ;
2
+ import '@testing-library/jest-dom' ;
3
+ import { IntlProvider } from '@edx/frontend-platform/i18n' ;
2
4
3
5
import { useRenderData } from './hooks' ;
4
6
import { FileRenderer } from './index' ;
5
7
6
- jest . mock ( './Banners' , ( ) => ( {
7
- ErrorBanner : ( ) => 'ErrorBanner' ,
8
- LoadingBanner : ( ) => 'LoadingBanner' ,
9
- } ) ) ;
8
+ jest . unmock ( '@openedx/paragon' ) ;
9
+ jest . unmock ( 'react' ) ;
10
+ jest . unmock ( '@edx/frontend-platform/i18n' ) ;
11
+
12
+ /* eslint-disable react/prop-types */
10
13
11
14
jest . mock ( './hooks' , ( ) => ( {
12
15
useRenderData : jest . fn ( ) ,
13
16
} ) ) ;
14
17
18
+ jest . mock ( './Banners' , ( ) => ( {
19
+ ErrorBanner : ( { message, headerMessage, actions } ) => (
20
+ < div data-testid = "error-banner" >
21
+ < div data-testid = "error-header" > { headerMessage } </ div >
22
+ < div data-testid = "error-message" > { message } </ div >
23
+ { actions ?. map ( ( action ) => (
24
+ < span data-testid = { `error-action-${ action . id } ` } > { action . message } </ span >
25
+ ) ) }
26
+ </ div >
27
+ ) ,
28
+ LoadingBanner : ( ) => < div data-testid = "loading-banner" > Loading...</ div > ,
29
+ } ) ) ;
30
+
31
+ jest . mock ( './FileCard' , ( ) => ( { children, file, defaultOpen } ) => (
32
+ < div data-testid = "file-card" >
33
+ < div >
34
+ { file . fileName } - { defaultOpen ? 'open' : 'closed' }
35
+ </ div >
36
+ { children }
37
+ </ div >
38
+ ) ) ;
39
+
15
40
describe ( 'FileRenderer Component' , ( ) => {
41
+ const renderWithIntl = ( component ) => render ( < IntlProvider locale = "en" > { component } </ IntlProvider > ) ;
42
+
16
43
const props = {
17
44
file : {
18
45
fileName : 'some_file' ,
@@ -22,7 +49,7 @@ describe('FileRenderer Component', () => {
22
49
} ;
23
50
24
51
const defaultRenderData = {
25
- Renderer : ( ) => ' Renderer' ,
52
+ Renderer : ( ) => < div data-testid = "renderer" > Renderer content </ div > ,
26
53
isLoading : false ,
27
54
errorStatus : false ,
28
55
error : null ,
@@ -31,32 +58,97 @@ describe('FileRenderer Component', () => {
31
58
} ,
32
59
} ;
33
60
34
- it ( 'render default' , ( ) => {
61
+ beforeEach ( ( ) => {
62
+ jest . clearAllMocks ( ) ;
63
+ } ) ;
64
+
65
+ it ( 'renders default renderer' , ( ) => {
35
66
useRenderData . mockReturnValue ( defaultRenderData ) ;
36
- const wrapper = shallow ( < FileRenderer { ...props } /> ) ;
37
- expect ( wrapper . snapshot ) . toMatchSnapshot ( ) ;
67
+ renderWithIntl ( < FileRenderer { ...props } /> ) ;
38
68
39
- expect ( wrapper . instance . findByType ( 'Renderer' ) ) . toHaveLength ( 1 ) ;
40
- expect ( wrapper . instance . findByType ( 'LoadingBanner' ) ) . toHaveLength ( 0 ) ;
41
- expect ( wrapper . instance . findByType ( 'ErrorBanner' ) ) . toHaveLength ( 0 ) ;
69
+ expect ( screen . getByTestId ( 'file-card' ) ) . toBeInTheDocument ( ) ;
70
+ expect ( screen . getByText ( 'some_file - open' ) ) . toBeInTheDocument ( ) ;
71
+ expect ( screen . getByTestId ( 'renderer' ) ) . toBeInTheDocument ( ) ;
72
+ expect ( screen . getByText ( 'Renderer content' ) ) . toBeInTheDocument ( ) ;
73
+ expect ( screen . queryByTestId ( 'loading-banner' ) ) . not . toBeInTheDocument ( ) ;
74
+ expect ( screen . queryByTestId ( 'error-banner' ) ) . not . toBeInTheDocument ( ) ;
42
75
} ) ;
43
76
44
- it ( 'render loading banner' , ( ) => {
77
+ it ( 'renders loading banner' , ( ) => {
45
78
useRenderData . mockReturnValue ( { ...defaultRenderData , isLoading : true } ) ;
46
- const wrapper = shallow ( < FileRenderer { ...props } /> ) ;
47
- expect ( wrapper . snapshot ) . toMatchSnapshot ( ) ;
79
+ renderWithIntl ( < FileRenderer { ...props } /> ) ;
80
+
81
+ expect ( screen . getByTestId ( 'loading-banner' ) ) . toBeInTheDocument ( ) ;
82
+ expect ( screen . getByText ( 'Loading...' ) ) . toBeInTheDocument ( ) ;
83
+ expect ( screen . queryByTestId ( 'error-banner' ) ) . not . toBeInTheDocument ( ) ;
84
+ expect ( screen . queryByTestId ( 'renderer' ) ) . not . toBeInTheDocument ( ) ;
85
+ } ) ;
48
86
49
- expect ( wrapper . instance . findByType ( 'LoadingBanner' ) ) . toHaveLength ( 1 ) ;
50
- expect ( wrapper . instance . findByType ( 'ErrorBanner' ) ) . toHaveLength ( 0 ) ;
51
- expect ( wrapper . instance . findByType ( 'Renderer' ) ) . toHaveLength ( 0 ) ;
87
+ it ( 'renders error banner' , ( ) => {
88
+ useRenderData . mockReturnValue ( {
89
+ errorStatus : true ,
90
+ error : { message : 'some_error' } ,
91
+ } ) ;
92
+ renderWithIntl ( < FileRenderer { ...props } /> ) ;
93
+
94
+ expect ( screen . getByTestId ( 'error-banner' ) ) . toBeInTheDocument ( ) ;
95
+ expect ( screen . getByText ( 'some_error' ) ) . toBeInTheDocument ( ) ;
96
+ expect ( screen . queryByTestId ( 'loading-banner' ) ) . not . toBeInTheDocument ( ) ;
97
+ expect ( screen . queryByTestId ( 'renderer' ) ) . not . toBeInTheDocument ( ) ;
98
+ } ) ;
99
+
100
+ it ( 'passes defaultOpen prop correctly' , ( ) => {
101
+ useRenderData . mockReturnValue ( defaultRenderData ) ;
102
+ renderWithIntl ( < FileRenderer { ...props } defaultOpen = { false } /> ) ;
103
+
104
+ expect ( screen . getByText ( 'some_file - closed' ) ) . toBeInTheDocument ( ) ;
105
+ } ) ;
106
+
107
+ it ( 'passes rendererProps to Renderer component' , ( ) => {
108
+ const CustomRenderer = jest . fn ( ( ) => < div > Custom Renderer</ div > ) ;
109
+ const customRendererProps = {
110
+ prop1 : 'value1' ,
111
+ prop2 : 'value2' ,
112
+ } ;
113
+ useRenderData . mockReturnValue ( {
114
+ ...defaultRenderData ,
115
+ Renderer : CustomRenderer ,
116
+ rendererProps : customRendererProps ,
117
+ } ) ;
118
+
119
+ renderWithIntl ( < FileRenderer { ...props } /> ) ;
120
+ expect ( CustomRenderer ) . toHaveBeenCalledWith ( customRendererProps , { } ) ;
121
+ } ) ;
122
+
123
+ it ( 'passes all error properties to ErrorBanner' , ( ) => {
124
+ const errorData = {
125
+ headerMessage : 'Error Header' ,
126
+ message : 'Error Message' ,
127
+ actions : [ { id : 'retry' , message : 'Retry' , onClick : jest . fn ( ) } ] ,
128
+ } ;
129
+ useRenderData . mockReturnValue ( {
130
+ errorStatus : true ,
131
+ error : errorData ,
132
+ } ) ;
133
+
134
+ renderWithIntl ( < FileRenderer { ...props } /> ) ;
135
+ expect ( screen . getByTestId ( 'error-header' ) ) . toHaveTextContent (
136
+ 'Error Header' ,
137
+ ) ;
138
+ expect ( screen . getByTestId ( 'error-message' ) ) . toHaveTextContent (
139
+ 'Error Message' ,
140
+ ) ;
141
+ expect ( screen . getByTestId ( 'error-action-retry' ) ) . toHaveTextContent ( 'Retry' ) ;
52
142
} ) ;
53
143
54
- it ( 'render error banner' , ( ) => {
55
- useRenderData . mockReturnValue ( { errorStatus : true , error : { message : 'some_error' } } ) ;
56
- const wrapper = shallow ( < FileRenderer { ...props } /> ) ;
57
- expect ( wrapper . snapshot ) . toMatchSnapshot ( ) ;
144
+ it ( 'handles missing optional file properties' , ( ) => {
145
+ const minimalProps = {
146
+ file : { fileName : 'minimal_file' } ,
147
+ defaultOpen : true ,
148
+ } ;
149
+ useRenderData . mockReturnValue ( defaultRenderData ) ;
58
150
59
- expect ( wrapper . instance . findByType ( 'ErrorBanner' ) ) . toHaveLength ( 1 ) ;
60
- expect ( wrapper . instance . findByType ( 'LoadingBanner ') ) . toHaveLength ( 0 ) ;
151
+ renderWithIntl ( < FileRenderer { ... minimalProps } /> ) ;
152
+ expect ( screen . getByText ( 'minimal_file - open ') ) . toBeInTheDocument ( ) ;
61
153
} ) ;
62
154
} ) ;
0 commit comments