# -*- coding: utf-8 -*- """브라우저 기본 오른쪽 클릭 메뉴 막기(PLAN 39-9a) 회귀검증 — 글 입력 칸 판정 · 막기 · 꺼짐 · 대상 주소. Node 헬퍼(`helper_common_native_menu.cjs`)가 `ui_template/ui_template_native_menu.ts` 를 트랜스파일해 가짜 창 · 가짜 요소로 돌리고, 여기서 값을 판정함. """ import json import os import subprocess import pytest HERE = os.path.dirname(os.path.abspath(__file__)) @pytest.fixture(scope="module") def results(): proc = subprocess.run( ["node", os.path.join(HERE, "helper_common_native_menu.cjs")], capture_output=True, text=True, encoding="utf-8", timeout=60, ) assert proc.returncode == 0, proc.stderr return json.loads(proc.stdout) def test_글_입력_칸만_살림(results): e = results["editable"] assert e["input"] and e["inputNoType"] and e["number"] and e["readonly"] assert e["textarea"] and e["editable"] assert not (e["div"] or e["canvas"] or e["checkbox"] or e["range"]) assert not (e["textNode"] or e["none"]) def test_입력_칸_밖은_막음(results): b = results["blocked"] assert b["div"] and b["canvas"] and b["checkbox"] assert not (b["input"] or b["readonly"] or b["textarea"] or b["editable"]) def test_꺼지면_안_막고_이벤트는_안_멈춤(results): assert results["off"] is False assert results["stopped"] is False # 우리 메뉴 듣기가 그대로 돌아야 함 assert results["listener"] == [["contextmenu", True]] # 창 캡처 단계 def test_대상_주소는_B_M_만(results): r = results["routes"] assert r["b01-account"] and r["b05-profile"] and r["b11-loading"] assert r["m01-master-data"] and r["m02-master-template"] assert not (r["a01-home"] or r["a06-login"] or r["bogus"])