github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/utils/alter/merge_test.go (about) 1 package alter_test 2 3 import ( 4 "context" 5 "encoding/json" 6 "testing" 7 8 "github.com/lmorg/murex/test/count" 9 "github.com/lmorg/murex/utils/alter" 10 ) 11 12 func mergeTest(t *testing.T, test *plan) { 13 t.Helper() 14 count.Tests(t, 1) 15 16 pathS, err := alter.SplitPath(test.path) 17 if err != nil { 18 panic(err) 19 } 20 21 var expV interface{} 22 if err := json.Unmarshal([]byte(test.expected), &expV); err != nil { 23 panic(err) 24 } 25 b, err := json.Marshal(expV) 26 if err != nil { 27 panic(err) 28 } 29 test.expected = string(b) 30 31 var old interface{} 32 err = json.Unmarshal([]byte(test.original), &old) 33 if err != nil { 34 t.Error("Error unmarshalling original for alter.Merge()") 35 t.Logf(" original: %s", test.original) 36 t.Logf(" path: %s: %v", test.path, pathS) 37 t.Logf(" change: %s", test.change) 38 t.Logf(" expected: %s.(%T)", test.expected, expV) 39 t.Logf(" actual: %s", "n/a") 40 t.Logf(" error: %s", err) 41 return 42 } 43 44 new := alter.StrToInterface(test.change) 45 46 v, err := alter.Merge(context.TODO(), old, pathS, new) 47 if err != nil { 48 t.Error("Error received from alter.Alter()") 49 t.Logf(" original: %s", test.original) 50 t.Logf(" path: %s: %v", test.path, pathS) 51 t.Logf(" change: %s", test.change) 52 t.Logf(" expected: %s.(%T)", test.expected, expV) 53 t.Logf(" actual: %s", "n/a") 54 t.Logf(" error: %s", err) 55 return 56 } 57 58 actual, err := json.Marshal(v) 59 if err != nil { 60 t.Error("Error marshalling v from alter.Merge()") 61 t.Logf(" original: %s", test.original) 62 t.Logf(" path: %s: %v", test.path, pathS) 63 t.Logf(" change: %s", test.change) 64 t.Logf(" expected: %s.(%T)", test.expected, expV) 65 t.Logf(" actual: %s", "n/a") 66 t.Logf(" error: %s", err) 67 return 68 } 69 70 if string(actual) != test.expected { 71 t.Error("Expected does not match actual") 72 t.Logf(" original: %s.(%T)", test.original, old) 73 t.Logf(" path: %s: %v", test.path, pathS) 74 t.Logf(" change: %s", test.change) 75 t.Logf(" expected: %s.(%T)", test.expected, expV) 76 t.Logf(" actual: %s.(%T)", string(actual), v) 77 t.Logf(" error: %s", "nil") 78 } 79 } 80 81 func TestMergeMap(t *testing.T) { 82 test := plan{ 83 original: ` 84 { 85 "a": "aye", 86 "b": "bee", 87 "c": "cee" 88 }`, 89 path: "/", 90 change: ` 91 { 92 "d": "dee", 93 "e": "ee", 94 "f": "eff" 95 }`, 96 expected: ` 97 { 98 "a": "aye", 99 "b": "bee", 100 "c": "cee", 101 "d": "dee", 102 "e": "ee", 103 "f": "eff" 104 }`, 105 } 106 107 mergeTest(t, &test) 108 } 109 110 func TestMergeAndUpdateMap(t *testing.T) { 111 test := plan{ 112 original: ` 113 { 114 "a": "aye", 115 "b": "bee", 116 "c": "cee" 117 }`, 118 path: "/", 119 change: ` 120 { 121 "c": "update", 122 "e": "ee", 123 "f": "eff" 124 }`, 125 expected: ` 126 { 127 "a": "aye", 128 "b": "bee", 129 "c": "update", 130 "e": "ee", 131 "f": "eff" 132 }`, 133 } 134 135 mergeTest(t, &test) 136 } 137 138 func TestMergeArrayAlpha(t *testing.T) { 139 test := plan{ 140 original: ` 141 [ 142 "aye", 143 "bee", 144 "cee" 145 ]`, 146 path: "/", 147 change: ` 148 [ 149 "dee", 150 "ee", 151 "eff" 152 ]`, 153 expected: ` 154 [ 155 "aye", 156 "bee", 157 "cee", 158 "dee", 159 "ee", 160 "eff" 161 ]`, 162 } 163 164 mergeTest(t, &test) 165 } 166 167 func TestMergeArrayNumeric(t *testing.T) { 168 test := plan{ 169 original: ` 170 [ 171 1, 172 2, 173 3 174 ]`, 175 path: "/", 176 change: ` 177 [ 178 5, 179 6, 180 7 181 ]`, 182 expected: ` 183 [ 184 1, 185 2, 186 3, 187 5, 188 6, 189 7 190 ]`, 191 } 192 193 mergeTest(t, &test) 194 } 195 196 func TestMergeNestedArrayAlpha(t *testing.T) { 197 test := plan{ 198 original: ` 199 { 200 "1": "foo", 201 "2": "bar", 202 "3": [ 203 "aye", 204 "bee", 205 "cee" 206 ] 207 }`, 208 path: "/3", 209 change: ` 210 [ 211 "dee", 212 "ee", 213 "eff" 214 ]`, 215 expected: ` 216 { 217 "1": "foo", 218 "2": "bar", 219 "3": [ 220 "aye", 221 "bee", 222 "cee", 223 "dee", 224 "ee", 225 "eff" 226 ] 227 }`, 228 } 229 230 mergeTest(t, &test) 231 } 232 233 func TestMergeNestedArrayNumeric(t *testing.T) { 234 test := plan{ 235 original: ` 236 { 237 "1": "foo", 238 "2": "bar", 239 "3": [ 240 4, 241 5, 242 6 243 ] 244 }`, 245 path: "/3", 246 change: ` 247 [ 248 7, 249 8, 250 9 251 ]`, 252 expected: ` 253 { 254 "1": "foo", 255 "2": "bar", 256 "3": [ 257 4, 258 5, 259 6, 260 7, 261 8, 262 9 263 ] 264 }`, 265 } 266 267 mergeTest(t, &test) 268 } 269 270 func TestMergeNestedArrayMap(t *testing.T) { 271 test := plan{ 272 original: ` 273 [ 274 { 275 "foo": 1 276 } 277 ]`, 278 path: "/", 279 change: ` 280 [ 281 { 282 "bar": 2 283 } 284 ]`, 285 expected: ` 286 [ 287 { 288 "foo": 1 289 }, 290 { 291 "bar": 2 292 } 293 ]`, 294 } 295 296 mergeTest(t, &test) 297 } 298 299 func TestMergeNestedArrayArray(t *testing.T) { 300 test := plan{ 301 original: ` 302 [ 303 [ 1, 2, 3 ] 304 ]`, 305 path: "/", 306 change: ` 307 [ 308 [ 6, 7, 8 ] 309 ]`, 310 expected: ` 311 [ 312 [ 1, 2, 3 ], 313 [ 6, 7, 8 ] 314 ] 315 `, 316 } 317 318 mergeTest(t, &test) 319 } 320 321 func TestMergeNestedMapArray(t *testing.T) { 322 test := plan{ 323 original: ` 324 { 325 "foo": [ 1, 2, 3 ] 326 }`, 327 path: "/", 328 change: ` 329 { 330 "foo": [ 6, 7, 8 ] 331 }`, 332 expected: ` 333 { 334 "foo": [ 335 1, 336 2, 337 3, 338 6, 339 7, 340 8 341 ] 342 }`, 343 } 344 345 mergeTest(t, &test) 346 } 347 348 func TestMergeNestedMapMap(t *testing.T) { 349 test := plan{ 350 original: ` 351 { 352 "foo": { "a": 1, "b": 2 } 353 }`, 354 path: "/", 355 change: ` 356 { 357 "foo": { "c": 3, "d": 4 } 358 }`, 359 expected: ` 360 { 361 "foo": { 362 "a": 1, 363 "b": 2, 364 "c": 3, 365 "d": 4 366 } 367 }`, 368 } 369 370 mergeTest(t, &test) 371 }