switchCalls[] = [ 'department_id' => $departmentId, 'relay_id' => $logicalRelayId, 'on' => $on, ]; return [ 'relay_id' => $logicalRelayId, 'online' => true, 'on' => $on, ]; } } final class DepartmentGatesRelayOpenHarness extends department_gates_o { public function __construct( array $config, int $departmentId, private readonly DepartmentGatesRelayManagerFake $manager, ) { $this->id = 1001; $departmentProperty = new object_property('department_gates', -1, 'department', 'int'); $departmentProperty->set($departmentId); $this->department = $departmentProperty; $configProperty = new object_property('department_gates', -1, 'config', 'json'); $configProperty->set($config); $this->config = $configProperty; } public function requireSelected(): void { } protected function resolveEdgeGatewayManager(): edge_gateway_manager { return $this->manager; } } it('dispatches relay-backed gates through the edge gateway relay manager', function (): void { $manager = new DepartmentGatesRelayManagerFake(); $gate = new DepartmentGatesRelayOpenHarness([ 'type' => 'RELAY', 'relay_id' => 'ENTRY-GATE-1', 'pulse_seconds' => 0, ], 17, $manager); $gate->openGate(); expect($manager->switchCalls)->toBe([ [ 'department_id' => 17, 'relay_id' => 'ENTRY-GATE-1', 'on' => true, ], ]); });