1
+ import { appKey } from "../support/helper" ;
2
+
3
+ const myEvent = {
4
+ key : "buttonClick" ,
5
+ segmentation : {
6
+ id : "id"
7
+ }
8
+ } ;
9
+
10
+ describe ( "Web Worker Request Intercepting Tests" , ( ) => {
11
+ it ( "SDK able to send requests for most basic calls" , ( ) => {
12
+ // create a worker
13
+ const myWorker = new Worker ( "../../examples/worker.js" ) ;
14
+
15
+ // send an event to worker
16
+ myWorker . postMessage ( { data : myEvent , type : "event" } ) ;
17
+ myWorker . postMessage ( { data : "begin_session" , type : "session" } ) ;
18
+ myWorker . postMessage ( { data : "end_session" , type : "session" } ) ;
19
+ myWorker . postMessage ( { data : "home_page" , type : "view" } ) ;
20
+
21
+ // intercept requests
22
+ cy . intercept ( "GET" , "**/i?**" , ( req ) => {
23
+ const { url } = req ;
24
+
25
+ // check url starts with https://try.count.ly/i?
26
+ assert . isTrue ( url . startsWith ( "https://try.count.ly/i?" ) ) ;
27
+
28
+ // turn query string into object
29
+ const paramsObject = turnSearchStringToObject ( url . split ( "?" ) [ 1 ] ) ;
30
+
31
+ // check common params
32
+ check_commons ( paramsObject ) ;
33
+
34
+ // we expect 4 requests: begin_session, end_session, healthcheck, event(event includes view and buttonClick)
35
+ let expectedRequests = 4 ;
36
+ if ( paramsObject . hc ) {
37
+ // check hc params types, values can change
38
+ assert . isTrue ( typeof paramsObject . hc . el === "number" ) ;
39
+ assert . isTrue ( typeof paramsObject . hc . wl === "number" ) ;
40
+ assert . isTrue ( typeof paramsObject . hc . sc === "number" ) ;
41
+ assert . isTrue ( typeof paramsObject . hc . em === "string" ) ;
42
+ expectedRequests -- ;
43
+ }
44
+ else if ( paramsObject . events ) {
45
+ // check event params with accordance to event sent (myEvent above)
46
+ for ( const eventInRequest of paramsObject . events ) {
47
+ if ( eventInRequest . key === "[CLY]_view" ) { // view event
48
+ expect ( eventInRequest . segmentation . name ) . to . equal ( "home_page" ) ;
49
+ expect ( eventInRequest . segmentation . visit ) . to . equal ( 1 ) ;
50
+ expect ( eventInRequest . segmentation . start ) . to . equal ( 1 ) ;
51
+ expect ( eventInRequest . segmentation . view ) . to . equal ( "web_worker" ) ;
52
+ expect ( eventInRequest . pvid ) . to . equal ( "" ) ;
53
+ }
54
+ else { // buttonClick event
55
+ expect ( eventInRequest . key ) . to . equal ( myEvent . key ) ;
56
+ expect ( eventInRequest . segmentation ) . to . deep . equal ( myEvent . segmentation ) ;
57
+ assert . isTrue ( eventInRequest . cvid === "" ) ;
58
+ }
59
+ assert . isTrue ( eventInRequest . count === 1 ) ;
60
+ expect ( eventInRequest . id ) . to . be . ok ;
61
+ expect ( eventInRequest . id . toString ( ) . length ) . to . equal ( 21 ) ;
62
+ expect ( eventInRequest . timestamp ) . to . be . ok ;
63
+ expect ( eventInRequest . timestamp . toString ( ) . length ) . to . equal ( 13 ) ;
64
+ expect ( eventInRequest . hour ) . to . be . within ( 0 , 23 ) ;
65
+ expect ( eventInRequest . dow ) . to . be . within ( 0 , 7 ) ;
66
+ }
67
+ expectedRequests -- ;
68
+ }
69
+ else if ( paramsObject . begin_session === 1 ) { // check metrics
70
+ expect ( paramsObject . metrics . _app_version ) . to . equal ( "0.0" ) ;
71
+ expect ( paramsObject . metrics . _ua ) . to . equal ( "abcd" ) ;
72
+ assert . isTrue ( typeof paramsObject . metrics . _locale === "string" ) ;
73
+ expectedRequests -- ;
74
+ }
75
+ else if ( paramsObject . end_session === 1 ) { // check metrics and session_duration
76
+ expect ( paramsObject . metrics . _ua ) . to . equal ( "abcd" ) ;
77
+ expect ( paramsObject . session_duration ) . to . be . above ( - 1 ) ;
78
+ expectedRequests -- ;
79
+ }
80
+ if ( expectedRequests === 0 ) {
81
+ myWorker . terminate ( ) ; // we checked everything, terminate worker
82
+ }
83
+ } ) ;
84
+ } ) ;
85
+ } ) ;
86
+
87
+ /**
88
+ * Check common params for all requests
89
+ * @param {Object } paramsObject - object from search string
90
+ */
91
+ function check_commons ( paramsObject ) {
92
+ expect ( paramsObject . timestamp ) . to . be . ok ;
93
+ expect ( paramsObject . timestamp . toString ( ) . length ) . to . equal ( 13 ) ;
94
+ expect ( paramsObject . hour ) . to . be . within ( 0 , 23 ) ;
95
+ expect ( paramsObject . dow ) . to . be . within ( 0 , 7 ) ;
96
+ expect ( paramsObject . app_key ) . to . equal ( appKey ) ;
97
+ expect ( paramsObject . device_id ) . to . be . ok ;
98
+ expect ( paramsObject . sdk_name ) . to . equal ( "javascript_native_web" ) ;
99
+ expect ( paramsObject . sdk_version ) . to . be . ok ;
100
+ expect ( paramsObject . t ) . to . be . within ( 0 , 3 ) ;
101
+ expect ( paramsObject . av ) . to . equal ( 0 ) ; // av is 0 as we parsed parsable things
102
+ if ( ! paramsObject . hc ) { // hc is direct request
103
+ expect ( paramsObject . rr ) . to . be . above ( - 1 ) ;
104
+ }
105
+ expect ( paramsObject . metrics . _ua ) . to . be . ok ;
106
+ }
107
+
108
+ /**
109
+ * Turn search string into object with values parsed
110
+ * @param {String } searchString - search string
111
+ * @returns {object } - object from search string
112
+ */
113
+ function turnSearchStringToObject ( searchString ) {
114
+ const searchParams = new URLSearchParams ( searchString ) ;
115
+ const paramsObject = { } ;
116
+ for ( const [ key , value ] of searchParams . entries ( ) ) {
117
+ try {
118
+ paramsObject [ key ] = JSON . parse ( value ) ; // try to parse value
119
+ }
120
+ catch ( e ) {
121
+ paramsObject [ key ] = value ;
122
+ }
123
+ }
124
+ return paramsObject ;
125
+ }
0 commit comments