Client-side helpers: isPushSupported, isIOSSafari, isStandalonePWA, urlBase64ToUint8Array, subscribeToPush, unsubscribeFromPush. Stub actions/push.ts zodat imports resolven (implementatie volgt in volgende taak). Unit tests voor urlBase64ToUint8Array. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
35 lines
1.3 KiB
TypeScript
35 lines
1.3 KiB
TypeScript
import { describe, it, expect, vi } from 'vitest'
|
|
|
|
vi.mock('@/actions/push', () => ({
|
|
subscribeToPushAction: vi.fn(),
|
|
unsubscribeFromPushAction: vi.fn(),
|
|
}))
|
|
|
|
import { urlBase64ToUint8Array } from '@/lib/push-client'
|
|
|
|
describe('urlBase64ToUint8Array', () => {
|
|
it('converts a base64url-encoded VAPID public key to Uint8Array', () => {
|
|
// 65-byte uncompressed EC public key encoded as base64url (no padding)
|
|
const base64url = 'BNMxB-LJm6XvGGiJSsYLdumcYiM7q9s_1aM9i5lI8lVzZ7GYJw1QkQFmrknwFsI4dI-e1iyvUhYHjNpHJKJD3oc'
|
|
const result = urlBase64ToUint8Array(base64url)
|
|
expect(result).toBeInstanceOf(Uint8Array)
|
|
expect(result.length).toBe(65)
|
|
expect(result[0]).toBe(0x04) // uncompressed EC point prefix
|
|
})
|
|
|
|
it('handles base64url with padding', () => {
|
|
// simple known vector: "hello" = aGVsbG8= in base64
|
|
const result = urlBase64ToUint8Array('aGVsbG8')
|
|
expect(result).toBeInstanceOf(Uint8Array)
|
|
expect(Array.from(result)).toEqual([104, 101, 108, 108, 111]) // "hello"
|
|
})
|
|
|
|
it('converts - and _ characters correctly', () => {
|
|
// base64url uses - and _ instead of + and /
|
|
const base64standard = 'AB+/AA=='
|
|
const base64url = 'AB-_AA'
|
|
const fromStd = urlBase64ToUint8Array(base64standard)
|
|
const fromUrl = urlBase64ToUint8Array(base64url)
|
|
expect(Array.from(fromStd)).toEqual(Array.from(fromUrl))
|
|
})
|
|
})
|