github.com/status-im/status-go@v1.1.0/centralizedmetrics/sqlite_persistence_test.go (about) 1 package centralizedmetrics 2 3 import ( 4 "database/sql" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 9 "github.com/status-im/status-go/appdatabase" 10 "github.com/status-im/status-go/centralizedmetrics/common" 11 "github.com/status-im/status-go/t/helpers" 12 ) 13 14 func openTestDB() (*sql.DB, error) { 15 db, err := helpers.SetupTestMemorySQLAccountsDB(appdatabase.DbInitializer{}) 16 if err != nil { 17 return nil, err 18 } 19 20 return db, nil 21 } 22 23 func setupTestDB(t *testing.T) *sql.DB { 24 db, err := openTestDB() 25 require.NoError(t, err) 26 27 return db 28 } 29 30 func TestNewSQLiteMetricRepository(t *testing.T) { 31 db := setupTestDB(t) 32 defer db.Close() 33 34 repo := NewSQLiteMetricRepository(db) 35 require.NotNil(t, repo) 36 require.Equal(t, db, repo.db) 37 } 38 39 func TestSQLiteMetricRepository_Add(t *testing.T) { 40 db := setupTestDB(t) 41 defer db.Close() 42 43 repo := NewSQLiteMetricRepository(db) 44 45 metric := common.Metric{ 46 ID: "id", 47 UserID: "user123", 48 EventName: "purchase", 49 EventValue: map[string]interface{}{ 50 "amount": 99.99, 51 }, 52 } 53 54 err := repo.Add(metric) 55 require.NoError(t, err) 56 57 var count int 58 err = db.QueryRow("SELECT COUNT(*) FROM centralizedmetrics_metrics WHERE id = ?", metric.ID).Scan(&count) 59 require.NoError(t, err) 60 require.Equal(t, 1, count) 61 } 62 63 func TestSQLiteMetricRepository_Poll(t *testing.T) { 64 db := setupTestDB(t) 65 defer db.Close() 66 67 repo := NewSQLiteMetricRepository(db) 68 69 // Insert test data 70 metric := common.Metric{ 71 ID: "id", 72 UserID: "user123", 73 EventName: "purchase", 74 EventValue: map[string]interface{}{ 75 "amount": 99.99, 76 }, 77 } 78 79 err := repo.Add(metric) 80 require.NoError(t, err) 81 82 metrics, err := repo.Poll() 83 require.NoError(t, err) 84 require.Len(t, metrics, 1) 85 require.Equal(t, metric.ID, metrics[0].ID) 86 require.Equal(t, metric.EventName, metrics[0].EventName) 87 require.Equal(t, metric.EventValue, metrics[0].EventValue) 88 require.NotEmpty(t, metrics[0].UserID) 89 require.NotEmpty(t, metrics[0].Timestamp) 90 } 91 92 func TestSQLiteMetricRepository_Delete(t *testing.T) { 93 db := setupTestDB(t) 94 defer db.Close() 95 96 repo := NewSQLiteMetricRepository(db) 97 98 // Insert test data 99 metric := common.Metric{ 100 ID: "id", 101 EventName: "purchase", 102 EventValue: map[string]interface{}{ 103 "amount": 99.99, 104 }, 105 } 106 107 err := repo.Add(metric) 108 require.NoError(t, err) 109 110 metrics := []common.Metric{metric} 111 err = repo.Delete(metrics) 112 require.NoError(t, err) 113 114 var count int 115 err = db.QueryRow("SELECT COUNT(*) FROM centralizedmetrics_metrics WHERE id = ?", metric.ID).Scan(&count) 116 require.NoError(t, err) 117 require.Equal(t, 0, count) 118 } 119 120 func TestSQLiteMetricRepository_UserID(t *testing.T) { 121 db := setupTestDB(t) 122 defer db.Close() 123 124 repo := NewSQLiteMetricRepository(db) 125 126 // Test when there is no UUID in the table 127 userID, err := repo.UserID(nil) 128 require.NoError(t, err) 129 require.NotEmpty(t, userID) 130 131 var count int 132 err = db.QueryRow("SELECT COUNT(*) FROM centralizedmetrics_uuid WHERE uuid = ?", userID).Scan(&count) 133 require.NoError(t, err) 134 require.Equal(t, 1, count) 135 136 // Test when a UUID already exists 137 existingUUID := userID 138 userID, err = repo.UserID(nil) 139 require.NoError(t, err) 140 require.Equal(t, existingUUID, userID) 141 } 142 143 func TestSQLiteMetricRepository_Enabled(t *testing.T) { 144 db := setupTestDB(t) 145 defer db.Close() 146 147 repo := NewSQLiteMetricRepository(db) 148 149 info, err := repo.Info() 150 require.NoError(t, err) 151 require.False(t, info.Enabled) 152 153 err = repo.ToggleEnabled(true) 154 require.NoError(t, err) 155 156 info, err = repo.Info() 157 require.NoError(t, err) 158 require.True(t, info.Enabled) 159 160 err = repo.ToggleEnabled(false) 161 require.NoError(t, err) 162 163 info, err = repo.Info() 164 require.NoError(t, err) 165 require.False(t, info.Enabled) 166 } 167 168 func TestSQLiteMetricRepository_EnabledDelete(t *testing.T) { 169 db := setupTestDB(t) 170 defer db.Close() 171 172 repo := NewSQLiteMetricRepository(db) 173 174 info, err := repo.Info() 175 require.NoError(t, err) 176 require.False(t, info.Enabled) 177 178 metric := common.Metric{ 179 ID: "id", 180 UserID: "user123", 181 EventName: "purchase", 182 EventValue: map[string]interface{}{ 183 "amount": 99.99, 184 }, 185 } 186 187 err = repo.Add(metric) 188 require.NoError(t, err) 189 190 var count int 191 err = db.QueryRow("SELECT COUNT(*) FROM centralizedmetrics_metrics WHERE id = ?", metric.ID).Scan(&count) 192 require.NoError(t, err) 193 require.Equal(t, 1, count) 194 195 err = repo.ToggleEnabled(false) 196 require.NoError(t, err) 197 198 err = db.QueryRow("SELECT COUNT(*) FROM centralizedmetrics_metrics WHERE id = ?", metric.ID).Scan(&count) 199 require.NoError(t, err) 200 require.Equal(t, 0, count) 201 202 info, err = repo.Info() 203 require.NoError(t, err) 204 require.False(t, info.Enabled) 205 require.True(t, info.UserConfirmed) 206 }