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  }