@@ -5,7 +5,8 @@ import type { IRefineOptions, HttpError } from "@refinedev/core";
55import * as Core from "@refinedev/core" ;
66import { MockJSONServer , TestWrapper , act , render , waitFor } from "../../test" ;
77import { Route , Routes } from "react-router" ;
8- import { Controller } from "react-hook-form" ;
8+ import { Controller , useFieldArray } from "react-hook-form" ;
9+ import { screen } from "@testing-library/react" ;
910
1011interface IPost {
1112 title : string ;
@@ -329,4 +330,56 @@ describe("useForm hook", () => {
329330 useFormCoreSpy . mockRestore ( ) ;
330331 }
331332 } ) ;
333+
334+ it ( "should populate useFieldArray fields that mount after initial query data sync" , async ( ) => {
335+ const queryData = {
336+ data : {
337+ data : { id : "1" , tags : [ { value : "react" } , { value : "refine" } ] } ,
338+ } ,
339+ } ;
340+
341+ const useFormCoreSpy = vi . spyOn ( Core , "useForm" ) . mockReturnValue ( {
342+ query : queryData ,
343+ onFinish : vi . fn ( ) . mockResolvedValue ( { } ) ,
344+ onFinishAutoSave : vi . fn ( ) . mockResolvedValue ( { } ) ,
345+ formLoading : true , // cached data available immediately; formLoading driven by EditPage prop
346+ } ) ;
347+
348+ const FieldArrayChild = ( { control } : { control : any } ) => {
349+ const { fields } = useFieldArray ( { control, name : "tags" } ) ;
350+ return (
351+ < ul >
352+ { fields . map ( ( field ) => (
353+ < li key = { field . id } data-testid = "tag-item" />
354+ ) ) }
355+ </ ul >
356+ ) ;
357+ } ;
358+
359+ const EditPage = ( { formLoading } : { formLoading : boolean } ) => {
360+ const { control } = useForm < IPost , HttpError , IPost > ( {
361+ refineCoreProps : { resource : "posts" , action : "edit" , id : "1" }
362+ } ) ;
363+ if ( formLoading ) return < p > loading</ p > ;
364+ return < FieldArrayChild control = { control } /> ;
365+ } ;
366+
367+ try {
368+ const page = ( formLoading : boolean ) => (
369+ < Routes >
370+ < Route path = "/" element = { < EditPage formLoading = { formLoading } /> } />
371+ </ Routes >
372+ ) ;
373+
374+ const { rerender } = render ( page ( true ) , { wrapper : TestWrapper ( { } ) } ) ;
375+
376+ await act ( async ( ) => rerender ( page ( false ) ) ) ;
377+
378+ await waitFor ( ( ) =>
379+ expect ( screen . getAllByTestId ( "tag-item" ) ) . toHaveLength ( 2 ) ,
380+ ) ;
381+ } finally {
382+ useFormCoreSpy . mockRestore ( ) ;
383+ }
384+ } ) ;
332385} ) ;
0 commit comments