Add invocation-owned Cobra sessions
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package cobra
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -179,3 +180,47 @@ func TestSelectedPathsResolveThroughBackendParents(t *testing.T) {
|
||||
t.Fatalf("root usage failed: %v", failure)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSessionReusesTreeForParseHelpAndUsageWithFreshState(t *testing.T) {
|
||||
tree := &Command{Name: "app", Children: []*Command{{Name: "run", Runnable: true, Flags: []Flag{{Name: "value"}}}}}
|
||||
var output, errors bytes.Buffer
|
||||
session := Prepare(tree, ParseOptions{Context: context.Background(), Out: &output, Err: &errors})
|
||||
first := session.Parse([]string{"run", "--value=old"})
|
||||
if first.Failure != nil || !reflect.DeepEqual(first.FlagValues, [][]string{{"old"}}) {
|
||||
t.Fatalf("first session parse = %#v", first)
|
||||
}
|
||||
help, failure := session.RenderHelp([]string{"run"})
|
||||
if failure != nil || !strings.Contains(help, "run") {
|
||||
t.Fatalf("session help = %q, %v", help, failure)
|
||||
}
|
||||
line, failure := session.UsageLine([]string{"run"})
|
||||
if failure != nil || !strings.Contains(line, "run") {
|
||||
t.Fatalf("session usage = %q, %v", line, failure)
|
||||
}
|
||||
if output.Len() != 0 || errors.Len() != 0 {
|
||||
t.Fatalf("help escaped session delivery control: out=%q err=%q", output.String(), errors.String())
|
||||
}
|
||||
|
||||
var secondOutput, secondErrors bytes.Buffer
|
||||
second := Prepare(tree, ParseOptions{Context: context.Background(), Out: &secondOutput, Err: &secondErrors})
|
||||
secondResult := second.Parse([]string{"run"})
|
||||
if secondResult.Failure != nil || !reflect.DeepEqual(secondResult.FlagValues, [][]string{nil}) {
|
||||
t.Fatalf("fresh session state = %#v", secondResult)
|
||||
}
|
||||
if output.Len() != 0 || errors.Len() != 0 || secondOutput.Len() != 0 || secondErrors.Len() != 0 {
|
||||
t.Fatal("prepared session streams were unexpectedly used")
|
||||
}
|
||||
}
|
||||
|
||||
func TestMissingSessionTreeReturnsNeutralFailures(t *testing.T) {
|
||||
session := Prepare(nil, ParseOptions{})
|
||||
if result := session.Parse(nil); result.Failure == nil || result.Failure.Message != "command tree is nil" {
|
||||
t.Fatalf("missing-tree parse = %#v", result)
|
||||
}
|
||||
if _, failure := session.RenderHelp(nil); failure == nil || failure.Message != "command tree is nil" {
|
||||
t.Fatalf("missing-tree help failure = %#v", failure)
|
||||
}
|
||||
if _, failure := session.UsageLine(nil); failure == nil || failure.Message != "command tree is nil" {
|
||||
t.Fatalf("missing-tree usage failure = %#v", failure)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user