60 lines
1.8 KiB
Go
60 lines
1.8 KiB
Go
package composeedit
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestPatchPreservesUnknownAndComments(t *testing.T) {
|
|
src := "# top\nservices:\n app:\n image: nginx:old # keep\n x-future:\n magic: true\n deploy:\n replicas: 2\n"
|
|
out, e := Apply(src, Patch{Path: []string{"services", "app", "image"}, Value: "nginx:new"})
|
|
if e != nil {
|
|
t.Fatal(e)
|
|
}
|
|
if !strings.Contains(out, "x-future:") || !strings.Contains(out, "magic: true") || !strings.Contains(out, "replicas: 2") || !strings.Contains(out, "# top") {
|
|
t.Fatalf("preservation failed:\n%s", out)
|
|
}
|
|
r, e := Parse(out)
|
|
if e != nil || r.Value == nil {
|
|
t.Fatalf("parse %v", e)
|
|
}
|
|
}
|
|
func TestArrayPatch(t *testing.T) {
|
|
src := "services:\n app:\n ports:\n - 8080:80\n"
|
|
out, e := Apply(src, Patch{Path: []string{"services", "app", "ports", "0"}, Value: "9090:80"})
|
|
if e != nil {
|
|
t.Fatal(e)
|
|
}
|
|
if !strings.Contains(out, "9090:80") {
|
|
t.Fatal(out)
|
|
}
|
|
}
|
|
|
|
func TestAddTopLevelNamedVolumePreservesServiceMounts(t *testing.T) {
|
|
src := "services:\n app:\n volumes:\n - db_data:/var/lib/db\n - /srv/app:/data:ro\n x-future: keep\n"
|
|
out, err := Apply(src, Patch{Path: []string{"volumes", "db_data"}, Value: map[string]any{}})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, want := range []string{"db_data:/var/lib/db", "/srv/app:/data:ro", "x-future: keep", "volumes:", "db_data:"} {
|
|
if !strings.Contains(out, want) {
|
|
t.Fatalf("expected %q to be preserved/added:\n%s", want, out)
|
|
}
|
|
}
|
|
parsed, err := Parse(out)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
root, ok := parsed.Value.(map[string]any)
|
|
if !ok {
|
|
t.Fatalf("unexpected parse result %#v", parsed.Value)
|
|
}
|
|
vols, ok := root["volumes"].(map[string]any)
|
|
if !ok {
|
|
t.Fatalf("top-level volumes missing: %#v", root["volumes"])
|
|
}
|
|
if _, ok := vols["db_data"]; !ok {
|
|
t.Fatalf("db_data declaration missing: %#v", vols)
|
|
}
|
|
}
|