@@ -4,35 +4,32 @@ import { MockProvider } from 'ng-mocks';
44import { of } from 'rxjs' ;
55
66import { HttpRequest } from '@angular/common/http' ;
7- import { runInInjectionContext } from '@angular/core' ;
7+ import { PLATFORM_ID , runInInjectionContext } from '@angular/core' ;
88import { TestBed } from '@angular/core/testing' ;
99
10+ import { ENVIRONMENT } from '@core/provider/environment.provider' ;
11+ import { EnvironmentModel } from '@osf/shared/models/environment.model' ;
12+
1013import { authInterceptor } from './auth.interceptor' ;
1114
1215describe ( 'authInterceptor' , ( ) => {
1316 let cookieService : CookieService ;
1417 let mockHandler : jest . Mock ;
1518
16- beforeEach ( ( ) => {
17- mockHandler = jest . fn ( ) ;
18-
19+ const setup = ( platformId = 'browser' , environmentOverrides : Partial < EnvironmentModel > = { } ) => {
1920 TestBed . configureTestingModule ( {
2021 providers : [
21- MockProvider ( CookieService , {
22- get : jest . fn ( ) ,
23- } ) ,
24- {
25- provide : 'PLATFORM_ID' ,
26- useValue : 'browser' ,
27- } ,
28- {
29- provide : 'REQUEST' ,
30- useValue : null ,
31- } ,
22+ MockProvider ( CookieService , { get : jest . fn ( ) } ) ,
23+ MockProvider ( PLATFORM_ID , platformId ) ,
24+ MockProvider ( ENVIRONMENT , { throttleToken : '' , ...environmentOverrides } as EnvironmentModel ) ,
3225 ] ,
3326 } ) ;
3427
3528 cookieService = TestBed . inject ( CookieService ) ;
29+ } ;
30+
31+ beforeEach ( ( ) => {
32+ mockHandler = jest . fn ( ) ;
3633 jest . clearAllMocks ( ) ;
3734 } ) ;
3835
@@ -49,6 +46,7 @@ describe('authInterceptor', () => {
4946 } ;
5047
5148 it ( 'should skip CrossRef funders API requests' , ( ) => {
49+ setup ( ) ;
5250 const request = createRequest ( '/api.crossref.org/funders/10.13039/100000001' ) ;
5351 const handler = createHandler ( ) ;
5452
@@ -60,6 +58,7 @@ describe('authInterceptor', () => {
6058 } ) ;
6159
6260 it ( 'should set Accept header to */* for text response type' , ( ) => {
61+ setup ( ) ;
6362 const request = createRequest ( '/api/v2/projects/' , { responseType : 'text' } ) ;
6463 const handler = createHandler ( ) ;
6564
@@ -71,6 +70,7 @@ describe('authInterceptor', () => {
7170 } ) ;
7271
7372 it ( 'should set Accept header to API version for json response type' , ( ) => {
73+ setup ( ) ;
7474 const request = createRequest ( '/api/v2/projects/' , { responseType : 'json' } ) ;
7575 const handler = createHandler ( ) ;
7676
@@ -82,6 +82,7 @@ describe('authInterceptor', () => {
8282 } ) ;
8383
8484 it ( 'should set Content-Type header when not present' , ( ) => {
85+ setup ( ) ;
8586 const request = createRequest ( '/api/v2/projects/' ) ;
8687 const handler = createHandler ( ) ;
8788
@@ -93,6 +94,7 @@ describe('authInterceptor', () => {
9394 } ) ;
9495
9596 it ( 'should not override existing Content-Type header' , ( ) => {
97+ setup ( ) ;
9698 const request = createRequest ( '/api/v2/projects/' ) ;
9799 const requestWithHeaders = request . clone ( {
98100 setHeaders : { 'Content-Type' : 'application/json' } ,
@@ -107,6 +109,7 @@ describe('authInterceptor', () => {
107109 } ) ;
108110
109111 it ( 'should add CSRF token and withCredentials in browser platform' , ( ) => {
112+ setup ( ) ;
110113 jest . spyOn ( cookieService , 'get' ) . mockReturnValue ( 'csrf-token-123' ) ;
111114
112115 const request = createRequest ( '/api/v2/projects/' ) ;
@@ -122,6 +125,7 @@ describe('authInterceptor', () => {
122125 } ) ;
123126
124127 it ( 'should not add CSRF token when not available in browser platform' , ( ) => {
128+ setup ( ) ;
125129 jest . spyOn ( cookieService , 'get' ) . mockReturnValue ( '' ) ;
126130
127131 const request = createRequest ( '/api/v2/projects/' ) ;
@@ -135,4 +139,37 @@ describe('authInterceptor', () => {
135139 expect ( modifiedRequest . headers . has ( 'X-CSRFToken' ) ) . toBe ( false ) ;
136140 expect ( modifiedRequest . withCredentials ) . toBe ( true ) ;
137141 } ) ;
142+
143+ it ( 'should not add X-Throttle-Token on browser platform' , ( ) => {
144+ setup ( 'browser' , { throttleToken : 'test-token' } ) ;
145+ const request = createRequest ( '/api/v2/projects/' ) ;
146+ const handler = createHandler ( ) ;
147+
148+ runInInjectionContext ( TestBed , ( ) => authInterceptor ( request , handler ) ) ;
149+
150+ const modifiedRequest = handler . mock . calls [ 0 ] [ 0 ] ;
151+ expect ( modifiedRequest . headers . has ( 'X-Throttle-Token' ) ) . toBe ( false ) ;
152+ } ) ;
153+
154+ it ( 'should add X-Throttle-Token on server platform when token is present' , ( ) => {
155+ setup ( 'server' , { throttleToken : 'test-token' } ) ;
156+ const request = createRequest ( '/api/v2/projects/' ) ;
157+ const handler = createHandler ( ) ;
158+
159+ runInInjectionContext ( TestBed , ( ) => authInterceptor ( request , handler ) ) ;
160+
161+ const modifiedRequest = handler . mock . calls [ 0 ] [ 0 ] ;
162+ expect ( modifiedRequest . headers . get ( 'X-Throttle-Token' ) ) . toBe ( 'test-token' ) ;
163+ } ) ;
164+
165+ it ( 'should not add X-Throttle-Token on server platform when token is empty' , ( ) => {
166+ setup ( 'server' , { throttleToken : '' } ) ;
167+ const request = createRequest ( '/api/v2/projects/' ) ;
168+ const handler = createHandler ( ) ;
169+
170+ runInInjectionContext ( TestBed , ( ) => authInterceptor ( request , handler ) ) ;
171+
172+ const modifiedRequest = handler . mock . calls [ 0 ] [ 0 ] ;
173+ expect ( modifiedRequest . headers . has ( 'X-Throttle-Token' ) ) . toBe ( false ) ;
174+ } ) ;
138175} ) ;
0 commit comments