package parking import ( "testing" "github.com/stretchr/testify/require" ) type gateControllerStub struct { openDevice string closeDevice string openTime byte closeTime byte } func (s *gateControllerStub) OpenGate(deviceCode string, validTime byte) error { s.openDevice = deviceCode s.openTime = validTime return nil } func (s *gateControllerStub) CloseGate(deviceCode string, validTime byte) error { s.closeDevice = deviceCode s.closeTime = validTime return nil } func (s *gateControllerStub) IsGateConnected(string) bool { return true } func TestPassageServiceUsesUnifiedGateController(t *testing.T) { previous := currentGateController() stub := &gateControllerStub{} SetGateController(stub) t.Cleanup(func() { SetGateController(previous) }) svc := &PassageService{} require.NoError(t, svc.OpenGateByDeviceCode("GATE-01", 0)) require.NoError(t, svc.CloseGateByDeviceCode("GATE-01", 5)) require.Equal(t, "GATE-01", stub.openDevice) require.Equal(t, defaultGateValidTime, stub.openTime) require.Equal(t, "GATE-01", stub.closeDevice) require.Equal(t, byte(5), stub.closeTime) } func TestPassageServiceRejectsEmptyGateDevice(t *testing.T) { svc := &PassageService{} require.Error(t, svc.OpenGateByDeviceCode("", 2)) require.Error(t, svc.CloseGateByDeviceCode("", 2)) } func TestSimulatedGateController(t *testing.T) { controller := NewSimulatedGateController() require.True(t, controller.IsGateConnected("GATE-SIM-01")) require.False(t, controller.IsGateConnected("")) require.NoError(t, controller.OpenGate("GATE-SIM-01", 2)) require.Equal(t, "open", controller.lastAction["GATE-SIM-01"]) require.NoError(t, controller.CloseGate("GATE-SIM-01", 2)) require.Equal(t, "close", controller.lastAction["GATE-SIM-01"]) require.Error(t, controller.OpenGate("", 2)) } func TestGetGateRuntimeStatus(t *testing.T) { previous := currentGateController() controller := NewSimulatedGateController() SetGateController(controller) t.Cleanup(func() { SetGateController(previous) }) status := GetGateRuntimeStatus("GATE-SIM-01") require.True(t, status.Connected) require.True(t, status.Simulated) require.Equal(t, GateRuntimeStatus{}, GetGateRuntimeStatus("")) }