github.com/jrperritt/terraform@v0.1.1-0.20170525065507-96f391dafc38/helper/validation/validation_test.go (about)

     1  package validation
     2  
     3  import (
     4  	"regexp"
     5  	"testing"
     6  
     7  	"github.com/hashicorp/terraform/helper/schema"
     8  )
     9  
    10  type testCase struct {
    11  	val         interface{}
    12  	f           schema.SchemaValidateFunc
    13  	expectedErr *regexp.Regexp
    14  }
    15  
    16  func TestValidationIntBetween(t *testing.T) {
    17  	runTestCases(t, []testCase{
    18  		{
    19  			val: 1,
    20  			f:   IntBetween(1, 1),
    21  		},
    22  		{
    23  			val: 1,
    24  			f:   IntBetween(0, 2),
    25  		},
    26  		{
    27  			val:         1,
    28  			f:           IntBetween(2, 3),
    29  			expectedErr: regexp.MustCompile("expected [\\w]+ to be in the range \\(2 - 3\\), got 1"),
    30  		},
    31  		{
    32  			val:         "1",
    33  			f:           IntBetween(2, 3),
    34  			expectedErr: regexp.MustCompile("expected type of [\\w]+ to be int"),
    35  		},
    36  	})
    37  }
    38  
    39  func TestValidationStringInSlice(t *testing.T) {
    40  	runTestCases(t, []testCase{
    41  		{
    42  			val: "ValidValue",
    43  			f:   StringInSlice([]string{"ValidValue", "AnotherValidValue"}, false),
    44  		},
    45  		// ignore case
    46  		{
    47  			val: "VALIDVALUE",
    48  			f:   StringInSlice([]string{"ValidValue", "AnotherValidValue"}, true),
    49  		},
    50  		{
    51  			val:         "VALIDVALUE",
    52  			f:           StringInSlice([]string{"ValidValue", "AnotherValidValue"}, false),
    53  			expectedErr: regexp.MustCompile("expected [\\w]+ to be one of \\[ValidValue AnotherValidValue\\], got VALIDVALUE"),
    54  		},
    55  		{
    56  			val:         "InvalidValue",
    57  			f:           StringInSlice([]string{"ValidValue", "AnotherValidValue"}, false),
    58  			expectedErr: regexp.MustCompile("expected [\\w]+ to be one of \\[ValidValue AnotherValidValue\\], got InvalidValue"),
    59  		},
    60  		{
    61  			val:         1,
    62  			f:           StringInSlice([]string{"ValidValue", "AnotherValidValue"}, false),
    63  			expectedErr: regexp.MustCompile("expected type of [\\w]+ to be string"),
    64  		},
    65  	})
    66  }
    67  
    68  func TestValidateJsonString(t *testing.T) {
    69  	type testCases struct {
    70  		Value    string
    71  		ErrCount int
    72  	}
    73  
    74  	invalidCases := []testCases{
    75  		{
    76  			Value:    `{0:"1"}`,
    77  			ErrCount: 1,
    78  		},
    79  		{
    80  			Value:    `{'abc':1}`,
    81  			ErrCount: 1,
    82  		},
    83  		{
    84  			Value:    `{"def":}`,
    85  			ErrCount: 1,
    86  		},
    87  		{
    88  			Value:    `{"xyz":[}}`,
    89  			ErrCount: 1,
    90  		},
    91  	}
    92  
    93  	for _, tc := range invalidCases {
    94  		_, errors := ValidateJsonString(tc.Value, "json")
    95  		if len(errors) != tc.ErrCount {
    96  			t.Fatalf("Expected %q to trigger a validation error.", tc.Value)
    97  		}
    98  	}
    99  
   100  	validCases := []testCases{
   101  		{
   102  			Value:    ``,
   103  			ErrCount: 0,
   104  		},
   105  		{
   106  			Value:    `{}`,
   107  			ErrCount: 0,
   108  		},
   109  		{
   110  			Value:    `{"abc":["1","2"]}`,
   111  			ErrCount: 0,
   112  		},
   113  	}
   114  
   115  	for _, tc := range validCases {
   116  		_, errors := ValidateJsonString(tc.Value, "json")
   117  		if len(errors) != tc.ErrCount {
   118  			t.Fatalf("Expected %q not to trigger a validation error.", tc.Value)
   119  		}
   120  	}
   121  }
   122  
   123  func runTestCases(t *testing.T, cases []testCase) {
   124  	matchErr := func(errs []error, r *regexp.Regexp) bool {
   125  		// err must match one provided
   126  		for _, err := range errs {
   127  			if r.MatchString(err.Error()) {
   128  				return true
   129  			}
   130  		}
   131  
   132  		return false
   133  	}
   134  
   135  	for i, tc := range cases {
   136  		_, errs := tc.f(tc.val, "test_property")
   137  
   138  		if len(errs) == 0 && tc.expectedErr == nil {
   139  			continue
   140  		}
   141  
   142  		if !matchErr(errs, tc.expectedErr) {
   143  			t.Fatalf("expected test case %d to produce error matching \"%s\", got %v", i, tc.expectedErr, errs)
   144  		}
   145  	}
   146  }