from __future__ import annotations import pytest from yuxi.channel.security.qr_binding import PairingQRGenerator @pytest.fixture def qr_generator() -> PairingQRGenerator: return PairingQRGenerator() @pytest.mark.unit class TestPairingQRGeneratorGenerateContent: def test_plain_mode_returns_raw_code(self, qr_generator: PairingQRGenerator) -> None: code = "123456" result = qr_generator.generate_content(code, "feishu", "acc_1", "peer_1", mode="plain") assert result == code def test_link_mode_returns_url_when_base_url_provided(self, qr_generator: PairingQRGenerator) -> None: generator = PairingQRGenerator(base_url="https://example.com") result = generator.generate_content("123456", "feishu", "acc_1", "peer_1", mode="link") assert result == ("https://example.com/pairing?code=123456&channel=feishu&account=acc_1&peer_id=peer_1") def test_link_mode_falls_back_to_code_when_base_url_missing(self, qr_generator: PairingQRGenerator) -> None: code = "123456" result = qr_generator.generate_content(code, "feishu", "acc_1", "peer_1", mode="link") assert result == code @pytest.mark.unit class TestPairingQRGeneratorGenerateImage: PNG_HEADER = b"\x89PNG\r\n\x1a\n" def test_generate_image_returns_png_bytes(self, qr_generator: PairingQRGenerator) -> None: image = qr_generator.generate_image("test-content") assert image assert isinstance(image, bytes) assert image.startswith(self.PNG_HEADER) @pytest.mark.parametrize( ("box_size", "border"), [ (1, 0), (10, 2), (20, 5), ], ) def test_generate_image_with_various_sizes( self, qr_generator: PairingQRGenerator, box_size: int, border: int, ) -> None: image = qr_generator.generate_image("test-content", box_size=box_size, border=border) assert image assert image.startswith(self.PNG_HEADER)