@@ -4,35 +4,33 @@ 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 ;
14- let mockHandler : jest . Mock ;
17+ let cookieServiceMock : { get : jest . Mock } ;
1518
16- beforeEach ( ( ) => {
17- mockHandler = jest . fn ( ) ;
19+ const setup = ( platformId = 'browser' , environmentOverrides : Partial < EnvironmentModel > = { } ) => {
20+ cookieServiceMock = { get : jest . fn ( ) } ;
1821
1922 TestBed . configureTestingModule ( {
2023 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- } ,
24+ MockProvider ( CookieService , cookieServiceMock ) ,
25+ MockProvider ( PLATFORM_ID , platformId ) ,
26+ MockProvider ( ENVIRONMENT , { throttleToken : '' , ...environmentOverrides } as EnvironmentModel ) ,
3227 ] ,
3328 } ) ;
3429
3530 cookieService = TestBed . inject ( CookieService ) ;
31+ } ;
32+
33+ beforeEach ( ( ) => {
3634 jest . clearAllMocks ( ) ;
3735 } ) ;
3836
@@ -44,11 +42,12 @@ describe('authInterceptor', () => {
4442 } ;
4543
4644 const createHandler = ( ) => {
47- const handler = mockHandler . mockReturnValue ( of ( { } ) ) ;
45+ const handler = jest . fn ( ) . mockReturnValue ( of ( { } ) ) ;
4846 return handler ;
4947 } ;
5048
5149 it ( 'should skip ROR funders API requests' , ( ) => {
50+ setup ( ) ;
5251 const request = createRequest ( 'https://api.ror.org/v2' ) ;
5352 const handler = createHandler ( ) ;
5453
@@ -60,6 +59,7 @@ describe('authInterceptor', () => {
6059 } ) ;
6160
6261 it ( 'should set Accept header to */* for text response type' , ( ) => {
62+ setup ( ) ;
6363 const request = createRequest ( '/api/v2/projects/' , { responseType : 'text' } ) ;
6464 const handler = createHandler ( ) ;
6565
@@ -71,6 +71,7 @@ describe('authInterceptor', () => {
7171 } ) ;
7272
7373 it ( 'should set Accept header to API version for json response type' , ( ) => {
74+ setup ( ) ;
7475 const request = createRequest ( '/api/v2/projects/' , { responseType : 'json' } ) ;
7576 const handler = createHandler ( ) ;
7677
@@ -82,6 +83,7 @@ describe('authInterceptor', () => {
8283 } ) ;
8384
8485 it ( 'should set Content-Type header when not present' , ( ) => {
86+ setup ( ) ;
8587 const request = createRequest ( '/api/v2/projects/' ) ;
8688 const handler = createHandler ( ) ;
8789
@@ -93,6 +95,7 @@ describe('authInterceptor', () => {
9395 } ) ;
9496
9597 it ( 'should not override existing Content-Type header' , ( ) => {
98+ setup ( ) ;
9699 const request = createRequest ( '/api/v2/projects/' ) ;
97100 const requestWithHeaders = request . clone ( {
98101 setHeaders : { 'Content-Type' : 'application/json' } ,
@@ -107,7 +110,8 @@ describe('authInterceptor', () => {
107110 } ) ;
108111
109112 it ( 'should add CSRF token and withCredentials in browser platform' , ( ) => {
110- jest . spyOn ( cookieService , 'get' ) . mockReturnValue ( 'csrf-token-123' ) ;
113+ setup ( ) ;
114+ cookieServiceMock . get . mockReturnValue ( 'csrf-token-123' ) ;
111115
112116 const request = createRequest ( '/api/v2/projects/' ) ;
113117 const handler = createHandler ( ) ;
@@ -122,7 +126,8 @@ describe('authInterceptor', () => {
122126 } ) ;
123127
124128 it ( 'should not add CSRF token when not available in browser platform' , ( ) => {
125- jest . spyOn ( cookieService , 'get' ) . mockReturnValue ( '' ) ;
129+ setup ( ) ;
130+ cookieServiceMock . get . mockReturnValue ( '' ) ;
126131
127132 const request = createRequest ( '/api/v2/projects/' ) ;
128133 const handler = createHandler ( ) ;
@@ -135,4 +140,37 @@ describe('authInterceptor', () => {
135140 expect ( modifiedRequest . headers . has ( 'X-CSRFToken' ) ) . toBe ( false ) ;
136141 expect ( modifiedRequest . withCredentials ) . toBe ( true ) ;
137142 } ) ;
143+
144+ it ( 'should not add X-Throttle-Token on browser platform' , ( ) => {
145+ setup ( 'browser' , { throttleToken : 'test-token' } ) ;
146+ const request = createRequest ( '/api/v2/projects/' ) ;
147+ const handler = createHandler ( ) ;
148+
149+ runInInjectionContext ( TestBed , ( ) => authInterceptor ( request , handler ) ) ;
150+
151+ const modifiedRequest = handler . mock . calls [ 0 ] [ 0 ] ;
152+ expect ( modifiedRequest . headers . has ( 'X-Throttle-Token' ) ) . toBe ( false ) ;
153+ } ) ;
154+
155+ it ( 'should add X-Throttle-Token on server platform when token is present' , ( ) => {
156+ setup ( 'server' , { throttleToken : 'test-token' } ) ;
157+ const request = createRequest ( '/api/v2/projects/' ) ;
158+ const handler = createHandler ( ) ;
159+
160+ runInInjectionContext ( TestBed , ( ) => authInterceptor ( request , handler ) ) ;
161+
162+ const modifiedRequest = handler . mock . calls [ 0 ] [ 0 ] ;
163+ expect ( modifiedRequest . headers . get ( 'X-Throttle-Token' ) ) . toBe ( 'test-token' ) ;
164+ } ) ;
165+
166+ it ( 'should not add X-Throttle-Token on server platform when token is empty' , ( ) => {
167+ setup ( 'server' , { throttleToken : '' } ) ;
168+ const request = createRequest ( '/api/v2/projects/' ) ;
169+ const handler = createHandler ( ) ;
170+
171+ runInInjectionContext ( TestBed , ( ) => authInterceptor ( request , handler ) ) ;
172+
173+ const modifiedRequest = handler . mock . calls [ 0 ] [ 0 ] ;
174+ expect ( modifiedRequest . headers . has ( 'X-Throttle-Token' ) ) . toBe ( false ) ;
175+ } ) ;
138176} ) ;
0 commit comments