e2e: cleanup TestGlobalHelp() to be less brittle

- remove check for "A self-sufficient runtime for containers"; really
  not important to check for.
- don't make the checks positional (just match that we find them, and
  that we don't find them multiple times)
- account for leading whitespace to change instead of hard-coding the
  number of spaces before output.
- change the badopt check; I think it should be sufficient to check
  that the bad option was printed and that "run --help" output is
  printed.

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Sebastiaan van Stijn 2022-03-26 17:54:40 +01:00
parent dd7397342a
commit bc2b48aaf2
No known key found for this signature in database
GPG Key ID: 76698F39D527CE8C
1 changed files with 17 additions and 43 deletions

View File

@ -1,9 +1,7 @@
package cliplugins package cliplugins
import ( import (
"bufio"
"regexp" "regexp"
"strings"
"testing" "testing"
"gotest.tools/v3/assert" "gotest.tools/v3/assert"
@ -21,7 +19,7 @@ func TestGlobalHelp(t *testing.T) {
ExitCode: 0, ExitCode: 0,
}) })
assert.Assert(t, is.Equal(res.Stderr(), "")) assert.Assert(t, is.Equal(res.Stderr(), ""))
scanner := bufio.NewScanner(strings.NewReader(res.Stdout())) output := res.Stdout()
// Instead of baking in the full current output of `docker // Instead of baking in the full current output of `docker
// help`, which can be expected to change regularly, bake in // help`, which can be expected to change regularly, bake in
@ -34,44 +32,20 @@ func TestGlobalHelp(t *testing.T) {
// - The `badmeta` plugin under the "Invalid Plugins" heading. // - The `badmeta` plugin under the "Invalid Plugins" heading.
// //
// Regexps are needed because the width depends on `unix.TIOCGWINSZ` or similar. // Regexps are needed because the width depends on `unix.TIOCGWINSZ` or similar.
helloworldre := regexp.MustCompile(`^ helloworld\*\s+A basic Hello World plugin for tests \(Docker Inc\., testing\)$`) for _, s := range []string{
badmetare := regexp.MustCompile(`^ badmeta\s+invalid metadata: invalid character 'i' looking for beginning of object key string$`) `Management Commands:`,
var helloworldcount, badmetacount int `\s+container\s+Manage containers`,
for _, expected := range []*regexp.Regexp{ `\s+helloworld\*\s+A basic Hello World plugin for tests \(Docker Inc\., testing\)`,
regexp.MustCompile(`^A self-sufficient runtime for containers$`), `\s+image\s+Manage images`,
regexp.MustCompile(`^Management Commands:$`), `Commands:`,
regexp.MustCompile(`^ container\s+Manage containers$`), `\s+create\s+Create a new container`,
helloworldre, `Invalid Plugins:`,
regexp.MustCompile(`^ image\s+Manage images$`), `\s+badmeta\s+invalid metadata: invalid character 'i' looking for beginning of object key string`,
regexp.MustCompile(`^Commands:$`),
regexp.MustCompile(`^ create\s+Create a new container$`),
regexp.MustCompile(`^Invalid Plugins:$`),
badmetare,
nil, // scan to end of input rather than stopping at badmetare
} { } {
var found bool expected := regexp.MustCompile(`(?m)^` + s + `$`)
for scanner.Scan() { matches := expected.FindAllString(output, -1)
text := scanner.Text() assert.Equal(t, len(matches), 1, "Did not find expected number of matches for %q in `docker help` output", expected)
if helloworldre.MatchString(text) {
helloworldcount++
} }
if badmetare.MatchString(text) {
badmetacount++
}
if expected != nil && expected.MatchString(text) {
found = true
break
}
}
assert.Assert(t, expected == nil || found, "Did not find match for %q in `docker help` output", expected)
}
// We successfully scanned all the input
assert.Assert(t, !scanner.Scan())
assert.NilError(t, scanner.Err())
// Plugins should only be listed once.
assert.Assert(t, is.Equal(helloworldcount, 1))
assert.Assert(t, is.Equal(badmetacount, 1))
// Running with `--help` should produce the same. // Running with `--help` should produce the same.
t.Run("help_flag", func(t *testing.T) { t.Run("help_flag", func(t *testing.T) {
@ -79,7 +53,7 @@ func TestGlobalHelp(t *testing.T) {
res2.Assert(t, icmd.Expected{ res2.Assert(t, icmd.Expected{
ExitCode: 0, ExitCode: 0,
}) })
assert.Assert(t, is.Equal(res2.Stdout(), res.Stdout())) assert.Assert(t, is.Equal(res2.Stdout(), output))
assert.Assert(t, is.Equal(res2.Stderr(), "")) assert.Assert(t, is.Equal(res2.Stderr(), ""))
}) })
@ -90,7 +64,7 @@ func TestGlobalHelp(t *testing.T) {
ExitCode: 0, ExitCode: 0,
}) })
assert.Assert(t, is.Equal(res2.Stdout(), "")) assert.Assert(t, is.Equal(res2.Stdout(), ""))
assert.Assert(t, is.Equal(res2.Stderr(), res.Stdout())) assert.Assert(t, is.Equal(res2.Stderr(), output))
}) })
t.Run("badopt", func(t *testing.T) { t.Run("badopt", func(t *testing.T) {
@ -103,7 +77,7 @@ func TestGlobalHelp(t *testing.T) {
ExitCode: 125, ExitCode: 125,
}) })
assert.Assert(t, is.Equal(res2.Stdout(), "")) assert.Assert(t, is.Equal(res2.Stdout(), ""))
exp := "unknown flag: --badopt\nSee 'docker --help'.\n" + res.Stdout() + "\n" assert.Assert(t, is.Contains(res2.Stderr(), "unknown flag: --badopt"))
assert.Assert(t, is.Equal(res2.Stderr(), exp)) assert.Assert(t, is.Contains(res2.Stderr(), "See 'docker --help"))
}) })
} }