Improve the output for these validation errors:
- Removes the short command description from the output. This information
does not provide much useful help, and distracts from the error message.
- Reduces punctuation, and
- Prefixes the error message with the binary / root-command name
(usually `docker:`) to be consistent with other similar errors.
- Adds an empty line between the error-message and the "call to action"
(`Run 'docker volume --help'...` in the example below). This helps
separating the error message and "usage" from the call-to-action.
Before this patch:
$ docker volume ls one two three
"docker volume ls" accepts no arguments.
See 'docker volume ls --help'.
Usage: docker volume ls [OPTIONS]
List volumes
$ docker volume create one two three
"docker volume create" requires at most 1 argument.
See 'docker volume create --help'.
Usage: docker volume create [OPTIONS] [VOLUME]
Create a volume
With this patch:
$ docker volume ls one two three
docker: 'docker volume ls' accepts no arguments
Usage: docker volume ls [OPTIONS]
Run 'docker volume ls --help' for more information
$ docker voludocker volume create one two three
docker: 'docker volume create' requires at most 1 argument
Usage: docker volume create [OPTIONS] [VOLUME]
SRun 'docker volume create --help' for more information
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
78 lines
1.9 KiB
Go
78 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"io"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/docker/cli/cli/command"
|
|
"github.com/docker/cli/cli/debug"
|
|
"github.com/sirupsen/logrus"
|
|
"gotest.tools/v3/assert"
|
|
is "gotest.tools/v3/assert/cmp"
|
|
)
|
|
|
|
func TestClientDebugEnabled(t *testing.T) {
|
|
defer debug.Disable()
|
|
ctx, cancel := context.WithCancel(context.TODO())
|
|
defer cancel()
|
|
|
|
cli, err := command.NewDockerCli(command.WithBaseContext(ctx))
|
|
assert.NilError(t, err)
|
|
tcmd := newDockerCommand(cli)
|
|
tcmd.SetFlag("debug", "true")
|
|
cmd, _, err := tcmd.HandleGlobalFlags()
|
|
assert.NilError(t, err)
|
|
assert.NilError(t, tcmd.Initialize())
|
|
err = cmd.PersistentPreRunE(cmd, []string{})
|
|
assert.NilError(t, err)
|
|
assert.Check(t, is.Equal("1", os.Getenv("DEBUG")))
|
|
assert.Check(t, is.Equal(logrus.DebugLevel, logrus.GetLevel()))
|
|
}
|
|
|
|
var discard = io.NopCloser(bytes.NewBuffer(nil))
|
|
|
|
func runCliCommand(t *testing.T, r io.ReadCloser, w io.Writer, args ...string) error {
|
|
t.Helper()
|
|
if r == nil {
|
|
r = discard
|
|
}
|
|
if w == nil {
|
|
w = io.Discard
|
|
}
|
|
ctx, cancel := context.WithCancel(context.TODO())
|
|
defer cancel()
|
|
|
|
cli, err := command.NewDockerCli(
|
|
command.WithBaseContext(ctx),
|
|
command.WithInputStream(r),
|
|
command.WithCombinedStreams(w))
|
|
assert.NilError(t, err)
|
|
tcmd := newDockerCommand(cli)
|
|
|
|
tcmd.SetArgs(args)
|
|
cmd, _, err := tcmd.HandleGlobalFlags()
|
|
assert.NilError(t, err)
|
|
assert.NilError(t, tcmd.Initialize())
|
|
return cmd.Execute()
|
|
}
|
|
|
|
func TestExitStatusForInvalidSubcommandWithHelpFlag(t *testing.T) {
|
|
err := runCliCommand(t, nil, nil, "help", "invalid")
|
|
assert.Error(t, err, "unknown help topic: invalid")
|
|
}
|
|
|
|
func TestExitStatusForInvalidSubcommand(t *testing.T) {
|
|
err := runCliCommand(t, nil, nil, "invalid")
|
|
assert.Check(t, is.ErrorContains(err, "docker: unknown command: docker invalid"))
|
|
}
|
|
|
|
func TestVersion(t *testing.T) {
|
|
var b bytes.Buffer
|
|
err := runCliCommand(t, nil, &b, "--version")
|
|
assert.NilError(t, err)
|
|
assert.Check(t, is.Contains(b.String(), "Docker version"))
|
|
}
|