github.com/status-im/status-go@v1.1.0/appmetrics/database_test.go (about) 1 package appmetrics 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "testing" 7 "time" 8 9 "github.com/status-im/status-go/appdatabase" 10 "github.com/status-im/status-go/t/helpers" 11 12 "github.com/stretchr/testify/require" 13 ) 14 15 func setupTestDB(t *testing.T) (*Database, func()) { 16 db, cleanup, err := helpers.SetupTestSQLDB(appdatabase.DbInitializer{}, "appmetrics-tests") 17 require.NoError(t, err) 18 return NewDB(db), func() { require.NoError(t, cleanup()) } 19 } 20 21 func TestSaveAppMetrics(t *testing.T) { 22 sessionID := "rand-omse-ssid" 23 db, stop := setupTestDB(t) 24 defer stop() 25 26 // we need backticks (``) for value because it is expected by gojsonschema 27 // it considers text inside tics to be stringified json 28 appMetrics := []AppMetric{ 29 {Event: NavigateTo, Value: json.RawMessage(`{"view_id": "some-view-id", "params": {"screen": "login"}}`), OS: "android", AppVersion: "1.11"}, 30 } 31 32 err := db.SaveAppMetrics(appMetrics, sessionID) 33 require.NoError(t, err) 34 35 appMetricsPage, err := db.GetAppMetrics(10, 0) 36 res := appMetricsPage.AppMetrics 37 count := appMetricsPage.TotalCount 38 require.NoError(t, err) 39 require.Equal(t, appMetrics[0].Event, res[0].Event) 40 require.Equal(t, appMetrics[0].Value, res[0].Value) 41 require.Equal(t, appMetrics[0].OS, res[0].OS) 42 require.Equal(t, appMetrics[0].AppVersion, res[0].AppVersion) 43 require.False(t, res[0].Processed) 44 require.NotNil(t, res[0].CreatedAt) 45 require.Equal(t, count, 1) 46 } 47 48 func TestDatabase_GetUnprocessedMetrics(t *testing.T) { 49 db, stop := setupTestDB(t) 50 defer stop() 51 52 var uam []AppMetric 53 metricsPerSession := 10 54 unprocessedMetricsPerSession := 5 55 numberOfSessions := 3 56 numberOfSessionSaves := 5 57 58 for i := 0; i < numberOfSessionSaves; i++ { 59 for ii := 1; ii < numberOfSessions+1; ii++ { 60 err := db.SaveAppMetrics(GenerateMetrics(metricsPerSession), "rand-omse-ssid-"+fmt.Sprint(ii)) 61 require.NoError(t, err) 62 63 uam, err = db.GetUnprocessed() 64 require.NoError(t, err) 65 require.Len(t, uam, unprocessedMetricsPerSession*ii+(i*numberOfSessions*unprocessedMetricsPerSession)) 66 } 67 } 68 69 // Test metrics are grouped by session_id 70 lastSessionID := "" 71 sessionCount := 0 72 for _, m := range uam { 73 if lastSessionID != m.SessionID { 74 lastSessionID = m.SessionID 75 sessionCount++ 76 } 77 } 78 require.Equal(t, numberOfSessions, sessionCount) 79 } 80 81 func TestDatabase_SetProcessedMetrics(t *testing.T) { 82 db, stop := setupTestDB(t) 83 defer stop() 84 85 // Add sample data to the DB 86 err := db.SaveAppMetrics(GenerateMetrics(20), "rand-omse-ssid") 87 require.NoError(t, err) 88 89 // Get only the unprocessed metrics 90 uam, err := db.GetUnprocessed() 91 require.NoError(t, err) 92 93 // Extract the ids from the metrics IDs 94 ids := GetAppMetricsIDs(uam) 95 96 // Add some more metrics to the DB 97 err = db.SaveAppMetrics(GenerateMetrics(20), "rand-omse-ssid-2") 98 require.NoError(t, err) 99 100 // Set metrics as processed with the given ids 101 err = db.SetToProcessedByIDs(ids) 102 require.NoError(t, err) 103 104 // Check we have the expected number of unprocessed metrics in the db 105 uam, err = db.GetUnprocessed() 106 require.NoError(t, err) 107 require.Len(t, uam, 10) 108 } 109 110 func TestDatabase_GetUnprocessedGroupedBySession(t *testing.T) { 111 db, stop := setupTestDB(t) 112 defer stop() 113 114 // Add sample data to the DB 115 err := db.SaveAppMetrics(GenerateMetrics(20), "rand-omse-ssid") 116 require.NoError(t, err) 117 118 // Add some more metrics to the DB 119 err = db.SaveAppMetrics(GenerateMetrics(20), "rand-omse-ssid-2") 120 require.NoError(t, err) 121 122 // Check we have the expected number of unprocessed metrics in the db 123 uam, err := db.GetUnprocessedGroupedBySession() 124 require.NoError(t, err) 125 126 // Check we have 2 groups / sessions 127 require.Len(t, uam, 2) 128 require.Len(t, uam["rand-omse-ssid"], 10) 129 require.Len(t, uam["rand-omse-ssid-2"], 10) 130 } 131 132 func TestDatabase_DeleteOlderThan(t *testing.T) { 133 db, stop := setupTestDB(t) 134 defer stop() 135 136 threeHoursAgo := time.Now().Add(time.Hour * -3) // go is annoying sometimes 137 oneHourHence := time.Now().Add(time.Hour) 138 139 // Add sample data to the DB 140 err := db.SaveAppMetrics(GenerateMetrics(20), "rand-omse-ssid") 141 require.NoError(t, err) 142 143 // Delete all messages older than 3 hours old 144 err = db.DeleteOlderThan(&threeHoursAgo) 145 require.NoError(t, err) 146 147 // Get all metrics from DB, none should be deleted 148 ams, err := db.GetAppMetrics(100, 0) 149 require.NoError(t, err) 150 require.Len(t, ams.AppMetrics, 20) 151 152 // Delete all messages older than 1 hours in the future 153 err = db.DeleteOlderThan(&oneHourHence) 154 require.NoError(t, err) 155 156 // Get all metrics from DB, all should be deleted 157 ams, err = db.GetAppMetrics(100, 0) 158 require.NoError(t, err) 159 require.Len(t, ams.AppMetrics, 0) 160 }