|
5 | 5 | import pytz
|
6 | 6 | from django import db
|
7 | 7 | from django.contrib.auth.models import User
|
8 |
| -from django.db.models import functions |
| 8 | +from django.db import connection |
| 9 | +from django.db.models import functions, Value |
9 | 10 | from django.test import TestCase, override_settings
|
10 | 11 | from django.utils import timezone
|
11 | 12 |
|
12 | 13 | import naivedatetimefield
|
| 14 | +from naivedatetimefield import AtTimeZone |
13 | 15 | from .models import (
|
14 | 16 | NaiveDateTimeTestModel,
|
15 | 17 | NaiveDateTimeAutoNowAddModel,
|
@@ -344,3 +346,138 @@ def test_select_by_naive(self):
|
344 | 346 | ).count()
|
345 | 347 |
|
346 | 348 | self.assertTrue(find_with_naive_in_utc == 1)
|
| 349 | + |
| 350 | + |
| 351 | +def identity(v): |
| 352 | + return v |
| 353 | + |
| 354 | + |
| 355 | +@skipIf(connection.vendor != "postgresql", "AtTimeZone is only supported in PostgreSQL") |
| 356 | +class AtTimeZoneTests(TestCase): |
| 357 | + @classmethod |
| 358 | + def setUpTestData(cls): |
| 359 | + cls.now = datetime.datetime(2019, 1, 15, 10) |
| 360 | + cls.perth_tz = pytz.timezone('Australia/Perth') |
| 361 | + cls.sydney_tz = pytz.timezone('Australia/Sydney') |
| 362 | + cls.adelaide_tz = pytz.timezone('Australia/Adelaide') |
| 363 | + |
| 364 | + cls.perth = NaiveDateTimeTestModel.objects.create( |
| 365 | + naive=cls.now, |
| 366 | + aware=timezone.make_aware(cls.now, cls.perth_tz), |
| 367 | + timezone='Australia/Perth', |
| 368 | + ) |
| 369 | + |
| 370 | + cls.sydney = NaiveDateTimeTestModel.objects.create( |
| 371 | + naive=cls.now, |
| 372 | + aware=timezone.make_aware(cls.now, cls.sydney_tz), |
| 373 | + timezone='Australia/Sydney', |
| 374 | + ) |
| 375 | + |
| 376 | + def test_annotate(self): |
| 377 | + self.assertQuerysetEqual( |
| 378 | + NaiveDateTimeTestModel.objects.annotate( |
| 379 | + naive_converted=AtTimeZone('aware', 'timezone'), |
| 380 | + aware_converted=AtTimeZone('naive', 'timezone'), |
| 381 | + ).values_list('naive_converted', 'aware_converted'), |
| 382 | + [ |
| 383 | + (self.now, timezone.make_aware(self.now, self.perth_tz)), |
| 384 | + (self.now, timezone.make_aware(self.now, self.sydney_tz)), |
| 385 | + ], |
| 386 | + transform=identity, |
| 387 | + ) |
| 388 | + |
| 389 | + def test_db_aware_db_timezone(self): |
| 390 | + self.assertQuerysetEqual( |
| 391 | + NaiveDateTimeTestModel.objects.filter( |
| 392 | + naive=AtTimeZone( |
| 393 | + 'aware', |
| 394 | + 'timezone', |
| 395 | + ) |
| 396 | + ), |
| 397 | + [self.perth, self.sydney], |
| 398 | + transform=identity, |
| 399 | + ) |
| 400 | + |
| 401 | + def test_db_aware_value_timezone(self): |
| 402 | + self.assertQuerysetEqual( |
| 403 | + NaiveDateTimeTestModel.objects.filter( |
| 404 | + naive__lt=AtTimeZone( |
| 405 | + 'aware', |
| 406 | + Value('Australia/Adelaide'), |
| 407 | + ) |
| 408 | + ), |
| 409 | + [self.perth], |
| 410 | + transform=identity, |
| 411 | + ) |
| 412 | + |
| 413 | + def test_db_naive_db_timezone(self): |
| 414 | + self.assertQuerysetEqual( |
| 415 | + NaiveDateTimeTestModel.objects.filter( |
| 416 | + aware=AtTimeZone( |
| 417 | + 'naive', |
| 418 | + 'timezone', |
| 419 | + ) |
| 420 | + ), |
| 421 | + [self.perth, self.sydney], |
| 422 | + transform=identity, |
| 423 | + ) |
| 424 | + |
| 425 | + def test_db_naive_value_timezone(self): |
| 426 | + self.assertQuerysetEqual( |
| 427 | + NaiveDateTimeTestModel.objects.filter( |
| 428 | + aware__lt=AtTimeZone( |
| 429 | + 'naive', |
| 430 | + Value('Australia/Adelaide'), |
| 431 | + ) |
| 432 | + ), |
| 433 | + [self.sydney], |
| 434 | + transform=identity, |
| 435 | + ) |
| 436 | + |
| 437 | + def test_value_aware_db_timezone(self): |
| 438 | + self.assertQuerysetEqual( |
| 439 | + NaiveDateTimeTestModel.objects.filter( |
| 440 | + naive__lt=AtTimeZone( |
| 441 | + timezone.make_aware(self.now, self.adelaide_tz), |
| 442 | + 'timezone', |
| 443 | + ) |
| 444 | + ), |
| 445 | + [self.sydney], |
| 446 | + transform=identity, |
| 447 | + ) |
| 448 | + |
| 449 | + def test_value_aware_value_timezone(self): |
| 450 | + self.assertQuerysetEqual( |
| 451 | + NaiveDateTimeTestModel.objects.filter( |
| 452 | + naive=AtTimeZone( |
| 453 | + Value(timezone.make_aware(self.now, self.adelaide_tz)), |
| 454 | + Value('Australia/Adelaide'), |
| 455 | + ) |
| 456 | + ), |
| 457 | + [self.perth, self.sydney], |
| 458 | + transform=identity, |
| 459 | + ) |
| 460 | + |
| 461 | + def test_value_naive_db_timezone(self): |
| 462 | + self.assertQuerysetEqual( |
| 463 | + NaiveDateTimeTestModel.objects.filter( |
| 464 | + aware=AtTimeZone( |
| 465 | + Value(self.now), |
| 466 | + 'timezone', |
| 467 | + ) |
| 468 | + ), |
| 469 | + [self.perth, self.sydney], |
| 470 | + transform=identity, |
| 471 | + ) |
| 472 | + |
| 473 | + def test_value_naive_value_timezone(self): |
| 474 | + self.assertQuerysetEqual( |
| 475 | + NaiveDateTimeTestModel.objects.filter( |
| 476 | + aware__lt=AtTimeZone( |
| 477 | + Value(self.now), |
| 478 | + Value('Australia/Adelaide'), |
| 479 | + ) |
| 480 | + ), |
| 481 | + [self.sydney], |
| 482 | + transform=identity, |
| 483 | + ) |
0 commit comments