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