@@ -14,6 +14,12 @@ const configMock = vi.hoisted(() => ({
1414} ) ) ;
1515vi . mock ( '../../lib/config.js' , ( ) => configMock ) ;
1616
17+ const analyticsMock = vi . hoisted ( ( ) => ( {
18+ trackPosthog : vi . fn ( ) ,
19+ shutdownAnalytics : vi . fn ( async ( ) => { } ) ,
20+ } ) ) ;
21+ vi . mock ( '../../lib/analytics.js' , ( ) => analyticsMock ) ;
22+
1723vi . mock ( '../../lib/prompts.js' , ( ) => ( { isInteractive : false } ) ) ;
1824
1925// `open` is loaded dynamically inside runConnectFlow; mock so the real browser
@@ -81,6 +87,8 @@ beforeEach(() => {
8187 outputMock . outputJson . mockReset ( ) ;
8288 outputMock . outputSuccess . mockReset ( ) ;
8389 clackNoteMock . mockReset ( ) ;
90+ analyticsMock . trackPosthog . mockReset ( ) ;
91+ analyticsMock . shutdownAnalytics . mockClear ( ) ;
8492 configMock . getProjectConfig . mockReturnValue ( { project_id : 'p1' , project_name : 'Test Project' } ) ;
8593 configMock . getAccessToken . mockReturnValue ( 'tok' ) ;
8694} ) ;
@@ -175,4 +183,32 @@ describe('posthog setup', () => {
175183 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 $ / ) ;
176184 } ) ;
177185 } ) ;
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+ } ) ;
178214} ) ;
0 commit comments