diff --git a/Makefile b/Makefile index 77c4d75..2cccf86 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ migrateup: .PHONY: mock # Mock database mock: - go run go.uber.org/mock/mockgen@latest -package mock -destination internal/domains/sensors/mock/querier.go $(MOD_NAME)/internal/domains/sensors Repository + go run go.uber.org/mock/mockgen@latest -package sensors -destination internal/domains/sensors/repository_mock.go $(MOD_NAME)/internal/domains/sensors Repository .PHONY: test # Run tests @@ -48,6 +48,7 @@ run-prod: .PHONY: lazy-start lazy-start: # Install dependencies, tools, dockerize containers, run tests and run app. + go mod download make dockerize-db make dockerize-nats make run-prod \ No newline at end of file diff --git a/internal/domains/sensors/mock/querier.go b/internal/domains/sensors/repository_mock.go similarity index 74% rename from internal/domains/sensors/mock/querier.go rename to internal/domains/sensors/repository_mock.go index 057a246..27dd25d 100644 --- a/internal/domains/sensors/mock/querier.go +++ b/internal/domains/sensors/repository_mock.go @@ -3,14 +3,13 @@ // // Generated by this command: // -// mockgen -package mock -destination internal/domains/sensors/mock/querier.go nats-app/internal/domains/sensors Repository +// mockgen -package sensors -destination internal/domains/sensors/repository_mock.go nats-app/internal/domains/sensors Repository // -// Package mock is a generated GoMock package. -package mock +// Package sensors is a generated GoMock package. +package sensors import ( - sensors "nats-app/internal/domains/sensors" reflect "reflect" time "time" @@ -42,7 +41,7 @@ func (m *MockRepository) EXPECT() *MockRepositoryMockRecorder { } // CreateSensor mocks base method. -func (m *MockRepository) CreateSensor(s sensors.Sensor) error { +func (m *MockRepository) CreateSensor(s Sensor) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CreateSensor", s) ret0, _ := ret[0].(error) @@ -55,11 +54,25 @@ func (mr *MockRepositoryMockRecorder) CreateSensor(s any) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateSensor", reflect.TypeOf((*MockRepository)(nil).CreateSensor), s) } +// CreateSensorData mocks base method. +func (m *MockRepository) CreateSensorData(data SensorData) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateSensorData", data) + ret0, _ := ret[0].(error) + return ret0 +} + +// CreateSensorData indicates an expected call of CreateSensorData. +func (mr *MockRepositoryMockRecorder) CreateSensorData(data any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateSensorData", reflect.TypeOf((*MockRepository)(nil).CreateSensorData), data) +} + // ReadAllSensors mocks base method. -func (m *MockRepository) ReadAllSensors() ([]sensors.Sensor, error) { +func (m *MockRepository) ReadAllSensors() ([]Sensor, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReadAllSensors") - ret0, _ := ret[0].([]sensors.Sensor) + ret0, _ := ret[0].([]Sensor) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -71,10 +84,10 @@ func (mr *MockRepositoryMockRecorder) ReadAllSensors() *gomock.Call { } // ReadSensor mocks base method. -func (m *MockRepository) ReadSensor(sensorID string) (sensors.Sensor, error) { +func (m *MockRepository) ReadSensor(sensorID string) (Sensor, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReadSensor", sensorID) - ret0, _ := ret[0].(sensors.Sensor) + ret0, _ := ret[0].(Sensor) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -86,10 +99,10 @@ func (mr *MockRepositoryMockRecorder) ReadSensor(sensorID any) *gomock.Call { } // ReadSensorValues mocks base method. -func (m *MockRepository) ReadSensorValues(sensorID string, from, to time.Time) ([]sensors.SensorData, error) { +func (m *MockRepository) ReadSensorValues(sensorID string, from, to time.Time) ([]SensorData, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "ReadSensorValues", sensorID, from, to) - ret0, _ := ret[0].([]sensors.SensorData) + ret0, _ := ret[0].([]SensorData) ret1, _ := ret[1].(error) return ret0, ret1 } @@ -101,7 +114,7 @@ func (mr *MockRepositoryMockRecorder) ReadSensorValues(sensorID, from, to any) * } // UpdateSensor mocks base method. -func (m *MockRepository) UpdateSensor(s sensors.Sensor) error { +func (m *MockRepository) UpdateSensor(s Sensor) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UpdateSensor", s) ret0, _ := ret[0].(error) diff --git a/internal/domains/sensors/service_test.go b/internal/domains/sensors/service_test.go new file mode 100644 index 0000000..244f211 --- /dev/null +++ b/internal/domains/sensors/service_test.go @@ -0,0 +1,79 @@ +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) + } + }) + } +}