diff --git a/projects/kit/offline/src/lib/offline.interceptor.spec.ts b/projects/kit/offline/src/lib/offline.interceptor.spec.ts index 2d1343c..f726997 100644 --- a/projects/kit/offline/src/lib/offline.interceptor.spec.ts +++ b/projects/kit/offline/src/lib/offline.interceptor.spec.ts @@ -1,4 +1,4 @@ -import { HttpContext, HttpErrorResponse, HttpRequest, HttpResponse } from '@angular/common/http'; +import { HttpContext, HttpErrorResponse, HttpHeaders, HttpRequest, HttpResponse } from '@angular/common/http'; import { TestBed } from '@angular/core/testing'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { firstValueFrom, of, throwError } from 'rxjs'; @@ -40,6 +40,20 @@ describe('offlineInterceptor', () => { expect(markApiSuccess).toHaveBeenCalledOnce(); }); + it('inner interceptorのlocal responseを実API成功として扱わない', async () => { + resolve.mockReturnValue({ kind: 'read', readLocal: vi.fn() }); + const response = new HttpResponse({ + body: { userId: 1 }, + status: 200, + headers: new HttpHeaders().set(OFFLINE_RESPONSE_HEADER, 'local'), + }); + + await expect(firstValueFrom(run(new HttpRequest('GET', '/bootstrap'), () => of(response)))).resolves.toBe(response); + + expect(markApiSuccess).not.toHaveBeenCalled(); + expect(markApiFailure).toHaveBeenCalledOnce(); + }); + it('status=0だけlocal replica responseへfallbackする', async () => { const local = new HttpResponse({ body: { dataFrom: 'api' }, status: 200 }); const readLocal = vi.fn(async () => local); diff --git a/projects/kit/offline/src/lib/offline.interceptor.ts b/projects/kit/offline/src/lib/offline.interceptor.ts index ae95a9c..46d1c64 100644 --- a/projects/kit/offline/src/lib/offline.interceptor.ts +++ b/projects/kit/offline/src/lib/offline.interceptor.ts @@ -23,7 +23,12 @@ function observeTransport(source: Observable>, network: Offli return source.pipe( tap({ next: (event) => { - if (event instanceof AngularHttpResponse) network.markApiSuccess(); + if (!(event instanceof AngularHttpResponse)) return; + if (event.headers.get(OFFLINE_RESPONSE_HEADER) === 'local') { + network.markApiFailure(); + return; + } + network.markApiSuccess(); }, error: (error: unknown) => { if (isOfflineFallbackError(error)) network.markApiFailure();