18
18
from __future__ import division , absolute_import , print_function
19
19
20
20
from test import _common
21
- from datetime import datetime
21
+ from datetime import datetime , timedelta
22
22
import unittest
23
23
import time
24
24
from beets .dbcore .query import _parse_periods , DateInterval , DateQuery ,\
@@ -29,6 +29,10 @@ def _date(string):
29
29
return datetime .strptime (string , '%Y-%m-%dT%H:%M:%S' )
30
30
31
31
32
+ def _datepattern (datetimedate ):
33
+ return datetimedate .strftime ('%Y-%m-%dT%H:%M:%S' )
34
+
35
+
32
36
class DateIntervalTest (unittest .TestCase ):
33
37
def test_year_precision_intervals (self ):
34
38
self .assertContains ('2000..2001' , '2000-01-01T00:00:00' )
@@ -44,6 +48,9 @@ def test_year_precision_intervals(self):
44
48
self .assertContains ('..2001' , '2001-12-31T23:59:59' )
45
49
self .assertExcludes ('..2001' , '2002-01-01T00:00:00' )
46
50
51
+ self .assertContains ('-1d..1d' , _datepattern (datetime .now ()))
52
+ self .assertExcludes ('-2d..-1d' , _datepattern (datetime .now ()))
53
+
47
54
def test_day_precision_intervals (self ):
48
55
self .assertContains ('2000-06-20..2000-06-20' , '2000-06-20T00:00:00' )
49
56
self .assertContains ('2000-06-20..2000-06-20' , '2000-06-20T10:20:30' )
@@ -161,6 +168,87 @@ def test_single_day_nonmatch_fast(self):
161
168
self .assertEqual (len (matched ), 0 )
162
169
163
170
171
+ class DateQueryTestRelative (_common .LibTestCase ):
172
+ def setUp (self ):
173
+ super (DateQueryTestRelative , self ).setUp ()
174
+ self .i .added = _parsetime (datetime .now ().strftime ('%Y-%m-%d %H:%M' ))
175
+ self .i .store ()
176
+
177
+ def test_single_month_match_fast (self ):
178
+ query = DateQuery ('added' , datetime .now ().strftime ('%Y-%m' ))
179
+ matched = self .lib .items (query )
180
+ self .assertEqual (len (matched ), 1 )
181
+
182
+ def test_single_month_nonmatch_fast (self ):
183
+ query = DateQuery ('added' , (datetime .now () + timedelta (days = 30 ))
184
+ .strftime ('%Y-%m' ))
185
+ matched = self .lib .items (query )
186
+ self .assertEqual (len (matched ), 0 )
187
+
188
+ def test_single_month_match_slow (self ):
189
+ query = DateQuery ('added' , datetime .now ().strftime ('%Y-%m' ))
190
+ self .assertTrue (query .match (self .i ))
191
+
192
+ def test_single_month_nonmatch_slow (self ):
193
+ query = DateQuery ('added' , (datetime .now () + timedelta (days = 30 ))
194
+ .strftime ('%Y-%m' ))
195
+ self .assertFalse (query .match (self .i ))
196
+
197
+ def test_single_day_match_fast (self ):
198
+ query = DateQuery ('added' , datetime .now ().strftime ('%Y-%m-%d' ))
199
+ matched = self .lib .items (query )
200
+ self .assertEqual (len (matched ), 1 )
201
+
202
+ def test_single_day_nonmatch_fast (self ):
203
+ query = DateQuery ('added' , (datetime .now () + timedelta (days = 1 ))
204
+ .strftime ('%Y-%m-%d' ))
205
+ matched = self .lib .items (query )
206
+ self .assertEqual (len (matched ), 0 )
207
+
208
+
209
+ class DateQueryTestRelativeMore (_common .LibTestCase ):
210
+ def setUp (self ):
211
+ super (DateQueryTestRelativeMore , self ).setUp ()
212
+ self .i .added = _parsetime (datetime .now ().strftime ('%Y-%m-%d %H:%M' ))
213
+ self .i .store ()
214
+
215
+ def test_relative (self ):
216
+ for timespan in ['d' , 'w' , 'm' , 'y' ]:
217
+ query = DateQuery ('added' , '-4' + timespan + '..+4' + timespan )
218
+ matched = self .lib .items (query )
219
+ self .assertEqual (len (matched ), 1 )
220
+
221
+ def test_relative_fail (self ):
222
+ for timespan in ['d' , 'w' , 'm' , 'y' ]:
223
+ query = DateQuery ('added' , '-2' + timespan + '..-1' + timespan )
224
+ matched = self .lib .items (query )
225
+ self .assertEqual (len (matched ), 0 )
226
+
227
+ def test_start_relative (self ):
228
+ for timespan in ['d' , 'w' , 'm' , 'y' ]:
229
+ query = DateQuery ('added' , '-4' + timespan + '..' )
230
+ matched = self .lib .items (query )
231
+ self .assertEqual (len (matched ), 1 )
232
+
233
+ def test_start_relative_fail (self ):
234
+ for timespan in ['d' , 'w' , 'm' , 'y' ]:
235
+ query = DateQuery ('added' , '4' + timespan + '..' )
236
+ matched = self .lib .items (query )
237
+ self .assertEqual (len (matched ), 0 )
238
+
239
+ def test_end_relative (self ):
240
+ for timespan in ['d' , 'w' , 'm' , 'y' ]:
241
+ query = DateQuery ('added' , '..+4' + timespan )
242
+ matched = self .lib .items (query )
243
+ self .assertEqual (len (matched ), 1 )
244
+
245
+ def test_end_relative_fail (self ):
246
+ for timespan in ['d' , 'w' , 'm' , 'y' ]:
247
+ query = DateQuery ('added' , '..-4' + timespan )
248
+ matched = self .lib .items (query )
249
+ self .assertEqual (len (matched ), 0 )
250
+
251
+
164
252
class DateQueryConstructTest (unittest .TestCase ):
165
253
def test_long_numbers (self ):
166
254
with self .assertRaises (InvalidQueryArgumentValueError ):
0 commit comments