| 354 | from views import BookWeekArchive |
| 355 | |
| 356 | class WeekArchiveTest(TestCase): |
| 357 | """ |
| 358 | Test that WeekArchive gets the correct queryset for each week in a year. As of |
| 359 | changeset 14656, it does work when the week_format is '%U', i.e., each week begins |
| 360 | on a Sunday, which is the default case. However, it did not work correctly when |
| 361 | using '%W', i.e., each week begins on a Monday. |
| 362 | |
| 363 | This test creates a Book object for each day of a year and then tests that the |
| 364 | correct queryset is returned for all possible cases involving a week. |
| 365 | |
| 366 | BaseWeekArchiveView.get_dated_items calls a helper function, _date_from_string, |
| 367 | to get the date for a given week number. It does this correctly for weeks |
| 368 | beginning on Sunday, for example, for the 10th week in 2009, with: |
| 369 | time.strptime('2009__0__10', '%Y__%w__%U') |
| 370 | However, if we are requesting a week beginning on Monday, it should use: |
| 371 | time.strptime('2009__1__10', '%Y__%w__%W') |
| 372 | but instead it used: |
| 373 | time.strptime('2009__0__10', '%Y__%w__%W') |
| 374 | """ |
| 375 | test_year = 2009 # if you use current year, you'll have to deal with allow_future issues |
| 376 | |
| 377 | def every_day_in_year(self, year=test_year): |
| 378 | "Generate a date for every day in a year" |
| 379 | date = datetime.date(self.test_year, 1, 1) |
| 380 | last_date = date.replace(year=date.year+1) |
| 381 | while date < last_date: |
| 382 | yield date |
| 383 | date += datetime.timedelta(days=1) |
| 384 | |
| 385 | def dates_grouped_by_week(self, week_format): |
| 386 | "The dates for an entire year, grouped by week, specified by week_format (%U or %W)" |
| 387 | group_key = lambda date:date.strftime(week_format) |
| 388 | return itertools.groupby(self.every_day_in_year(), group_key) |
| 389 | |
| 390 | def setUp(self): |
| 391 | "Create a Book for every day of the year" |
| 392 | for pubdate in self.every_day_in_year(): |
| 393 | day_of_year = pubdate.strftime('%j') |
| 394 | Book.objects.create(name=day_of_year, slug=day_of_year, pages=1, pubdate=pubdate) |
| 395 | |
| 396 | def test_simple(self): |
| 397 | "See that each Book object exists and is what we expect" |
| 398 | for date in self.every_day_in_year(): |
| 399 | obj = Book.objects.get(pubdate=date) |
| 400 | self.assertEqual(obj.name, obj.slug) |
| 401 | self.assertEqual(obj.slug, date.strftime('%j')) |
| 402 | |
| 403 | def test_week_start_Sunday(self): |
| 404 | week_format = '%U' |
| 405 | self.common_week_start(week_format) |
| 406 | |
| 407 | def test_week_start_Monday(self): |
| 408 | week_format = '%W' |
| 409 | self.common_week_start(week_format) |
| 410 | |
| 411 | def common_week_start(self, week_format): |
| 412 | """ |
| 413 | We get a list of dates belonging to each week of the year, |
| 414 | as determined by the week_format (either dates starting on Sunday, |
| 415 | or dates starting on Monday). Because we have a Book for each day |
| 416 | of the year, the list of dates should match the dates from the Books |
| 417 | retrieved for that week. |
| 418 | """ |
| 419 | for key,group in self.dates_grouped_by_week(week_format): |
| 420 | dates_in_week = list(group) |
| 421 | view_obj = BookWeekArchive(week_format = week_format, year = str(self.test_year), week = key) |
| 422 | date_list, qs, extra_context = view_obj.get_dated_items() |
| 423 | self.assertEqual(date_list, None) |
| 424 | qs_dates = sorted([obj.pubdate for obj in qs]) |
| 425 | self.assertEqual( dates_in_week, qs_dates ) |