package db import ( "errors" "log" "path" "slices" "testing" "postern/internal/model" ) // TestUsers tests db operations around user management func TestUsers(t *testing.T) { posternDB, err := OpenDB(&Config{ DBPath: path.Join(t.TempDir(), "meta.db"), }) if err != nil { log.Fatal(err) } defer func(posternDB *DB) { err := posternDB.Close() if err != nil { log.Fatal(err) } }(posternDB) tx, err := posternDB.GetWriteTx(t.Context()) if err != nil { t.Fatal(err) } _, err = InsertUser(t.Context(), tx, "testuser1", []byte{}) if err != nil { t.Fatal(err) } _, err = InsertUser(t.Context(), tx, "testuser2", []byte{}) if err != nil { t.Fatal(err) } err = tx.Commit() if err != nil { t.Fatal(err) } err = posternDB.InsertUserAddress(t.Context(), "testuser1", "test1@example.com") if err != nil { t.Fatal(err) } err = posternDB.InsertUserAddress(t.Context(), "testuser1", "test2@example.com") if err != nil { t.Fatal(err) } // Test GetUser u, err := posternDB.GetUser(t.Context(), "testuser1") if err != nil { t.Fatal(err) } if len(u.Addresses) != 2 { t.Errorf("got %d addresses, want 2", len(u.Addresses)) } if !slices.Contains(u.Addresses, "test2@example.com") { t.Errorf("did not find user address in addresses") } // Test non-existing user u, err = posternDB.GetUser(t.Context(), "non-existent") if err == nil { t.Errorf("got nil, want error for non-existent user") } // Test for exists exists, err := posternDB.UserExists(t.Context(), "testuser1") if err != nil { t.Fatal(err) } if !exists { t.Errorf("expected user to exist") } exists, err = posternDB.UserExists(t.Context(), "non-existent") if err != nil { t.Fatal(err) } if exists { t.Errorf("expected user to not exist") } users, err := posternDB.ListUsers(t.Context()) if err != nil { t.Fatal(err) } if len(users) != 2 { t.Errorf("got %d users, want 2", len(users)) } for _, u = range users { if u.Name == "testuser1" { if len(u.Addresses) != 2 { t.Errorf("got %d addresses, want 2", len(u.Addresses)) } } if u.Name == "testuser2" { if len(u.Addresses) != 0 { t.Errorf("got %d addresses, want 0", len(u.Addresses)) } } } // Test ListUserAddresses addrs, err := posternDB.ListUserAddresses(t.Context(), "testuser1") if err != nil { t.Fatal(err) } if len(addrs) != 2 { t.Errorf("got %d addresses, want 2", len(addrs)) } if !slices.Contains(addrs, "test1@example.com") || !slices.Contains(addrs, "test2@example.com") { t.Errorf("expected both addresses, got %v", addrs) } // Test RemoveUserAddress err = posternDB.RemoveUserAddress(t.Context(), "testuser1", "test1@example.com") if err != nil { t.Fatal(err) } addrs, err = posternDB.ListUserAddresses(t.Context(), "testuser1") if err != nil { t.Fatal(err) } if len(addrs) != 1 || addrs[0] != "test2@example.com" { t.Errorf("got %v, want [test2@example.com]", addrs) } // Test removing a non-existent address if err = posternDB.RemoveUserAddress(t.Context(), "testuser1", "nope@example.com"); !errors.Is(err, model.ErrNotFound) { t.Errorf("expected ErrNotFound for missing address, got %v", err) } // Test removing an address of a non-existent user if err = posternDB.RemoveUserAddress(t.Context(), "non-existent", "nope@example.com"); !errors.Is(err, model.ErrNotFound) { t.Errorf("expected ErrNotFound for missing user, got %v", err) } err = posternDB.RemoveUser(t.Context(), "testuser1") if err != nil { t.Fatal(err) } exists, err = posternDB.UserExists(t.Context(), "testuser1") if err != nil { t.Fatal(err) } if exists { t.Errorf("expected user to not exist") } }