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 }