|
4 | 4 | from io import BytesIO |
5 | 5 |
|
6 | 6 | from django.contrib.auth.models import AnonymousUser |
| 7 | +from django.core.exceptions import ValidationError |
7 | 8 | from django.core.files.uploadedfile import SimpleUploadedFile |
8 | 9 | from django.db import connection, models |
9 | 10 | from django.test import TestCase, override_settings |
10 | 11 | from guardian.shortcuts import assign_perm, get_perms, remove_perm |
11 | 12 | from PIL import Image |
12 | 13 | from rest_framework import status |
13 | 14 | from rest_framework.test import APIRequestFactory, APITestCase |
| 15 | +from django.utils import timezone |
14 | 16 | from rich import print |
15 | 17 |
|
16 | 18 | from ami.exports.models import DataExport |
17 | 19 | from ami.jobs.models import VALID_JOB_TYPES, Job |
| 20 | +from ami.main.api.serializers import DeploymentSerializer |
18 | 21 | from ami.main.models import ( |
19 | 22 | Classification, |
20 | 23 | Deployment, |
|
46 | 49 | logger = logging.getLogger(__name__) |
47 | 50 |
|
48 | 51 |
|
| 52 | +class TestTimeZoneNormalization(TestCase): |
| 53 | + def test_deployment_invalid_time_zone_raises(self): |
| 54 | + project = Project.objects.create(name="TZ Project", create_defaults=False) |
| 55 | + deployment = Deployment(project=project, name="D1", time_zone="Mars/Phobos") |
| 56 | + with self.assertRaises(ValidationError): |
| 57 | + deployment.full_clean() |
| 58 | + |
| 59 | + def test_deployment_serializer_exposes_time_zone(self): |
| 60 | + project = Project.objects.create(name="TZ Project", create_defaults=False) |
| 61 | + deployment = Deployment.objects.create(project=project, name="D1", time_zone="UTC") |
| 62 | + |
| 63 | + class MinimalDeploymentSerializer(DeploymentSerializer): |
| 64 | + class Meta(DeploymentSerializer.Meta): |
| 65 | + fields = ("id", "time_zone") |
| 66 | + |
| 67 | + request = APIRequestFactory().get("/") |
| 68 | + request.user = AnonymousUser() |
| 69 | + |
| 70 | + data = MinimalDeploymentSerializer(deployment, context={"request": request}).data |
| 71 | + self.assertEqual(data["time_zone"], "UTC") |
| 72 | + |
| 73 | + @override_settings(USE_TZ=True) |
| 74 | + def test_event_presave_normalizes_with_deployment_tz(self): |
| 75 | + project = Project.objects.create(name="TZ Project", create_defaults=False) |
| 76 | + deployment = Deployment.objects.create(project=project, name="D1", time_zone="America/New_York") |
| 77 | + start = datetime.datetime(2020, 1, 1, 0, 0, 0) # naive |
| 78 | + end = datetime.datetime(2020, 1, 1, 1, 0, 0) |
| 79 | + event = Event.objects.create(project=project, deployment=deployment, start=start, end=end, group_by="g1") |
| 80 | + self.assertEqual(event.start.tzinfo, timezone.utc) |
| 81 | + self.assertEqual(event.end.tzinfo, timezone.utc) |
| 82 | + expected_start = datetime.datetime(2020, 1, 1, 5, 0, 0, tzinfo=timezone.utc) |
| 83 | + expected_end = datetime.datetime(2020, 1, 1, 6, 0, 0, tzinfo=timezone.utc) |
| 84 | + self.assertEqual(event.start, expected_start) # America/New_York (Eastern Standard Time, UTC-5) -> UTC |
| 85 | + self.assertEqual(event.end, expected_end) |
| 86 | + |
| 87 | + |
49 | 88 | class TestProjectSetup(TestCase): |
50 | 89 | def test_project_creation(self): |
51 | 90 | project = Project.objects.create(name="New Project with Defaults", create_defaults=True) |
|
0 commit comments