github.com/nov1n/terraform@v0.7.9-0.20161103151050-bf6852f38e28/command/flag_kv_test.go (about)

     1  package command
     2  
     3  import (
     4  	"flag"
     5  	"io/ioutil"
     6  	"reflect"
     7  	"testing"
     8  
     9  	"github.com/davecgh/go-spew/spew"
    10  )
    11  
    12  func TestFlagStringKV_impl(t *testing.T) {
    13  	var _ flag.Value = new(FlagStringKV)
    14  }
    15  
    16  func TestFlagStringKV(t *testing.T) {
    17  	cases := []struct {
    18  		Input  string
    19  		Output map[string]string
    20  		Error  bool
    21  	}{
    22  		{
    23  			"key=value",
    24  			map[string]string{"key": "value"},
    25  			false,
    26  		},
    27  
    28  		{
    29  			"key=",
    30  			map[string]string{"key": ""},
    31  			false,
    32  		},
    33  
    34  		{
    35  			"key=foo=bar",
    36  			map[string]string{"key": "foo=bar"},
    37  			false,
    38  		},
    39  
    40  		{
    41  			"map.key=foo",
    42  			map[string]string{"map.key": "foo"},
    43  			false,
    44  		},
    45  
    46  		{
    47  			"key",
    48  			nil,
    49  			true,
    50  		},
    51  
    52  		{
    53  			"key=/path",
    54  			map[string]string{"key": "/path"},
    55  			false,
    56  		},
    57  	}
    58  
    59  	for _, tc := range cases {
    60  		f := new(FlagStringKV)
    61  		err := f.Set(tc.Input)
    62  		if err != nil != tc.Error {
    63  			t.Fatalf("bad error. Input: %#v\n\nError: %s", tc.Input, err)
    64  		}
    65  
    66  		actual := map[string]string(*f)
    67  		if !reflect.DeepEqual(actual, tc.Output) {
    68  			t.Fatalf("bad: %#v", actual)
    69  		}
    70  	}
    71  }
    72  
    73  func TestFlagTypedKV_impl(t *testing.T) {
    74  	var _ flag.Value = new(FlagTypedKV)
    75  }
    76  
    77  func TestFlagTypedKV(t *testing.T) {
    78  	cases := []struct {
    79  		Input  string
    80  		Output map[string]interface{}
    81  		Error  bool
    82  	}{
    83  		{
    84  			"key=value",
    85  			map[string]interface{}{"key": "value"},
    86  			false,
    87  		},
    88  
    89  		{
    90  			"key=",
    91  			map[string]interface{}{"key": ""},
    92  			false,
    93  		},
    94  
    95  		{
    96  			"key=foo=bar",
    97  			map[string]interface{}{"key": "foo=bar"},
    98  			false,
    99  		},
   100  
   101  		{
   102  			"key=false",
   103  			map[string]interface{}{"key": "false"},
   104  			false,
   105  		},
   106  
   107  		{
   108  			"map.key=foo",
   109  			map[string]interface{}{"map.key": "foo"},
   110  			false,
   111  		},
   112  
   113  		{
   114  			"key",
   115  			nil,
   116  			true,
   117  		},
   118  
   119  		{
   120  			`key=["hello", "world"]`,
   121  			map[string]interface{}{"key": []interface{}{"hello", "world"}},
   122  			false,
   123  		},
   124  
   125  		{
   126  			`key={"hello" = "world", "foo" = "bar"}`,
   127  			map[string]interface{}{
   128  				"key": map[string]interface{}{
   129  					"hello": "world",
   130  					"foo":   "bar",
   131  				},
   132  			},
   133  			false,
   134  		},
   135  
   136  		{
   137  			`key={"hello" = "world", "foo" = "bar"}\nkey2="invalid"`,
   138  			nil,
   139  			true,
   140  		},
   141  
   142  		{
   143  			"key=/path",
   144  			map[string]interface{}{"key": "/path"},
   145  			false,
   146  		},
   147  
   148  		{
   149  			"key=1234.dkr.ecr.us-east-1.amazonaws.com/proj:abcdef",
   150  			map[string]interface{}{"key": "1234.dkr.ecr.us-east-1.amazonaws.com/proj:abcdef"},
   151  			false,
   152  		},
   153  
   154  		// simple values that can parse as numbers should remain strings
   155  		{
   156  			"key=1",
   157  			map[string]interface{}{
   158  				"key": "1",
   159  			},
   160  			false,
   161  		},
   162  		{
   163  			"key=1.0",
   164  			map[string]interface{}{
   165  				"key": "1.0",
   166  			},
   167  			false,
   168  		},
   169  		{
   170  			"key=0x10",
   171  			map[string]interface{}{
   172  				"key": "0x10",
   173  			},
   174  			false,
   175  		},
   176  	}
   177  
   178  	for _, tc := range cases {
   179  		f := new(FlagTypedKV)
   180  		err := f.Set(tc.Input)
   181  		if err != nil != tc.Error {
   182  			t.Fatalf("bad error. Input: %#v\n\nError: %s", tc.Input, err)
   183  		}
   184  
   185  		actual := map[string]interface{}(*f)
   186  		if !reflect.DeepEqual(actual, tc.Output) {
   187  			t.Fatalf("bad:\nexpected: %s\n\n     got: %s\n", spew.Sdump(tc.Output), spew.Sdump(actual))
   188  		}
   189  	}
   190  }
   191  
   192  func TestFlagKVFile_impl(t *testing.T) {
   193  	var _ flag.Value = new(FlagKVFile)
   194  }
   195  
   196  func TestFlagKVFile(t *testing.T) {
   197  	inputLibucl := `
   198  foo = "bar"
   199  `
   200  	inputMap := `
   201  foo = {
   202  	k = "v"
   203  }`
   204  
   205  	inputJson := `{
   206  		"foo": "bar"}`
   207  
   208  	cases := []struct {
   209  		Input  string
   210  		Output map[string]interface{}
   211  		Error  bool
   212  	}{
   213  		{
   214  			inputLibucl,
   215  			map[string]interface{}{"foo": "bar"},
   216  			false,
   217  		},
   218  
   219  		{
   220  			inputJson,
   221  			map[string]interface{}{"foo": "bar"},
   222  			false,
   223  		},
   224  
   225  		{
   226  			`map.key = "foo"`,
   227  			map[string]interface{}{"map.key": "foo"},
   228  			false,
   229  		},
   230  
   231  		{
   232  			inputMap,
   233  			map[string]interface{}{
   234  				"foo": map[string]interface{}{
   235  					"k": "v",
   236  				},
   237  			},
   238  			false,
   239  		},
   240  	}
   241  
   242  	path := testTempFile(t)
   243  
   244  	for _, tc := range cases {
   245  		if err := ioutil.WriteFile(path, []byte(tc.Input), 0644); err != nil {
   246  			t.Fatalf("err: %s", err)
   247  		}
   248  
   249  		f := new(FlagKVFile)
   250  		err := f.Set(path)
   251  		if err != nil != tc.Error {
   252  			t.Fatalf("bad error. Input: %#v, err: %s", tc.Input, err)
   253  		}
   254  
   255  		actual := map[string]interface{}(*f)
   256  		if !reflect.DeepEqual(actual, tc.Output) {
   257  			t.Fatalf("bad: %#v", actual)
   258  		}
   259  	}
   260  }