Files
aiturk-hermes-ide/apps/mobile/tests/invite.test.mjs
T

28 lines
1.6 KiB
JavaScript

import test from 'node:test'
import assert from 'node:assert/strict'
import qrcode from 'qrcode-generator'
import jsQR from 'jsqr'
import { parseInvite } from '../src/invite.mjs'
const invite = { version: 2, desktopFingerprint: Array(32).fill('AB').join(':'), kind: 'aiturk-mobile-invite', inviteId: '11111111-1111-4111-8111-111111111111',
desktopId: '22222222-2222-4222-8222-222222222222', secret: 'a'.repeat(43), expiresAt: new Date(600000).toISOString() }
test('invitation parser refuses URLs, expired and unknown invitations', () => {
assert.equal(parseInvite(JSON.stringify(invite), 0).desktopId, invite.desktopId)
assert.equal(parseInvite(JSON.stringify(invite), 0).desktopFingerprint, invite.desktopFingerprint)
for (const bad of ['https://evil.test', JSON.stringify({ ...invite, version: 1 }),
JSON.stringify({ ...invite, desktopFingerprint: undefined }), JSON.stringify({ ...invite, secret: 'short' })])
assert.throws(() => parseInvite(bad, 0))
assert.throws(() => parseInvite(JSON.stringify(invite), 600000))
})
test('bundled QR encoder and decoder round trip the actual invitation pixels', () => {
const qr = qrcode(0, 'M'); qr.addData(JSON.stringify(invite)); qr.make()
const n = qr.getModuleCount(), size = (n + 8) * 5, pixels = new Uint8ClampedArray(size * size * 4).fill(255)
for (let y = 0; y < n; y++) for (let x = 0; x < n; x++) if (qr.isDark(y, x)) {
for (let sy = 0; sy < 5; sy++) for (let sx = 0; sx < 5; sx++) {
const i = (((y + 4) * 5 + sy) * size + (x + 4) * 5 + sx) * 4
pixels[i] = pixels[i + 1] = pixels[i + 2] = 0
}
}
assert.deepEqual(JSON.parse(jsQR(pixels, size, size).data), invite)
})