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' ) ;
10
11
12
+ // Mock the hooks and components that have complex dependencies
11
13
jest . mock ( './hooks' , ( ) => ( {
12
14
useRenderData : jest . fn ( ) ,
13
15
} ) ) ;
14
16
17
+ jest . mock ( './Banners' , ( ) => ( {
18
+ // eslint-disable-next-line react/prop-types
19
+ ErrorBanner : ( { message } ) => < div data-testid = "error-banner" > { message } </ div > ,
20
+ LoadingBanner : ( ) => < div data-testid = "loading-banner" > Loading...</ div > ,
21
+ } ) ) ;
22
+
23
+ // eslint-disable-next-line react/prop-types
24
+ jest . mock ( './FileCard' , ( ) => ( { children, file, defaultOpen } ) => (
25
+ < div data-testid = "file-card" >
26
+ < div >
27
+ { /* eslint-disable-next-line react/prop-types */ }
28
+ { file . fileName } - { defaultOpen ? 'open' : 'closed' }
29
+ </ div >
30
+ { children }
31
+ </ div >
32
+ ) ) ;
33
+
15
34
describe ( 'FileRenderer Component' , ( ) => {
35
+ const renderWithIntl = ( component ) => render ( < IntlProvider locale = "en" > { component } </ IntlProvider > ) ;
36
+
16
37
const props = {
17
38
file : {
18
39
fileName : 'some_file' ,
@@ -22,7 +43,7 @@ describe('FileRenderer Component', () => {
22
43
} ;
23
44
24
45
const defaultRenderData = {
25
- Renderer : ( ) => ' Renderer' ,
46
+ Renderer : ( ) => < div data-testid = "renderer" > Renderer content </ div > ,
26
47
isLoading : false ,
27
48
errorStatus : false ,
28
49
error : null ,
@@ -31,32 +52,49 @@ describe('FileRenderer Component', () => {
31
52
} ,
32
53
} ;
33
54
34
- it ( 'render default' , ( ) => {
55
+ beforeEach ( ( ) => {
56
+ jest . clearAllMocks ( ) ;
57
+ } ) ;
58
+
59
+ it ( 'renders default renderer' , ( ) => {
35
60
useRenderData . mockReturnValue ( defaultRenderData ) ;
36
- const wrapper = shallow ( < FileRenderer { ...props } /> ) ;
37
- expect ( wrapper . snapshot ) . toMatchSnapshot ( ) ;
61
+ renderWithIntl ( < FileRenderer { ...props } /> ) ;
38
62
39
- expect ( wrapper . instance . findByType ( 'Renderer' ) ) . toHaveLength ( 1 ) ;
40
- expect ( wrapper . instance . findByType ( 'LoadingBanner' ) ) . toHaveLength ( 0 ) ;
41
- expect ( wrapper . instance . findByType ( 'ErrorBanner' ) ) . toHaveLength ( 0 ) ;
63
+ expect ( screen . getByTestId ( 'file-card' ) ) . toBeInTheDocument ( ) ;
64
+ expect ( screen . getByText ( 'some_file - open' ) ) . toBeInTheDocument ( ) ;
65
+ expect ( screen . getByTestId ( 'renderer' ) ) . toBeInTheDocument ( ) ;
66
+ expect ( screen . getByText ( 'Renderer content' ) ) . toBeInTheDocument ( ) ;
67
+ expect ( screen . queryByTestId ( 'loading-banner' ) ) . not . toBeInTheDocument ( ) ;
68
+ expect ( screen . queryByTestId ( 'error-banner' ) ) . not . toBeInTheDocument ( ) ;
42
69
} ) ;
43
70
44
- it ( 'render loading banner' , ( ) => {
71
+ it ( 'renders loading banner' , ( ) => {
45
72
useRenderData . mockReturnValue ( { ...defaultRenderData , isLoading : true } ) ;
46
- const wrapper = shallow ( < FileRenderer { ...props } /> ) ;
47
- expect ( wrapper . snapshot ) . toMatchSnapshot ( ) ;
73
+ renderWithIntl ( < FileRenderer { ...props } /> ) ;
74
+
75
+ expect ( screen . getByTestId ( 'loading-banner' ) ) . toBeInTheDocument ( ) ;
76
+ expect ( screen . getByText ( 'Loading...' ) ) . toBeInTheDocument ( ) ;
77
+ expect ( screen . queryByTestId ( 'error-banner' ) ) . not . toBeInTheDocument ( ) ;
78
+ expect ( screen . queryByTestId ( 'renderer' ) ) . not . toBeInTheDocument ( ) ;
79
+ } ) ;
80
+
81
+ it ( 'renders error banner' , ( ) => {
82
+ useRenderData . mockReturnValue ( {
83
+ errorStatus : true ,
84
+ error : { message : 'some_error' } ,
85
+ } ) ;
86
+ renderWithIntl ( < FileRenderer { ...props } /> ) ;
48
87
49
- expect ( wrapper . instance . findByType ( 'LoadingBanner' ) ) . toHaveLength ( 1 ) ;
50
- expect ( wrapper . instance . findByType ( 'ErrorBanner' ) ) . toHaveLength ( 0 ) ;
51
- expect ( wrapper . instance . findByType ( 'Renderer' ) ) . toHaveLength ( 0 ) ;
88
+ expect ( screen . getByTestId ( 'error-banner' ) ) . toBeInTheDocument ( ) ;
89
+ expect ( screen . getByText ( 'some_error' ) ) . toBeInTheDocument ( ) ;
90
+ expect ( screen . queryByTestId ( 'loading-banner' ) ) . not . toBeInTheDocument ( ) ;
91
+ expect ( screen . queryByTestId ( 'renderer' ) ) . not . toBeInTheDocument ( ) ;
52
92
} ) ;
53
93
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 ( ) ;
94
+ it ( 'passes defaultOpen prop correctly' , ( ) => {
95
+ useRenderData . mockReturnValue ( defaultRenderData ) ;
96
+ renderWithIntl ( < FileRenderer { ...props } defaultOpen = { false } /> ) ;
58
97
59
- expect ( wrapper . instance . findByType ( 'ErrorBanner' ) ) . toHaveLength ( 1 ) ;
60
- expect ( wrapper . instance . findByType ( 'LoadingBanner' ) ) . toHaveLength ( 0 ) ;
98
+ expect ( screen . getByText ( 'some_file - closed' ) ) . toBeInTheDocument ( ) ;
61
99
} ) ;
62
100
} ) ;
0 commit comments