' . "'" . DeviceScope::CAMERA . "'" . '";', $php); } public function testIngestRejectsTheReservedCameraId(): void { // 센티넬은 서버 소유다. 엣지가 이 값으로 낙상을 올리면 콘솔이 그것을 "장치 전체" 로 // 이름 붙이고 카메라 목록·구역·통계에서 빼버려, 진짜 사고가 화면에서 더 안 보이게 된다. $res = (new EventValidator())->validate([ 'device_id' => 'pi-01', 'camera_id' => DeviceScope::CAMERA, 'event_type' => 'fall', 'severity' => 'high', 'occurred_at' => 1_700_000_000, ]); self::assertFalse($res['ok']); self::assertContains('reserved:camera_id', $res['errors']); } public function testIngestStillAcceptsAnOrdinaryCameraId(): void { $res = (new EventValidator())->validate([ 'device_id' => 'pi-01', 'camera_id' => 'cam-01', 'event_type' => 'fall', 'severity' => 'high', 'occurred_at' => 1_700_000_000, ]); self::assertTrue($res['ok'], implode(',', $res['errors'] ?? [])); } }