package repository_test import ( "context" "fmt" "math/rand" "net/url" "os" "path/filepath" "testing" "time" uuid "github.com/satori/go.uuid" "github.com/stretchr/testify/require" "github.com/volker-raschek/flucky/pkg/repository" "github.com/volker-raschek/flucky/pkg/testutils/dockerutils" "github.com/volker-raschek/flucky/pkg/types" "github.com/volker-raschek/go-logger/pkg/logger" ) func TestPostgresBackend(t *testing.T) { t.Skip("Database backend postgres not completly implemented") require := require.New(t) dockerClient, err := dockerutils.New() require.NoError(err) rand.Seed(time.Now().Unix()) postgresHostPort := rand.Intn(10024-1024) + 1024 postgresDBPasswort := "postgres" postgresContainerID, err := dockerClient.NewBuilder("postgres:latest"). Port(fmt.Sprintf("%v:5432/tcp", postgresHostPort)). Pull(). AddEnv("PGTZ", "Europe/Berlin"). AddEnv("POSTGRES_PASSWORD", postgresDBPasswort). AddEnv("TZ", "Europe/Berlin"). Mount("/etc/localtime", "/etc/localtime"). Start(context.Background()) cleanup := func() { dockerClient.ContainerRemoveByIDs(context.Background(), postgresContainerID) } t.Cleanup(cleanup) require.NoError(err) // postgres://[user]:[password]@[host]:[port]/[path]?[query] storageEndpoint, err := url.Parse(fmt.Sprintf("postgres://postgres:%v@localhost:%v", postgresDBPasswort, postgresHostPort)) require.NoError(err) repo, err := repository.New(storageEndpoint, logger.NewDefaultLogger(logger.LogLevelDebug)) require.NoError(err) testBackend(t, repo) } func TestSQLiteBackend(t *testing.T) { require := require.New(t) workspace := filepath.Join(os.TempDir(), uuid.NewV4().String()) err := os.MkdirAll(workspace, 0755) require.NoError(err) defer os.RemoveAll(workspace) storageEndpoint, err := url.Parse(fmt.Sprintf("sqlite3://%v/test.db", workspace)) require.NoError(err) repo, err := repository.New(storageEndpoint, logger.NewDefaultLogger(logger.LogLevelDebug)) require.NoError(err) testBackend(t, repo) } func testBackend(t *testing.T, repo *repository.Repository) { require := require.New(t) location := uuid.NewV4().String() expectedDevices := []*types.Device{ { ID: "ec0be3ab-d26d-4f9b-a96e-23ae5c577f8f", Name: "f2b245eb-b15f-40e1-9212-9a645907b710", Location: &location, CreationDate: *timeNow(require), }, { ID: "39b8f150-8abf-4539-9f16-7f68cedb1649", Name: "62e3978f-2198-4aa9-9d6f-cdc91a468b00", Location: &location, CreationDate: *timeNow(require), }, } // Test: AddDevice err := repo.AddDevices(expectedDevices...) require.NoError(err) // Test: GetDevices devices, err := repo.GetDevices() require.NoError(err) require.Len(devices, len(expectedDevices)) require.EqualValues(expectedDevices, devices) // Test: GetDevice device, err := repo.GetDevice(expectedDevices[0].ID) require.NoError(err) require.EqualValues(expectedDevices[0], device) // Test: RemoveDevice err = repo.RemoveDevices(expectedDevices[1].ID) require.NoError(err) devices, err = repo.GetDevices() require.NoError(err) require.Len(devices, 1) device, err = repo.GetDevice(expectedDevices[1].ID) require.NoError(err) require.Nil(device) // Test: Update Devices location = "MyLocation" expectedDevice := &types.Device{ ID: "ec0be3ab-d26d-4f9b-a96e-23ae5c577f8f", Name: "Hello World", Location: &location, CreationDate: *timeNow(require), } err = repo.UpdateDevices(expectedDevice) require.NoError(err) device, err = repo.GetDevice(expectedDevice.ID) require.NoError(err) require.EqualValues(expectedDevice, device) var ( wireID = "50473fdc-f6ef-4227-b3c4-484d8e9c1323" i2cBus = 1 i2cAddress uint8 = 76 expectedSensors = []*types.Sensor{ { ID: "0f8b88b0-c20d-42b2-ab51-b09ca99c0752", Name: "e1fbdbe9-cebf-42ed-8065-bf4882ccf76b", Location: "6d5b5450-1f87-47cb-b185-f64c35fae3c1", GPIONumber: "GPIO14", Model: "DHT11", Enabled: true, TickDuration: "1m", DeviceID: "ec0be3ab-d26d-4f9b-a96e-23ae5c577f8f", CreationDate: *timeNow(require), }, { ID: "80b1c4bd-abec-4ff0-afb4-bd70aeed0c83", Name: "544365ee-ece9-44ea-911d-5d920a68d4ba", Location: "7ae2d05e-9e6b-4d2d-b26a-cb4acca83778", WireID: &wireID, Model: "DS18B20", Enabled: true, TickDuration: "5m", DeviceID: "ec0be3ab-d26d-4f9b-a96e-23ae5c577f8f", CreationDate: *timeNow(require), }, { ID: "8c74397f-8e60-4c9d-960d-3197747cef9a", Name: "4b808675-de02-4866-893d-1c77f23b9304", Location: "8a085c0f-dd3c-447f-8c4e-c4c1d869c7b6", I2CBus: &i2cBus, I2CAddress: &i2cAddress, Model: "BME280", Enabled: false, TickDuration: "10m", DeviceID: "39b8f150-8abf-4539-9f16-7f68cedb1649", CreationDate: *timeNow(require), }, } ) // Test: AddSensors err = repo.AddSensors(expectedSensors...) require.NoError(err) // Test: GetSensors sensors, err := repo.GetSensors() require.NoError(err) require.Len(sensors, len(expectedSensors)) require.Equal(expectedSensors, sensors) // Test: GetSensor sensor, err := repo.GetSensor(expectedSensors[0].ID) require.NoError(err) require.Equal(expectedSensors[0], sensor) // Test: GetSensorsByDeviceID sensors, err = repo.GetSensorsByDeviceID("ec0be3ab-d26d-4f9b-a96e-23ae5c577f8f") require.NoError(err) require.Len(sensors, 2) require.Equal(expectedSensors[0:2], sensors) // Test: RemoveSensors err = repo.RemoveSensors(expectedSensors[0].ID) require.NoError(err) sensors, err = repo.GetSensors() require.NoError(err) require.Len(sensors, 2) sensors, err = repo.GetSensorsByDeviceID("ec0be3ab-d26d-4f9b-a96e-23ae5c577f8f") require.NoError(err) require.Len(sensors, 1) sensor, err = repo.GetSensor(expectedSensors[0].ID) require.NoError(err) require.Nil(sensor) // Test: RemoveSensorsByNames err = repo.RemoveSensorsByNames(expectedSensors[1].Name) require.NoError(err) sensors, err = repo.GetSensors() require.NoError(err) require.Len(sensors, 1) sensor, err = repo.GetSensor(expectedSensors[1].ID) require.NoError(err) require.Nil(sensor) // Test: RenameSensor err = repo.RenameSensors(expectedSensors[2].Name, "Hello") require.NoError(err) sensor, err = repo.GetSensor(expectedSensors[2].ID) require.Equal("Hello", sensor.Name) require.NotNil(sensor) // Test: DisableSensorsByNames err = repo.DisableSensorsByNames("Hello") require.NoError(err) sensor, err = repo.GetSensor(expectedSensors[2].ID) require.False(sensor.Enabled) require.NotNil(sensor) // Test: EnableSensorsByName err = repo.EnableSensorsByNames("Hello") require.NoError(err) sensor, err = repo.GetSensor(expectedSensors[2].ID) require.True(sensor.Enabled) require.NotNil(sensor) // Test: UpdateSensors expectedSensor := &types.Sensor{ ID: "8c74397f-8e60-4c9d-960d-3197747cef9a", Name: "4b808675-de02-4866-893d-1c77f23b9304", Location: "Über den Wolken muss die Freiheit wohl grenzenlos sein...", I2CBus: nil, I2CAddress: nil, Model: "SDS011", Enabled: true, TickDuration: "6h", DeviceID: "39b8f150-8abf-4539-9f16-7f68cedb1649", CreationDate: *timeNow(require), } err = repo.UpdateSensors(expectedSensor) require.NoError(err) sensor, err = repo.GetSensor(expectedSensor.ID) require.NoError(err) require.NotNil(sensor) require.EqualValues(expectedSensor, sensor) var ( expectedMeasuredValues = []*types.MeasuredValue{ { ID: "2e5a297a-3da0-46ae-89d2-0fcab0f1d5f7", Value: 32, ValueType: "temperature", Date: *timeNow(require), SensorID: "8c74397f-8e60-4c9d-960d-3197747cef9a", CreationDate: timeNow(require), UpdateDate: nil, }, { ID: "d69f1b62-0c6c-4058-b42c-4a2821bd220c", Value: 38, ValueType: "temperature", Date: *timeNow(require), SensorID: "8c74397f-8e60-4c9d-960d-3197747cef9a", CreationDate: timeNow(require), UpdateDate: nil, }, { ID: "ea945ae0-412b-4561-a191-1f8f1f909fa4", Value: 35.4, ValueType: "temperature", Date: *timeNow(require), SensorID: "8c74397f-8e60-4c9d-960d-3197747cef9a", CreationDate: timeNow(require), UpdateDate: nil, }, } ) // Test: AddMeasuredValues err = repo.AddMeasuredValues(expectedMeasuredValues...) require.NoError(err) } func timeNow(require *require.Assertions) *time.Time { now, err := time.Parse("2006-01-02 15:04:05", time.Now().Format("2006-01-02 15:04:05")) require.NoError(err) return &now }