github.com/posener/terraform@v0.11.0-beta1.0.20171103235147-645df36af025/helper/variables/flag_file_test.go (about)

     1  package variables
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"reflect"
     8  	"testing"
     9  )
    10  
    11  func TestFlagFile_impl(t *testing.T) {
    12  	var _ flag.Value = new(FlagFile)
    13  }
    14  
    15  func TestFlagFile(t *testing.T) {
    16  	inputLibucl := `
    17  foo = "bar"
    18  `
    19  	inputMap := `
    20  foo = {
    21  	k = "v"
    22  }`
    23  
    24  	inputJson := `{
    25  		"foo": "bar"}`
    26  
    27  	cases := []struct {
    28  		Input  interface{}
    29  		Output map[string]interface{}
    30  		Error  bool
    31  	}{
    32  		{
    33  			inputLibucl,
    34  			map[string]interface{}{"foo": "bar"},
    35  			false,
    36  		},
    37  
    38  		{
    39  			inputJson,
    40  			map[string]interface{}{"foo": "bar"},
    41  			false,
    42  		},
    43  
    44  		{
    45  			`map.key = "foo"`,
    46  			map[string]interface{}{"map.key": "foo"},
    47  			false,
    48  		},
    49  
    50  		{
    51  			inputMap,
    52  			map[string]interface{}{
    53  				"foo": map[string]interface{}{
    54  					"k": "v",
    55  				},
    56  			},
    57  			false,
    58  		},
    59  
    60  		{
    61  			[]string{
    62  				`foo = { "k" = "v"}`,
    63  				`foo = { "j" = "v" }`,
    64  			},
    65  			map[string]interface{}{
    66  				"foo": map[string]interface{}{
    67  					"k": "v",
    68  					"j": "v",
    69  				},
    70  			},
    71  			false,
    72  		},
    73  	}
    74  
    75  	path := testTempFile(t)
    76  
    77  	for i, tc := range cases {
    78  		t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
    79  			var input []string
    80  			switch i := tc.Input.(type) {
    81  			case string:
    82  				input = []string{i}
    83  			case []string:
    84  				input = i
    85  			default:
    86  				t.Fatalf("bad input type: %T", i)
    87  			}
    88  
    89  			f := new(FlagFile)
    90  			for _, input := range input {
    91  				if err := ioutil.WriteFile(path, []byte(input), 0644); err != nil {
    92  					t.Fatalf("err: %s", err)
    93  				}
    94  
    95  				err := f.Set(path)
    96  				if err != nil != tc.Error {
    97  					t.Fatalf("bad error. Input: %#v, err: %s", input, err)
    98  				}
    99  			}
   100  
   101  			actual := map[string]interface{}(*f)
   102  			if !reflect.DeepEqual(actual, tc.Output) {
   103  				t.Fatalf("bad: %#v", actual)
   104  			}
   105  		})
   106  	}
   107  }