package main import ( "bytes" "context" "io" "testing" commandkit "gitea.maximumdirect.net/eric/CommandKit" "gitea.maximumdirect.net/eric/CommandKit/integrations/ckconfig" "go.yaml.in/yaml/v4" ) func TestSimpleAppComparesFixturesAndKeepsDefaultCommands(t *testing.T) { app, err := newApp() if err != nil { t.Fatal(err) } var output bytes.Buffer outcome := app.Execute(context.Background(), []string{"config", "diff", "--config", "fixtures/before.yml", "--against-config", "fixtures/after.yml"}, commandkit.Streams{Out: &output, Err: io.Discard}) if outcome.Kind != commandkit.OutcomeSuccess { t.Fatalf("fixture comparison outcome = %#v", outcome) } var report yaml.Node if err := yaml.Unmarshal(output.Bytes(), &report); err != nil { t.Fatalf("comparison report is not YAML: %q: %v", output.String(), err) } changes := field(report.Content[0], "changes") greeting := field(changes, "greeting") if greeting == nil || greeting.Value != "Goodbye" { t.Fatalf("fixture comparison report = %q", output.String()) } output.Reset() outcome = app.Execute(context.Background(), []string{"config", "diff", "--config", "fixtures/before.yml", "--against-config", "fixtures/before.yml"}, commandkit.Streams{Out: &output, Err: io.Discard}) if outcome.Kind != commandkit.OutcomeSuccess { t.Fatalf("equal fixture comparison outcome = %#v", outcome) } if reportNode, err := decodeReport(output.Bytes()); err != nil || len(field(reportNode, "additions").Content) != 0 || len(field(reportNode, "changes").Content) != 0 || len(field(reportNode, "deletions").Content) != 0 { t.Fatalf("equal fixture report = %q, decode error %v", output.String(), err) } output.Reset() outcome = app.Execute(context.Background(), []string{"config", "show"}, commandkit.Streams{Out: &output, Err: io.Discard}) if outcome.Kind != commandkit.OutcomeSuccess || output.String() != "greeting: Hello\n" { t.Fatalf("default show outcome/output = %#v / %q", outcome, output.String()) } output.Reset() outcome = app.Execute(context.Background(), []string{"greet"}, commandkit.Streams{Out: &output, Err: io.Discard}) if outcome.Kind != commandkit.OutcomeSuccess || len(output.String()) == 0 || output.String()[:5] != "Hello" { t.Fatalf("default greeting outcome/output = %#v / %q", outcome, output.String()) } } func TestSimpleLoaderDoesNotReplaceExplicitEmptyConfiguration(t *testing.T) { _, err := loadAppConfiguration(context.Background(), ckconfig.Selection{Config: commandkit.Supplied[string]{Set: true}}) if err == nil { t.Fatal("explicit empty configuration fell back to the default source") } } func field(mapping *yaml.Node, name string) *yaml.Node { if mapping == nil || mapping.Kind != yaml.MappingNode { return nil } for index := 0; index+1 < len(mapping.Content); index += 2 { if mapping.Content[index].Value == name { return mapping.Content[index+1] } } return nil } func decodeReport(data []byte) (*yaml.Node, error) { var document yaml.Node if err := yaml.Unmarshal(data, &document); err != nil { return nil, err } return document.Content[0], nil }