@@ -2,7 +2,11 @@ package pas_test
22
33import (
44 "bytes"
5+ "crypto/hmac"
6+ "crypto/sha256"
57 "database/sql"
8+ "encoding/hex"
9+ "fmt"
610 "log"
711 "net/http"
812 "net/http/httptest"
@@ -23,7 +27,7 @@ func init() {
2327
2428 analytics := pas .NewAnalytics (db )
2529
26- handler = pas .NewHandler (analytics )
30+ handler = pas .NewHandler (analytics , "" )
2731}
2832
2933func TestPostEvents (t * testing.T ) {
@@ -67,3 +71,60 @@ func TestPostUsers(t *testing.T) {
6771 status , http .StatusOK )
6872 }
6973}
74+
75+ func TestUserHash (t * testing.T ) {
76+ const secret = "foobar"
77+
78+ db , err := sql .Open ("mysql" , localDSN )
79+ if err != nil {
80+ log .Fatal (err )
81+ }
82+ defer db .Close ()
83+
84+ analytics := pas .NewAnalytics (db )
85+
86+ handler := pas .NewHandler (analytics , secret )
87+
88+ s0 := `{
89+ "events": [
90+ {"name": "test_done", "user_id": "1234", "user_hash": "%s", "timestamp": "2000-01-01T01:02:03Z", "properties": [
91+ {"name": "foo", "value": "bar", "type": "string"}
92+ ]}]}
93+ `
94+
95+ // Test invalid secret
96+ s := fmt .Sprintf (s0 , generateUserHash ("1234" , "invalid" ))
97+ var postBody = bytes .NewBufferString (s )
98+ req , err := http .NewRequest ("POST" , "/api/events" , postBody )
99+ if err != nil {
100+ t .Fatal (err )
101+ }
102+ rr := httptest .NewRecorder ()
103+ handler .ServeHTTP (rr , req )
104+ if status := rr .Code ; status != http .StatusBadRequest {
105+ t .Log (rr .Body .String ())
106+ t .Errorf ("handler returned wrong status code: got %v want %v" ,
107+ status , http .StatusOK )
108+ }
109+
110+ // Test correct secret
111+ s = fmt .Sprintf (s0 , generateUserHash ("1234" , secret ))
112+ postBody = bytes .NewBufferString (s )
113+ req , err = http .NewRequest ("POST" , "/api/events" , postBody )
114+ if err != nil {
115+ t .Fatal (err )
116+ }
117+ rr = httptest .NewRecorder ()
118+ handler .ServeHTTP (rr , req )
119+ if status := rr .Code ; status != http .StatusOK {
120+ t .Log (rr .Body .String ())
121+ t .Errorf ("handler returned wrong status code: got %v want %v" ,
122+ status , http .StatusOK )
123+ }
124+ }
125+
126+ func generateUserHash (userID , secret string ) string {
127+ hash := hmac .New (sha256 .New , []byte (secret ))
128+ hash .Write ([]byte (userID ))
129+ return hex .EncodeToString (hash .Sum (nil ))
130+ }
0 commit comments