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  }