Files
2026-11-14 09:56:45 +00:00

77 lines
3.1 KiB
TypeScript

// SPDX-License-Identifier: LicenseRef-ConusAI-Template-1.0
import { createTestObserve } from "@conusai-sdk/observe-testing"
import { describe, expect, it } from "vitest"
import { browserObserveOptions, observeMeta, startBrowserObserve } from "../apps/web/src/observe/browser.js"
import {
CONSENT_COOKIE,
CONSENT_NOTICE_VERSION,
CONSENT_SECONDS,
consentCookie,
privacyRestricted,
readConsentChoice,
recordConsentChoice,
} from "../apps/web/src/observe/consent.js"
const NOW = Date.parse("2026-10-01T12:00:00.000Z")
const choice = (analytics: boolean, replay: boolean) => ({
analytics,
replay,
at: new Date(NOW).toISOString(),
notice: CONSENT_NOTICE_VERSION,
})
describe("the app's consent record", () => {
it("stores both independent choices for six months and rejects malformed or stale records", () => {
const saved = choice(true, false)
const cookie = consentCookie(saved)
expect(cookie).toContain(`${CONSENT_COOKIE}=`)
expect(cookie).toContain(`Max-Age=${CONSENT_SECONDS}`)
expect(cookie).toContain("SameSite=Lax; Secure")
expect(readConsentChoice(cookie, NOW)).toEqual(saved)
expect(readConsentChoice(cookie, NOW + CONSENT_SECONDS * 1000)).toBeUndefined()
expect(readConsentChoice(`${CONSENT_COOKIE}=not-json`, NOW)).toBeUndefined()
expect(readConsentChoice(consentCookie({ ...saved, notice: "old" }), NOW)).toBeUndefined()
})
it("does not infer replay from analytics consent", () => {
const settings = { release: "r", environment: "production" }
expect(browserObserveOptions(settings, choice(true, false)).modules).toEqual({ traces: true, analytics: true })
expect(browserObserveOptions(settings, choice(true, true)).modules).toEqual({
traces: true,
analytics: true,
replay: true,
})
expect(browserObserveOptions(settings, choice(true, true), true).modules).not.toHaveProperty("replay")
})
})
describe("restoring and changing a choice", () => {
const documentWith = (cookie: string) => ({
cookie,
querySelector: (selector: string) =>
selector === 'meta[name="app-observe"]'
? { getAttribute: (name: string) => observeMeta({ release: "r", environment: "e" })[name] ?? null }
: null,
})
it("restores analytics without granting replay, and revokes everything on withdrawal", () => {
const instance = createTestObserve({ consent: "opt-in", modules: { errors: false } })
startBrowserObserve(documentWith(consentCookie(choice(true, false))) as never, () => instance)
expect(instance.consent.state()).toBe("granted")
recordConsentChoice({ analytics: false, replay: false })
expect(instance.consent.state()).toBe("denied")
})
it("treats GPC as a refusal even when an older cookie granted both purposes", () => {
const instance = createTestObserve({ consent: "opt-in", modules: { errors: false } })
startBrowserObserve(documentWith(consentCookie(choice(true, true))) as never, () => instance, {
globalPrivacyControl: true,
})
expect(instance.consent.state()).toBe("denied")
expect(privacyRestricted({ doNotTrack: "1" })).toBe(true)
expect(privacyRestricted({ globalPrivacyControl: false })).toBe(false)
})
})