diff --git a/packages/core/src/resource/resource.ts b/packages/core/src/resource/resource.ts index d668de30004..b81b93e8160 100644 --- a/packages/core/src/resource/resource.ts +++ b/packages/core/src/resource/resource.ts @@ -115,8 +115,9 @@ abstract class BaseWritableResource implements WritableResource { * Put the resource into the error state. */ protected setErrorState(err: unknown): void { - this.status.set(ResourceStatus.Error); this.value.set(undefined); + // The previous line will set the status to `Local`, so we need to update it. + this.status.set(ResourceStatus.Error); this.error.set(err); } diff --git a/packages/core/test/resource/resource_spec.ts b/packages/core/test/resource/resource_spec.ts index d8b051dbe19..cb759a8e6c4 100644 --- a/packages/core/test/resource/resource_spec.ts +++ b/packages/core/test/resource/resource_spec.ts @@ -128,10 +128,45 @@ describe('resource', () => { expect(echoResource.status()).toBe(ResourceStatus.Error); expect(echoResource.isLoading()).toBeFalse(); + expect(echoResource.hasValue()).toBeFalse(); expect(echoResource.value()).toEqual(undefined); expect(echoResource.error()).toBe('Something went wrong....'); }); + it('should expose errors on reload', async () => { + const backend = new MockEchoBackend(); + const counter = signal(0); + const echoResource = resource({ + request: () => ({counter: counter()}), + loader: (params) => { + if (params.request.counter % 2 === 0) { + return Promise.resolve('ok'); + } else { + throw new Error('KO'); + } + }, + injector: TestBed.inject(Injector), + }); + + TestBed.flushEffects(); + await backend.flush(); + + expect(echoResource.status()).toBe(ResourceStatus.Resolved); + expect(echoResource.isLoading()).toBeFalse(); + expect(echoResource.hasValue()).toBeTrue(); + expect(echoResource.value()).toEqual('ok'); + expect(echoResource.error()).toBe(undefined); + + counter.update((value) => value + 1); + TestBed.flushEffects(); + + expect(echoResource.status()).toBe(ResourceStatus.Error); + expect(echoResource.isLoading()).toBeFalse(); + expect(echoResource.hasValue()).toBeFalse(); + expect(echoResource.value()).toEqual(undefined); + expect(echoResource.error()).toEqual(Error('KO')); + }); + it('should _not_ load if the request resolves to undefined', () => { const counter = signal(0); const backend = new MockEchoBackend();