82 lines
3.0 KiB
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
|
||
|
|
}
|