package main import ( "bytes" "context" "errors" "os" "os/exec" "path/filepath" "testing" "gitea.maximumdirect.net/eric/ReleaseKit/cmd/releasekit/internal/cli" ) func TestCandidateCheckUsesCommittedDeclarationSymlink(t *testing.T) { repository := newCLIRepository(t) if err := os.Rename(filepath.Join(repository, "go.mod"), filepath.Join(repository, "module.txt")); err != nil { t.Fatal(err) } if err := os.Symlink("module.txt", filepath.Join(repository, "go.mod")); err != nil { t.Fatal(err) } writeDeliveryProfile(t, repository, cli.Settings{Product: "Example Product"}) cliGitRun(t, repository, "add", ".") cliGitRun(t, repository, "commit", "-m", "Use committed declaration symlink") var stdout, stderr bytes.Buffer if status := run(context.Background(), []string{"check", "--repo", repository, "v1.2.3"}, &stdout, &stderr); status != 0 { t.Fatalf("linked declaration check status=%d stderr=%s", status, stderr.String()) } } func TestPageOnlyDeliveryUsesCommittedModuleInSparseCheckout(t *testing.T) { repository := newCLIRepository(t) const module = "apps/widget" writeRepositoryFile(t, repository, module+"/go.mod", "module example.com/widget\n\ngo 1.26.0\n") writeRepositoryFile(t, repository, module+"/docs/releases/v1.2.3.md", "# Example Product v1.2.3\n\nNested release note.\n") cliGitRun(t, repository, "add", ".") cliGitRun(t, repository, "commit", "-m", "Add sparse release module") state := &deliveryServerState{tag: module + "/v1.2.3"} server := newDeliveryServer(t, state) defer server.Close() writeDeliveryProfile(t, repository, cli.Settings{Product: "Example Product", ModuleDir: module, Delivery: &cli.DeliverySettings{BaseURL: server.URL, Owner: "owner", Repository: "example"}, }) state.commit = cliGitOutput(t, repository, "rev-parse", "HEAD") cliGitRun(t, repository, "tag", state.tag) cliGitRun(t, repository, "checkout", "--detach", state.tag) cliGitRun(t, repository, "sparse-checkout", "set", "--cone", "docs") if _, err := os.Stat(filepath.Join(repository, filepath.FromSlash(module))); !errors.Is(err, os.ErrNotExist) { t.Fatalf("module fixture is materialized: %v", err) } t.Setenv("RELEASEKIT_GITEA_TOKEN", "fixture-token") gitOnly := t.TempDir() gitPath, err := exec.LookPath("git") if err != nil { t.Fatal(err) } if err := os.Symlink(gitPath, filepath.Join(gitOnly, "git")); err != nil { t.Fatal(err) } t.Setenv("PATH", gitOnly) for _, args := range [][]string{ {"deliver", "--repo", repository, "v1.2.3"}, {"ci-deliver", "--repo", repository, "--prepared", "--expected-module", module, "--commit", state.commit, state.tag}, } { var stdout, stderr bytes.Buffer if status := run(context.Background(), args, &stdout, &stderr); status != 0 || state.releaseCreates != 1 || state.assetUploads != 0 { t.Fatalf("%s sparse delivery status=%d creates=%d uploads=%d stderr=%s", args[0], status, state.releaseCreates, state.assetUploads, stderr.String()) } } }