Fix YAML patch in some cases #1626
This commit is contained in:
+99
-136
@@ -7,140 +7,103 @@ import (
|
||||
)
|
||||
|
||||
func TestPatch(t *testing.T) {
|
||||
b := []byte(`# prefix`)
|
||||
|
||||
// 1. Add first
|
||||
b, err := Patch(b, "camera1", "url1", "streams")
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Equal(t, `# prefix
|
||||
streams:
|
||||
camera1: url1
|
||||
`, string(b))
|
||||
|
||||
// 2. Add second
|
||||
b, err = Patch(b, "camera2", []string{"url2", "url3"}, "streams")
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Equal(t, `# prefix
|
||||
streams:
|
||||
camera1: url1
|
||||
camera2:
|
||||
- url2
|
||||
- url3
|
||||
`, string(b))
|
||||
|
||||
// 3. Replace first
|
||||
b, err = Patch(b, "camera1", "url4", "streams")
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Equal(t, `# prefix
|
||||
streams:
|
||||
camera1: url4
|
||||
camera2:
|
||||
- url2
|
||||
- url3
|
||||
`, string(b))
|
||||
|
||||
// 4. Replace second
|
||||
b, err = Patch(b, "camera2", "url5", "streams")
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Equal(t, `# prefix
|
||||
streams:
|
||||
camera1: url4
|
||||
camera2: url5
|
||||
`, string(b))
|
||||
|
||||
// 5. Delete first
|
||||
b, err = Patch(b, "camera1", nil, "streams")
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Equal(t, `# prefix
|
||||
streams:
|
||||
camera2: url5
|
||||
`, string(b))
|
||||
}
|
||||
|
||||
func TestPatchParings(t *testing.T) {
|
||||
b := []byte(`homekit:
|
||||
camera1:
|
||||
pin: 123-45-678
|
||||
streams:
|
||||
camera1: url1
|
||||
`)
|
||||
|
||||
// 1. Add new key
|
||||
pairings := []string{"client1", "client2"}
|
||||
|
||||
b, err := Patch(b, "pairings", pairings, "homekit", "camera1")
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Equal(t, `homekit:
|
||||
camera1:
|
||||
pin: 123-45-678
|
||||
pairings:
|
||||
- client1
|
||||
- client2
|
||||
streams:
|
||||
camera1: url1
|
||||
`, string(b))
|
||||
}
|
||||
|
||||
func TestPatch2(t *testing.T) {
|
||||
b := []byte(`streams:
|
||||
camera1:
|
||||
- url1
|
||||
- url2
|
||||
`)
|
||||
|
||||
b, err := Patch(b, "camera2", "url3", "streams")
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Equal(t, `streams:
|
||||
camera1:
|
||||
- url1
|
||||
- url2
|
||||
camera2: url3
|
||||
`, string(b))
|
||||
}
|
||||
|
||||
func TestNoNewLineEnd1(t *testing.T) {
|
||||
b := []byte(`streams:
|
||||
camera1: url4
|
||||
camera2:
|
||||
- url2
|
||||
- url3`)
|
||||
|
||||
b, err := Patch(b, "camera2", "url5", "streams")
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Equal(t, `streams:
|
||||
camera1: url4
|
||||
camera2: url5
|
||||
`, string(b))
|
||||
}
|
||||
|
||||
func TestNoNewLineEnd2(t *testing.T) {
|
||||
b := []byte(`streams:
|
||||
camera1: url1
|
||||
homekit:
|
||||
camera1:
|
||||
pin: 123-45-678`)
|
||||
|
||||
// 1. Add new key
|
||||
pairings := []string{"client1", "client2"}
|
||||
|
||||
b, err := Patch(b, "pairings", pairings, "homekit", "camera1")
|
||||
require.Nil(t, err)
|
||||
|
||||
require.Equal(t, `streams:
|
||||
camera1: url1
|
||||
homekit:
|
||||
camera1:
|
||||
pin: 123-45-678
|
||||
pairings:
|
||||
- client1
|
||||
- client2
|
||||
`, string(b))
|
||||
tests := []struct {
|
||||
name string
|
||||
src string
|
||||
path []string
|
||||
value any
|
||||
expect string
|
||||
}{
|
||||
{
|
||||
name: "empty config",
|
||||
src: "",
|
||||
path: []string{"streams", "camera1"},
|
||||
value: "val1",
|
||||
expect: "streams:\n camera1: val1\n",
|
||||
},
|
||||
{
|
||||
name: "empty main key",
|
||||
src: "#dummy",
|
||||
path: []string{"streams", "camera1"},
|
||||
value: "val1",
|
||||
expect: "#dummy\nstreams:\n camera1: val1\n",
|
||||
},
|
||||
{
|
||||
name: "single line value",
|
||||
src: "streams:\n camera1: url1\n camera2: url2",
|
||||
path: []string{"streams", "camera1"},
|
||||
value: "val1",
|
||||
expect: "streams:\n camera1: val1\n camera2: url2",
|
||||
},
|
||||
{
|
||||
name: "next line value",
|
||||
src: "streams:\n camera1:\n url1\n camera2: url2",
|
||||
path: []string{"streams", "camera1"},
|
||||
value: "val1",
|
||||
expect: "streams:\n camera1: val1\n camera2: url2",
|
||||
},
|
||||
{
|
||||
name: "two lines value",
|
||||
src: "streams:\n camera1: url1\n url2\n camera2: url2",
|
||||
path: []string{"streams", "camera1"},
|
||||
value: "val1",
|
||||
expect: "streams:\n camera1: val1\n camera2: url2",
|
||||
},
|
||||
{
|
||||
name: "next two lines value",
|
||||
src: "streams:\n camera1:\n url1\n url2\n camera2: url2",
|
||||
path: []string{"streams", "camera1"},
|
||||
value: "val1",
|
||||
expect: "streams:\n camera1: val1\n camera2: url2",
|
||||
},
|
||||
{
|
||||
name: "add array",
|
||||
src: "",
|
||||
path: []string{"streams", "camera1"},
|
||||
value: []string{"val1", "val2"},
|
||||
expect: "streams:\n camera1:\n - val1\n - val2\n",
|
||||
},
|
||||
{
|
||||
name: "remove value",
|
||||
src: "streams:\n camera1: url1\n camera2: url2",
|
||||
path: []string{"streams", "camera1"},
|
||||
value: nil,
|
||||
expect: "streams:\n camera2: url2",
|
||||
},
|
||||
{
|
||||
name: "add pairings",
|
||||
src: "homekit:\n camera1:\nstreams:\n camera1: url1",
|
||||
path: []string{"homekit", "camera1", "pairings"},
|
||||
value: []string{"val1"},
|
||||
expect: "homekit:\n camera1:\n pairings:\n - val1\nstreams:\n camera1: url1",
|
||||
},
|
||||
{
|
||||
name: "remove pairings",
|
||||
src: "homekit:\n camera1:\n pairings:\n - val1\nstreams:\n camera1: url1",
|
||||
path: []string{"homekit", "camera1", "pairings"},
|
||||
value: nil,
|
||||
expect: "homekit:\n camera1:\nstreams:\n camera1: url1",
|
||||
},
|
||||
{
|
||||
name: "no new line",
|
||||
src: "streams:\n camera1: url1",
|
||||
path: []string{"streams", "camera1"},
|
||||
value: "val1",
|
||||
expect: "streams:\n camera1: val1\n",
|
||||
},
|
||||
{
|
||||
name: "no new line",
|
||||
src: "streams:\n camera1: url1\nhomekit:\n camera1:\n name: dummy",
|
||||
path: []string{"homekit", "camera1", "pairings"},
|
||||
value: []string{"val1"},
|
||||
expect: "streams:\n camera1: url1\nhomekit:\n camera1:\n name: dummy\n pairings:\n - val1\n",
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
b, err := Patch([]byte(tt.src), tt.path, tt.value)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, tt.expect, string(b))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user