github.com/status-im/status-go@v1.1.0/centralizedmetrics/providers/mixpanel_test.go (about)

     1  package providers
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  	"net/http/httptest"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/status-im/status-go/centralizedmetrics/common"
    12  )
    13  
    14  func TestMixpanelMetricProcessor(t *testing.T) {
    15  	var t1 int64 = 1719933294765
    16  	var t2 int64 = 1719933294766
    17  
    18  	// Create a test server to mock Mixpanel API
    19  	testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    20  		// Check the request method and URL
    21  		require.Equal(t, http.MethodPost, r.Method)
    22  
    23  		expectedPath := "/track"
    24  		require.Equal(t, expectedPath, r.URL.Path)
    25  		queryParams := r.URL.Query()
    26  		require.Equal(t, "1", queryParams.Get("strict"))
    27  		require.Equal(t, "testAppID", queryParams.Get("project_id"))
    28  
    29  		// Check headers
    30  		require.Equal(t, "application/json", r.Header.Get("accept"))
    31  		require.Equal(t, "application/json", r.Header.Get("content-type"))
    32  
    33  		// Check request body
    34  		var metrics []mixpanelMetric
    35  		err := json.NewDecoder(r.Body).Decode(&metrics)
    36  		require.NoError(t, err)
    37  
    38  		require.Len(t, metrics, 2)
    39  		metric1 := metrics[0]
    40  		require.Equal(t, "user123", metric1.Properties.UserID)
    41  		require.Equal(t, "testSecret", metric1.Properties.Token)
    42  		require.Equal(t, "purchase", metric1.Event)
    43  		require.Equal(t, t1, metric1.Properties.Time)
    44  		require.Equal(t, map[string]interface{}{"price": 10.0}, metric1.Properties.AdditionalProperties)
    45  		metric2 := metrics[1]
    46  		require.Equal(t, "user123", metric2.Properties.UserID)
    47  		require.Equal(t, "testSecret", metric2.Properties.Token)
    48  		require.Equal(t, "purchase", metric2.Event)
    49  		require.Equal(t, t2, metric2.Properties.Time)
    50  		require.Equal(t, map[string]interface{}{"price": 11.0}, metric2.Properties.AdditionalProperties)
    51  
    52  		// Respond with 200 OK
    53  		w.WriteHeader(http.StatusOK)
    54  	}))
    55  	defer testServer.Close()
    56  
    57  	// Initialize the MixpanelMetricProcessor with the test server URL
    58  	processor := NewMixpanelMetricProcessor("testAppID", "testSecret", testServer.URL)
    59  
    60  	// Example metrics
    61  	metrics := []common.Metric{
    62  		{UserID: "user123", EventName: "purchase", EventValue: map[string]interface{}{"price": 10.0}, Timestamp: t1},
    63  		{UserID: "user123", EventName: "purchase", EventValue: map[string]interface{}{"price": 11.0}, Timestamp: t2},
    64  	}
    65  
    66  	// Process metrics
    67  	require.NoError(t, processor.Process(metrics))
    68  }