internal/db/user_test.go (view raw)
1package db
2
3import (
4 "errors"
5 "log"
6 "path"
7 "slices"
8 "testing"
9
10 "postern/internal/model"
11)
12
13// TestUsers tests db operations around user management
14func TestUsers(t *testing.T) {
15 posternDB, err := OpenDB(&Config{
16 DBPath: path.Join(t.TempDir(), "meta.db"),
17 })
18 if err != nil {
19 log.Fatal(err)
20 }
21
22 defer func(posternDB *DB) {
23 err := posternDB.Close()
24 if err != nil {
25 log.Fatal(err)
26 }
27 }(posternDB)
28
29 tx, err := posternDB.GetWriteTx(t.Context())
30 if err != nil {
31 t.Fatal(err)
32 }
33
34 _, err = InsertUser(t.Context(), tx, "testuser1", []byte{})
35 if err != nil {
36 t.Fatal(err)
37 }
38 _, err = InsertUser(t.Context(), tx, "testuser2", []byte{})
39 if err != nil {
40 t.Fatal(err)
41 }
42 err = tx.Commit()
43 if err != nil {
44 t.Fatal(err)
45 }
46
47 err = posternDB.InsertUserAddress(t.Context(), "testuser1", "test1@example.com")
48 if err != nil {
49 t.Fatal(err)
50 }
51
52 err = posternDB.InsertUserAddress(t.Context(), "testuser1", "test2@example.com")
53 if err != nil {
54 t.Fatal(err)
55 }
56
57 // Test GetUser
58 u, err := posternDB.GetUser(t.Context(), "testuser1")
59 if err != nil {
60 t.Fatal(err)
61 }
62 if len(u.Addresses) != 2 {
63 t.Errorf("got %d addresses, want 2", len(u.Addresses))
64 }
65 if !slices.Contains(u.Addresses, "test2@example.com") {
66 t.Errorf("did not find user address in addresses")
67 }
68
69 // Test non-existing user
70 u, err = posternDB.GetUser(t.Context(), "non-existent")
71 if err == nil {
72 t.Errorf("got nil, want error for non-existent user")
73 }
74
75 // Test for exists
76 exists, err := posternDB.UserExists(t.Context(), "testuser1")
77 if err != nil {
78 t.Fatal(err)
79 }
80 if !exists {
81 t.Errorf("expected user to exist")
82 }
83 exists, err = posternDB.UserExists(t.Context(), "non-existent")
84 if err != nil {
85 t.Fatal(err)
86 }
87 if exists {
88 t.Errorf("expected user to not exist")
89 }
90
91 users, err := posternDB.ListUsers(t.Context())
92 if err != nil {
93 t.Fatal(err)
94 }
95 if len(users) != 2 {
96 t.Errorf("got %d users, want 2", len(users))
97 }
98 for _, u = range users {
99 if u.Name == "testuser1" {
100 if len(u.Addresses) != 2 {
101 t.Errorf("got %d addresses, want 2", len(u.Addresses))
102 }
103 }
104 if u.Name == "testuser2" {
105 if len(u.Addresses) != 0 {
106 t.Errorf("got %d addresses, want 0", len(u.Addresses))
107 }
108 }
109 }
110
111 // Test ListUserAddresses
112 addrs, err := posternDB.ListUserAddresses(t.Context(), "testuser1")
113 if err != nil {
114 t.Fatal(err)
115 }
116 if len(addrs) != 2 {
117 t.Errorf("got %d addresses, want 2", len(addrs))
118 }
119 if !slices.Contains(addrs, "test1@example.com") || !slices.Contains(addrs, "test2@example.com") {
120 t.Errorf("expected both addresses, got %v", addrs)
121 }
122
123 // Test RemoveUserAddress
124 err = posternDB.RemoveUserAddress(t.Context(), "testuser1", "test1@example.com")
125 if err != nil {
126 t.Fatal(err)
127 }
128 addrs, err = posternDB.ListUserAddresses(t.Context(), "testuser1")
129 if err != nil {
130 t.Fatal(err)
131 }
132 if len(addrs) != 1 || addrs[0] != "test2@example.com" {
133 t.Errorf("got %v, want [test2@example.com]", addrs)
134 }
135
136 // Test removing a non-existent address
137 if err = posternDB.RemoveUserAddress(t.Context(), "testuser1", "nope@example.com"); !errors.Is(err, model.ErrNotFound) {
138 t.Errorf("expected ErrNotFound for missing address, got %v", err)
139 }
140
141 // Test removing an address of a non-existent user
142 if err = posternDB.RemoveUserAddress(t.Context(), "non-existent", "nope@example.com"); !errors.Is(err, model.ErrNotFound) {
143 t.Errorf("expected ErrNotFound for missing user, got %v", err)
144 }
145
146 err = posternDB.RemoveUser(t.Context(), "testuser1")
147 if err != nil {
148 t.Fatal(err)
149 }
150 exists, err = posternDB.UserExists(t.Context(), "testuser1")
151 if err != nil {
152 t.Fatal(err)
153 }
154 if exists {
155 t.Errorf("expected user to not exist")
156 }
157}