github.com/divyam234/rclone@v1.64.1/fs/parsetime_test.go (about)

     1  package fs
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  // Check it satisfies the interface
    14  var _ flagger = (*Time)(nil)
    15  
    16  func TestParseTime(t *testing.T) {
    17  	now := time.Date(2020, 9, 5, 8, 15, 5, 250, time.UTC)
    18  	oldTimeNowFunc := timeNowFunc
    19  	timeNowFunc = func() time.Time { return now }
    20  	defer func() { timeNowFunc = oldTimeNowFunc }()
    21  
    22  	for _, test := range []struct {
    23  		in   string
    24  		want time.Time
    25  		err  bool
    26  	}{
    27  		{"", time.Time{}, true},
    28  		{"1ms", now.Add(-time.Millisecond), false},
    29  		{"1s", now.Add(-time.Second), false},
    30  		{"1", now.Add(-time.Second), false},
    31  		{"1m", now.Add(-time.Minute), false},
    32  		{"1.5m", now.Add(-(3 * time.Minute) / 2), false},
    33  		{"1h", now.Add(-time.Hour), false},
    34  		{"1d", now.Add(-time.Hour * 24), false},
    35  		{"1w", now.Add(-time.Hour * 24 * 7), false},
    36  		{"1M", now.Add(-time.Hour * 24 * 30), false},
    37  		{"1y", now.Add(-time.Hour * 24 * 365), false},
    38  		{"1.5y", now.Add(-time.Hour * 24 * 365 * 3 / 2), false},
    39  		{"-1.5y", now.Add(time.Hour * 24 * 365 * 3 / 2), false},
    40  		{"-1s", now.Add(time.Second), false},
    41  		{"-1", now.Add(time.Second), false},
    42  		{"0", now, false},
    43  		{"100", now.Add(-100 * time.Second), false},
    44  		{"-100", now.Add(100 * time.Second), false},
    45  		{"1.s", now.Add(-time.Second), false},
    46  		{"1x", time.Time{}, true},
    47  		{"-1x", time.Time{}, true},
    48  		{"off", time.Time{}, false},
    49  		{"1h2m3s", now.Add(-(time.Hour + 2*time.Minute + 3*time.Second)), false},
    50  		{"2001-02-03", time.Date(2001, 2, 3, 0, 0, 0, 0, time.Local), false},
    51  		{"2001-02-03 10:11:12", time.Date(2001, 2, 3, 10, 11, 12, 0, time.Local), false},
    52  		{"2001-08-03 10:11:12", time.Date(2001, 8, 3, 10, 11, 12, 0, time.Local), false},
    53  		{"2001-02-03T10:11:12", time.Date(2001, 2, 3, 10, 11, 12, 0, time.Local), false},
    54  		{"2001-02-03T10:11:12.123Z", time.Date(2001, 2, 3, 10, 11, 12, 123000000, time.UTC), false},
    55  		{"2001-02-03T10:11:12.123+00:00", time.Date(2001, 2, 3, 10, 11, 12, 123000000, time.UTC), false},
    56  	} {
    57  		parsedTime, err := ParseTime(test.in)
    58  		if test.err {
    59  			require.Error(t, err, test.in)
    60  		} else {
    61  			require.NoError(t, err, test.in)
    62  		}
    63  		assert.True(t, test.want.Equal(parsedTime), "%v should be parsed as %v instead of %v", test.in, test.want, parsedTime)
    64  	}
    65  }
    66  
    67  func TestTimeString(t *testing.T) {
    68  	now := time.Date(2020, 9, 5, 8, 15, 5, 250, time.UTC)
    69  	oldTimeNowFunc := timeNowFunc
    70  	timeNowFunc = func() time.Time { return now }
    71  	defer func() { timeNowFunc = oldTimeNowFunc }()
    72  
    73  	for _, test := range []struct {
    74  		in   time.Time
    75  		want string
    76  	}{
    77  		{now, "2020-09-05T08:15:05.00000025Z"},
    78  		{time.Date(2021, 8, 5, 8, 15, 5, 0, time.UTC), "2021-08-05T08:15:05Z"},
    79  		{time.Time{}, "off"},
    80  	} {
    81  		got := Time(test.in).String()
    82  		assert.Equal(t, test.want, got)
    83  		// Test the reverse
    84  		reverse, err := ParseTime(test.want)
    85  		assert.NoError(t, err)
    86  		assert.Equal(t, test.in, reverse)
    87  	}
    88  }
    89  
    90  func TestTimeScan(t *testing.T) {
    91  	now := time.Date(2020, 9, 5, 8, 15, 5, 250, time.UTC)
    92  	oldTimeNowFunc := timeNowFunc
    93  	timeNowFunc = func() time.Time { return now }
    94  	defer func() { timeNowFunc = oldTimeNowFunc }()
    95  
    96  	for _, test := range []struct {
    97  		in   string
    98  		want Time
    99  	}{
   100  		{"17m", Time(now.Add(-17 * time.Minute))},
   101  		{"-12h", Time(now.Add(12 * time.Hour))},
   102  		{"0", Time(now)},
   103  		{"off", Time(time.Time{})},
   104  		{"2022-03-26T17:48:19Z", Time(time.Date(2022, 03, 26, 17, 48, 19, 0, time.UTC))},
   105  		{"2022-03-26 17:48:19", Time(time.Date(2022, 03, 26, 17, 48, 19, 0, time.Local))},
   106  	} {
   107  		var got Time
   108  		n, err := fmt.Sscan(test.in, &got)
   109  		require.NoError(t, err)
   110  		assert.Equal(t, 1, n)
   111  		assert.Equal(t, test.want, got)
   112  	}
   113  }
   114  
   115  func TestParseTimeUnmarshalJSON(t *testing.T) {
   116  	now := time.Date(2020, 9, 5, 8, 15, 5, 250, time.UTC)
   117  	oldTimeNowFunc := timeNowFunc
   118  	timeNowFunc = func() time.Time { return now }
   119  	defer func() { timeNowFunc = oldTimeNowFunc }()
   120  
   121  	for _, test := range []struct {
   122  		in   string
   123  		want time.Time
   124  		err  bool
   125  	}{
   126  		{`""`, time.Time{}, true},
   127  		{"0", time.Time{}, true},
   128  		{"1", time.Time{}, true},
   129  		{"1", time.Time{}, true},
   130  		{`"2022-03-26T17:48:19Z"`, time.Date(2022, 03, 26, 17, 48, 19, 0, time.UTC), false},
   131  		{`"0"`, now, false},
   132  		{`"1ms"`, now.Add(-time.Millisecond), false},
   133  		{`"1s"`, now.Add(-time.Second), false},
   134  		{`"1"`, now.Add(-time.Second), false},
   135  		{`"1m"`, now.Add(-time.Minute), false},
   136  		{`"1h"`, now.Add(-time.Hour), false},
   137  		{`"-1h"`, now.Add(time.Hour), false},
   138  		{`"1d"`, now.Add(-time.Hour * 24), false},
   139  		{`"1w"`, now.Add(-time.Hour * 24 * 7), false},
   140  		{`"1M"`, now.Add(-time.Hour * 24 * 30), false},
   141  		{`"1y"`, now.Add(-time.Hour * 24 * 365), false},
   142  		{`"off"`, time.Time{}, false},
   143  		{`"error"`, time.Time{}, true},
   144  		{"error", time.Time{}, true},
   145  	} {
   146  		var parsedTime Time
   147  		err := json.Unmarshal([]byte(test.in), &parsedTime)
   148  		if test.err {
   149  			require.Error(t, err, test.in)
   150  		} else {
   151  			require.NoError(t, err, test.in)
   152  		}
   153  		assert.Equal(t, Time(test.want), parsedTime, test.in)
   154  	}
   155  }
   156  
   157  func TestParseTimeMarshalJSON(t *testing.T) {
   158  	for _, test := range []struct {
   159  		in   time.Time
   160  		want string
   161  		err  bool
   162  	}{
   163  		{time.Time{}, `"0001-01-01T00:00:00Z"`, false},
   164  		{time.Date(2022, 03, 26, 17, 48, 19, 0, time.UTC), `"2022-03-26T17:48:19Z"`, false},
   165  	} {
   166  		gotBytes, err := json.Marshal(test.in)
   167  		got := string(gotBytes)
   168  		if test.err {
   169  			require.Error(t, err, test.in)
   170  		} else {
   171  			require.NoError(t, err, test.in)
   172  		}
   173  		assert.Equal(t, test.want, got, test.in)
   174  	}
   175  }