1+ import https from 'node:https'
2+
13import path from 'path'
24import type { InitialisedList } from '../src/lib/core/initialise-lists'
35import { runTelemetry , disableTelemetry } from '../src/lib/telemetry'
@@ -55,8 +57,13 @@ jest.mock('conf', () => {
5557 }
5658} )
5759
58- jest . mock ( 'node-fetch' , ( ) => {
59- return jest . fn ( ) . mockImplementation ( async ( ) => ( { } as Response ) )
60+ jest . mock ( 'node:https' , ( ) => {
61+ const end = jest . fn ( )
62+ const request = jest . fn ( ) . mockImplementation ( ( ) => ( { end } ) ) as any
63+ request . end = end
64+ return {
65+ request
66+ }
6067} )
6168
6269jest . mock ( 'node:os' , ( ) => {
@@ -105,15 +112,10 @@ const lists: Record<string, InitialisedList> = {
105112
106113describe ( 'Telemetry tests' , ( ) => {
107114 beforeEach ( ( ) => {
108- jest . resetAllMocks ( )
115+ jest . clearAllMocks ( )
109116 mockTelemetryConfig = undefined // reset state
110117 } )
111118
112- afterAll ( ( ) => {
113- jest . restoreAllMocks ( )
114- } )
115-
116- const mockFetch = require ( 'node-fetch' )
117119 const today = new Date ( ) . toJSON ( ) . slice ( 0 , 10 )
118120 const mockYesterday = '2023-01-01'
119121 const mockTelemetryConfigInitialised = {
@@ -127,12 +129,14 @@ describe('Telemetry tests', () => {
127129 }
128130
129131 function expectDidSend ( lastSentDate : string | null ) {
130- expect ( mockFetch ) . toHaveBeenCalledWith ( `https://telemetry.keystonejs.com/v1/event/project` , {
132+ expect ( https . request ) . toHaveBeenCalledWith ( `https://telemetry.keystonejs.com/v1/event/project` , {
131133 method : 'POST' ,
132134 headers : {
133135 'Content-Type' : 'application/json' ,
134136 } ,
135- body : JSON . stringify ( {
137+ } )
138+ expect ( ( https . request as any ) . end ) . toHaveBeenCalledWith (
139+ JSON . stringify ( {
136140 previous : lastSentDate ,
137141 fields : {
138142 unknown : 0 ,
@@ -141,26 +145,28 @@ describe('Telemetry tests', () => {
141145 lists : 2 ,
142146 versions : mockPackageVersions ,
143147 database : 'sqlite' ,
144- } ) ,
145- } )
148+ } )
149+ )
146150
147- expect ( mockFetch ) . toHaveBeenCalledWith ( `https://telemetry.keystonejs.com/v1/event/device` , {
151+ expect ( https . request ) . toHaveBeenCalledWith ( `https://telemetry.keystonejs.com/v1/event/device` , {
148152 method : 'POST' ,
149153 headers : {
150154 'Content-Type' : 'application/json' ,
151155 } ,
152- body : JSON . stringify ( {
156+ } )
157+ expect ( ( https . request as any ) . end ) . toHaveBeenCalledWith (
158+ JSON . stringify ( {
153159 previous : lastSentDate ,
154160 os : 'keystone-os' ,
155161 node : process . versions . node . split ( '.' ) [ 0 ] ,
156- } ) ,
157- } )
162+ } )
163+ )
158164 }
159165
160166 test ( 'Telemetry writes out an empty configuration, and sends nothing on first run' , async ( ) => {
161167 await runTelemetry ( mockProjectDir , lists , 'sqlite' ) // inform
162168
163- expect ( mockFetch ) . toHaveBeenCalledTimes ( 0 )
169+ expect ( https . request ) . toHaveBeenCalledTimes ( 0 )
164170 expect ( mockTelemetryConfig ) . toBeDefined ( )
165171 expect ( mockTelemetryConfig ?. device . lastSentDate ) . toBe ( null )
166172 expect ( mockTelemetryConfig ?. projects ) . toBeDefined ( )
@@ -172,7 +178,7 @@ describe('Telemetry tests', () => {
172178 await runTelemetry ( mockProjectDir , lists , 'sqlite' ) // send
173179
174180 expectDidSend ( null )
175- expect ( mockFetch ) . toHaveBeenCalledTimes ( 2 )
181+ expect ( https . request ) . toHaveBeenCalledTimes ( 2 )
176182 expect ( mockTelemetryConfig ) . toBeDefined ( )
177183 expect ( mockTelemetryConfig ?. device . lastSentDate ) . toBe ( today )
178184 expect ( mockTelemetryConfig ?. projects ) . toBeDefined ( )
@@ -186,7 +192,7 @@ describe('Telemetry tests', () => {
186192 await runTelemetry ( mockProjectDir , lists , 'sqlite' ) // send, same day
187193
188194 expectDidSend ( null )
189- expect ( mockFetch ) . toHaveBeenCalledTimes ( 2 ) // would be 4 if sent twice
195+ expect ( https . request ) . toHaveBeenCalledTimes ( 2 ) // would be 4 if sent twice
190196 } )
191197
192198 test ( 'Telemetry sends a lastSentDate on the third run, second day' , async ( ) => {
@@ -195,7 +201,7 @@ describe('Telemetry tests', () => {
195201 await runTelemetry ( mockProjectDir , lists , 'sqlite' ) // send, different day
196202
197203 expectDidSend ( mockYesterday )
198- expect ( mockFetch ) . toHaveBeenCalledTimes ( 2 )
204+ expect ( https . request ) . toHaveBeenCalledTimes ( 2 )
199205 expect ( mockTelemetryConfig ) . toBeDefined ( )
200206 expect ( mockTelemetryConfig ?. device . lastSentDate ) . toBe ( today )
201207 expect ( mockTelemetryConfig ?. projects ) . toBeDefined ( )
@@ -216,7 +222,7 @@ describe('Telemetry tests', () => {
216222 await runTelemetry ( mockProjectDir , lists , 'sqlite' ) // send
217223 await runTelemetry ( mockProjectDir , lists , 'sqlite' ) // send, same day
218224
219- expect ( mockFetch ) . toHaveBeenCalledTimes ( 0 )
225+ expect ( https . request ) . toHaveBeenCalledTimes ( 0 )
220226 expect ( mockTelemetryConfig ) . toBe ( false )
221227 } )
222228
@@ -241,18 +247,18 @@ describe('Telemetry tests', () => {
241247
242248 await runTelemetry ( mockProjectDir , lists , 'sqlite' ) // try send again
243249
244- expect ( mockFetch ) . toHaveBeenCalledTimes ( 0 )
250+ expect ( https . request ) . toHaveBeenCalledTimes ( 0 )
245251 expect ( mockTelemetryConfig ) . toBe ( mockTelemetryConfigInitialised ) // unchanged
246252 } )
247253
248254 test ( `if not initialised, we do nothing` , async ( ) => {
249255 expect ( mockTelemetryConfig ) . toBe ( undefined )
250- expect ( mockFetch ) . toHaveBeenCalledTimes ( 0 )
256+ expect ( https . request ) . toHaveBeenCalledTimes ( 0 )
251257
252258 await runTelemetry ( mockProjectDir , lists , 'sqlite' ) // try inform
253259 await runTelemetry ( mockProjectDir , lists , 'sqlite' ) // try send
254260
255- expect ( mockFetch ) . toHaveBeenCalledTimes ( 0 )
261+ expect ( https . request ) . toHaveBeenCalledTimes ( 0 )
256262 expect ( mockTelemetryConfig ) . toBe ( undefined ) // nothing changed
257263 } )
258264 } )
@@ -276,7 +282,7 @@ describe('Telemetry tests', () => {
276282
277283 await runTelemetryThrows ( mockProjectDir , lists , 'sqlite' ) // send
278284
279- expect ( mockFetch ) . toHaveBeenCalledTimes ( 0 )
285+ expect ( https . request ) . toHaveBeenCalledTimes ( 0 )
280286 expect ( mockTelemetryConfig ) . toBe ( mockTelemetryConfigInitialised ) // unchanged
281287 } )
282288 } )
@@ -298,18 +304,18 @@ describe('Telemetry tests', () => {
298304
299305 await runTelemetryCI ( mockProjectDir , lists , 'sqlite' ) // try send again
300306
301- expect ( mockFetch ) . toHaveBeenCalledTimes ( 0 )
307+ expect ( https . request ) . toHaveBeenCalledTimes ( 0 )
302308 expect ( mockTelemetryConfig ) . toBe ( mockTelemetryConfigInitialised ) // unchanged
303309 } )
304310
305311 test ( `if not initialised, we do nothing` , async ( ) => {
306312 expect ( mockTelemetryConfig ) . toBe ( undefined )
307- expect ( mockFetch ) . toHaveBeenCalledTimes ( 0 )
313+ expect ( https . request ) . toHaveBeenCalledTimes ( 0 )
308314
309315 await runTelemetryCI ( mockProjectDir , lists , 'sqlite' ) // try inform
310316 await runTelemetryCI ( mockProjectDir , lists , 'sqlite' ) // try send
311317
312- expect ( mockFetch ) . toHaveBeenCalledTimes ( 0 )
318+ expect ( https . request ) . toHaveBeenCalledTimes ( 0 )
313319 expect ( mockTelemetryConfig ) . toBe ( undefined ) // nothing changed
314320 } )
315321 } )
0 commit comments