67 lines
2.9 KiB
Go
67 lines
2.9 KiB
Go
package ckconfig
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"io"
|
|
"strings"
|
|
"testing"
|
|
|
|
commandkit "gitea.maximumdirect.net/eric/CommandKit"
|
|
configkit "gitea.maximumdirect.net/eric/ConfigKit"
|
|
)
|
|
|
|
func TestCompletionUsesInstalledScopeCapabilitiesWithoutAcquisition(t *testing.T) {
|
|
var inputs, states, acquisitions, comparisons int
|
|
suite := Suite[struct{}, struct{}]{
|
|
NewInput: func() struct{} { inputs++; return struct{}{} },
|
|
NewState: func() struct{} { states++; return struct{}{} },
|
|
Scopes: []Scope[struct{}, struct{}]{
|
|
{Name: "app", Operations: []Operation{Diff}, Compare: func(context.Context, ComparisonRequest[struct{}], struct{}) (commandkit.Acquired[[]configkit.Difference], error) {
|
|
comparisons++
|
|
return commandkit.Acquired[[]configkit.Difference]{}, nil
|
|
}},
|
|
{Name: "other", Operations: []Operation{Validate}, Acquire: func(context.Context, Request, struct{}, struct{}) (commandkit.Acquired[View], error) {
|
|
acquisitions++
|
|
return commandkit.Acquired[View]{}, nil
|
|
}},
|
|
},
|
|
}
|
|
app, err := commandkit.New(commandkit.Identity{Name: "example"}, Command(suite), commandkit.Completion("example"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, tc := range []struct {
|
|
args []string
|
|
contains, omit string
|
|
}{
|
|
{[]string{"__complete", "config", "diff", "--scope="}, "app\n", "other\n"},
|
|
{[]string{"__complete", "config", "validate", "--scope="}, "other\n", "all\n"},
|
|
{[]string{"__complete", "config", "diff", "--format="}, "yaml\n", "text\n"},
|
|
{[]string{"__complete", "config", "validate", "--format="}, "text\n", "invalid\n"},
|
|
{[]string{"__complete", "config", "diff", "--against-config=fixtures/"}, ":0\n", ":4\n"},
|
|
} {
|
|
var output bytes.Buffer
|
|
outcome := app.Execute(context.Background(), tc.args, commandkit.Streams{Out: &output, Err: io.Discard})
|
|
if outcome.Status != 0 || !strings.Contains(output.String(), tc.contains) || strings.Contains(output.String(), tc.omit) {
|
|
t.Fatalf("query %q outcome=%#v output=%q", tc.args, outcome, output.String())
|
|
}
|
|
}
|
|
allSuite := Suite[struct{}, struct{}]{Scopes: []Scope[struct{}, struct{}]{
|
|
{Name: "app", Operations: []Operation{Validate}, Acquire: suite.Scopes[1].Acquire},
|
|
{Name: "other", Operations: []Operation{Validate}, Acquire: suite.Scopes[1].Acquire},
|
|
}}
|
|
allApp, err := commandkit.New(commandkit.Identity{Name: "example"}, Command(allSuite), commandkit.Completion("example"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var allOutput bytes.Buffer
|
|
allOutcome := allApp.Execute(context.Background(), []string{"__complete", "config", "validate", "--scope="}, commandkit.Streams{Out: &allOutput})
|
|
if allOutcome.Status != 0 || !strings.Contains(allOutput.String(), "all\n") {
|
|
t.Fatalf("all-scope query outcome=%#v output=%q", allOutcome, allOutput.String())
|
|
}
|
|
if inputs != 0 || states != 0 || acquisitions != 0 || comparisons != 0 {
|
|
t.Fatalf("completion ran suite work: %d %d %d %d", inputs, states, acquisitions, comparisons)
|
|
}
|
|
}
|