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  }