@@ -74,3 +74,84 @@ impl TimeRange {
74
74
Ok ( Self { start, end } )
75
75
}
76
76
}
77
+
78
+ #[ cfg( test) ]
79
+ mod tests {
80
+ use super :: * ;
81
+ use chrono:: { Duration , SecondsFormat , Utc } ;
82
+
83
+ #[ test]
84
+ fn valid_rfc3339_timestamps ( ) {
85
+ let start_time = "2023-01-01T12:00:00Z" ;
86
+ let end_time = "2023-01-01T13:00:00Z" ;
87
+
88
+ let result = TimeRange :: parse_human_time ( start_time, end_time) ;
89
+ let parsed = result. unwrap ( ) ;
90
+
91
+ assert_eq ! (
92
+ parsed. start. to_rfc3339_opts( SecondsFormat :: Secs , true ) ,
93
+ start_time
94
+ ) ;
95
+ assert_eq ! (
96
+ parsed. end. to_rfc3339_opts( SecondsFormat :: Secs , true ) ,
97
+ end_time
98
+ ) ;
99
+ }
100
+
101
+ #[ test]
102
+ fn end_time_now_with_valid_duration ( ) {
103
+ let start_time = "1h" ;
104
+ let end_time = "now" ;
105
+
106
+ let result = TimeRange :: parse_human_time ( start_time, end_time) ;
107
+ let parsed = result. unwrap ( ) ;
108
+
109
+ assert ! ( parsed. end <= Utc :: now( ) ) ;
110
+ assert_eq ! ( parsed. end - parsed. start, Duration :: hours( 1 ) ) ;
111
+
112
+ let start_time = "30 minutes" ;
113
+ let end_time = "now" ;
114
+
115
+ let result = TimeRange :: parse_human_time ( start_time, end_time) ;
116
+ let parsed = result. unwrap ( ) ;
117
+
118
+ assert ! ( parsed. end <= Utc :: now( ) ) ;
119
+ assert_eq ! ( parsed. end - parsed. start, Duration :: minutes( 30 ) ) ;
120
+ }
121
+
122
+ #[ test]
123
+ fn start_time_after_end_time ( ) {
124
+ let start_time = "2023-01-01T14:00:00Z" ;
125
+ let end_time = "2023-01-01T13:00:00Z" ;
126
+
127
+ let result = TimeRange :: parse_human_time ( start_time, end_time) ;
128
+ assert ! ( matches!( result, Err ( TimeParseError :: StartTimeAfterEndTime ) ) ) ;
129
+ }
130
+
131
+ #[ test]
132
+ fn invalid_start_time_format ( ) {
133
+ let start_time = "not-a-valid-time" ;
134
+ let end_time = "2023-01-01T13:00:00Z" ;
135
+
136
+ let result = TimeRange :: parse_human_time ( start_time, end_time) ;
137
+ assert ! ( matches!( result, Err ( TimeParseError :: Chrono ( _) ) ) ) ;
138
+ }
139
+
140
+ #[ test]
141
+ fn invalid_end_time_format ( ) {
142
+ let start_time = "2023-01-01T12:00:00Z" ;
143
+ let end_time = "not-a-valid-time" ;
144
+
145
+ let result = TimeRange :: parse_human_time ( start_time, end_time) ;
146
+ assert ! ( matches!( result, Err ( TimeParseError :: Chrono ( _) ) ) ) ;
147
+ }
148
+
149
+ #[ test]
150
+ fn invalid_duration_with_end_time_now ( ) {
151
+ let start_time = "not-a-duration" ;
152
+ let end_time = "now" ;
153
+
154
+ let result = TimeRange :: parse_human_time ( start_time, end_time) ;
155
+ assert ! ( matches!( result, Err ( TimeParseError :: HumanTime ( _) ) ) ) ;
156
+ }
157
+ }
0 commit comments