2023-03-21 13:21:03 +00:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
2022-04-04 11:04:38 +00:00
|
|
|
from datetime import datetime, timezone
|
2016-11-23 23:49:53 +00:00
|
|
|
|
2021-12-04 11:33:50 +00:00
|
|
|
import time_machine
|
2016-11-23 23:49:53 +00:00
|
|
|
from django.test import TestCase
|
|
|
|
|
|
|
|
|
|
from model_utils.fields import MonitorField
|
2020-11-29 20:58:00 +00:00
|
|
|
from tests.models import DoubleMonitored, Monitored, MonitorWhen, MonitorWhenEmpty
|
2016-11-23 23:49:53 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class MonitorFieldTests(TestCase):
|
2023-03-22 17:50:18 +00:00
|
|
|
def setUp(self) -> None:
|
2022-04-04 11:04:38 +00:00
|
|
|
with time_machine.travel(datetime(2016, 1, 1, 10, 0, 0, tzinfo=timezone.utc)):
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance = Monitored(name='Charlie')
|
|
|
|
|
self.created = self.instance.name_changed
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_save_no_change(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance.save()
|
|
|
|
|
self.assertEqual(self.instance.name_changed, self.created)
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_save_changed(self) -> None:
|
2022-04-04 11:04:38 +00:00
|
|
|
with time_machine.travel(datetime(2016, 1, 1, 12, 0, 0, tzinfo=timezone.utc)):
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance.name = 'Maria'
|
|
|
|
|
self.instance.save()
|
2022-04-04 11:04:38 +00:00
|
|
|
self.assertEqual(self.instance.name_changed, datetime(2016, 1, 1, 12, 0, 0, tzinfo=timezone.utc))
|
2016-11-23 23:49:53 +00:00
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_double_save(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance.name = 'Jose'
|
|
|
|
|
self.instance.save()
|
|
|
|
|
changed = self.instance.name_changed
|
|
|
|
|
self.instance.save()
|
|
|
|
|
self.assertEqual(self.instance.name_changed, changed)
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_no_monitor_arg(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
with self.assertRaises(TypeError):
|
2024-03-29 16:12:32 +00:00
|
|
|
MonitorField() # type: ignore[call-arg]
|
2016-11-23 23:49:53 +00:00
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_monitor_default_is_none_when_nullable(self) -> None:
|
2024-04-04 08:26:17 +00:00
|
|
|
self.assertIsNone(self.instance.name_changed_nullable)
|
|
|
|
|
expected_datetime = datetime(2022, 1, 18, 12, 0, 0, tzinfo=timezone.utc)
|
|
|
|
|
|
|
|
|
|
self.instance.name = "Jose"
|
|
|
|
|
with time_machine.travel(expected_datetime, tick=False):
|
|
|
|
|
self.instance.save()
|
|
|
|
|
|
|
|
|
|
self.assertEqual(self.instance.name_changed_nullable, expected_datetime)
|
2023-07-19 22:39:36 +00:00
|
|
|
|
2016-11-23 23:49:53 +00:00
|
|
|
|
|
|
|
|
class MonitorWhenFieldTests(TestCase):
|
|
|
|
|
"""
|
|
|
|
|
Will record changes only when name is 'Jose' or 'Maria'
|
|
|
|
|
"""
|
2023-03-22 17:50:18 +00:00
|
|
|
def setUp(self) -> None:
|
2022-04-04 11:04:38 +00:00
|
|
|
with time_machine.travel(datetime(2016, 1, 1, 10, 0, 0, tzinfo=timezone.utc)):
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance = MonitorWhen(name='Charlie')
|
|
|
|
|
self.created = self.instance.name_changed
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_save_no_change(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance.save()
|
|
|
|
|
self.assertEqual(self.instance.name_changed, self.created)
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_save_changed_to_Jose(self) -> None:
|
2022-04-04 11:04:38 +00:00
|
|
|
with time_machine.travel(datetime(2016, 1, 1, 12, 0, 0, tzinfo=timezone.utc)):
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance.name = 'Jose'
|
|
|
|
|
self.instance.save()
|
2022-04-04 11:04:38 +00:00
|
|
|
self.assertEqual(self.instance.name_changed, datetime(2016, 1, 1, 12, 0, 0, tzinfo=timezone.utc))
|
2016-11-23 23:49:53 +00:00
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_save_changed_to_Maria(self) -> None:
|
2022-04-04 11:04:38 +00:00
|
|
|
with time_machine.travel(datetime(2016, 1, 1, 12, 0, 0, tzinfo=timezone.utc)):
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance.name = 'Maria'
|
|
|
|
|
self.instance.save()
|
2022-04-04 11:04:38 +00:00
|
|
|
self.assertEqual(self.instance.name_changed, datetime(2016, 1, 1, 12, 0, 0, tzinfo=timezone.utc))
|
2016-11-23 23:49:53 +00:00
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_save_changed_to_Pedro(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance.name = 'Pedro'
|
|
|
|
|
self.instance.save()
|
|
|
|
|
self.assertEqual(self.instance.name_changed, self.created)
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_double_save(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance.name = 'Jose'
|
|
|
|
|
self.instance.save()
|
|
|
|
|
changed = self.instance.name_changed
|
|
|
|
|
self.instance.save()
|
|
|
|
|
self.assertEqual(self.instance.name_changed, changed)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MonitorWhenEmptyFieldTests(TestCase):
|
|
|
|
|
"""
|
|
|
|
|
Monitor should never be updated id when is an empty list.
|
|
|
|
|
"""
|
2023-03-22 17:50:18 +00:00
|
|
|
def setUp(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance = MonitorWhenEmpty(name='Charlie')
|
|
|
|
|
self.created = self.instance.name_changed
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_save_no_change(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance.save()
|
|
|
|
|
self.assertEqual(self.instance.name_changed, self.created)
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_save_changed_to_Jose(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance.name = 'Jose'
|
|
|
|
|
self.instance.save()
|
|
|
|
|
self.assertEqual(self.instance.name_changed, self.created)
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_save_changed_to_Maria(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
self.instance.name = 'Maria'
|
|
|
|
|
self.instance.save()
|
|
|
|
|
self.assertEqual(self.instance.name_changed, self.created)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MonitorDoubleFieldTests(TestCase):
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def setUp(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
DoubleMonitored.objects.create(name='Charlie', name2='Charlie2')
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_recursion_error_with_only(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
# Any field passed to only() is generating a recursion error
|
|
|
|
|
list(DoubleMonitored.objects.only('id'))
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_recursion_error_with_defer(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
# Only monitored fields passed to defer() are failing
|
|
|
|
|
list(DoubleMonitored.objects.defer('name'))
|
|
|
|
|
|
2023-03-22 17:50:18 +00:00
|
|
|
def test_monitor_still_works_with_deferred_fields_filtered_out_of_save_initial(self) -> None:
|
2016-11-23 23:49:53 +00:00
|
|
|
obj = DoubleMonitored.objects.defer('name').get(name='Charlie')
|
2022-04-04 11:04:38 +00:00
|
|
|
with time_machine.travel(datetime(2016, 12, 1, tzinfo=timezone.utc)):
|
2016-11-23 23:49:53 +00:00
|
|
|
obj.name = 'Charlie2'
|
|
|
|
|
obj.save()
|
2022-04-04 11:04:38 +00:00
|
|
|
self.assertEqual(obj.name_changed, datetime(2016, 12, 1, tzinfo=timezone.utc))
|