diff --git a/packages/angular-query-experimental/src/__tests__/inject-is-fetching.test.ts b/packages/angular-query-experimental/src/__tests__/inject-is-fetching.test.ts index ad29c381bb..db1f7aeea1 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-is-fetching.test.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-is-fetching.test.ts @@ -60,6 +60,36 @@ describe('injectIsFetching', () => { expect(rendered.getByText('fetching: 0')).toBeInTheDocument() }) + it('should be able to filter by queryKey', async () => { + const key1 = queryKey() + const key2 = queryKey() + + @Component({ + template: `
fetching: {{ isFetching() }}
`, + }) + class Page { + readonly query1 = injectQuery(() => ({ + queryKey: key1, + queryFn: () => sleep(10).then(() => 'test1'), + })) + readonly query2 = injectQuery(() => ({ + queryKey: key2, + queryFn: () => sleep(100).then(() => 'test2'), + })) + readonly isFetching = injectIsFetching({ queryKey: key1 }) + } + + const rendered = await render(Page) + + await vi.advanceTimersByTimeAsync(0) + rendered.fixture.detectChanges() + expect(rendered.getByText('fetching: 1')).toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(11) + rendered.fixture.detectChanges() + expect(rendered.getByText('fetching: 0')).toBeInTheDocument() + }) + describe('injection context', () => { it('should throw NG0203 with descriptive error outside injection context', () => { expect(() => { diff --git a/packages/angular-query-experimental/src/__tests__/inject-is-mutating.test.ts b/packages/angular-query-experimental/src/__tests__/inject-is-mutating.test.ts index 91d3e89afb..66fe678d03 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-is-mutating.test.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-is-mutating.test.ts @@ -62,6 +62,39 @@ describe('injectIsMutating', () => { expect(rendered.getByText('mutating: 0')).toBeInTheDocument() }) + it('should be able to filter by mutationKey', async () => { + const key1 = queryKey() + const key2 = queryKey() + + @Component({ + template: `
mutating: {{ isMutating() }}
`, + }) + class Page { + readonly mutation1 = injectMutation(() => ({ + mutationKey: key1, + mutationFn: () => sleep(10).then(() => 'data1'), + })) + readonly mutation2 = injectMutation(() => ({ + mutationKey: key2, + mutationFn: () => sleep(100).then(() => 'data2'), + })) + readonly isMutating = injectIsMutating({ mutationKey: key1 }) + } + + const rendered = await render(Page) + + rendered.fixture.componentInstance.mutation1.mutate() + rendered.fixture.componentInstance.mutation2.mutate() + + await vi.advanceTimersByTimeAsync(0) + rendered.fixture.detectChanges() + expect(rendered.getByText('mutating: 1')).toBeInTheDocument() + + await vi.advanceTimersByTimeAsync(11) + rendered.fixture.detectChanges() + expect(rendered.getByText('mutating: 0')).toBeInTheDocument() + }) + describe('injection context', () => { it('should throw NG0203 with descriptive error outside injection context', () => { expect(() => { diff --git a/packages/angular-query-experimental/src/__tests__/inject-is-restoring.test.ts b/packages/angular-query-experimental/src/__tests__/inject-is-restoring.test.ts index 0b74019b3a..73659d74a5 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-is-restoring.test.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-is-restoring.test.ts @@ -43,6 +43,26 @@ describe('injectIsRestoring', () => { expect(isRestoring()).toBe(true) }) + it('should reactively reflect changes to the provided signal', () => { + const restoringSignal = signal(true) + + TestBed.configureTestingModule({ + providers: [provideIsRestoring(restoringSignal.asReadonly())], + }) + + const isRestoring = TestBed.runInInjectionContext(() => { + return injectIsRestoring() + }) + + expect(isRestoring()).toBe(true) + + restoringSignal.set(false) + expect(isRestoring()).toBe(false) + + restoringSignal.set(true) + expect(isRestoring()).toBe(true) + }) + it('should be usable outside injection context when passing an injector', () => { const isRestoring = injectIsRestoring({ injector: TestBed.inject(Injector), diff --git a/packages/angular-query-experimental/src/__tests__/inject-mutation.test.ts b/packages/angular-query-experimental/src/__tests__/inject-mutation.test.ts index fd32ee09b8..f0c53602b1 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-mutation.test.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-mutation.test.ts @@ -518,6 +518,21 @@ describe('injectMutation', () => { await expect(() => mutateAsync()).rejects.toThrow(err) }) + it('should resolve mutateAsync with the value returned from mutationFn', async () => { + const key = queryKey() + const { mutateAsync } = TestBed.runInInjectionContext(() => { + return injectMutation(() => ({ + mutationKey: key, + mutationFn: (params: string) => sleep(10).then(() => params), + })) + }) + + const promise = mutateAsync('Mock data') + await vi.advanceTimersByTimeAsync(11) + + await expect(promise).resolves.toBe('Mock data') + }) + describe('injection context', () => { it('should throw NG0203 with descriptive error outside injection context', () => { const key = queryKey() diff --git a/packages/angular-query-experimental/src/__tests__/inject-queries.test.ts b/packages/angular-query-experimental/src/__tests__/inject-queries.test.ts index 2d3560b99b..523bda69f0 100644 --- a/packages/angular-query-experimental/src/__tests__/inject-queries.test.ts +++ b/packages/angular-query-experimental/src/__tests__/inject-queries.test.ts @@ -136,6 +136,50 @@ describe('injectQueries', () => { expect(results.length).toBeGreaterThanOrEqual(2) }) + it('should reflect error state when one of the queries rejects', async () => { + const key1 = queryKey() + const key2 = queryKey() + + @Component({ + template: ` +
+ status1: {{ result()[0].status() }}, error1: + {{ result()[0].error()?.message ?? 'none' }} +
+
+ status2: {{ result()[1].status() }}, data2: + {{ result()[1].data() ?? 'none' }} +
+ `, + }) + class Page { + readonly result = injectQueries(() => ({ + queries: [ + { + queryKey: key1, + queryFn: () => + sleep(10).then(() => Promise.reject(new Error('Some error'))), + retry: false, + }, + { + queryKey: key2, + queryFn: () => sleep(10).then(() => 2), + }, + ], + })) + } + + const rendered = await render(Page) + + await vi.advanceTimersByTimeAsync(11) + rendered.fixture.detectChanges() + + expect( + rendered.getByText('status1: error, error1: Some error'), + ).toBeInTheDocument() + expect(rendered.getByText('status2: success, data2: 2')).toBeInTheDocument() + }) + describe('isRestoring', () => { it('should not fetch for the duration of the restoring period when isRestoring is true', async () => { const key1 = queryKey()