@@ -131,7 +131,8 @@ describe('<ReferenceField />', () => {
131
131
>
132
132
< TextField source = "title" />
133
133
</ ReferenceField >
134
- </ DataProviderContext . Provider >
134
+ </ DataProviderContext . Provider > ,
135
+ { admin : { resources : { posts : { data : { } } } } }
135
136
) ;
136
137
await new Promise ( resolve => setTimeout ( resolve , 10 ) ) ;
137
138
expect ( queryByRole ( 'progressbar' ) ) . toBeNull ( ) ;
@@ -156,7 +157,8 @@ describe('<ReferenceField />', () => {
156
157
>
157
158
< TextField source = "title" />
158
159
</ ReferenceField >
159
- </ DataProviderContext . Provider >
160
+ </ DataProviderContext . Provider > ,
161
+ { admin : { resources : { posts : { data : { } } } } }
160
162
) ;
161
163
await new Promise ( resolve => setTimeout ( resolve , 10 ) ) ;
162
164
expect ( queryByRole ( 'progressbar' ) ) . toBeNull ( ) ;
@@ -176,7 +178,8 @@ describe('<ReferenceField />', () => {
176
178
emptyText = "EMPTY"
177
179
>
178
180
< TextField source = "title" />
179
- </ ReferenceField >
181
+ </ ReferenceField > ,
182
+ { admin : { resources : { posts : { data : { } } } } }
180
183
) ;
181
184
expect ( getByText ( 'EMPTY' ) ) . not . toBeNull ( ) ;
182
185
} ) ;
@@ -260,7 +263,8 @@ describe('<ReferenceField />', () => {
260
263
< TextField source = "title" />
261
264
</ ReferenceField >
262
265
</ MemoryRouter >
263
- </ DataProviderContext . Provider >
266
+ </ DataProviderContext . Provider > ,
267
+ { admin : { resources : { posts : { data : { } } } } }
264
268
) ;
265
269
await waitFor ( ( ) => {
266
270
const action = dispatch . mock . calls [ 0 ] [ 0 ] ;
@@ -286,7 +290,8 @@ describe('<ReferenceField />', () => {
286
290
>
287
291
< TextField source = "title" />
288
292
</ ReferenceField >
289
- </ DataProviderContext . Provider >
293
+ </ DataProviderContext . Provider > ,
294
+ { admin : { resources : { posts : { data : { } } } } }
290
295
) ;
291
296
await waitFor ( ( ) => {
292
297
const ErrorIcon = getByRole ( 'presentation' , { hidden : true } ) ;
@@ -295,6 +300,63 @@ describe('<ReferenceField />', () => {
295
300
} ) ;
296
301
} ) ;
297
302
303
+ it ( 'should throw an error if used without a Resource for the reference' , async ( ) => {
304
+ jest . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } ) ;
305
+ class ErrorBoundary extends React . Component <
306
+ {
307
+ onError ?: (
308
+ error : Error ,
309
+ info : { componentStack : string }
310
+ ) => void ;
311
+ } ,
312
+ { error : Error | null }
313
+ > {
314
+ constructor ( props ) {
315
+ super ( props ) ;
316
+ this . state = { error : null } ;
317
+ }
318
+
319
+ static getDerivedStateFromError ( error ) {
320
+ // Update state so the next render will show the fallback UI.
321
+ return { error } ;
322
+ }
323
+
324
+ componentDidCatch ( error , errorInfo ) {
325
+ // You can also log the error to an error reporting service
326
+ this . props . onError ( error , errorInfo ) ;
327
+ }
328
+
329
+ render ( ) {
330
+ if ( this . state . error ) {
331
+ // You can render any custom fallback UI
332
+ return < h1 > Something went wrong.</ h1 > ;
333
+ }
334
+
335
+ return this . props . children ;
336
+ }
337
+ }
338
+ const onError = jest . fn ( ) ;
339
+ renderWithRedux (
340
+ < ErrorBoundary onError = { onError } >
341
+ < ReferenceField
342
+ record = { { id : 123 } }
343
+ resource = "comments"
344
+ source = "postId"
345
+ reference = "posts"
346
+ basePath = "/comments"
347
+ >
348
+ < TextField source = "title" />
349
+ </ ReferenceField >
350
+ </ ErrorBoundary > ,
351
+ { admin : { resources : { comments : { data : { } } } } }
352
+ ) ;
353
+ await waitFor ( ( ) => {
354
+ expect ( onError . mock . calls [ 0 ] [ 0 ] . message ) . toBe (
355
+ 'You must declare a <Resource name="posts"> in order to use a <ReferenceField reference="posts">'
356
+ ) ;
357
+ } ) ;
358
+ } ) ;
359
+
298
360
describe ( 'ReferenceFieldView' , ( ) => {
299
361
it ( 'should render a link to specified resourceLinkPath' , ( ) => {
300
362
const { container } = render (
0 commit comments