@@ -10,22 +10,23 @@ import {describe, it, afterEach, beforeEach} from 'node:test';
1010import sinon from 'sinon' ;
1111
1212import { ClearcutLogger } from '../../src/telemetry/clearcut-logger.js' ;
13- import { ClearcutSender } from '../../src/telemetry/clearcut-sender .js' ;
13+ import { WatchdogClient } from '../../src/telemetry/watchdog-client .js' ;
1414import type { Persistence } from '../../src/telemetry/persistence.js' ;
1515import { FilePersistence } from '../../src/telemetry/persistence.js' ;
16+ import { IpcMessageType } from '../../src/telemetry/types.js' ;
1617
1718describe ( 'ClearcutLogger' , ( ) => {
1819 let mockPersistence : sinon . SinonStubbedInstance < Persistence > ;
19- let mockSender : sinon . SinonStubbedInstance < ClearcutSender > ;
20+ let sendStub : sinon . SinonStub ;
2021
2122 beforeEach ( ( ) => {
2223 mockPersistence = sinon . createStubInstance ( FilePersistence , {
2324 loadState : Promise . resolve ( {
2425 lastActive : '' ,
2526 } ) ,
2627 } ) ;
27- mockSender = sinon . createStubInstance ( ClearcutSender ) ;
28- mockSender . send . resolves ( ) ;
28+ // Stub the prototype of WatchdogClient so newly created instances use it
29+ sendStub = sinon . stub ( WatchdogClient . prototype , 'send' ) ;
2930 } ) ;
3031
3132 afterEach ( ( ) => {
@@ -36,40 +37,38 @@ describe('ClearcutLogger', () => {
3637 it ( 'sends correct payload' , async ( ) => {
3738 const logger = new ClearcutLogger ( {
3839 persistence : mockPersistence ,
39- sender : mockSender ,
40+ appVersion : '1.0.0' ,
4041 } ) ;
4142 await logger . logToolInvocation ( {
4243 toolName : 'test_tool' ,
4344 success : true ,
4445 latencyMs : 123 ,
4546 } ) ;
4647
47- assert ( mockSender . send . calledOnce ) ;
48- const extension = mockSender . send . firstCall . args [ 0 ] ;
49- assert . strictEqual ( extension . tool_invocation ?. tool_name , 'test_tool' ) ;
50- assert . strictEqual ( extension . tool_invocation ?. success , true ) ;
51- assert . strictEqual ( extension . tool_invocation ?. latency_ms , 123 ) ;
48+ assert ( sendStub . calledOnce ) ;
49+ const msg = sendStub . firstCall . args [ 0 ] ;
50+ assert . strictEqual ( msg . type , IpcMessageType . EVENT ) ;
51+ assert . strictEqual ( msg . payload . tool_invocation ?. tool_name , 'test_tool' ) ;
52+ assert . strictEqual ( msg . payload . tool_invocation ?. success , true ) ;
53+ assert . strictEqual ( msg . payload . tool_invocation ?. latency_ms , 123 ) ;
5254 } ) ;
5355 } ) ;
5456
5557 describe ( 'logServerStart' , ( ) => {
5658 it ( 'logs flag usage' , async ( ) => {
5759 const logger = new ClearcutLogger ( {
5860 persistence : mockPersistence ,
59- sender : mockSender ,
61+ appVersion : '1.0.0' ,
6062 } ) ;
6163
6264 await logger . logServerStart ( { headless : true } ) ;
6365
6466 // Should have logged server start
65- const calls = mockSender . send . getCalls ( ) ;
66- const serverStartCall = calls . find ( call => {
67- return ! ! call . args [ 0 ] . server_start ;
68- } ) ;
69-
70- assert ( serverStartCall ) ;
67+ assert ( sendStub . calledOnce ) ;
68+ const msg = sendStub . firstCall . args [ 0 ] ;
69+ assert . strictEqual ( msg . type , IpcMessageType . EVENT ) ;
7170 assert . strictEqual (
72- serverStartCall . args [ 0 ] . server_start ?. flag_usage ?. headless ,
71+ msg . payload . server_start ?. flag_usage ?. headless ,
7372 true ,
7473 ) ;
7574 } ) ;
@@ -86,17 +85,16 @@ describe('ClearcutLogger', () => {
8685
8786 const logger = new ClearcutLogger ( {
8887 persistence : mockPersistence ,
89- sender : mockSender ,
88+ appVersion : '1.0.0' ,
9089 } ) ;
9190
9291 await logger . logDailyActiveIfNeeded ( ) ;
9392
94- const calls = mockSender . send . getCalls ( ) ;
95- const dailyActiveCall = calls . find ( call => {
96- return ! ! call . args [ 0 ] . daily_active ;
97- } ) ;
98-
99- assert ( dailyActiveCall , 'Should have logged daily active' ) ;
93+ assert ( sendStub . calledOnce ) ;
94+ const msg = sendStub . firstCall . args [ 0 ] ;
95+ assert . strictEqual ( msg . type , IpcMessageType . EVENT ) ;
96+ assert . ok ( msg . payload . daily_active ) ;
97+
10098 assert ( mockPersistence . saveState . called ) ;
10199 } ) ;
102100
@@ -107,17 +105,12 @@ describe('ClearcutLogger', () => {
107105
108106 const logger = new ClearcutLogger ( {
109107 persistence : mockPersistence ,
110- sender : mockSender ,
108+ appVersion : '1.0.0' ,
111109 } ) ;
112110
113111 await logger . logDailyActiveIfNeeded ( ) ;
114112
115- const calls = mockSender . send . getCalls ( ) ;
116- const dailyActiveCall = calls . find ( call => {
117- return ! ! call . args [ 0 ] . daily_active ;
118- } ) ;
119-
120- assert ( ! dailyActiveCall , 'Should NOT have logged daily active' ) ;
113+ assert ( sendStub . notCalled ) ;
121114 assert ( mockPersistence . saveState . notCalled ) ;
122115 } ) ;
123116
@@ -128,19 +121,16 @@ describe('ClearcutLogger', () => {
128121
129122 const logger = new ClearcutLogger ( {
130123 persistence : mockPersistence ,
131- sender : mockSender ,
124+ appVersion : '1.0.0' ,
132125 } ) ;
133126
134127 await logger . logDailyActiveIfNeeded ( ) ;
135128
136- const calls = mockSender . send . getCalls ( ) ;
137- const dailyActiveCall = calls . find ( call => {
138- return ! ! call . args [ 0 ] . daily_active ;
139- } ) ;
140-
141- assert ( dailyActiveCall , 'Should have logged daily active' ) ;
129+ assert ( sendStub . calledOnce ) ;
130+ const msg = sendStub . firstCall . args [ 0 ] ;
131+ assert . strictEqual ( msg . type , IpcMessageType . EVENT ) ;
142132 assert . strictEqual (
143- dailyActiveCall . args [ 0 ] . daily_active ?. days_since_last_active ,
133+ msg . payload . daily_active ?. days_since_last_active ,
144134 - 1 ,
145135 ) ;
146136 assert ( mockPersistence . saveState . called ) ;
0 commit comments