Complete forge delivery regression coverage

This commit is contained in:
2026-11-01 18:30:52 +00:00
parent 2e617db23c
commit c3f6eeb6df
12 changed files with 575 additions and 1686 deletions

View File

@@ -400,10 +400,56 @@ func TestBackendUploadAssetPreservesCancellationAsUncertain(t *testing.T) {
}
}
func TestBackendUploadAssetWaitsForMultipartWriterAfterReaderFailure(t *testing.T) {
readerErr := errors.New("asset reader failed")
readDone := make(chan struct{})
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodGet && r.URL.Path == "/api/v1/repos/owner/project/releases/tags/v1.2.3" {
_ = json.NewEncoder(w).Encode(releaseResponse{ID: 10, TagName: "v1.2.3"})
return
}
_, _ = io.Copy(io.Discard, r.Body)
_ = json.NewEncoder(w).Encode(assetResponse{ID: 50, Name: "app.bin", Size: 0})
}))
defer server.Close()
backend := NewBackend(testDestination(server.URL), server.Client())
release, err := backend.FindRelease(context.Background(), "v1.2.3")
if err != nil {
t.Fatalf("FindRelease() error = %v", err)
}
evidence, err := backend.UploadAsset(context.Background(), release.Handle, "app.bin", failingUploadReader{err: readerErr, done: readDone})
select {
case <-readDone:
default:
t.Fatal("UploadAsset() returned before the multipart worker finished reading")
}
if !errors.Is(err, readerErr) {
t.Fatalf("UploadAsset() error = %v, want reader cause %v", err, readerErr)
}
if !evidence.Attempted || evidence.Disposition != forge.WriteUncertain {
t.Fatalf("UploadAsset() evidence = %#v, want uncertain attempted write", evidence)
}
}
type failingUploadReader struct {
err error
done chan struct{}
}
func (reader failingUploadReader) Read([]byte) (int, error) {
close(reader.done)
return 0, reader.err
}
func validCreateReleaseRequest() forge.CreateReleaseRequest {
return forge.CreateReleaseRequest{Tag: "v1.2.3", Commit: strings.Repeat("a", 40), Title: "Release", Body: "# Release"}
}
func testDestination(baseURL string) Destination {
return Destination{BaseURL: baseURL, Owner: "owner", Repository: "project", Token: "fixture-secret-token"}
}
type trackedReader struct {
io.Reader
closed bool