github.com/graywolf-at-work-2/terraform-vendor@v1.4.5/internal/lang/funcs/datetime_test.go (about) 1 package funcs 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/zclconf/go-cty/cty" 9 ) 10 11 func TestTimestamp(t *testing.T) { 12 currentTime := time.Now().UTC() 13 result, err := Timestamp() 14 if err != nil { 15 t.Fatalf("err: %s", err) 16 } 17 resultTime, err := time.Parse(time.RFC3339, result.AsString()) 18 if err != nil { 19 t.Fatalf("Error parsing timestamp: %s", err) 20 } 21 22 if resultTime.Sub(currentTime).Seconds() > 10.0 { 23 t.Fatalf("Timestamp Diff too large. Expected: %s\nReceived: %s", currentTime.Format(time.RFC3339), result.AsString()) 24 } 25 26 } 27 28 func TestTimeadd(t *testing.T) { 29 tests := []struct { 30 Time cty.Value 31 Duration cty.Value 32 Want cty.Value 33 Err bool 34 }{ 35 { 36 cty.StringVal("2017-11-22T00:00:00Z"), 37 cty.StringVal("1s"), 38 cty.StringVal("2017-11-22T00:00:01Z"), 39 false, 40 }, 41 { 42 cty.StringVal("2017-11-22T00:00:00Z"), 43 cty.StringVal("10m1s"), 44 cty.StringVal("2017-11-22T00:10:01Z"), 45 false, 46 }, 47 { // also support subtraction 48 cty.StringVal("2017-11-22T00:00:00Z"), 49 cty.StringVal("-1h"), 50 cty.StringVal("2017-11-21T23:00:00Z"), 51 false, 52 }, 53 { // Invalid format timestamp 54 cty.StringVal("2017-11-22"), 55 cty.StringVal("-1h"), 56 cty.UnknownVal(cty.String), 57 true, 58 }, 59 { // Invalid format duration (day is not supported by ParseDuration) 60 cty.StringVal("2017-11-22T00:00:00Z"), 61 cty.StringVal("1d"), 62 cty.UnknownVal(cty.String), 63 true, 64 }, 65 } 66 67 for _, test := range tests { 68 t.Run(fmt.Sprintf("TimeAdd(%#v, %#v)", test.Time, test.Duration), func(t *testing.T) { 69 got, err := TimeAdd(test.Time, test.Duration) 70 71 if test.Err { 72 if err == nil { 73 t.Fatal("succeeded; want error") 74 } 75 return 76 } else if err != nil { 77 t.Fatalf("unexpected error: %s", err) 78 } 79 80 if !got.RawEquals(test.Want) { 81 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 82 } 83 }) 84 } 85 } 86 87 func TestTimeCmp(t *testing.T) { 88 tests := []struct { 89 TimeA, TimeB cty.Value 90 Want cty.Value 91 Err string 92 }{ 93 { 94 cty.StringVal("2017-11-22T00:00:00Z"), 95 cty.StringVal("2017-11-22T00:00:00Z"), 96 cty.Zero, 97 ``, 98 }, 99 { 100 cty.StringVal("2017-11-22T00:00:00Z"), 101 cty.StringVal("2017-11-22T01:00:00+01:00"), 102 cty.Zero, 103 ``, 104 }, 105 { 106 cty.StringVal("2017-11-22T00:00:01Z"), 107 cty.StringVal("2017-11-22T01:00:00+01:00"), 108 cty.NumberIntVal(1), 109 ``, 110 }, 111 { 112 cty.StringVal("2017-11-22T01:00:00Z"), 113 cty.StringVal("2017-11-22T00:59:00-01:00"), 114 cty.NumberIntVal(-1), 115 ``, 116 }, 117 { 118 cty.StringVal("2017-11-22T01:00:00+01:00"), 119 cty.StringVal("2017-11-22T01:00:00-01:00"), 120 cty.NumberIntVal(-1), 121 ``, 122 }, 123 { 124 cty.StringVal("2017-11-22T01:00:00-01:00"), 125 cty.StringVal("2017-11-22T01:00:00+01:00"), 126 cty.NumberIntVal(1), 127 ``, 128 }, 129 { 130 cty.StringVal("2017-11-22T00:00:00Z"), 131 cty.StringVal("bloop"), 132 cty.UnknownVal(cty.String), 133 `not a valid RFC3339 timestamp: cannot use "bloop" as year`, 134 }, 135 { 136 cty.StringVal("2017-11-22 00:00:00Z"), 137 cty.StringVal("2017-11-22T00:00:00Z"), 138 cty.UnknownVal(cty.String), 139 `not a valid RFC3339 timestamp: missing required time introducer 'T'`, 140 }, 141 { 142 cty.StringVal("2017-11-22T00:00:00Z"), 143 cty.UnknownVal(cty.String), 144 cty.UnknownVal(cty.Number), 145 ``, 146 }, 147 { 148 cty.UnknownVal(cty.String), 149 cty.StringVal("2017-11-22T00:00:00Z"), 150 cty.UnknownVal(cty.Number), 151 ``, 152 }, 153 { 154 cty.UnknownVal(cty.String), 155 cty.UnknownVal(cty.String), 156 cty.UnknownVal(cty.Number), 157 ``, 158 }, 159 } 160 161 for _, test := range tests { 162 t.Run(fmt.Sprintf("TimeCmp(%#v, %#v)", test.TimeA, test.TimeB), func(t *testing.T) { 163 got, err := TimeCmp(test.TimeA, test.TimeB) 164 165 if test.Err != "" { 166 if err == nil { 167 t.Fatal("succeeded; want error") 168 } 169 if got := err.Error(); got != test.Err { 170 t.Errorf("wrong error message\ngot: %s\nwant: %s", got, test.Err) 171 } 172 return 173 } else if err != nil { 174 t.Fatalf("unexpected error: %s", err) 175 } 176 177 if !got.RawEquals(test.Want) { 178 t.Errorf("wrong result\ngot: %#v\nwant: %#v", got, test.Want) 179 } 180 }) 181 } 182 }