@@ -11,10 +11,15 @@ vi.mock('../../lib/api/posthog.js', () => apiMock);
1111const configMock = vi . hoisted ( ( ) => ( {
1212 getProjectConfig : vi . fn ( ( ) => ( { project_id : 'p1' , project_name : 'Test Project' } ) ) ,
1313 getAccessToken : vi . fn ( ( ) => 'tok' ) ,
14- FAKE_PROJECT_ID : 'fa4e0000-1234-5678-90ab-cd1234567890' ,
1514} ) ) ;
1615vi . mock ( '../../lib/config.js' , ( ) => configMock ) ;
1716
17+ const analyticsMock = vi . hoisted ( ( ) => ( {
18+ trackPosthog : vi . fn ( ) ,
19+ shutdownAnalytics : vi . fn ( async ( ) => { } ) ,
20+ } ) ) ;
21+ vi . mock ( '../../lib/analytics.js' , ( ) => analyticsMock ) ;
22+
1823vi . mock ( '../../lib/prompts.js' , ( ) => ( { isInteractive : false } ) ) ;
1924
2025// `open` is loaded dynamically inside runConnectFlow; mock so the real browser
@@ -82,6 +87,8 @@ beforeEach(() => {
8287 outputMock . outputJson . mockReset ( ) ;
8388 outputMock . outputSuccess . mockReset ( ) ;
8489 clackNoteMock . mockReset ( ) ;
90+ analyticsMock . trackPosthog . mockReset ( ) ;
91+ analyticsMock . shutdownAnalytics . mockClear ( ) ;
8592 configMock . getProjectConfig . mockReturnValue ( { project_id : 'p1' , project_name : 'Test Project' } ) ;
8693 configMock . getAccessToken . mockReturnValue ( 'tok' ) ;
8794} ) ;
@@ -176,4 +183,32 @@ describe('posthog setup', () => {
176183 expect ( payload . wizardCommand ) . toMatch ( / ^ n p x ( \. c m d ) ? - y @ p o s t h o g \/ w i z a r d @ l a t e s t $ / ) ;
177184 } ) ;
178185 } ) ;
186+
187+ describe ( 'analytics' , ( ) => {
188+ it ( 'fires cli_posthog_invoked with the project config and flushes on success' , async ( ) => {
189+ apiMock . startPosthogCliFlow . mockResolvedValue ( { type : 'connected' } ) ;
190+ apiMock . fetchPosthogConnection . mockResolvedValue ( {
191+ kind : 'connected' ,
192+ connection : { apiKey : 'phc_' , host : 'h' , posthogProjectId : '1' } ,
193+ } ) ;
194+
195+ await runSetup ( [ '--skip-browser' ] ) ;
196+
197+ expect ( analyticsMock . trackPosthog ) . toHaveBeenCalledOnce ( ) ;
198+ expect ( analyticsMock . trackPosthog ) . toHaveBeenCalledWith (
199+ 'setup' ,
200+ expect . objectContaining ( { project_id : 'p1' } ) ,
201+ ) ;
202+ expect ( analyticsMock . shutdownAnalytics ) . toHaveBeenCalledOnce ( ) ;
203+ } ) ;
204+
205+ it ( 'still flushes analytics when setup fails' , async ( ) => {
206+ apiMock . startPosthogCliFlow . mockResolvedValue ( { type : 'connected' } ) ;
207+ apiMock . fetchPosthogConnection . mockResolvedValue ( { kind : 'not-connected' } ) ;
208+
209+ await runSetup ( [ '--skip-browser' ] ) ;
210+
211+ expect ( analyticsMock . shutdownAnalytics ) . toHaveBeenCalledOnce ( ) ;
212+ } ) ;
213+ } ) ;
179214} ) ;
0 commit comments