cache_sqlite_test.go 4.3 KB

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