package sensors import ( "testing" "time" "go.uber.org/mock/gomock" ) func setup(t *testing.T) (*Service, *MockRepository) { ctrl := gomock.NewController(t) q := NewMockRepository(ctrl) s := NewService(q) return s, q } func Test_RegisterSensor(t *testing.T) { type testCase struct { name string given Sensor setupMock func(q *MockRepository, params Sensor) expecErr bool } tests := []testCase{ { name: "success - registers new sensor", given: Sensor{ SensorID: "temp-001", SensorType: Temperature, SamplingInterval: ptr(time.Minute), ThresholdAbove: ptr(100.0), ThresholdBelow: ptr(0.0), }, setupMock: func(q *MockRepository, params Sensor) { q.EXPECT().CreateSensor(params).Return(nil) }, expecErr: false, }, { name: "error - sensor already exists", given: Sensor{ SensorID: "temp-001", SensorType: Temperature, SamplingInterval: ptr(time.Minute), ThresholdAbove: ptr(100.0), ThresholdBelow: ptr(0.0), }, setupMock: func(q *MockRepository, params Sensor) { q.EXPECT().CreateSensor(params).Return(ErrSensorAlreadyExists) }, expecErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { s, q := setup(t) tt.setupMock(q, tt.given) err := s.RegisterSensor(tt.given) if tt.expecErr && err == nil { t.Error("expected error, got nil") return } if !tt.expecErr && err != nil { t.Errorf("expected no error, got %v", err) return } if tt.expecErr && err != ErrSensorAlreadyExists { t.Errorf("expected ErrSensorAlreadyExists, got %v", err) } }) } }