@@ -1117,7 +1117,7 @@ describe('Tanstack Query React Hooks V5 Test', () => {
1117
1117
} ) ;
1118
1118
} ) ;
1119
1119
1120
- it ( 'optimistic delete' , async ( ) => {
1120
+ it ( 'optimistic delete simple ' , async ( ) => {
1121
1121
const { queryClient, wrapper } = createWrapper ( ) ;
1122
1122
1123
1123
const data : any [ ] = [ { id : '1' , name : 'foo' } ] ;
@@ -1168,6 +1168,122 @@ describe('Tanstack Query React Hooks V5 Test', () => {
1168
1168
} ) ;
1169
1169
} ) ;
1170
1170
1171
+ it ( 'optimistic delete nested query' , async ( ) => {
1172
+ const { queryClient, wrapper } = createWrapper ( ) ;
1173
+
1174
+ const data : any = { id : '1' , name : 'foo' , posts : [ { id : 'p1' , title : 'post1' } ] } ;
1175
+
1176
+ nock ( makeUrl ( 'User' , 'findFirst' ) )
1177
+ . get ( / .* / )
1178
+ . reply ( 200 , ( ) => {
1179
+ console . log ( 'Querying data:' , JSON . stringify ( data ) ) ;
1180
+ return { data } ;
1181
+ } )
1182
+ . persist ( ) ;
1183
+
1184
+ const { result } = renderHook (
1185
+ ( ) =>
1186
+ useModelQuery (
1187
+ 'User' ,
1188
+ makeUrl ( 'User' , 'findFirst' ) ,
1189
+ { include : { posts : true } } ,
1190
+ { optimisticUpdate : true }
1191
+ ) ,
1192
+ {
1193
+ wrapper,
1194
+ }
1195
+ ) ;
1196
+ await waitFor ( ( ) => {
1197
+ expect ( result . current . data ) . toMatchObject ( { id : '1' } ) ;
1198
+ } ) ;
1199
+
1200
+ nock ( makeUrl ( 'Post' , 'delete' ) )
1201
+ . delete ( / .* / )
1202
+ . reply ( 200 , ( ) => {
1203
+ console . log ( 'Not mutating data' ) ;
1204
+ return { data } ;
1205
+ } ) ;
1206
+
1207
+ const { result : mutationResult } = renderHook (
1208
+ ( ) =>
1209
+ useModelMutation ( 'Post' , 'DELETE' , makeUrl ( 'Post' , 'delete' ) , modelMeta , {
1210
+ optimisticUpdate : true ,
1211
+ invalidateQueries : false ,
1212
+ } ) ,
1213
+ {
1214
+ wrapper,
1215
+ }
1216
+ ) ;
1217
+
1218
+ act ( ( ) => mutationResult . current . mutate ( { where : { id : 'p1' } } ) ) ;
1219
+
1220
+ await waitFor ( ( ) => {
1221
+ const cacheData : any = queryClient . getQueryData (
1222
+ getQueryKey (
1223
+ 'User' ,
1224
+ 'findFirst' ,
1225
+ { include : { posts : true } } ,
1226
+ { infinite : false , optimisticUpdate : true }
1227
+ )
1228
+ ) ;
1229
+ expect ( cacheData . posts ) . toHaveLength ( 0 ) ;
1230
+ } ) ;
1231
+ } ) ;
1232
+
1233
+ it ( 'optimistic nested delete update query' , async ( ) => {
1234
+ const { queryClient, wrapper } = createWrapper ( ) ;
1235
+
1236
+ const data : any = [
1237
+ { id : 'p1' , title : 'post1' } ,
1238
+ { id : 'p2' , title : 'post2' } ,
1239
+ ] ;
1240
+
1241
+ nock ( makeUrl ( 'Post' , 'findMany' ) )
1242
+ . get ( / .* / )
1243
+ . reply ( 200 , ( ) => {
1244
+ console . log ( 'Querying data:' , JSON . stringify ( data ) ) ;
1245
+ return { data } ;
1246
+ } )
1247
+ . persist ( ) ;
1248
+
1249
+ const { result } = renderHook (
1250
+ ( ) => useModelQuery ( 'Post' , makeUrl ( 'Post' , 'findMany' ) , undefined , { optimisticUpdate : true } ) ,
1251
+ {
1252
+ wrapper,
1253
+ }
1254
+ ) ;
1255
+ await waitFor ( ( ) => {
1256
+ expect ( result . current . data ) . toHaveLength ( 2 ) ;
1257
+ } ) ;
1258
+
1259
+ nock ( makeUrl ( 'User' , 'update' ) )
1260
+ . delete ( / .* / )
1261
+ . reply ( 200 , ( ) => {
1262
+ console . log ( 'Not mutating data' ) ;
1263
+ return { data } ;
1264
+ } ) ;
1265
+
1266
+ const { result : mutationResult } = renderHook (
1267
+ ( ) =>
1268
+ useModelMutation ( 'User' , 'PUT' , makeUrl ( 'User' , 'update' ) , modelMeta , {
1269
+ optimisticUpdate : true ,
1270
+ invalidateQueries : false ,
1271
+ } ) ,
1272
+ {
1273
+ wrapper,
1274
+ }
1275
+ ) ;
1276
+
1277
+ act ( ( ) => mutationResult . current . mutate ( { where : { id : '1' } , data : { posts : { delete : { id : 'p1' } } } } ) ) ;
1278
+
1279
+ await waitFor ( ( ) => {
1280
+ const cacheData : any = queryClient . getQueryData (
1281
+ getQueryKey ( 'Post' , 'findMany' , undefined , { infinite : false , optimisticUpdate : true } )
1282
+ ) ;
1283
+ expect ( cacheData ) . toHaveLength ( 1 ) ;
1284
+ } ) ;
1285
+ } ) ;
1286
+
1171
1287
it ( 'top-level mutation and nested-read invalidation' , async ( ) => {
1172
1288
const { queryClient, wrapper } = createWrapper ( ) ;
1173
1289
0 commit comments