github.com/turtlemonvh/terraform@v0.6.9-0.20151204001754-8e40b6b855e8/config/interpolate_walk_test.go (about)

     1  package config
     2  
     3  import (
     4  	"fmt"
     5  	"reflect"
     6  	"testing"
     7  
     8  	"github.com/hashicorp/terraform/config/lang/ast"
     9  	"github.com/mitchellh/reflectwalk"
    10  )
    11  
    12  func TestInterpolationWalker_detect(t *testing.T) {
    13  	cases := []struct {
    14  		Input  interface{}
    15  		Result []string
    16  	}{
    17  		{
    18  			Input: map[string]interface{}{
    19  				"foo": "$${var.foo}",
    20  			},
    21  			Result: nil,
    22  		},
    23  
    24  		{
    25  			Input: map[string]interface{}{
    26  				"foo": "${var.foo}",
    27  			},
    28  			Result: []string{
    29  				"Variable(var.foo)",
    30  			},
    31  		},
    32  
    33  		{
    34  			Input: map[string]interface{}{
    35  				"foo": "${aws_instance.foo.*.num}",
    36  			},
    37  			Result: []string{
    38  				"Variable(aws_instance.foo.*.num)",
    39  			},
    40  		},
    41  
    42  		{
    43  			Input: map[string]interface{}{
    44  				"foo": "${lookup(var.foo)}",
    45  			},
    46  			Result: []string{
    47  				"Call(lookup, Variable(var.foo))",
    48  			},
    49  		},
    50  
    51  		{
    52  			Input: map[string]interface{}{
    53  				"foo": `${file("test.txt")}`,
    54  			},
    55  			Result: []string{
    56  				"Call(file, Literal(TypeString, test.txt))",
    57  			},
    58  		},
    59  
    60  		{
    61  			Input: map[string]interface{}{
    62  				"foo": `${file("foo/bar.txt")}`,
    63  			},
    64  			Result: []string{
    65  				"Call(file, Literal(TypeString, foo/bar.txt))",
    66  			},
    67  		},
    68  
    69  		{
    70  			Input: map[string]interface{}{
    71  				"foo": `${join(",", foo.bar.*.id)}`,
    72  			},
    73  			Result: []string{
    74  				"Call(join, Literal(TypeString, ,), Variable(foo.bar.*.id))",
    75  			},
    76  		},
    77  
    78  		{
    79  			Input: map[string]interface{}{
    80  				"foo": `${concat("localhost", ":8080")}`,
    81  			},
    82  			Result: []string{
    83  				"Call(concat, Literal(TypeString, localhost), Literal(TypeString, :8080))",
    84  			},
    85  		},
    86  	}
    87  
    88  	for i, tc := range cases {
    89  		var actual []string
    90  		detectFn := func(root ast.Node) (string, error) {
    91  			actual = append(actual, fmt.Sprintf("%s", root))
    92  			return "", nil
    93  		}
    94  
    95  		w := &interpolationWalker{F: detectFn}
    96  		if err := reflectwalk.Walk(tc.Input, w); err != nil {
    97  			t.Fatalf("err: %s", err)
    98  		}
    99  
   100  		if !reflect.DeepEqual(actual, tc.Result) {
   101  			t.Fatalf("%d: bad:\n\n%#v", i, actual)
   102  		}
   103  	}
   104  }
   105  
   106  func TestInterpolationWalker_replace(t *testing.T) {
   107  	cases := []struct {
   108  		Input  interface{}
   109  		Output interface{}
   110  		Value  string
   111  	}{
   112  		{
   113  			Input: map[string]interface{}{
   114  				"foo": "$${var.foo}",
   115  			},
   116  			Output: map[string]interface{}{
   117  				"foo": "$${var.foo}",
   118  			},
   119  			Value: "bar",
   120  		},
   121  
   122  		{
   123  			Input: map[string]interface{}{
   124  				"foo": "hello, ${var.foo}",
   125  			},
   126  			Output: map[string]interface{}{
   127  				"foo": "bar",
   128  			},
   129  			Value: "bar",
   130  		},
   131  
   132  		{
   133  			Input: map[string]interface{}{
   134  				"foo": map[string]interface{}{
   135  					"${var.foo}": "bar",
   136  				},
   137  			},
   138  			Output: map[string]interface{}{
   139  				"foo": map[string]interface{}{
   140  					"bar": "bar",
   141  				},
   142  			},
   143  			Value: "bar",
   144  		},
   145  
   146  		{
   147  			Input: map[string]interface{}{
   148  				"foo": []interface{}{
   149  					"${var.foo}",
   150  					"bing",
   151  				},
   152  			},
   153  			Output: map[string]interface{}{
   154  				"foo": []interface{}{
   155  					"bar",
   156  					"baz",
   157  					"bing",
   158  				},
   159  			},
   160  			Value: NewStringList([]string{"bar", "baz"}).String(),
   161  		},
   162  
   163  		{
   164  			Input: map[string]interface{}{
   165  				"foo": []interface{}{
   166  					"${var.foo}",
   167  					"bing",
   168  				},
   169  			},
   170  			Output: map[string]interface{}{},
   171  			Value:  NewStringList([]string{UnknownVariableValue, "baz"}).String(),
   172  		},
   173  	}
   174  
   175  	for i, tc := range cases {
   176  		fn := func(ast.Node) (string, error) {
   177  			return tc.Value, nil
   178  		}
   179  
   180  		w := &interpolationWalker{F: fn, Replace: true}
   181  		if err := reflectwalk.Walk(tc.Input, w); err != nil {
   182  			t.Fatalf("err: %s", err)
   183  		}
   184  
   185  		if !reflect.DeepEqual(tc.Input, tc.Output) {
   186  			t.Fatalf("%d: bad:\n\nexpected:%#v\ngot:%#v", i, tc.Output, tc.Input)
   187  		}
   188  	}
   189  }