summary history files

internal/store/log_test.go
package store

import (
	"context"
	"ct/internal/testtooling"
	"os"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
)

func TestLogStore(t *testing.T) {

	ts, err := time.Parse("2006-01-02", "2020-01-01")
	assert.Nil(t, err)

	t.Run("Create", func(t *testing.T) {
		dbFile, db, err := testtooling.CreateTmpDB()
		if err != nil {
			t.Error(err)
		}
		defer db.Close()
		defer os.Remove(dbFile)

		ctx := context.Background()
		metricID, err := testtooling.CreateMetric(ctx, db)
		assert.Nil(t, err)

		logStore := LogStore{db}
		_, err = logStore.Create(ctx, &Log{MetricID: *metricID, Value: "1", Timestamp: ts})
		assert.Nil(t, err)

		tx, err := db.BeginTx(ctx, nil)
		assert.Nil(t, err)

		var ret int
		err = tx.QueryRowContext(ctx, "SELECT COUNT(1) FROM log WHERE metric_id = ? AND value = 1 AND timestamp = ?", metricID, ts.Format("2006-01-02")).Scan(&ret)
		assert.Nil(t, err)
		assert.Equal(t, 1, ret)

		// Create a duplicate log which will return err.
		_, err = logStore.Create(ctx, &Log{MetricID: *metricID, Value: "1", Timestamp: ts})
		assert.Error(t, err)
	})

	t.Run("Update", func(t *testing.T) {
		dbFile, db, err := testtooling.CreateTmpDB()
		if err != nil {
			t.Error(err)
		}
		defer db.Close()
		defer os.Remove(dbFile)

		ctx := context.Background()
		metricID, err := testtooling.CreateMetric(ctx, db)
		assert.Nil(t, err)

		logStore := LogStore{db}
		_, err = logStore.Upsert(ctx, &Log{MetricID: *metricID, Value: "1", Timestamp: ts})
		assert.Nil(t, err)
		_, err = logStore.Upsert(ctx, &Log{MetricID: *metricID, Value: "2", Timestamp: ts})
		assert.Nil(t, err)
		tx, err := db.BeginTx(ctx, nil)
		assert.Nil(t, err)

		var ret int
		err = tx.QueryRowContext(ctx, "SELECT COUNT(1) FROM log WHERE metric_id = ? AND value = 2 AND timestamp = ?", metricID, ts.Format("2006-01-02")).Scan(&ret)
		assert.Nil(t, err)
		assert.Equal(t, 1, ret)
	})

	t.Run("SelectOne", func(t *testing.T) {
		dbFile, db, err := testtooling.CreateTmpDB()
		if err != nil {
			t.Error(err)
		}
		defer db.Close()
		defer os.Remove(dbFile)

		ctx := context.Background()
		metricID, err := testtooling.CreateMetric(ctx, db)
		assert.Nil(t, err)

		logID, err := testtooling.CreateLog(ctx, db, *metricID)
		assert.Nil(t, err)

		logStore := LogStore{db}
		log, err := logStore.SelectOne(ctx, *metricID, ts)
		assert.Nil(t, err)

		assert.Equal(t, log.LogID, *logID)
	})

	t.Run("SelectLimit", func(t *testing.T) {
		dbFile, db, err := testtooling.CreateTmpDB()
		assert.Nil(t, err)
		defer db.Close()
		defer os.Remove(dbFile)

		logStore := LogStore{db}

		ctx := context.Background()
		ret, err := logStore.SelectLimit(ctx, 0)
		assert.Nil(t, err)
		assert.Len(t, ret, 0)

		for i := 0; i < 5; i++ {
			metricID, err := testtooling.CreateMetric(ctx, db)
			assert.Nil(t, err)
			_, err = testtooling.CreateLog(ctx, db, *metricID)
			assert.Nil(t, err)
		}

		ret, err = logStore.SelectLimit(ctx, 0)
		assert.Nil(t, err)
		assert.Len(t, ret, 5)

		ret, err = logStore.SelectLimit(ctx, 1)
		assert.Nil(t, err)
		assert.Len(t, ret, 1)
	})

	t.Run("SelectWithTimestamp", func(t *testing.T) {
		dbFile, db, err := testtooling.CreateTmpDB()
		assert.NoError(t, err)
		defer db.Close()
		defer os.Remove(dbFile)

		logStore := LogStore{db}

		ctx := context.Background()
		ret, err := logStore.SelectWithTimestamp(ctx, 0, time.Now())
		assert.NoError(t, err)
		assert.Equal(t, len(ret), 0)
	})
}