Files
commandkit/integrations/ckconfig/examples/simple/main_test.go

82 lines
3.0 KiB
Go

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
}