package user import ( "context" "errors" "path/filepath" "testing" "polar/internal/db" ) func TestValidateUsername(t *testing.T) { valid := []string{"alice", "rin", "dev_01", "git-user-99", "ab"} for _, u := range valid { if err := ValidateUsername(u); err != nil { t.Errorf("expected username %q to be valid, got %v", u, err) } } invalid := []string{ "", "a", "-alice", "alice-", "alice..dev", "../etc", "foo/bar", `foo\bar`, "repo.git", "admin", "login", "register", "settings", "_ui", "healthz", "explore", "alice--user", } for _, u := range invalid { if err := ValidateUsername(u); err == nil { t.Errorf("expected username %q to be rejected", u) } } } func TestFirstUserAdminAndRegistrationToggle(t *testing.T) { ctx := context.Background() database, err := db.Open(ctx, filepath.Join(t.TempDir(), "users.db"), true) if err != nil { t.Fatalf("open db: %v", err) } defer database.Close() svc := NewService(database) // First user becomes admin even if regEnabled is false first, err := svc.Register(ctx, "alice", "alice@example.com", "supersecret123", false) if err != nil { t.Fatalf("Register first user failed: %v", err) } if !first.IsAdmin { t.Fatalf("expected first registered user to be admin") } // Second user when regEnabled is false must fail _, err = svc.Register(ctx, "bob", "bob@example.com", "supersecret123", false) if !errors.Is(err, ErrRegistrationDisabled) { t.Fatalf("expected ErrRegistrationDisabled, got %v", err) } // Second user when regEnabled is true succeeds and is NOT admin second, err := svc.Register(ctx, "bob", "bob@example.com", "supersecret123", true) if err != nil { t.Fatalf("Register second user failed: %v", err) } if second.IsAdmin { t.Fatalf("expected second user NOT to be admin") } // Authenticate by username and email if _, err := svc.Authenticate(ctx, "alice", "supersecret123"); err != nil { t.Fatalf("Authenticate by username failed: %v", err) } if _, err := svc.Authenticate(ctx, "ALICE@example.com", "supersecret123"); err != nil { t.Fatalf("Authenticate by email failed: %v", err) } if _, err := svc.Authenticate(ctx, "alice", "wrongpassword"); err == nil { t.Fatalf("expected error for wrong password") } }