1
+ declare global {
2
+ namespace jest {
3
+ interface Matchers < R > {
4
+ toHaveQueryParams ( expectedParamsKeys : Array < string > ) : R ;
5
+ toHaveQueryParamsValues ( expectedParams : Record < string , string > ) : R ;
6
+ toHaveOrigin ( expectedOrigin : string ) : R ;
7
+ }
8
+ }
9
+ }
10
+
11
+ expect . extend ( {
12
+ toHaveQueryParams ( received , expectedParamsKeys ) {
13
+ const { params } = parseUrl ( received ) ;
14
+ for ( let k of expectedParamsKeys ) {
15
+ if ( params [ k ] === undefined ) {
16
+ return {
17
+ message : ( ) => `URL query parameter [${ k } ] should exist, but it doesn't` ,
18
+ pass : false ,
19
+ } ;
20
+ }
21
+ }
22
+ return {
23
+ message : ( ) =>
24
+ `URL [${ received } ] should not include all of the parameters ${ JSON . stringify ( expectedParamsKeys ) } , but it does` ,
25
+ pass : true ,
26
+ } ;
27
+ } ,
28
+
29
+ toHaveQueryParamsValues ( received , expectedParams ) {
30
+ const { params } = parseUrl ( received ) ;
31
+ for ( let k in expectedParams ) {
32
+ if ( String ( params [ k ] ) !== String ( expectedParams [ k ] ) ) {
33
+ return {
34
+ message : ( ) => `URL query parameter [${ k } ] should have value [${ expectedParams [ k ] } ], instead it has value [${ params [ k ] } ]` ,
35
+ pass : false ,
36
+ } ;
37
+ }
38
+ }
39
+ return {
40
+ message : ( ) =>
41
+ `URL [${ received } ] should not include all of the values [${ JSON . stringify ( expectedParams ) } ], but it does` ,
42
+ pass : true ,
43
+ } ;
44
+ } ,
45
+
46
+ toHaveOrigin ( received , expectedOrigin ) {
47
+ const { origin } = parseUrl ( received ) ;
48
+ if ( origin !== expectedOrigin ) {
49
+ return {
50
+ message : ( ) => `URL hostname should have value [${ expectedOrigin } ], instead it has value [${ origin } ]` ,
51
+ pass : false ,
52
+ } ;
53
+ }
54
+ return {
55
+ message : ( ) => `URL hostname should not have value [${ expectedOrigin } ], but it does` , // if .not is used
56
+ pass : true ,
57
+ } ;
58
+ } ,
59
+ } ) ;
60
+
61
+ /* ************************ */
62
+
63
+ function parseUrl ( urlWithQueryParams : string ) {
64
+ const url = new URL ( urlWithQueryParams ) ;
65
+ let params : Record < string , string > = { } ;
66
+ url . searchParams . forEach ( ( value , key ) => {
67
+ params [ key ] = value ;
68
+ } ) ;
69
+ const baseUrl = `${ url . origin } ${ url . pathname } ` ;
70
+ return {
71
+ origin : url . origin ,
72
+ baseUrl : baseUrl ,
73
+ params : params ,
74
+ } ;
75
+ }
76
+
77
+ export default undefined ;
0 commit comments