package identity import ( "context" "errors" "github.com/jackc/pgx/v5/pgxpool" "os" "strings" "testing" ) func TestValidateDisplayName(t *testing.T) { for _, name := range []string{"", " ", "名字\n另一行", strings.Repeat("名", 81), string([]byte{0xff})} { if _, err := ValidateDisplayName(name); !errors.Is(err, ErrInvalidDisplayName) { t.Errorf("accepted invalid nickname %q", name) } } if name, err := ValidateDisplayName(" 家庭成员 "); err != nil || name != "家庭成员" { t.Fatalf("normalization %q %v", name, err) } } func TestDisplayNameOnlyChangesAuthenticatedIdentity(t *testing.T) { url := os.Getenv("TEST_DATABASE_URL") if url == "" { t.Skip("TEST_DATABASE_URL is not set") } ctx := context.Background() pool, err := pgxpool.New(ctx, url) if err != nil { t.Fatal(err) } defer pool.Close() repo := NewRepository(pool) owner := Principal{Issuer: localIssuer, Subject: ownerSubject} outsider := Principal{Issuer: localIssuer, Subject: outsiderSubject} before, err := repo.CurrentUser(ctx, owner) if err != nil { t.Fatal(err) } other, err := repo.CurrentUser(ctx, outsider) if err != nil { t.Fatal(err) } defer repo.UpdateDisplayName(ctx, owner, before.Accounts[0].DisplayName) if err := repo.UpdateDisplayName(ctx, owner, "测试家人"); err != nil { t.Fatal(err) } after, err := repo.CurrentUser(ctx, owner) if err != nil || after.Accounts[0].DisplayName != "测试家人" { t.Fatalf("nickname not saved: %v", err) } unchanged, err := repo.CurrentUser(ctx, outsider) if err != nil || unchanged.Accounts[0].DisplayName != other.Accounts[0].DisplayName { t.Fatal("another identity was modified") } if err := repo.UpdateDisplayName(ctx, Principal{}, "其他"); !errors.Is(err, ErrAccessDenied) { t.Fatalf("empty principal accepted: %v", err) } }