package spindle
import (
"context"
"io"
"log/slog"
"path/filepath"
"strings"
"testing"
"github.com/bluesky-social/indigo/atproto/syntax"
"tangled.org/core/spindle/config"
"tangled.org/core/spindle/db"
"tangled.org/core/spindle/models"
"tangled.org/core/workflow"
)
func TestRunPipelineAnswersNoIdForAPipelineItFailedToEnqueue(t *testing.T) {
src := newSourceRepo(t, "sha1")
writeTestFile(t, filepath.Join(src, ".tangled/workflows/ci.yaml"), "engine: dummy\nwhen:\n - event: push\n branch: main\nsteps:\n - name: build\n command: \"true\"\n")
commitEverything(t, src)
sha := gitInDir(t, src, "rev-parse", "HEAD")
d, err := db.Make(context.Background(), filepath.Join(t.TempDir(), "spindle.db"))
if err != nil {
t.Fatal(err)
}
t.Cleanup(func() { d.Close() })
const repoDid = syntax.DID("did:plc:runpipeline")
if err := d.AddRepo(db.Repo{Knot: "knot.example.com", Owner: "did:plc:owner", Rkey: "repo", RepoDid: repoDid}); err != nil {
t.Fatal(err)
}
cfg := &config.Config{}
cfg.Server.Admission = config.AdmissionOpen
s := &Spindle{db: d, cfg: cfg, l: slog.New(slog.NewTextHandler(io.Discard, nil)), rootCtx: context.Background()}
repoStr := repoDid.String()
trigger := workflow.TriggerMetadata{
Kind: "push",
Push: &workflow.PushTriggerData{NewSha: sha, OldSha: strings.Repeat("0", 40), Ref: "refs/heads/main"},
Repo: &workflow.TriggerRepo{Did: "did:plc:owner", Knot: "knot.example.com", RepoDid: &repoStr, DefaultBranch: "main"},
}
run := func() (models.PipelineId, error) {
return s.runPipeline(context.Background(), "same-id", repoDid, trigger, nil, src, filepath.Join(t.TempDir(), "checkout"), sha, nil, nil, false)
}
if id, err := run(); err != nil || id != "same-id" {
t.Fatalf("first run = %q, %v, want its id", id, err)
}
if id, err := run(); err == nil || id != "" {
t.Fatalf("second run = %q, %v, want an error and no id", id, err)
}
}