auth
auth/session_test.go
Wire up the postgres database for authd. Have authd use the AUTH_PG_DB environment variable to detect support for the postgres *Stores, and if postgres is supported, use it. If postgres isn't supported, fall back on the in-memory store. Also create-if-not-exists the test scopes, instead of panicking when the scope already exists.
1 package auth
3 import (
4 "os"
5 "testing"
6 "time"
8 "code.secondbit.org/uuid.hg"
9 )
11 func init() {
12 if os.Getenv("PG_TEST_DB") != "" {
13 p, err := NewPostgres(os.Getenv("PG_TEST_DB"))
14 if err != nil {
15 panic(err)
16 }
17 sessionStores = append(sessionStores, &p)
18 }
19 }
21 var sessionStores = []sessionStore{NewMemstore()}
23 func compareSessions(session1, session2 Session) (success bool, field string, val1, val2 interface{}) {
24 if session1.ID != session2.ID {
25 return false, "ID", session1.ID, session2.ID
26 }
27 if session1.IP != session2.IP {
28 return false, "IP", session1.IP, session2.IP
29 }
30 if session1.UserAgent != session2.UserAgent {
31 return false, "UserAgent", session1.UserAgent, session2.UserAgent
32 }
33 if !session1.ProfileID.Equal(session2.ProfileID) {
34 return false, "ProfileID", session1.ProfileID, session2.ProfileID
35 }
36 if !session1.Created.Equal(session2.Created) {
37 return false, "Created", session1.Created, session2.Created
38 }
39 if !session1.Expires.Equal(session2.Expires) {
40 return false, "Expires", session1.Expires, session2.Expires
41 }
42 if session1.Login != session2.Login {
43 return false, "Login", session1.Login, session2.Login
44 }
45 if session1.Active != session2.Active {
46 return false, "Active", session1.Active, session2.Active
47 }
48 if session1.CSRFToken != session2.CSRFToken {
49 return false, "CSRFToken", session1.CSRFToken, session2.CSRFToken
50 }
51 return true, "", nil, nil
52 }
54 func TestSessionStoreSuccess(t *testing.T) {
55 t.Parallel()
56 session := Session{
57 ID: uuid.NewID().String() + uuid.NewID().String(),
58 IP: "127.0.0.1",
59 UserAgent: "TestRunner",
60 ProfileID: uuid.NewID(),
61 Created: time.Now().Round(time.Millisecond),
62 Login: "test@example.com",
63 Active: true,
64 }
65 for _, store := range sessionStores {
66 context := Context{sessions: store}
67 err := context.CreateSession(session)
68 if err != nil {
69 t.Errorf("Error saving session to %T: %s", store, err)
70 }
71 err = context.CreateSession(session)
72 if err != ErrSessionAlreadyExists {
73 t.Errorf("Expected ErrSessionAlreadyExists from %T, got %s", store, err)
74 }
75 retrieved, err := context.GetSession(session.ID)
76 if err != nil {
77 t.Errorf("Error retrieving session from %T: %s", store, err)
78 }
79 success, field, expectation, result := compareSessions(session, retrieved)
80 if !success {
81 t.Errorf("Expected field %s to be %v, but got %v from %T", field, expectation, result, store)
82 }
83 retrievedList, err := context.ListSessions(session.ProfileID, time.Time{}, 10)
84 if err != nil {
85 t.Errorf("Error retrieving sessions by profile from %T: %s", store, err)
86 }
87 if len(retrievedList) != 1 {
88 t.Errorf("Expected 1 session retrieved by profile from %T, got %d", store, len(retrievedList))
89 }
90 success, field, expectation, result = compareSessions(session, retrievedList[0])
91 if !success {
92 t.Errorf("Expected field %s to be %v, but got %v from %T", field, expectation, result, store)
93 }
94 err = context.RemoveSession(session.ID)
95 if err != nil {
96 t.Errorf("Error removing session from %T: %s", store, err)
97 }
98 retrieved, err = context.GetSession(session.ID)
99 if err != ErrSessionNotFound {
100 t.Errorf("Expected ErrSessionNotFound from %T, got %s", store, err)
101 }
102 retrievedList, err = context.ListSessions(session.ProfileID, time.Time{}, 10)
103 if err != nil {
104 t.Errorf("Error retrieving sessions by profile from %T: %s", store, err)
105 }
106 if len(retrievedList) != 0 {
107 t.Errorf("Expected 0 sessions retrieved by profile from %T, got %d", store, len(retrievedList))
108 }
109 err = context.RemoveSession(session.ID)
110 if err != ErrSessionNotFound {
111 t.Errorf("Expected ErrSessionNotFound from %T, got %s", store, err)
112 }
113 }
114 }
116 // BUG(paddy): We need to test the CreateSessionHandler.
117 // BUG(paddy): We need to test the credentialsValidate function.