github.com/renier/terraform@v0.7.8-0.20161024133817-eb8a9ef5471a/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  			"map.key=foo",
   103  			map[string]interface{}{"map.key": "foo"},
   104  			false,
   105  		},
   106  
   107  		{
   108  			"key",
   109  			nil,
   110  			true,
   111  		},
   112  
   113  		{
   114  			`key=["hello", "world"]`,
   115  			map[string]interface{}{"key": []interface{}{"hello", "world"}},
   116  			false,
   117  		},
   118  
   119  		{
   120  			`key={"hello" = "world", "foo" = "bar"}`,
   121  			map[string]interface{}{
   122  				"key": map[string]interface{}{
   123  					"hello": "world",
   124  					"foo":   "bar",
   125  				},
   126  			},
   127  			false,
   128  		},
   129  
   130  		{
   131  			`key={"hello" = "world", "foo" = "bar"}\nkey2="invalid"`,
   132  			nil,
   133  			true,
   134  		},
   135  
   136  		{
   137  			"key=/path",
   138  			map[string]interface{}{"key": "/path"},
   139  			false,
   140  		},
   141  
   142  		{
   143  			"key=1234.dkr.ecr.us-east-1.amazonaws.com/proj:abcdef",
   144  			map[string]interface{}{"key": "1234.dkr.ecr.us-east-1.amazonaws.com/proj:abcdef"},
   145  			false,
   146  		},
   147  
   148  		// simple values that can parse as numbers should remain strings
   149  		{
   150  			"key=1",
   151  			map[string]interface{}{
   152  				"key": "1",
   153  			},
   154  			false,
   155  		},
   156  		{
   157  			"key=1.0",
   158  			map[string]interface{}{
   159  				"key": "1.0",
   160  			},
   161  			false,
   162  		},
   163  		{
   164  			"key=0x10",
   165  			map[string]interface{}{
   166  				"key": "0x10",
   167  			},
   168  			false,
   169  		},
   170  	}
   171  
   172  	for _, tc := range cases {
   173  		f := new(FlagTypedKV)
   174  		err := f.Set(tc.Input)
   175  		if err != nil != tc.Error {
   176  			t.Fatalf("bad error. Input: %#v\n\nError: %s", tc.Input, err)
   177  		}
   178  
   179  		actual := map[string]interface{}(*f)
   180  		if !reflect.DeepEqual(actual, tc.Output) {
   181  			t.Fatalf("bad:\nexpected: %s\n\n     got: %s\n", spew.Sdump(tc.Output), spew.Sdump(actual))
   182  		}
   183  	}
   184  }
   185  
   186  func TestFlagKVFile_impl(t *testing.T) {
   187  	var _ flag.Value = new(FlagKVFile)
   188  }
   189  
   190  func TestFlagKVFile(t *testing.T) {
   191  	inputLibucl := `
   192  foo = "bar"
   193  `
   194  	inputMap := `
   195  foo = {
   196  	k = "v"
   197  }`
   198  
   199  	inputJson := `{
   200  		"foo": "bar"}`
   201  
   202  	cases := []struct {
   203  		Input  string
   204  		Output map[string]interface{}
   205  		Error  bool
   206  	}{
   207  		{
   208  			inputLibucl,
   209  			map[string]interface{}{"foo": "bar"},
   210  			false,
   211  		},
   212  
   213  		{
   214  			inputJson,
   215  			map[string]interface{}{"foo": "bar"},
   216  			false,
   217  		},
   218  
   219  		{
   220  			`map.key = "foo"`,
   221  			map[string]interface{}{"map.key": "foo"},
   222  			false,
   223  		},
   224  
   225  		{
   226  			inputMap,
   227  			map[string]interface{}{
   228  				"foo": map[string]interface{}{
   229  					"k": "v",
   230  				},
   231  			},
   232  			false,
   233  		},
   234  	}
   235  
   236  	path := testTempFile(t)
   237  
   238  	for _, tc := range cases {
   239  		if err := ioutil.WriteFile(path, []byte(tc.Input), 0644); err != nil {
   240  			t.Fatalf("err: %s", err)
   241  		}
   242  
   243  		f := new(FlagKVFile)
   244  		err := f.Set(path)
   245  		if err != nil != tc.Error {
   246  			t.Fatalf("bad error. Input: %#v, err: %s", tc.Input, err)
   247  		}
   248  
   249  		actual := map[string]interface{}(*f)
   250  		if !reflect.DeepEqual(actual, tc.Output) {
   251  			t.Fatalf("bad: %#v", actual)
   252  		}
   253  	}
   254  }