Complete forge delivery regression coverage
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user