github.com/replicatedhq/ship@v0.55.0/pkg/lifecycle/render/helm/values_test.go (about)

     1  package helm
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/emosbaugh/yaml"
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestGetAllKeys(t *testing.T) {
    11  	t.Run("get all keys", func(t *testing.T) {
    12  		req := require.New(t)
    13  
    14  		req.Equal([]interface{}(nil), getAllKeys(yaml.MapSlice{}))
    15  
    16  		m1 := yaml.MapSlice{
    17  			{Key: "a", Value: 5},
    18  		}
    19  		m2 := yaml.MapSlice{
    20  			{Key: "b", Value: true},
    21  		}
    22  		m3 := yaml.MapSlice{
    23  			{Key: "a", Value: "value"},
    24  			{Key: "b", Value: false},
    25  			{Key: "c", Value: nil},
    26  		}
    27  		req.Equal(
    28  			[]interface{}{"a", "b", "c"},
    29  			getAllKeys(m1, m2, m3),
    30  		)
    31  	})
    32  }
    33  
    34  func TestMergeHelmValues(t *testing.T) {
    35  	tests := []struct {
    36  		name     string
    37  		base     string
    38  		user     string
    39  		vendor   string
    40  		expected string
    41  	}{
    42  		{
    43  			name:     "merge, vendor values only",
    44  			base:     "",
    45  			user:     "",
    46  			vendor:   "#comment line\nkey1: 1 # this is a comment\nkey2: a\n",
    47  			expected: "#comment line\nkey1: 1 # this is a comment\nkey2: a\n",
    48  		},
    49  
    50  		{
    51  			name: "merge, vendor and user values",
    52  			base: `key1: 1
    53  key2:
    54    - item1
    55  deep_key:
    56    level1:
    57      level2:
    58        myvalue: 3
    59  key3: a`,
    60  			user: `key1: 1
    61  key2:
    62    - item1
    63    - item2_added_by_user
    64  deep_key:
    65    level1:
    66      level2:
    67        myvalue: modified-by-user-5
    68  key3: a`,
    69  			vendor: `key1: 1
    70  key2:
    71    - item1
    72  deep_key:
    73    level1:
    74      newkey: added-by-vendor
    75      level2:
    76        myvalue: 5
    77  key3: modified-by-vendor`,
    78  			expected: `key1: 1
    79  key2:
    80  - item1
    81  - item2_added_by_user
    82  deep_key:
    83    level1:
    84      newkey: added-by-vendor
    85      level2:
    86        myvalue: modified-by-user-5
    87  key3: modified-by-vendor
    88  `,
    89  		},
    90  
    91  		{
    92  			name: "comments",
    93  			base: "",
    94  			user: `# user comment
    95  key3: 4
    96  # another user comment`,
    97  			vendor:   "# comment prefix\nkey1: 1\n  # indented comment\n\n# empty line\nnested_key:\n  # nested comment line 1\n  # nested comment line 2\n  key2: 2 # inline comment\n  # nested comment line 3\nkey3: 3\n# comment suffix\n",
    98  			expected: "# comment prefix\nkey1: 1\n  # indented comment\n\n# empty line\nnested_key:\n  # nested comment line 1\n  # nested comment line 2\n  key2: 2\n          # inline comment\n  # nested comment line 3\nkey3: 4\n# comment suffix\n",
    99  		},
   100  		{
   101  			name: "mysql",
   102  			base: "",
   103  			user: "mysqlPassword: my-super-secret-password",
   104  			vendor: `## mysql image version
   105  ## ref: https://hub.docker.com/r/library/mysql/tags/
   106  ##
   107  image: "mysql"
   108  imageTag: "5.7.14"
   109  
   110  ## Specify password for root user
   111  ##
   112  ## Default: random 10 character string
   113  # mysqlRootPassword: testing
   114  
   115  ## Create a database user
   116  ##
   117  # mysqlUser:
   118  ## Default: random 10 character string
   119  # mysqlPassword:
   120  
   121  ## Allow unauthenticated access, uncomment to enable
   122  ##
   123  # mysqlAllowEmptyPassword: true
   124  
   125  ## Create a database
   126  ##
   127  # mysqlDatabase:
   128  
   129  ## Specify an imagePullPolicy (Required)
   130  ## It's recommended to change this to 'Always' if the image tag is 'latest'
   131  ## ref: http://kubernetes.io/docs/user-guide/images/#updating-images
   132  ##
   133  imagePullPolicy: IfNotPresent`,
   134  			expected: `## mysql image version
   135  ## ref: https://hub.docker.com/r/library/mysql/tags/
   136  ##
   137  image: mysql
   138  imageTag: 5.7.14
   139  
   140  ## Specify password for root user
   141  ##
   142  ## Default: random 10 character string
   143  # mysqlRootPassword: testing
   144  
   145  ## Create a database user
   146  ##
   147  # mysqlUser:
   148  ## Default: random 10 character string
   149  # mysqlPassword:
   150  
   151  ## Allow unauthenticated access, uncomment to enable
   152  ##
   153  # mysqlAllowEmptyPassword: true
   154  
   155  ## Create a database
   156  ##
   157  # mysqlDatabase:
   158  
   159  ## Specify an imagePullPolicy (Required)
   160  ## It's recommended to change this to 'Always' if the image tag is 'latest'
   161  ## ref: http://kubernetes.io/docs/user-guide/images/#updating-images
   162  ##
   163  imagePullPolicy: IfNotPresent
   164  mysqlPassword: my-super-secret-password
   165  `,
   166  		},
   167  	}
   168  
   169  	for _, test := range tests {
   170  		t.Run(test.name, func(t *testing.T) {
   171  			req := require.New(t)
   172  			merged, err := MergeHelmValues(test.base, test.user, test.vendor, true)
   173  			req.NoError(err)
   174  			req.Equal(test.expected, merged)
   175  		})
   176  	}
   177  }