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' ;
24
35import { useRenderData } from './hooks' ;
46import { FileRenderer } from './index' ;
57
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 */
1013
1114jest . mock ( './hooks' , ( ) => ( {
1215 useRenderData : jest . fn ( ) ,
1316} ) ) ;
1417
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+
1540describe ( 'FileRenderer Component' , ( ) => {
41+ const renderWithIntl = ( component ) => render ( < IntlProvider locale = "en" > { component } </ IntlProvider > ) ;
42+
1643 const props = {
1744 file : {
1845 fileName : 'some_file' ,
@@ -22,7 +49,7 @@ describe('FileRenderer Component', () => {
2249 } ;
2350
2451 const defaultRenderData = {
25- Renderer : ( ) => ' Renderer' ,
52+ Renderer : ( ) => < div data-testid = "renderer" > Renderer content </ div > ,
2653 isLoading : false ,
2754 errorStatus : false ,
2855 error : null ,
@@ -31,32 +58,97 @@ describe('FileRenderer Component', () => {
3158 } ,
3259 } ;
3360
34- it ( 'render default' , ( ) => {
61+ beforeEach ( ( ) => {
62+ jest . clearAllMocks ( ) ;
63+ } ) ;
64+
65+ it ( 'renders default renderer' , ( ) => {
3566 useRenderData . mockReturnValue ( defaultRenderData ) ;
36- const wrapper = shallow ( < FileRenderer { ...props } /> ) ;
37- expect ( wrapper . snapshot ) . toMatchSnapshot ( ) ;
67+ renderWithIntl ( < FileRenderer { ...props } /> ) ;
3868
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 ( ) ;
4275 } ) ;
4376
44- it ( 'render loading banner' , ( ) => {
77+ it ( 'renders loading banner' , ( ) => {
4578 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+ } ) ;
4886
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' ) ;
52142 } ) ;
53143
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 ) ;
58150
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 ( ) ;
61153 } ) ;
62154} ) ;
0 commit comments