Skip to content

Commit e54a6e4

Browse files
committed
test(cli): cover cli_posthog_invoked telemetry in posthog setup
1 parent c0418cf commit e54a6e4

2 files changed

Lines changed: 36 additions & 3 deletions

File tree

src/commands/posthog/setup.test.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,15 @@ vi.mock('../../lib/api/posthog.js', () => apiMock);
1111
const 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
}));
1615
vi.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+
1823
vi.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(/^npx(\.cmd)? -y @posthog\/wizard@latest$/);
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
});

src/commands/posthog/setup.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,6 @@ async function runSetup(opts: RunSetupOpts): Promise<SetupResult> {
8686
throw new AuthError('Not logged in. Run `insforge login` first.');
8787
}
8888

89-
// Step 2 of the "dashboard connect → CLI posthog setup" funnel; pairs
90-
// with backend `posthog_connect_started` joined on project_id.
9189
trackPosthog('setup', proj);
9290

9391
if (!opts.json) {

0 commit comments

Comments
 (0)