cache_sqlite_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package server
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "github.com/stretchr/testify/require"
  6. "path/filepath"
  7. "testing"
  8. "time"
  9. )
  10. func TestSqliteCache_Messages(t *testing.T) {
  11. testCacheMessages(t, newSqliteTestCache(t))
  12. }
  13. func TestSqliteCache_MessagesScheduled(t *testing.T) {
  14. testCacheMessagesScheduled(t, newSqliteTestCache(t))
  15. }
  16. func TestSqliteCache_Topics(t *testing.T) {
  17. testCacheTopics(t, newSqliteTestCache(t))
  18. }
  19. func TestSqliteCache_MessagesTagsPrioAndTitle(t *testing.T) {
  20. testCacheMessagesTagsPrioAndTitle(t, newSqliteTestCache(t))
  21. }
  22. func TestSqliteCache_Prune(t *testing.T) {
  23. testCachePrune(t, newSqliteTestCache(t))
  24. }
  25. func TestSqliteCache_Attachments(t *testing.T) {
  26. testCacheAttachments(t, newSqliteTestCache(t))
  27. }
  28. func TestSqliteCache_Migration_From0(t *testing.T) {
  29. filename := newSqliteTestCacheFile(t)
  30. db, err := sql.Open("sqlite3", filename)
  31. require.Nil(t, err)
  32. // Create "version 0" schema
  33. _, err = db.Exec(`
  34. BEGIN;
  35. CREATE TABLE IF NOT EXISTS messages (
  36. id VARCHAR(20) PRIMARY KEY,
  37. time INT NOT NULL,
  38. topic VARCHAR(64) NOT NULL,
  39. message VARCHAR(1024) NOT NULL
  40. );
  41. CREATE INDEX IF NOT EXISTS idx_topic ON messages (topic);
  42. COMMIT;
  43. `)
  44. require.Nil(t, err)
  45. // Insert a bunch of messages
  46. for i := 0; i < 10; i++ {
  47. _, err = db.Exec(`INSERT INTO messages (id, time, topic, message) VALUES (?, ?, ?, ?)`,
  48. fmt.Sprintf("abcd%d", i), time.Now().Unix(), "mytopic", fmt.Sprintf("some message %d", i))
  49. require.Nil(t, err)
  50. }
  51. require.Nil(t, db.Close())
  52. // Create cache to trigger migration
  53. c := newSqliteTestCacheFromFile(t, filename)
  54. checkSchemaVersion(t, c.db)
  55. messages, err := c.Messages("mytopic", sinceAllMessages, false)
  56. require.Nil(t, err)
  57. require.Equal(t, 10, len(messages))
  58. require.Equal(t, "some message 5", messages[5].Message)
  59. require.Equal(t, "", messages[5].Title)
  60. require.Nil(t, messages[5].Tags)
  61. require.Equal(t, 0, messages[5].Priority)
  62. }
  63. func TestSqliteCache_Migration_From1(t *testing.T) {
  64. filename := newSqliteTestCacheFile(t)
  65. db, err := sql.Open("sqlite3", filename)
  66. require.Nil(t, err)
  67. // Create "version 1" schema
  68. _, err = db.Exec(`
  69. CREATE TABLE IF NOT EXISTS messages (
  70. id VARCHAR(20) PRIMARY KEY,
  71. time INT NOT NULL,
  72. topic VARCHAR(64) NOT NULL,
  73. message VARCHAR(512) NOT NULL,
  74. title VARCHAR(256) NOT NULL,
  75. priority INT NOT NULL,
  76. tags VARCHAR(256) NOT NULL
  77. );
  78. CREATE INDEX IF NOT EXISTS idx_topic ON messages (topic);
  79. CREATE TABLE IF NOT EXISTS schemaVersion (
  80. id INT PRIMARY KEY,
  81. version INT NOT NULL
  82. );
  83. INSERT INTO schemaVersion (id, version) VALUES (1, 1);
  84. `)
  85. require.Nil(t, err)
  86. // Insert a bunch of messages
  87. for i := 0; i < 10; i++ {
  88. _, err = db.Exec(`INSERT INTO messages (id, time, topic, message, title, priority, tags) VALUES (?, ?, ?, ?, ?, ?, ?)`,
  89. fmt.Sprintf("abcd%d", i), time.Now().Unix(), "mytopic", fmt.Sprintf("some message %d", i), "", 0, "")
  90. require.Nil(t, err)
  91. }
  92. require.Nil(t, db.Close())
  93. // Create cache to trigger migration
  94. c := newSqliteTestCacheFromFile(t, filename)
  95. checkSchemaVersion(t, c.db)
  96. // Add delayed message
  97. delayedMessage := newDefaultMessage("mytopic", "some delayed message")
  98. delayedMessage.Time = time.Now().Add(time.Minute).Unix()
  99. require.Nil(t, c.AddMessage(delayedMessage))
  100. // 10, not 11!
  101. messages, err := c.Messages("mytopic", sinceAllMessages, false)
  102. require.Nil(t, err)
  103. require.Equal(t, 10, len(messages))
  104. // 11!
  105. messages, err = c.Messages("mytopic", sinceAllMessages, true)
  106. require.Nil(t, err)
  107. require.Equal(t, 11, len(messages))
  108. }
  109. func checkSchemaVersion(t *testing.T, db *sql.DB) {
  110. rows, err := db.Query(`SELECT version FROM schemaVersion`)
  111. require.Nil(t, err)
  112. require.True(t, rows.Next())
  113. var schemaVersion int
  114. require.Nil(t, rows.Scan(&schemaVersion))
  115. require.Equal(t, currentSchemaVersion, schemaVersion)
  116. require.Nil(t, rows.Close())
  117. }
  118. func newSqliteTestCache(t *testing.T) *sqliteCache {
  119. c, err := newSqliteCache(newSqliteTestCacheFile(t))
  120. if err != nil {
  121. t.Fatal(err)
  122. }
  123. return c
  124. }
  125. func newSqliteTestCacheFile(t *testing.T) string {
  126. return filepath.Join(t.TempDir(), "cache.db")
  127. }
  128. func newSqliteTestCacheFromFile(t *testing.T, filename string) *sqliteCache {
  129. c, err := newSqliteCache(filename)
  130. if err != nil {
  131. t.Fatal(err)
  132. }
  133. return c
  134. }