...

Source file src/sigs.k8s.io/structured-merge-diff/v4/merge/field_level_overrides_test.go

Documentation: sigs.k8s.io/structured-merge-diff/v4/merge

     1  package merge_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"sigs.k8s.io/structured-merge-diff/v4/fieldpath"
     7  	"sigs.k8s.io/structured-merge-diff/v4/internal/fixture"
     8  	"sigs.k8s.io/structured-merge-diff/v4/merge"
     9  	"sigs.k8s.io/structured-merge-diff/v4/typed"
    10  )
    11  
    12  func TestFieldLevelOverrides(t *testing.T) {
    13  	var overrideStructTypeParser = func() fixture.Parser {
    14  		parser, err := typed.NewParser(`
    15          types:
    16          - name: type
    17            map:
    18              fields:
    19                - name: associativeListReference
    20                  type:
    21                    namedType: associativeList
    22                    elementRelationship: atomic
    23                - name: separableInlineList
    24                  type:
    25                    list:
    26                      elementType:
    27                        scalar: numeric
    28                      elementRelationship: atomic
    29                    elementRelationship: associative
    30                - name: separableMapReference
    31                  type:
    32                    namedType: atomicMap
    33                    elementRelationship: separable
    34                - name: atomicMapReference
    35                  type:
    36                    namedType: unspecifiedMap
    37                    elementRelationship: atomic
    38  
    39          - name: associativeList
    40            list:
    41              elementType:
    42                namedType: unspecifiedMap
    43                elementRelationship: atomic
    44              elementRelationship: associative
    45              keys:
    46              - name
    47          - name: unspecifiedMap
    48            map:
    49              fields:
    50              - name: name
    51                type:
    52                  scalar: string
    53              - name: value
    54                type:
    55                  scalar: numeric
    56          - name: atomicMap
    57            map:
    58              elementRelationship: atomic
    59              fields:
    60              - name: name
    61                type:
    62                  scalar: string
    63              - name: value
    64                type:
    65                  scalar: numeric
    66      `)
    67  		if err != nil {
    68  			panic(err)
    69  		}
    70  		return fixture.SameVersionParser{T: parser.Type("type")}
    71  	}()
    72  
    73  	tests := map[string]fixture.TestCase{
    74  		"test_override_atomic_map_with_separable": {
    75  			// Test that a reference with an separable override to an atomic type
    76  			// is treated as separable
    77  			Ops: []fixture.Operation{
    78  				fixture.Apply{
    79  					Manager: "apply_one",
    80  					Object: `
    81                          separableMapReference:
    82                            name: a
    83                      `,
    84  					APIVersion: "v1",
    85  				},
    86  				fixture.Apply{
    87  					Manager: "apply_two",
    88  					Object: `
    89                          separableMapReference:
    90                            value: 2
    91                      `,
    92  					APIVersion: "v1",
    93  				},
    94  			},
    95  			Object: `
    96                  separableMapReference:
    97                    name: a
    98                    value: 2
    99              `,
   100  			APIVersion: "v1",
   101  			Managed: fieldpath.ManagedFields{
   102  				"apply_one": fieldpath.NewVersionedSet(
   103  					_NS(
   104  						_P("separableMapReference", "name"),
   105  					),
   106  					"v1",
   107  					false,
   108  				),
   109  				"apply_two": fieldpath.NewVersionedSet(
   110  					_NS(
   111  						_P("separableMapReference", "value"),
   112  					),
   113  					"v1",
   114  					false,
   115  				),
   116  			},
   117  		},
   118  		"test_override_unspecified_map_with_atomic": {
   119  			// Test that a map which has its element relaetionship left as defualt
   120  			// (granular) can be overriden to be atomic
   121  			Ops: []fixture.Operation{
   122  				fixture.Apply{
   123  					Manager: "apply_one",
   124  					Object: `
   125                          atomicMapReference:
   126                            name: a
   127                      `,
   128  					APIVersion: "v1",
   129  				},
   130  				fixture.Apply{
   131  					Manager: "apply_two",
   132  					Object: `
   133                          atomicMapReference:
   134                            value: 2
   135                      `,
   136  					APIVersion: "v1",
   137  					Conflicts: merge.Conflicts{
   138  						merge.Conflict{Manager: "apply_one", Path: _P("atomicMapReference")},
   139  					},
   140  				},
   141  				fixture.Apply{
   142  					Manager: "apply_one",
   143  					Object: `
   144                          atomicMapReference:
   145                            name: b
   146                            value: 2
   147                      `,
   148  					APIVersion: "v1",
   149  				},
   150  			},
   151  			Object: `
   152                  atomicMapReference:
   153                    name: b
   154                    value: 2
   155              `,
   156  			APIVersion: "v1",
   157  			Managed: fieldpath.ManagedFields{
   158  				"apply_one": fieldpath.NewVersionedSet(
   159  					_NS(
   160  						_P("atomicMapReference"),
   161  					),
   162  					"v1",
   163  					false,
   164  				),
   165  			},
   166  		},
   167  		"test_override_associative_list_with_atomic": {
   168  			// Test that if a list type is listed associative but referred to as atomic
   169  			// that attempting to add to the list fauks
   170  			Ops: []fixture.Operation{
   171  				fixture.Apply{
   172  					Manager: "apply_one",
   173  					Object: `
   174                          associativeListReference:
   175                            - name: a
   176                              value: 1
   177                      `,
   178  					APIVersion: "v1",
   179  				},
   180  				fixture.Apply{
   181  					Manager: "apply_two",
   182  					Object: `
   183                          associativeListReference:
   184                          - name: b
   185                            value: 2
   186                      `,
   187  					APIVersion: "v1",
   188  					Conflicts: merge.Conflicts{
   189  						merge.Conflict{Manager: "apply_one", Path: _P("associativeListReference")},
   190  					},
   191  				},
   192  			},
   193  			Object: `
   194                  associativeListReference:
   195                    - name: a
   196                      value: 1
   197              `,
   198  			APIVersion: "v1",
   199  			Managed: fieldpath.ManagedFields{
   200  				"apply_one": fieldpath.NewVersionedSet(
   201  					_NS(
   202  						_P("associativeListReference"),
   203  					),
   204  					"v1",
   205  					false,
   206  				),
   207  			},
   208  		},
   209  		"test_override_inline_atomic_list_with_associative": {
   210  			// Tests that an inline atomic list can have its type overridden to be
   211  			// associative
   212  			Ops: []fixture.Operation{
   213  				fixture.Apply{
   214  					Manager: "apply_one",
   215  					Object: `
   216                          separableInlineList:
   217                          - 1
   218                      `,
   219  					APIVersion: "v1",
   220  				},
   221  				fixture.Apply{
   222  					Manager: "apply_two",
   223  					Object: `
   224                          separableInlineList:
   225                          - 2
   226                      `,
   227  					APIVersion: "v1",
   228  				},
   229  			},
   230  			Object: `
   231                  separableInlineList:
   232                  - 1
   233                  - 2
   234              `,
   235  			APIVersion: "v1",
   236  			Managed: fieldpath.ManagedFields{
   237  				"apply_one": fieldpath.NewVersionedSet(
   238  					_NS(
   239  						_P("separableInlineList", _V(1)),
   240  					),
   241  					"v1",
   242  					true,
   243  				),
   244  				"apply_two": fieldpath.NewVersionedSet(
   245  					_NS(
   246  						_P("separableInlineList", _V(2)),
   247  					),
   248  					"v1",
   249  					true,
   250  				),
   251  			},
   252  		},
   253  	}
   254  
   255  	for name, test := range tests {
   256  		t.Run(name, func(t *testing.T) {
   257  			if err := test.Test(overrideStructTypeParser); err != nil {
   258  				t.Fatal(err)
   259  			}
   260  		})
   261  	}
   262  }
   263  

View as plain text