github.com/darkowlzz/helm@v2.5.1-0.20171213183701-6707fe0468d4+incompatible/pkg/strvals/parser_test.go (about)

     1  /*
     2  Copyright 2016 The Kubernetes Authors All rights reserved.
     3  Licensed under the Apache License, Version 2.0 (the "License");
     4  you may not use this file except in compliance with the License.
     5  You may obtain a copy of the License at
     6  
     7  http://www.apache.org/licenses/LICENSE-2.0
     8  
     9  Unless required by applicable law or agreed to in writing, software
    10  distributed under the License is distributed on an "AS IS" BASIS,
    11  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  See the License for the specific language governing permissions and
    13  limitations under the License.
    14  */
    15  
    16  package strvals
    17  
    18  import (
    19  	"testing"
    20  
    21  	"github.com/ghodss/yaml"
    22  )
    23  
    24  func TestSetIndex(t *testing.T) {
    25  	tests := []struct {
    26  		name    string
    27  		initial []interface{}
    28  		expect  []interface{}
    29  		add     int
    30  		val     int
    31  	}{
    32  		{
    33  			name:    "short",
    34  			initial: []interface{}{0, 1},
    35  			expect:  []interface{}{0, 1, 2},
    36  			add:     2,
    37  			val:     2,
    38  		},
    39  		{
    40  			name:    "equal",
    41  			initial: []interface{}{0, 1},
    42  			expect:  []interface{}{0, 2},
    43  			add:     1,
    44  			val:     2,
    45  		},
    46  		{
    47  			name:    "long",
    48  			initial: []interface{}{0, 1, 2, 3, 4, 5},
    49  			expect:  []interface{}{0, 1, 2, 4, 4, 5},
    50  			add:     3,
    51  			val:     4,
    52  		},
    53  	}
    54  
    55  	for _, tt := range tests {
    56  		got := setIndex(tt.initial, tt.add, tt.val)
    57  		if len(got) != len(tt.expect) {
    58  			t.Fatalf("%s: Expected length %d, got %d", tt.name, len(tt.expect), len(got))
    59  		}
    60  
    61  		if gg := got[tt.add].(int); gg != tt.val {
    62  			t.Errorf("%s, Expected value %d, got %d", tt.name, tt.val, gg)
    63  		}
    64  	}
    65  }
    66  
    67  func TestParseSet(t *testing.T) {
    68  	tests := []struct {
    69  		str    string
    70  		expect map[string]interface{}
    71  		err    bool
    72  	}{
    73  		{
    74  			"name1=value1",
    75  			map[string]interface{}{"name1": "value1"},
    76  			false,
    77  		},
    78  		{
    79  			"name1=value1,name2=value2",
    80  			map[string]interface{}{"name1": "value1", "name2": "value2"},
    81  			false,
    82  		},
    83  		{
    84  			"name1=value1,name2=value2,",
    85  			map[string]interface{}{"name1": "value1", "name2": "value2"},
    86  			false,
    87  		},
    88  		{
    89  			str: "name1=value1,,,,name2=value2,",
    90  			err: true,
    91  		},
    92  		{
    93  			str:    "name1=,name2=value2",
    94  			expect: map[string]interface{}{"name1": "", "name2": "value2"},
    95  		},
    96  		{
    97  			str:    "leading_zeros=00009",
    98  			expect: map[string]interface{}{"leading_zeros": "00009"},
    99  		},
   100  		{
   101  			str: "name1,name2=",
   102  			err: true,
   103  		},
   104  		{
   105  			str: "name1,name2=value2",
   106  			err: true,
   107  		},
   108  		{
   109  			str: "name1,name2=value2\\",
   110  			err: true,
   111  		},
   112  		{
   113  			str: "name1,name2",
   114  			err: true,
   115  		},
   116  		{
   117  			"name1=one\\,two,name2=three\\,four",
   118  			map[string]interface{}{"name1": "one,two", "name2": "three,four"},
   119  			false,
   120  		},
   121  		{
   122  			"name1=one\\=two,name2=three\\=four",
   123  			map[string]interface{}{"name1": "one=two", "name2": "three=four"},
   124  			false,
   125  		},
   126  		{
   127  			"name1=one two three,name2=three two one",
   128  			map[string]interface{}{"name1": "one two three", "name2": "three two one"},
   129  			false,
   130  		},
   131  		{
   132  			"outer.inner=value",
   133  			map[string]interface{}{"outer": map[string]interface{}{"inner": "value"}},
   134  			false,
   135  		},
   136  		{
   137  			"outer.middle.inner=value",
   138  			map[string]interface{}{"outer": map[string]interface{}{"middle": map[string]interface{}{"inner": "value"}}},
   139  			false,
   140  		},
   141  		{
   142  			"outer.inner1=value,outer.inner2=value2",
   143  			map[string]interface{}{"outer": map[string]interface{}{"inner1": "value", "inner2": "value2"}},
   144  			false,
   145  		},
   146  		{
   147  			"outer.inner1=value,outer.middle.inner=value",
   148  			map[string]interface{}{
   149  				"outer": map[string]interface{}{
   150  					"inner1": "value",
   151  					"middle": map[string]interface{}{
   152  						"inner": "value",
   153  					},
   154  				},
   155  			},
   156  			false,
   157  		},
   158  		{
   159  			str: "name1.name2",
   160  			err: true,
   161  		},
   162  		{
   163  			str: "name1.name2,name1.name3",
   164  			err: true,
   165  		},
   166  		{
   167  			str:    "name1.name2=",
   168  			expect: map[string]interface{}{"name1": map[string]interface{}{"name2": ""}},
   169  		},
   170  		{
   171  			str: "name1.=name2",
   172  			err: true,
   173  		},
   174  		{
   175  			str: "name1.,name2",
   176  			err: true,
   177  		},
   178  		{
   179  			"name1={value1,value2}",
   180  			map[string]interface{}{"name1": []string{"value1", "value2"}},
   181  			false,
   182  		},
   183  		{
   184  			"name1={value1,value2},name2={value1,value2}",
   185  			map[string]interface{}{
   186  				"name1": []string{"value1", "value2"},
   187  				"name2": []string{"value1", "value2"},
   188  			},
   189  			false,
   190  		},
   191  		{
   192  			"name1={1021,902}",
   193  			map[string]interface{}{"name1": []int{1021, 902}},
   194  			false,
   195  		},
   196  		{
   197  			"name1.name2={value1,value2}",
   198  			map[string]interface{}{"name1": map[string]interface{}{"name2": []string{"value1", "value2"}}},
   199  			false,
   200  		},
   201  		{
   202  			str: "name1={1021,902",
   203  			err: true,
   204  		},
   205  		// List support
   206  		{
   207  			str:    "list[0]=foo",
   208  			expect: map[string]interface{}{"list": []string{"foo"}},
   209  		},
   210  		{
   211  			str: "list[0].foo=bar",
   212  			expect: map[string]interface{}{
   213  				"list": []interface{}{
   214  					map[string]interface{}{"foo": "bar"},
   215  				},
   216  			},
   217  		},
   218  		{
   219  			str: "list[0].foo=bar,list[0].hello=world",
   220  			expect: map[string]interface{}{
   221  				"list": []interface{}{
   222  					map[string]interface{}{"foo": "bar", "hello": "world"},
   223  				},
   224  			},
   225  		},
   226  		{
   227  			str:    "list[0]=foo,list[1]=bar",
   228  			expect: map[string]interface{}{"list": []string{"foo", "bar"}},
   229  		},
   230  		{
   231  			str:    "list[0]=foo,list[1]=bar,",
   232  			expect: map[string]interface{}{"list": []string{"foo", "bar"}},
   233  		},
   234  		{
   235  			str:    "list[0]=foo,list[3]=bar",
   236  			expect: map[string]interface{}{"list": []interface{}{"foo", nil, nil, "bar"}},
   237  		},
   238  		{
   239  			str: "illegal[0]name.foo=bar",
   240  			err: true,
   241  		},
   242  		{
   243  			str:    "noval[0]",
   244  			expect: map[string]interface{}{"noval": []interface{}{}},
   245  		},
   246  		{
   247  			str:    "noval[0]=",
   248  			expect: map[string]interface{}{"noval": []interface{}{""}},
   249  		},
   250  		{
   251  			str:    "nested[0][0]=1",
   252  			expect: map[string]interface{}{"nested": []interface{}{[]interface{}{1}}},
   253  		},
   254  		{
   255  			str:    "nested[1][1]=1",
   256  			expect: map[string]interface{}{"nested": []interface{}{nil, []interface{}{nil, 1}}},
   257  		},
   258  	}
   259  
   260  	for _, tt := range tests {
   261  		got, err := Parse(tt.str)
   262  		if err != nil {
   263  			if tt.err {
   264  				continue
   265  			}
   266  			t.Fatalf("%s: %s", tt.str, err)
   267  		}
   268  		if tt.err {
   269  			t.Errorf("%s: Expected error. Got nil", tt.str)
   270  		}
   271  
   272  		y1, err := yaml.Marshal(tt.expect)
   273  		if err != nil {
   274  			t.Fatal(err)
   275  		}
   276  		y2, err := yaml.Marshal(got)
   277  		if err != nil {
   278  			t.Fatalf("Error serializing parsed value: %s", err)
   279  		}
   280  
   281  		if string(y1) != string(y2) {
   282  			t.Errorf("%s: Expected:\n%s\nGot:\n%s", tt.str, y1, y2)
   283  		}
   284  	}
   285  }
   286  
   287  func TestParseInto(t *testing.T) {
   288  	got := map[string]interface{}{
   289  		"outer": map[string]interface{}{
   290  			"inner1": "overwrite",
   291  			"inner2": "value2",
   292  		},
   293  	}
   294  	input := "outer.inner1=value1,outer.inner3=value3"
   295  	expect := map[string]interface{}{
   296  		"outer": map[string]interface{}{
   297  			"inner1": "value1",
   298  			"inner2": "value2",
   299  			"inner3": "value3",
   300  		},
   301  	}
   302  
   303  	if err := ParseInto(input, got); err != nil {
   304  		t.Fatal(err)
   305  	}
   306  
   307  	y1, err := yaml.Marshal(expect)
   308  	if err != nil {
   309  		t.Fatal(err)
   310  	}
   311  	y2, err := yaml.Marshal(got)
   312  	if err != nil {
   313  		t.Fatalf("Error serializing parsed value: %s", err)
   314  	}
   315  
   316  	if string(y1) != string(y2) {
   317  		t.Errorf("%s: Expected:\n%s\nGot:\n%s", input, y1, y2)
   318  	}
   319  }
   320  
   321  func TestToYAML(t *testing.T) {
   322  	// The TestParse does the hard part. We just verify that YAML formatting is
   323  	// happening.
   324  	o, err := ToYAML("name=value")
   325  	if err != nil {
   326  		t.Fatal(err)
   327  	}
   328  	expect := "name: value\n"
   329  	if o != expect {
   330  		t.Errorf("Expected %q, got %q", expect, o)
   331  	}
   332  }