diff --git a/cmd/runner/runner.go b/cmd/runner/runner.go index 72424c1b6..e620b53b3 100644 --- a/cmd/runner/runner.go +++ b/cmd/runner/runner.go @@ -15,7 +15,12 @@ type runnerOpts struct { r running } -func NewCommand(config *settings.Config, preRunE validator.Validator) *cobra.Command { +func NewCommand(rootConfig *settings.Config, preRunE validator.Validator) *cobra.Command { + // The runner API versioning is decoupled from the other Circle APIs. Here we make a copy of the root configuration, + // and update the rest endpoint accordingly + config := *rootConfig + config.RestEndpoint = "/api/v3" + var opts runnerOpts cmd := &cobra.Command{ Use: "runner", @@ -27,7 +32,7 @@ func NewCommand(config *settings.Config, preRunE validator.Validator) *cobra.Com } else { host = config.Host } - opts.r = runner.New(rest.NewFromConfig(host, config)) + opts.r = runner.New(rest.NewFromConfig(host, &config)) }, } diff --git a/cmd/runner/runner_test.go b/cmd/runner/runner_test.go new file mode 100644 index 000000000..cfef51286 --- /dev/null +++ b/cmd/runner/runner_test.go @@ -0,0 +1,31 @@ +package runner + +import ( + "net/http" + "net/http/httptest" + "testing" + + "gotest.tools/v3/assert" + "gotest.tools/v3/assert/cmp" + + "github.com/CircleCI-Public/circleci-cli/settings" +) + +func Test_NewCommand(t *testing.T) { + t.Run("Runner uses /api/v3", func(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Check(t, cmp.Equal(r.URL.EscapedPath(), "/api/v3/runner")) + + w.Header().Set("Content-Type", "application/json") + _, err := w.Write([]byte(`{"items":[]}`)) + assert.NilError(t, err) + w.WriteHeader(http.StatusOK) + })) + t.Cleanup(server.Close) + + cmd := NewCommand(&settings.Config{Host: server.URL, HTTPClient: &http.Client{}}, nil) + cmd.SetArgs([]string{"instance", "ls", "my-namespace"}) + err := cmd.Execute() + assert.NilError(t, err) + }) +}