"""지문 판정 테스트 — 진단 도구가 '무엇이 문제인지' 정확히 짚는지. 이 판정이 틀리면 엉뚱한 걸 고치게 된다. 특히 통과 환경(맥 실측)을 문제로 몰거나, 컨테이너의 소프트웨어 렌더링을 놓치면 진단 도구의 의미가 없다. """ from services.search.fingerprint import is_software_renderer, judge # 2026-08-06 맥에서 실측한 '통과하는' 지문 그대로. PASSING = { "glRenderer": "ANGLE (Apple, ANGLE Metal Renderer: Apple M3 Pro, Unspecified Version)", "webdriver": "false", "plugins": 5, "korFonts": "Nanum Gothic, Malgun Gothic, Apple SD Gothic Neo", "languages": "ko-KR", "timeZone": "Asia/Seoul", "screen": "2560x1080", "avail": "2560x1050", } # GPU 없는 컨테이너에서 나올 법한 지문. CONTAINER = {**PASSING, "glRenderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (LLVM 16.0.0)), SwiftShader driver)", "plugins": 0, "korFonts": "(없음)", "screen": "1920x1080", "avail": "1920x1080"} def _by_name(fp): return {name: (ok, value) for name, ok, value, _ in judge(fp)} def test_passing_fingerprint_has_no_complaints(): """통과 환경을 문제로 몰면 진단이 노이즈가 된다.""" assert all(ok for _, ok, _, _ in judge(PASSING)), _by_name(PASSING) def test_container_fingerprint_flags_software_renderer(): r = _by_name(CONTAINER) assert r["WebGL 렌더러"][0] is False, "SwiftShader 를 놓치면 진단의 핵심을 놓친다" def test_container_fingerprint_flags_the_known_gaps(): r = _by_name(CONTAINER) assert r["plugins"][0] is False assert r["한글 폰트"][0] is False assert r["screen vs avail"][0] is False # 창 관리자 없는 Xvfb def test_every_finding_explains_why(): """이유 없는 경고는 다음 행동으로 이어지지 않는다.""" for name, ok, value, why in judge(CONTAINER): assert why and len(why) > 10, name def test_software_renderer_detection(): assert is_software_renderer("SwiftShader driver") assert is_software_renderer("Mesa OffScreen") assert is_software_renderer("llvmpipe (LLVM 15.0.6, 256 bits)") assert not is_software_renderer("ANGLE (Apple, ANGLE Metal Renderer: Apple M3 Pro)") assert not is_software_renderer("ANGLE (NVIDIA, NVIDIA GeForce RTX 3060 Direct3D11)") assert not is_software_renderer("") def test_non_korean_locale_is_flagged(): """한국 IP 로 접근하면서 en-US 면 캡차가 뜬다(실측) — 이 조합을 놓치면 안 된다.""" r = _by_name({**PASSING, "languages": "en-US", "timeZone": "America/New_York"}) assert r["languages"][0] is False assert r["timeZone"][0] is False