Skip to content

Commit c3c49dc

Browse files
committed
test: http-loader: added tests that check if interceptor is used or not
1 parent 3b36c1c commit c3c49dc

File tree

4 files changed

+117
-34
lines changed

4 files changed

+117
-34
lines changed

projects/http-loader/src/lib/http-loader-backend.spec.ts

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
import {HttpBackend, HttpClient, provideHttpClient} from "@angular/common/http";
1+
import {
2+
HTTP_INTERCEPTORS,
3+
HttpBackend,
4+
HttpClient,
5+
provideHttpClient,
6+
withInterceptorsFromDi
7+
} from "@angular/common/http";
28
import {HttpTestingController, provideHttpClientTesting} from "@angular/common/http/testing";
39
import {TestBed} from "@angular/core/testing";
410
import {TranslateLoader, provideTranslateService, TranslateService, Translation} from "@ngx-translate/core";
511
import {TranslateHttpLoader} from "../public-api";
12+
import {MarkerInterceptor} from "../test-helper/marker-interceptor";
613

714
describe('TranslateLoader (HttpBackend)', () => {
815
let translate: TranslateService;
@@ -11,34 +18,38 @@ describe('TranslateLoader (HttpBackend)', () => {
1118
beforeEach(() => {
1219
TestBed.configureTestingModule({
1320
providers: [
14-
TranslateService,
15-
provideHttpClient(),
21+
MarkerInterceptor,
22+
{
23+
provide: HTTP_INTERCEPTORS,
24+
useExisting: MarkerInterceptor,
25+
multi: true
26+
},
27+
provideHttpClient(
28+
withInterceptorsFromDi()
29+
),
1630
provideHttpClientTesting(),
17-
/*
18-
provideTranslateService({
19-
loader: {
20-
provide: TranslateLoader,
21-
useFactory: (httpClient: HttpClient) => new TranslateHttpLoader(httpClient),
22-
deps: [HttpClient]
23-
}
24-
}
25-
)
26-
*/
31+
TranslateService,
2732
provideTranslateService({
28-
loader: {
29-
provide: TranslateLoader,
30-
useFactory: (backend: HttpBackend) => TranslateHttpLoader.withHttpBackend(backend),
31-
deps: [HttpBackend]
32-
}
33+
loader: {
34+
provide: TranslateLoader,
35+
useFactory: (httpBackend: HttpBackend) =>
36+
TranslateHttpLoader.withHttpBackend(httpBackend, '/assets/i18n/', '.json'),
37+
deps: [HttpBackend],
3338
}
34-
)
35-
39+
}),
3640
]
3741
});
42+
3843
translate = TestBed.inject(TranslateService);
3944
http = TestBed.inject(HttpTestingController);
4045
});
4146

47+
48+
afterEach(() => {
49+
http.verify();
50+
});
51+
52+
4253
it('should be able to provide TranslateHttpLoader', () => {
4354
expect(TranslateHttpLoader).toBeDefined();
4455
expect(translate.currentLoader).toBeDefined();
@@ -65,6 +76,15 @@ describe('TranslateLoader (HttpBackend)', () => {
6576
});
6677
});
6778

79+
it('should trigger MarkerInterceptor when loading translations', () => {
80+
translate.use('en').subscribe();
81+
82+
const req = http.expectOne('/assets/i18n/en.json');
83+
req.flush({ HELLO: 'Hello' });
84+
85+
expect(req.request.headers.get('X-Test-Header')).toBeNull()
86+
});
87+
6888
it('should be able to reload a lang', () => {
6989
translate.use('en');
7090

@@ -95,7 +115,6 @@ describe('TranslateLoader (HttpBackend)', () => {
95115

96116
// reset the lang as if it was never initiated
97117
translate.resetLang('en');
98-
99118
expect(translate.instant('TEST') as string).toEqual('TEST');
100119

101120
// use set timeout because no request is really made and we need to trigger zone to resolve the observable

projects/http-loader/src/lib/http-loader.spec.ts

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
1-
import {HttpClient, provideHttpClient} from "@angular/common/http";
1+
import {
2+
HTTP_INTERCEPTORS,
3+
HttpBackend,
4+
HttpClient,
5+
provideHttpClient,
6+
withInterceptors,
7+
withInterceptorsFromDi
8+
} from "@angular/common/http";
29
import {HttpTestingController, provideHttpClientTesting} from "@angular/common/http/testing";
310
import {TestBed} from "@angular/core/testing";
411
import {TranslateLoader, provideTranslateService, TranslateService, Translation} from "@ngx-translate/core";
512
import {TranslateHttpLoader} from "../public-api";
13+
import {MarkerInterceptor} from "../test-helper/marker-interceptor";
614

715
describe('TranslateLoader (HttpClient)', () => {
816
let translate: TranslateService;
@@ -11,23 +19,38 @@ describe('TranslateLoader (HttpClient)', () => {
1119
beforeEach(() => {
1220
TestBed.configureTestingModule({
1321
providers: [
14-
TranslateService,
15-
provideHttpClient(),
22+
MarkerInterceptor,
23+
{
24+
provide: HTTP_INTERCEPTORS,
25+
useExisting: MarkerInterceptor,
26+
multi: true
27+
},
28+
provideHttpClient(
29+
withInterceptorsFromDi()
30+
),
1631
provideHttpClientTesting(),
32+
TranslateService,
1733
provideTranslateService({
18-
loader: {
19-
provide: TranslateLoader,
20-
useFactory: (httpClient: HttpClient) => new TranslateHttpLoader(httpClient),
21-
deps: [HttpClient]
22-
}
34+
loader: {
35+
provide: TranslateLoader,
36+
useFactory: (client: HttpClient) =>
37+
new TranslateHttpLoader(client, '/assets/i18n/', '.json'),
38+
deps: [HttpClient],
2339
}
24-
)
40+
}),
2541
]
2642
});
43+
2744
translate = TestBed.inject(TranslateService);
2845
http = TestBed.inject(HttpTestingController);
2946
});
3047

48+
49+
afterEach(() => {
50+
http.verify();
51+
});
52+
53+
3154
it('should be able to provide TranslateHttpLoader', () => {
3255
expect(TranslateHttpLoader).toBeDefined();
3356
expect(translate.currentLoader).toBeDefined();
@@ -54,6 +77,15 @@ describe('TranslateLoader (HttpClient)', () => {
5477
});
5578
});
5679

80+
it('should trigger MarkerInterceptor when loading translations', () => {
81+
translate.use('en').subscribe();
82+
83+
const req = http.expectOne('/assets/i18n/en.json');
84+
req.flush({ HELLO: 'Hello' });
85+
86+
expect(req.request.headers.get('X-Test-Header')).toBe('marker');
87+
});
88+
5789
it('should be able to reload a lang', () => {
5890
translate.use('en');
5991

@@ -100,4 +132,6 @@ describe('TranslateLoader (HttpClient)', () => {
100132
// mock response after the xhr request, otherwise it will be undefined
101133
http.expectOne('/assets/i18n/en.json').flush({"TEST": "This is a test"});
102134
});
135+
136+
103137
});

projects/http-loader/src/lib/http-loader.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,23 @@ import {Observable} from 'rxjs';
66
@Injectable()
77
export class TranslateHttpLoader implements TranslateLoader {
88

9+
static readonly defaultPrefix = "/assets/i18n/";
10+
static readonly defaultSuffix = ".json";
11+
912
constructor(
1013
private http: HttpClient,
11-
@Inject(String) public prefix = "/assets/i18n/",
12-
@Inject(String) public suffix = ".json"
14+
@Inject(String) public prefix = TranslateHttpLoader.defaultPrefix,
15+
@Inject(String) public suffix = TranslateHttpLoader.defaultSuffix
1316
)
1417
{}
1518

16-
public static withHttpBackend(backend: HttpBackend): TranslateHttpLoader {
17-
return new TranslateHttpLoader(new HttpClient(backend));
19+
public static withHttpBackend(
20+
backend: HttpBackend,
21+
prefix: string = TranslateHttpLoader.defaultPrefix,
22+
suffix: string = TranslateHttpLoader.defaultSuffix
23+
): TranslateHttpLoader
24+
{
25+
return new TranslateHttpLoader(new HttpClient(backend), prefix, suffix);
1826
}
1927

2028
/**
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Injectable } from '@angular/core';
2+
import {
3+
HttpEvent, HttpInterceptor, HttpHandler, HttpRequest
4+
} from '@angular/common/http';
5+
import { Observable } from 'rxjs';
6+
7+
@Injectable()
8+
export class MarkerInterceptor implements HttpInterceptor {
9+
triggered = false;
10+
11+
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
12+
this.triggered = true;
13+
14+
const modified = req.clone({
15+
setHeaders: {
16+
'X-Test-Header': 'marker'
17+
}
18+
});
19+
20+
return next.handle(modified);
21+
}
22+
}

0 commit comments

Comments
 (0)