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  }