package com.sptmobile.pairing import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test // [unit->REQ-GATEWAY-PERIPHERAL] /** * Pair-code parsing for the Q1 paste-first entry path. The wire shape * (`{v, node, endpoint, token}`) is owned by `rust/link-proto::QrPayload`; * the valid-payload fixtures here mirror what `spt-mobile-host pair-code` * prints (see rust/link-client/tests/host_link.rs). */ class QrPayloadTest { private val valid = """{"v":1,"node":"aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899","endpoint":"mobile-gw","token":"tok-123"}""" private fun ok(text: String): QrPayload { val r = QrPayload.parse(text) assertTrue("expected Ok, got $r", r is QrPayload.Companion.ParseResult.Ok) return (r as QrPayload.Companion.ParseResult.Ok).payload } private fun err(text: String): String { val r = QrPayload.parse(text) assertTrue("expected Err, got $r", r is QrPayload.Companion.ParseResult.Err) return (r as QrPayload.Companion.ParseResult.Err).message } @Test fun `valid payload parses`() { val p = ok(valid) assertEquals(1, p.v) assertEquals("mobile-gw", p.endpoint) assertEquals("tok-123", p.token) } @Test fun `pasted whitespace is tolerated`() { assertEquals(ok(valid), ok(" \n$valid\n ")) } @Test fun `unknown keys are tolerated for forward compat`() { val p = ok(valid.dropLast(1) + ""","future":"stuff"}""") assertEquals("mobile-gw", p.endpoint) } @Test fun `wire json round-trips through the rust field names`() { val p = ok(valid) assertEquals(p, ok(p.toWireJson())) } @Test fun `empty paste is rejected with a hint`() { assertTrue(err(" ").contains("paste")) } @Test fun `garbage is rejected, not thrown`() { assertTrue(err("not json at all").contains("not a pair-code payload")) } @Test fun `missing field is rejected`() { err("""{"v":1,"node":"n","endpoint":"e"}""") } @Test fun `unsupported version is rejected by number`() { assertTrue(err(valid.replace("\"v\":1", "\"v\":2")).contains("version 2")) } @Test fun `blank node is rejected`() { assertTrue(err("""{"v":1,"node":"","endpoint":"e","token":"t"}""").contains("node key")) } @Test fun `blank token is rejected`() { assertTrue(err("""{"v":1,"node":"n","endpoint":"e","token":""}""").contains("token")) } }