From 5a38f95a076451c2369f8b9b927cd0e81e6646bc Mon Sep 17 00:00:00 2001 From: Rinat Date: Fri, 5 Apr 2024 12:09:13 +0300 Subject: [PATCH 1/2] resolve #465 update query on mutation success shorthand --- packages/core/src/update/update.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/core/src/update/update.ts b/packages/core/src/update/update.ts index 6cb50c48..c1bfbd85 100644 --- a/packages/core/src/update/update.ts +++ b/packages/core/src/update/update.ts @@ -49,7 +49,7 @@ export function update< Q extends Query, M extends Mutation, BySuccessSource = void, - ByFailureSource = void, + ByFailureSource = void >( query: Q, { @@ -57,7 +57,7 @@ export function update< by: rules, }: { on: M; - by: { + by?: { success: DynamicallySourcedField< { query: QueryState; @@ -94,12 +94,14 @@ export function update< refetch?: Refetch; }>(); + const success = rules?.success || (() => ({ error: null, refetch: true })); + split({ source: sample({ clock: mutation.finished.success, source: { partialRule: normalizeSourced({ - field: rules.success, + field: success, }), queryState: $queryState, }, @@ -115,7 +117,7 @@ export function update< cases: { fillData: fillQueryData, __: fillQueryError }, }); - if (rules.failure) { + if (rules?.failure) { split({ source: sample({ clock: mutation.finished.failure, From 9f47d07c33b7877efbd29c73dca50152ce37eb67 Mon Sep 17 00:00:00 2001 From: Rinat Date: Fri, 5 Apr 2024 14:05:06 +0300 Subject: [PATCH 2/2] #465 | unit-test for update query on mutation shorthand --- .../core/src/update/__tests__/update.test.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/packages/core/src/update/__tests__/update.test.ts b/packages/core/src/update/__tests__/update.test.ts index acdef2e2..1b578d41 100644 --- a/packages/core/src/update/__tests__/update.test.ts +++ b/packages/core/src/update/__tests__/update.test.ts @@ -117,6 +117,35 @@ describe('update', () => { expect(listeners.onStart).toBeCalledTimes(1); // only original call }); + test('refetch true causes query to be refetched with latest params shorthand', async () => { + const query = createQuery({ + handler: vi.fn().mockImplementation((params: number) => setTimeout(100).then(() => params.toString())), + initialData: 'initial', + }); + + const mutation = createMutation({ handler: vi.fn().mockResolvedValue('from mutation') }); + + update(query, { on: mutation }); + + const scope = fork(); + const { listeners } = watchRemoteOperation(query, scope); + + await allSettled(query.start, { scope, params: 1 }); + await allSettled(query.start, { scope, params: 2 }); + + allSettled(mutation.start, { scope }); // Do not wait + await setTimeout(1); // Async nature of mutations + expect(scope.getState(query.$data)).toEqual('initial'); + expect(scope.getState(query.$stale)).toBeTruthy(); + + await allSettled(scope); + expect(scope.getState(query.$data)).toEqual('2'); + + expect(listeners.onStart).toBeCalledTimes(3); // 2 original and 1 by refetch + expect(listeners.onStart).toHaveBeenNthCalledWith(3, 2); // refetch uses latest params + expect(scope.getState(query.$stale)).toBeFalsy(); + }); + test('refetch true causes query to be refetched with latest params', async () => { const query = createQuery({ handler: vi