From d5be5d3e8c06761d19677c122c2bcdfd85bbaed8 Mon Sep 17 00:00:00 2001
From: Philipp Heckel <pheckel@datto.com>
Date: Wed, 8 Dec 2021 23:24:09 -0500
Subject: [PATCH] Test schema migration

---
 server/cache_sqlite_test.go | 64 +++++++++++++++++++++++++++++++++++--
 1 file changed, 62 insertions(+), 2 deletions(-)

diff --git a/server/cache_sqlite_test.go b/server/cache_sqlite_test.go
index 4e7d2f1..0f6c430 100644
--- a/server/cache_sqlite_test.go
+++ b/server/cache_sqlite_test.go
@@ -1,8 +1,12 @@
 package server
 
 import (
+	"database/sql"
+	"fmt"
+	"github.com/stretchr/testify/assert"
 	"path/filepath"
 	"testing"
+	"time"
 )
 
 func TestSqliteCache_AddMessage(t *testing.T) {
@@ -21,8 +25,64 @@ func TestSqliteCache_Prune(t *testing.T) {
 	testCachePrune(t, newSqliteTestCache(t))
 }
 
-func newSqliteTestCache(t *testing.T) cache {
-	filename := filepath.Join(t.TempDir(), "cache.db")
+func TestSqliteCache_Migration_0to1(t *testing.T) {
+	filename := newSqliteTestCacheFile(t)
+	db, err := sql.Open("sqlite3", filename)
+	assert.Nil(t, err)
+
+	// Create "version 0" schema
+	_, err = db.Exec(`
+		BEGIN;
+		CREATE TABLE IF NOT EXISTS messages (
+			id VARCHAR(20) PRIMARY KEY,
+			time INT NOT NULL,
+			topic VARCHAR(64) NOT NULL,
+			message VARCHAR(1024) NOT NULL
+		);
+		CREATE INDEX IF NOT EXISTS idx_topic ON messages (topic);
+		COMMIT;
+	`)
+	assert.Nil(t, err)
+
+	// Insert a bunch of messages
+	for i := 0; i < 10; i++ {
+		_, err = db.Exec(`INSERT INTO messages (id, time, topic, message) VALUES (?, ?, ?, ?)`,
+			fmt.Sprintf("abcd%d", i), time.Now().Unix(), "mytopic", fmt.Sprintf("some message %d", i))
+		assert.Nil(t, err)
+	}
+
+	// Create cache to trigger migration
+	c := newSqliteTestCacheFromFile(t, filename)
+	messages, err := c.Messages("mytopic", sinceAllMessages)
+	assert.Nil(t, err)
+	assert.Equal(t, 10, len(messages))
+	assert.Equal(t, "some message 5", messages[5].Message)
+	assert.Equal(t, "", messages[5].Title)
+	assert.Nil(t, messages[5].Tags)
+	assert.Equal(t, 0, messages[5].Priority)
+
+	rows, err := c.db.Query(`SELECT version  FROM schemaVersion`)
+	assert.Nil(t, err)
+	assert.True(t, rows.Next())
+
+	var schemaVersion int
+	assert.Nil(t, rows.Scan(&schemaVersion))
+	assert.Equal(t, 1, schemaVersion)
+}
+
+func newSqliteTestCache(t *testing.T) *sqliteCache {
+	c, err := newSqliteCache(newSqliteTestCacheFile(t))
+	if err != nil {
+		t.Fatal(err)
+	}
+	return c
+}
+
+func newSqliteTestCacheFile(t *testing.T) string {
+	return filepath.Join(t.TempDir(), "cache.db")
+}
+
+func newSqliteTestCacheFromFile(t *testing.T, filename string) *sqliteCache {
 	c, err := newSqliteCache(filename)
 	if err != nil {
 		t.Fatal(err)
-- 
GitLab