@@ -4,8 +4,13 @@ import (
44 "testing"
55
66 "github.com/stretchr/testify/require"
7+ "gopkg.in/yaml.v3"
8+
9+ "gitlab.com/postgres-ai/database-lab/v3/pkg/util/ptypes"
710)
811
12+ const updatedName = "updated"
13+
914func TestStoreYaml (t * testing.T ) {
1015 r := require .New (t )
1116 s := fullTestStruct ()
@@ -28,3 +33,189 @@ func TestStoreYamlNull(t *testing.T) {
2833 // no changes should have been made to the node
2934 requireYamlNullApplied (t , node )
3035}
36+
37+ func TestStoreYaml_NilFieldBeforeNonNilFields (t * testing.T ) {
38+ type nilFirstStruct struct {
39+ Items []interface {} `proj:"nested.items"`
40+ Config map [string ]interface {} `proj:"nested.config"`
41+ Name * string `proj:"nested.name"`
42+ }
43+
44+ const yamlData = `
45+ nested:
46+ items:
47+ - "--no-privileges"
48+ config:
49+ key1: value1
50+ name: original
51+ `
52+
53+ node := & yaml.Node {}
54+ err := yaml .Unmarshal ([]byte (yamlData ), node )
55+ require .NoError (t , err )
56+
57+ newName := updatedName
58+ s := & nilFirstStruct {Name : & newName }
59+
60+ err = StoreYaml (s , node , StoreOptions {})
61+ require .NoError (t , err )
62+
63+ soft , err := NewSoftYaml (node )
64+ require .NoError (t , err )
65+
66+ nameVal , err := soft .Get (FieldGet {Path : []string {"nested" , "name" }, Type : ptypes .String })
67+ require .NoError (t , err )
68+ require .Equal (t , updatedName , nameVal )
69+
70+ itemsVal , err := soft .Get (FieldGet {Path : []string {"nested" , "items" }, Type : ptypes .Slice })
71+ require .NoError (t , err )
72+ require .Equal (t , []interface {}{"--no-privileges" }, itemsVal )
73+
74+ configVal , err := soft .Get (FieldGet {Path : []string {"nested" , "config" }, Type : ptypes .Map })
75+ require .NoError (t , err )
76+ require .Equal (t , map [string ]interface {}{"key1" : "value1" }, configVal )
77+ }
78+
79+ func TestStoreYaml_EmptyNonNilSliceOverwritesExisting (t * testing.T ) {
80+ type sliceStruct struct {
81+ Name * string `proj:"nested.name"`
82+ Items []interface {} `proj:"nested.items"`
83+ }
84+
85+ const yamlWithItems = `
86+ nested:
87+ name: original
88+ items:
89+ - "--no-privileges"
90+ - "--no-owner"
91+ `
92+
93+ node := & yaml.Node {}
94+ err := yaml .Unmarshal ([]byte (yamlWithItems ), node )
95+ require .NoError (t , err )
96+
97+ newName := updatedName
98+ s := & sliceStruct {Name : & newName , Items : []interface {}{}}
99+
100+ err = StoreYaml (s , node , StoreOptions {})
101+ require .NoError (t , err )
102+
103+ soft , err := NewSoftYaml (node )
104+ require .NoError (t , err )
105+
106+ nameVal , err := soft .Get (FieldGet {Path : []string {"nested" , "name" }, Type : ptypes .String })
107+ require .NoError (t , err )
108+ require .Equal (t , updatedName , nameVal )
109+
110+ itemsVal , err := soft .Get (FieldGet {Path : []string {"nested" , "items" }, Type : ptypes .Slice })
111+ require .NoError (t , err )
112+ require .Equal (t , []interface {}{}, itemsVal )
113+ }
114+
115+ func TestStoreYaml_EmptyNonNilMapOverwritesExisting (t * testing.T ) {
116+ type mapStruct struct {
117+ Name * string `proj:"nested.name"`
118+ Config map [string ]interface {} `proj:"nested.config"`
119+ }
120+
121+ const yamlWithMap = `
122+ nested:
123+ name: original
124+ config:
125+ key1: value1
126+ key2: value2
127+ `
128+
129+ node := & yaml.Node {}
130+ err := yaml .Unmarshal ([]byte (yamlWithMap ), node )
131+ require .NoError (t , err )
132+
133+ newName := updatedName
134+ s := & mapStruct {Name : & newName , Config : map [string ]interface {}{}}
135+
136+ err = StoreYaml (s , node , StoreOptions {})
137+ require .NoError (t , err )
138+
139+ soft , err := NewSoftYaml (node )
140+ require .NoError (t , err )
141+
142+ nameVal , err := soft .Get (FieldGet {Path : []string {"nested" , "name" }, Type : ptypes .String })
143+ require .NoError (t , err )
144+ require .Equal (t , updatedName , nameVal )
145+
146+ configVal , err := soft .Get (FieldGet {Path : []string {"nested" , "config" }, Type : ptypes .Map })
147+ require .NoError (t , err )
148+ require .Equal (t , map [string ]interface {}{}, configVal )
149+ }
150+
151+ func TestStoreYaml_NilSlicePreservesExisting (t * testing.T ) {
152+ type sliceStruct struct {
153+ Name * string `proj:"nested.name"`
154+ Items []interface {} `proj:"nested.items"`
155+ }
156+
157+ const yamlWithItems = `
158+ nested:
159+ name: original
160+ items:
161+ - "--no-privileges"
162+ - "--no-owner"
163+ `
164+
165+ node := & yaml.Node {}
166+ err := yaml .Unmarshal ([]byte (yamlWithItems ), node )
167+ require .NoError (t , err )
168+
169+ newName := updatedName
170+ s := & sliceStruct {Name : & newName }
171+
172+ err = StoreYaml (s , node , StoreOptions {})
173+ require .NoError (t , err )
174+
175+ soft , err := NewSoftYaml (node )
176+ require .NoError (t , err )
177+
178+ nameVal , err := soft .Get (FieldGet {Path : []string {"nested" , "name" }, Type : ptypes .String })
179+ require .NoError (t , err )
180+ require .Equal (t , updatedName , nameVal )
181+
182+ itemsVal , err := soft .Get (FieldGet {Path : []string {"nested" , "items" }, Type : ptypes .Slice })
183+ require .NoError (t , err )
184+ require .Equal (t , []interface {}{"--no-privileges" , "--no-owner" }, itemsVal )
185+ }
186+
187+ func TestStoreYaml_NilMapPreservesExisting (t * testing.T ) {
188+ type mapStruct struct {
189+ Name * string `proj:"nested.name"`
190+ Config map [string ]interface {} `proj:"nested.config"`
191+ }
192+
193+ const yamlWithMap = `
194+ nested:
195+ name: original
196+ config:
197+ key1: value1
198+ key2: value2
199+ `
200+
201+ node := & yaml.Node {}
202+ err := yaml .Unmarshal ([]byte (yamlWithMap ), node )
203+ require .NoError (t , err )
204+
205+ newName := updatedName
206+ s := & mapStruct {Name : & newName }
207+
208+ err = StoreYaml (s , node , StoreOptions {})
209+ require .NoError (t , err )
210+
211+ soft , err := NewSoftYaml (node )
212+ require .NoError (t , err )
213+
214+ nameVal , err := soft .Get (FieldGet {Path : []string {"nested" , "name" }, Type : ptypes .String })
215+ require .NoError (t , err )
216+ require .Equal (t , updatedName , nameVal )
217+
218+ configVal , err := soft .Get (FieldGet {Path : []string {"nested" , "config" }, Type : ptypes .Map })
219+ require .NoError (t , err )
220+ require .Equal (t , map [string ]interface {}{"key1" : "value1" , "key2" : "value2" }, configVal )
221+ }
0 commit comments