mirror of
https://github.com/hanzoai/insights-js.git
synced 2026-10-30 18:34:19 +00:00
We own the ingestion server (hanzoai/insights: Django + rust/capture + nodejs plugin) AND this SDK, so there is no external wire contract to preserve. The server is already 100% posthog-free; this SDK was the last laggard. - $last_posthog_reset -> $last_insights_reset. This FIXES A LIVE MISMATCH: the server taxonomy (insights/taxonomy/taxonomy.py, insights/insightsql/ai.py) already expected the insights form while the SDK emitted the posthog form. - __PosthogExtensions__ -> __InsightsExtensions__; all PostHog/posthog/POSTHOG identifiers -> Insights/insights/INSIGHTS (src, tests, playground, playwright, scripts, rrweb subpackages, package.json keywords). - Hosts: DEFAULT_PLUGIN_HOST + DEFAULT_NUXT_HOST + the core host default pointed at PostHog's cloud (us.i.posthog.com) — a real bug. All -> insights.hanzo.ai. - Removed the us-assets/eu-assets CDN split in getRemoteConfig (PostHog-specific; Hanzo serves remote config from the same host) — it had degenerated to a no-op. - Fixed generate-docs writing to a stray references/@hanzo/ subdir. - Renamed the 3 posthog-named test files; dropped 58MB of stale reference snapshots named for upstream posthog versions we never shipped (they are generated output — references/ is now gitignored). Verified: typecheck errors 42 (HEAD) -> 18 (all pre-existing test-mock looseness); types package 0; every package.json valid with @hanzo/* names. Guard: grep -rioE 'posthog' packages ... | wc -l => 0
64 lines
1.8 KiB
TypeScript
64 lines
1.8 KiB
TypeScript
/** @jest-environment jsdom */
|
|
import React, { useEffect } from 'react'
|
|
import { render, cleanup } from '@testing-library/react'
|
|
import { AppState, Linking } from 'react-native'
|
|
|
|
import { InsightsProvider } from '../src/InsightsProvider'
|
|
import { useInsights } from '../src/hooks/useInsights'
|
|
import type { Insights } from '../src/insights-rn'
|
|
|
|
Linking.getInitialURL = jest.fn(() => Promise.resolve(null))
|
|
AppState.addEventListener = jest.fn()
|
|
|
|
const CaptureClient = ({ onClient }: { onClient: (client: Insights) => void }) => {
|
|
const insights = useInsights()
|
|
|
|
useEffect(() => {
|
|
onClient(insights)
|
|
}, [onClient, insights])
|
|
|
|
return null
|
|
}
|
|
|
|
describe('InsightsProvider', () => {
|
|
beforeEach(() => {
|
|
;(globalThis as any).window.fetch = jest.fn(async () => ({
|
|
status: 200,
|
|
json: () => Promise.resolve({ featureFlags: {} }),
|
|
}))
|
|
})
|
|
|
|
afterEach(() => {
|
|
cleanup()
|
|
})
|
|
|
|
it.each([
|
|
['missing', undefined],
|
|
['empty', ''],
|
|
['blank', ' '],
|
|
])('should render a disabled client instead of throwing when the api key is %s', (_case, apiKey) => {
|
|
const onClient = jest.fn()
|
|
const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {})
|
|
|
|
try {
|
|
expect(() => {
|
|
render(
|
|
React.createElement(
|
|
InsightsProvider,
|
|
{ apiKey, autocapture: false, options: { persistence: 'memory' } },
|
|
React.createElement(CaptureClient, { onClient })
|
|
)
|
|
)
|
|
}).not.toThrow()
|
|
|
|
const insights = onClient.mock.calls[0][0] as Insights
|
|
expect(insights.isDisabled).toEqual(true)
|
|
expect(consoleErrorSpy).toHaveBeenCalledWith(
|
|
"You must pass your Insights project's api key. The client will be disabled."
|
|
)
|
|
} finally {
|
|
consoleErrorSpy.mockRestore()
|
|
}
|
|
})
|
|
})
|