@@ -21,7 +21,7 @@ function createXHRMock() {
21
21
status : 200 ,
22
22
response : 'Hello World!' ,
23
23
onreadystatechange : ( ) => { } ,
24
- getResponseHeader : ( header : string ) => {
24
+ getResponseHeader : jest . fn ( ( header : string ) => {
25
25
switch ( header ) {
26
26
case 'Retry-After' :
27
27
return '10' ;
@@ -30,7 +30,7 @@ function createXHRMock() {
30
30
default :
31
31
return `${ retryAfterSeconds } :error:scope` ;
32
32
}
33
- } ,
33
+ } ) ,
34
34
} ;
35
35
36
36
// casting `window` as `any` because XMLHttpRequest is missing in Window (TS-only)
@@ -56,16 +56,53 @@ describe('NewXHRTransport', () => {
56
56
expect ( xhrMock . setRequestHeader ) . toHaveBeenCalledTimes ( 0 ) ;
57
57
expect ( xhrMock . send ) . toHaveBeenCalledTimes ( 0 ) ;
58
58
59
+ await Promise . all ( [ transport . send ( ERROR_ENVELOPE ) , ( xhrMock as XMLHttpRequest ) . onreadystatechange ( null ) ] ) ;
60
+
61
+ expect ( xhrMock . open ) . toHaveBeenCalledTimes ( 1 ) ;
62
+ expect ( xhrMock . open ) . toHaveBeenCalledWith ( 'POST' , DEFAULT_XHR_TRANSPORT_OPTIONS . url ) ;
63
+ expect ( xhrMock . send ) . toHaveBeenCalledTimes ( 1 ) ;
64
+ expect ( xhrMock . send ) . toHaveBeenCalledWith ( serializeEnvelope ( ERROR_ENVELOPE ) ) ;
65
+ } ) ;
66
+
67
+ it ( 'returns the correct response' , async ( ) => {
68
+ const transport = makeNewXHRTransport ( DEFAULT_XHR_TRANSPORT_OPTIONS ) ;
69
+
59
70
const [ res ] = await Promise . all ( [
60
71
transport . send ( ERROR_ENVELOPE ) ,
61
72
( xhrMock as XMLHttpRequest ) . onreadystatechange ( null ) ,
62
73
] ) ;
63
74
64
- expect ( xhrMock . open ) . toHaveBeenCalledTimes ( 1 ) ;
65
- expect ( xhrMock . open ) . toHaveBeenCalledWith ( 'POST' , DEFAULT_XHR_TRANSPORT_OPTIONS . url ) ;
66
- expect ( xhrMock . send ) . toBeCalledWith ( serializeEnvelope ( ERROR_ENVELOPE ) ) ;
67
-
68
75
expect ( res ) . toBeDefined ( ) ;
69
76
expect ( res . status ) . toEqual ( 'success' ) ;
70
77
} ) ;
78
+
79
+ it ( 'sets rate limit response headers' , async ( ) => {
80
+ const transport = makeNewXHRTransport ( DEFAULT_XHR_TRANSPORT_OPTIONS ) ;
81
+
82
+ await Promise . all ( [ transport . send ( ERROR_ENVELOPE ) , ( xhrMock as XMLHttpRequest ) . onreadystatechange ( null ) ] ) ;
83
+
84
+ expect ( xhrMock . getResponseHeader ) . toHaveBeenCalledTimes ( 2 ) ;
85
+ expect ( xhrMock . getResponseHeader ) . toHaveBeenCalledWith ( 'X-Sentry-Rate-Limits' ) ;
86
+ expect ( xhrMock . getResponseHeader ) . toHaveBeenCalledWith ( 'Retry-After' ) ;
87
+ } ) ;
88
+
89
+ it ( 'sets custom request headers' , async ( ) => {
90
+ const headers = {
91
+ referrerPolicy : 'strict-origin' ,
92
+ keepalive : 'true' ,
93
+ referrer : 'http://example.org' ,
94
+ } ;
95
+ const options : XHRTransportOptions = {
96
+ ...DEFAULT_XHR_TRANSPORT_OPTIONS ,
97
+ headers,
98
+ } ;
99
+
100
+ const transport = makeNewXHRTransport ( options ) ;
101
+ await Promise . all ( [ transport . send ( ERROR_ENVELOPE ) , ( xhrMock as XMLHttpRequest ) . onreadystatechange ( null ) ] ) ;
102
+
103
+ expect ( xhrMock . setRequestHeader ) . toHaveBeenCalledTimes ( 3 ) ;
104
+ expect ( xhrMock . setRequestHeader ) . toHaveBeenCalledWith ( 'referrerPolicy' , headers . referrerPolicy ) ;
105
+ expect ( xhrMock . setRequestHeader ) . toHaveBeenCalledWith ( 'keepalive' , headers . keepalive ) ;
106
+ expect ( xhrMock . setRequestHeader ) . toHaveBeenCalledWith ( 'referrer' , headers . referrer ) ;
107
+ } ) ;
71
108
} ) ;
0 commit comments