diff --git a/libs/ngrx-toolkit/src/lib/mutation/http-mutation.spec.ts b/libs/ngrx-toolkit/src/lib/mutation/http-mutation.spec.ts index 58116002..6bd7981a 100644 --- a/libs/ngrx-toolkit/src/lib/mutation/http-mutation.spec.ts +++ b/libs/ngrx-toolkit/src/lib/mutation/http-mutation.spec.ts @@ -470,4 +470,28 @@ describe('httpMutation', () => { }) satisfies HttpMutation; }); }); + + it('should support non-json responseType such as blob', () => { + const downloadFile = TestBed.runInInjectionContext(() => + httpMutation({ + request: (fileId) => ({ + url: `/api/files/${fileId}`, + method: 'GET', + responseType: 'blob', + }), + }), + ); + + downloadFile('report-1'); + + const req = httpTestingController.expectOne('/api/files/report-1'); + expect(req.request.method).toBe('GET'); + expect(req.request.responseType).toBe('blob'); + + const mockBlob = new Blob(['file-contents'], { type: 'text/plain' }); + req.flush(mockBlob); + + expect(downloadFile.status()).toBe('success'); + expect(downloadFile.value()).toEqual(mockBlob); + }); }); diff --git a/libs/ngrx-toolkit/src/lib/mutation/http-mutation.ts b/libs/ngrx-toolkit/src/lib/mutation/http-mutation.ts index 37ff9989..ddbd1ad9 100644 --- a/libs/ngrx-toolkit/src/lib/mutation/http-mutation.ts +++ b/libs/ngrx-toolkit/src/lib/mutation/http-mutation.ts @@ -5,6 +5,7 @@ import { HttpHeaders, HttpParams, HttpProgressEvent, + HttpRequest, HttpResponse, } from '@angular/common/http'; import { inject, Signal, signal } from '@angular/core'; @@ -21,6 +22,7 @@ export type HttpMutationRequest = { headers?: HttpHeaders | Record; context?: HttpContext; reportProgress?: boolean; + responseType?: HttpRequest['responseType']; params?: | HttpParams | Record< @@ -139,10 +141,10 @@ export function httpMutation( statusCode.set(undefined); return httpClient - .request(httpRequest.method, httpRequest.url, { + .request(httpRequest.method, httpRequest.url, { ...httpRequest, observe: 'events', - responseType: 'json', + responseType: httpRequest.responseType ?? 'json', }) .pipe( tap((response) => {