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) } }