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  }