package repo import ( "context" "os" "path/filepath" "testing" "polar/internal/db" "polar/internal/user" ) func TestValidateRepoName(t *testing.T) { valid := []string{"alice", "my-repo_1", "v1.0.0", "x", "core.go"} for _, n := range valid { if err := ValidateRepoName(n); err != nil { t.Errorf("expected repo name %q to be valid, got %v", n, err) } } invalid := []string{ "", ".", "..", ".hidden", "-dash", "repo.git", "repo.lock", "repo.", "a..b", "foo/bar", `foo\bar`, "settings", "commits", "commit", "tree", "blob", "raw", "info", "git-upload-pack", } for _, n := range invalid { if err := ValidateRepoName(n); err == nil { t.Errorf("expected repo name %q to be rejected", n) } } } func TestRepoCRUDAndAccessControl(t *testing.T) { ctx := context.Background() tmp := t.TempDir() database, err := db.Open(ctx, filepath.Join(tmp, "repo.db"), true) if err != nil { t.Fatalf("open db: %v", err) } defer database.Close() userSvc := user.NewService(database) owner, err := userSvc.Register(ctx, "alice", "alice@example.com", "password123", true) if err != nil { t.Fatalf("register owner: %v", err) } stranger, err := userSvc.Register(ctx, "bob", "bob@example.com", "password123", true) if err != nil { t.Fatalf("register stranger: %v", err) } repoSvc := NewService(database, filepath.Join(tmp, "repos")) privRepo, err := repoSvc.Create(ctx, owner, "secret-notes", "Private repo", true) if err != nil { t.Fatalf("Create private repo failed: %v", err) } // Verify bare git repository exists on disk diskPath, err := repoSvc.DiskPath(owner.Username, privRepo.Name) if err != nil { t.Fatalf("DiskPath failed: %v", err) } if _, err := os.Stat(filepath.Join(diskPath, "HEAD")); err != nil { t.Fatalf("expected bare repo HEAD on disk: %v", err) } // Private repo access checks if repoSvc.CanRead(ctx, privRepo, nil) { t.Fatalf("anonymous user must NOT read private repo") } if repoSvc.CanRead(ctx, privRepo, stranger) { t.Fatalf("other regular user must NOT read private repo") } if !repoSvc.CanRead(ctx, privRepo, owner) { t.Fatalf("owner must read private repo") } if !repoSvc.CanWrite(ctx, privRepo, owner) || repoSvc.CanWrite(ctx, privRepo, stranger) { t.Fatalf("unexpected CanWrite result") } // Rename repository if err := repoSvc.Rename(ctx, privRepo, "renamed-notes"); err != nil { t.Fatalf("Rename failed: %v", err) } newDiskPath, _ := repoSvc.DiskPath(owner.Username, "renamed-notes") if _, err := os.Stat(filepath.Join(newDiskPath, "HEAD")); err != nil { t.Fatalf("expected renamed bare repo on disk: %v", err) } // Delete repository if err := repoSvc.Delete(ctx, privRepo); err != nil { t.Fatalf("Delete failed: %v", err) } if _, err := os.Stat(newDiskPath); !os.IsNotExist(err) { t.Fatalf("expected bare repo directory to be deleted from disk") } }