"""사진이 붙는 이벤트와 붙지 않는 이벤트. 이 경계는 성능이나 용량 문제가 아니라 우리가 작업자에게 한 약속이다 — "정상 근무 중에는 아무것도 남지 않는다". 발화 조건이 시간 경과 하나뿐인 유형(체류 상한 초과)에 사진을 붙이면 그 약속이 거짓이 되고, 시스템은 30분 넘게 그 구역에 있었다는 이유만으로 그 사람의 사진 3장을 서버에 남긴다. 위험해서가 아니라 오래 있어서. 반대 방향도 같은 무게로 잠근다: 넘어짐에서 사진이 빠지면 사고 조사에 쓸 것이 없다. """ import pytest from edge.app import NO_EVIDENCE_TYPES from edge.events import EventType # 사진이 사건의 증거인 유형 — 무슨 일이 일어났는지가 프레임 안에 있거나(넘어짐·협착), # 규칙 위반 자체가 인원 수라서 프레임이 그것을 증명한다(단독작업·정원 초과). EVIDENTIAL = [ EventType.FALL, EventType.FALL_FROM_HEIGHT, EventType.NO_MOTION, EventType.IMMOBILITY, EventType.GHOST, EventType.NEAR_FALL, EventType.PINCH, EventType.ZONE_WARNING, EventType.ZONE_RESTRICTED, EventType.LONE_WORKER, EventType.OVERCAPACITY, ] @pytest.mark.parametrize("etype", EVIDENTIAL, ids=lambda e: e.value) def test_incident_types_carry_evidence(etype): assert etype not in NO_EVIDENCE_TYPES, ( f"{etype.value} 에서 증거 프레임이 빠졌습니다. 사고 조사에서 볼 것이 사라집니다.") @pytest.mark.parametrize("etype", sorted(NO_EVIDENCE_TYPES, key=lambda e: e.value), ids=lambda e: e.value) def test_non_incident_types_carry_no_evidence(etype): # 목록에 든 것이 의도한 넷인지 고정한다. 새 유형을 여기 넣으려면 이 테스트를 고쳐야 하고, # 그 순간 "왜 이 유형은 사진이 필요 없는가"를 한 번 더 답하게 된다. assert etype in { EventType.ERGO_REPORT, EventType.OVERSTAY, EventType.DEVICE_FAULT, EventType.MONITORING_DEGRADED, } def test_overstay_is_excluded_because_time_alone_is_not_an_incident(): """가장 중요한 한 줄 — 되돌리면 감시 시스템이 된다. 체류 상한 초과는 사람이 구역에 머무른 시간만으로 발화한다. 프리셋 기본값은 밀폐공간 30분·화기작업 60분이라, 사진을 붙이면 정상 작업자가 규정대로 일하는 동안 주기적으로 본인 사진이 서버로 가는 시스템이 된다. """ assert EventType.OVERSTAY in NO_EVIDENCE_TYPES def test_the_exclusion_list_stays_small(): # 이 목록이 길어지고 있다면 경계가 "증거냐 기록이냐"에서 다른 무언가로 밀린 것이다. assert len(NO_EVIDENCE_TYPES) <= 6