...

Source file src/sigs.k8s.io/kustomize/api/types/fieldspec_test.go

Documentation: sigs.k8s.io/kustomize/api/types

     1  // Copyright 2019 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package types_test
     5  
     6  import (
     7  	"fmt"
     8  	"reflect"
     9  	"strings"
    10  	"testing"
    11  
    12  	. "sigs.k8s.io/kustomize/api/types"
    13  	"sigs.k8s.io/kustomize/kyaml/resid"
    14  )
    15  
    16  var mergeTests = []struct {
    17  	name     string
    18  	original FsSlice
    19  	incoming FsSlice
    20  	err      error
    21  	result   FsSlice
    22  }{
    23  	{
    24  		"normal",
    25  		FsSlice{
    26  			{
    27  				Path:               "whatever",
    28  				Gvk:                resid.Gvk{Group: "apple"},
    29  				CreateIfNotPresent: false,
    30  			},
    31  			{
    32  				Path:               "whatever",
    33  				Gvk:                resid.Gvk{Group: "pear"},
    34  				CreateIfNotPresent: false,
    35  			},
    36  		},
    37  		FsSlice{
    38  			{
    39  				Path:               "home",
    40  				Gvk:                resid.Gvk{Group: "beans"},
    41  				CreateIfNotPresent: false,
    42  			},
    43  		},
    44  		nil,
    45  		FsSlice{
    46  			{
    47  				Path:               "whatever",
    48  				Gvk:                resid.Gvk{Group: "apple"},
    49  				CreateIfNotPresent: false,
    50  			},
    51  			{
    52  				Path:               "whatever",
    53  				Gvk:                resid.Gvk{Group: "pear"},
    54  				CreateIfNotPresent: false,
    55  			},
    56  			{
    57  				Path:               "home",
    58  				Gvk:                resid.Gvk{Group: "beans"},
    59  				CreateIfNotPresent: false,
    60  			},
    61  		},
    62  	},
    63  	{
    64  		"ignore copy",
    65  		FsSlice{
    66  			{
    67  				Path:               "whatever",
    68  				Gvk:                resid.Gvk{Group: "apple"},
    69  				CreateIfNotPresent: false,
    70  			},
    71  			{
    72  				Path:               "whatever",
    73  				Gvk:                resid.Gvk{Group: "pear"},
    74  				CreateIfNotPresent: false,
    75  			},
    76  		},
    77  		FsSlice{
    78  			{
    79  				Path:               "whatever",
    80  				Gvk:                resid.Gvk{Group: "apple"},
    81  				CreateIfNotPresent: false,
    82  			},
    83  		},
    84  		nil,
    85  		FsSlice{
    86  			{
    87  				Path:               "whatever",
    88  				Gvk:                resid.Gvk{Group: "apple"},
    89  				CreateIfNotPresent: false,
    90  			},
    91  			{
    92  				Path:               "whatever",
    93  				Gvk:                resid.Gvk{Group: "pear"},
    94  				CreateIfNotPresent: false,
    95  			},
    96  		},
    97  	},
    98  	{
    99  		"error on conflict",
   100  		FsSlice{
   101  			{
   102  				Path:               "whatever",
   103  				Gvk:                resid.Gvk{Group: "apple"},
   104  				CreateIfNotPresent: false,
   105  			},
   106  			{
   107  				Path:               "whatever",
   108  				Gvk:                resid.Gvk{Group: "pear"},
   109  				CreateIfNotPresent: false,
   110  			},
   111  		},
   112  		FsSlice{
   113  			{
   114  				Path:               "whatever",
   115  				Gvk:                resid.Gvk{Group: "apple"},
   116  				CreateIfNotPresent: true,
   117  			},
   118  		},
   119  		fmt.Errorf("hey"),
   120  		FsSlice{},
   121  	},
   122  }
   123  
   124  func TestFsSlice_MergeAll(t *testing.T) {
   125  	for _, item := range mergeTests {
   126  		result, err := item.original.MergeAll(item.incoming)
   127  		if item.err == nil {
   128  			if err != nil {
   129  				t.Fatalf("test %s: unexpected err %v", item.name, err)
   130  			}
   131  			if !reflect.DeepEqual(item.result, result) {
   132  				t.Fatalf("test %s: expected: %v\n but got: %v\n",
   133  					item.name, item.result, result)
   134  			}
   135  		} else {
   136  			if err == nil {
   137  				t.Fatalf("test %s: expected err: %v", item.name, err)
   138  			}
   139  			if !strings.Contains(err.Error(), "conflicting fieldspecs") {
   140  				t.Fatalf("test %s: unexpected err: %v", item.name, err)
   141  			}
   142  		}
   143  	}
   144  }
   145  
   146  func TestFsSlice_DeepCopy(t *testing.T) {
   147  	original := make(FsSlice, 2, 4)
   148  	original[0] = FieldSpec{Path: "a"}
   149  	original[1] = FieldSpec{Path: "b"}
   150  
   151  	copied := original.DeepCopy()
   152  
   153  	original, _ = original.MergeOne(FieldSpec{Path: "c"})
   154  
   155  	// perform mutations which should not affect original
   156  	copied.Swap(0, 1)
   157  	_, _ = copied.MergeOne(FieldSpec{Path: "d"})
   158  
   159  	// if DeepCopy does not work, original would be {b,a,d} instead of {a,b,c}
   160  	expected := FsSlice{
   161  		{Path: "a"},
   162  		{Path: "b"},
   163  		{Path: "c"},
   164  	}
   165  	if !reflect.DeepEqual(original, expected) {
   166  		t.Fatalf("original affected by mutations to copied object:\ngot\t%+v,\nexpected: %+v", original, expected)
   167  	}
   168  }
   169  

View as plain text