all repos — postern

@ v0.1.0-alpha

Modern mail management

clone
git clone https:///postern.git

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}