72 lines
2.8 KiB
Go
72 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
"go.maximumdirect.net/releasekit/cmd/releasekit/internal/cli"
|
|
)
|
|
|
|
func TestDeliveryFailureStatusesRespectPhase(t *testing.T) {
|
|
for _, test := range []struct {
|
|
name, rejectedPath, state string
|
|
cancelWrite bool
|
|
status int
|
|
}{
|
|
{name: "preflight authorization", rejectedPath: "/api/v1/repos/owner/example", state: "not_attempted", status: 2},
|
|
{name: "later authorization", rejectedPath: "/api/v1/repos/owner/example/tags/v1.2.3", state: "not_attempted", status: 1},
|
|
{name: "canceled unresolved write", cancelWrite: true, state: "unknown", status: 3},
|
|
} {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
repository := newCLIRepository(t)
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
var commit string
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if r.URL.Path == test.rejectedPath {
|
|
http.Error(w, "rejected credential", http.StatusUnauthorized)
|
|
return
|
|
}
|
|
switch r.URL.Path {
|
|
case "/api/v1/repos/owner/example", "/api/v1/repositories/1":
|
|
_ = json.NewEncoder(w).Encode(map[string]any{"id": 1, "name": "example", "full_name": "owner/example", "owner": map[string]string{"login": "owner"}})
|
|
case "/api/v1/repos/owner/example/tags/v1.2.3":
|
|
_ = json.NewEncoder(w).Encode(map[string]any{"commit": map[string]string{"sha": commit}})
|
|
case "/api/v1/repos/owner/example/releases/tags/v1.2.3":
|
|
http.NotFound(w, r)
|
|
case "/api/v1/repos/owner/example/releases":
|
|
if r.Method != http.MethodPost || !test.cancelWrite {
|
|
t.Errorf("unexpected release write: %s", r.Method)
|
|
}
|
|
cancel()
|
|
http.Error(w, "unacknowledged write", http.StatusServiceUnavailable)
|
|
default:
|
|
t.Errorf("unexpected request: %s", r.URL.Path)
|
|
http.NotFound(w, r)
|
|
}
|
|
}))
|
|
defer server.Close()
|
|
writeDeliveryProfile(t, repository, cli.Settings{
|
|
Product: "Example Product",
|
|
Delivery: &cli.DeliverySettings{Forge: "gitea", BaseURL: server.URL, Owner: "owner", Repository: "example"},
|
|
})
|
|
commit = cliGitOutput(t, repository, "rev-parse", "HEAD")
|
|
cliGitRun(t, repository, "tag", "v1.2.3")
|
|
t.Setenv("RELEASEKIT_GITEA_TOKEN", "fixture-token")
|
|
var stdout, stderr bytes.Buffer
|
|
status := run(ctx, []string{"deliver", "--repo", repository, "v1.2.3"}, &stdout, &stderr)
|
|
if status != test.status || !strings.Contains(stderr.String(), "state="+test.state) {
|
|
t.Fatalf("status=%d stderr=%q, want status %d and state %s", status, stderr.String(), test.status, test.state)
|
|
}
|
|
if test.cancelWrite && !strings.Contains(stderr.String(), context.Canceled.Error()) {
|
|
t.Fatalf("cancellation cause missing: %s", stderr.String())
|
|
}
|
|
})
|
|
}
|
|
}
|