mirror of
https://github.com/Hopiu/django-model-utils.git
synced 2026-03-16 20:00:23 +00:00
Switch from freezegun to time-machine.
It’s [more accurate](https://adamj.eu/tech/2020/06/03/introducing-time-machine/) and [faster](https://adamj.eu/tech/2021/02/19/freezegun-versus-time-machine/).
This commit is contained in:
parent
02bd67cf7a
commit
8edd7c00fc
5 changed files with 27 additions and 27 deletions
|
|
@ -2,5 +2,5 @@
|
||||||
|
|
||||||
tox
|
tox
|
||||||
sphinx
|
sphinx
|
||||||
|
time-machine
|
||||||
twine
|
twine
|
||||||
freezegun
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
import time_machine
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from freezegun import freeze_time
|
|
||||||
|
|
||||||
from model_utils.fields import MonitorField
|
from model_utils.fields import MonitorField
|
||||||
from tests.models import DoubleMonitored, Monitored, MonitorWhen, MonitorWhenEmpty
|
from tests.models import DoubleMonitored, Monitored, MonitorWhen, MonitorWhenEmpty
|
||||||
|
|
@ -9,7 +9,7 @@ from tests.models import DoubleMonitored, Monitored, MonitorWhen, MonitorWhenEmp
|
||||||
|
|
||||||
class MonitorFieldTests(TestCase):
|
class MonitorFieldTests(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
with freeze_time(datetime(2016, 1, 1, 10, 0, 0)):
|
with time_machine.travel(datetime(2016, 1, 1, 10, 0, 0)):
|
||||||
self.instance = Monitored(name='Charlie')
|
self.instance = Monitored(name='Charlie')
|
||||||
self.created = self.instance.name_changed
|
self.created = self.instance.name_changed
|
||||||
|
|
||||||
|
|
@ -18,7 +18,7 @@ class MonitorFieldTests(TestCase):
|
||||||
self.assertEqual(self.instance.name_changed, self.created)
|
self.assertEqual(self.instance.name_changed, self.created)
|
||||||
|
|
||||||
def test_save_changed(self):
|
def test_save_changed(self):
|
||||||
with freeze_time(datetime(2016, 1, 1, 12, 0, 0)):
|
with time_machine.travel(datetime(2016, 1, 1, 12, 0, 0)):
|
||||||
self.instance.name = 'Maria'
|
self.instance.name = 'Maria'
|
||||||
self.instance.save()
|
self.instance.save()
|
||||||
self.assertEqual(self.instance.name_changed, datetime(2016, 1, 1, 12, 0, 0))
|
self.assertEqual(self.instance.name_changed, datetime(2016, 1, 1, 12, 0, 0))
|
||||||
|
|
@ -40,7 +40,7 @@ class MonitorWhenFieldTests(TestCase):
|
||||||
Will record changes only when name is 'Jose' or 'Maria'
|
Will record changes only when name is 'Jose' or 'Maria'
|
||||||
"""
|
"""
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
with freeze_time(datetime(2016, 1, 1, 10, 0, 0)):
|
with time_machine.travel(datetime(2016, 1, 1, 10, 0, 0)):
|
||||||
self.instance = MonitorWhen(name='Charlie')
|
self.instance = MonitorWhen(name='Charlie')
|
||||||
self.created = self.instance.name_changed
|
self.created = self.instance.name_changed
|
||||||
|
|
||||||
|
|
@ -49,13 +49,13 @@ class MonitorWhenFieldTests(TestCase):
|
||||||
self.assertEqual(self.instance.name_changed, self.created)
|
self.assertEqual(self.instance.name_changed, self.created)
|
||||||
|
|
||||||
def test_save_changed_to_Jose(self):
|
def test_save_changed_to_Jose(self):
|
||||||
with freeze_time(datetime(2016, 1, 1, 12, 0, 0)):
|
with time_machine.travel(datetime(2016, 1, 1, 12, 0, 0)):
|
||||||
self.instance.name = 'Jose'
|
self.instance.name = 'Jose'
|
||||||
self.instance.save()
|
self.instance.save()
|
||||||
self.assertEqual(self.instance.name_changed, datetime(2016, 1, 1, 12, 0, 0))
|
self.assertEqual(self.instance.name_changed, datetime(2016, 1, 1, 12, 0, 0))
|
||||||
|
|
||||||
def test_save_changed_to_Maria(self):
|
def test_save_changed_to_Maria(self):
|
||||||
with freeze_time(datetime(2016, 1, 1, 12, 0, 0)):
|
with time_machine.travel(datetime(2016, 1, 1, 12, 0, 0)):
|
||||||
self.instance.name = 'Maria'
|
self.instance.name = 'Maria'
|
||||||
self.instance.save()
|
self.instance.save()
|
||||||
self.assertEqual(self.instance.name_changed, datetime(2016, 1, 1, 12, 0, 0))
|
self.assertEqual(self.instance.name_changed, datetime(2016, 1, 1, 12, 0, 0))
|
||||||
|
|
@ -111,7 +111,7 @@ class MonitorDoubleFieldTests(TestCase):
|
||||||
|
|
||||||
def test_monitor_still_works_with_deferred_fields_filtered_out_of_save_initial(self):
|
def test_monitor_still_works_with_deferred_fields_filtered_out_of_save_initial(self):
|
||||||
obj = DoubleMonitored.objects.defer('name').get(name='Charlie')
|
obj = DoubleMonitored.objects.defer('name').get(name='Charlie')
|
||||||
with freeze_time("2016-12-01"):
|
with time_machine.travel("2016-12-01"):
|
||||||
obj.name = 'Charlie2'
|
obj.name = 'Charlie2'
|
||||||
obj.save()
|
obj.save()
|
||||||
self.assertEqual(obj.name_changed, datetime(2016, 12, 1))
|
self.assertEqual(obj.name_changed, datetime(2016, 12, 1))
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
|
import time_machine
|
||||||
from django.test.testcases import TestCase
|
from django.test.testcases import TestCase
|
||||||
from freezegun import freeze_time
|
|
||||||
|
|
||||||
from tests.models import Status, StatusCustomManager, StatusPlainTuple
|
from tests.models import Status, StatusCustomManager, StatusPlainTuple
|
||||||
|
|
||||||
|
|
@ -13,7 +13,7 @@ class StatusModelTests(TestCase):
|
||||||
self.active = Status.STATUS.active
|
self.active = Status.STATUS.active
|
||||||
|
|
||||||
def test_created(self):
|
def test_created(self):
|
||||||
with freeze_time(datetime(2016, 1, 1)):
|
with time_machine.travel(datetime(2016, 1, 1)):
|
||||||
c1 = self.model.objects.create()
|
c1 = self.model.objects.create()
|
||||||
self.assertTrue(c1.status_changed, datetime(2016, 1, 1))
|
self.assertTrue(c1.status_changed, datetime(2016, 1, 1))
|
||||||
|
|
||||||
|
|
@ -43,10 +43,10 @@ class StatusModelTests(TestCase):
|
||||||
accordingly when update_fields is used as an argument
|
accordingly when update_fields is used as an argument
|
||||||
and status_changed is provided
|
and status_changed is provided
|
||||||
'''
|
'''
|
||||||
with freeze_time(datetime(2020, 1, 1)):
|
with time_machine.travel(datetime(2020, 1, 1)):
|
||||||
t1 = Status.objects.create()
|
t1 = Status.objects.create()
|
||||||
|
|
||||||
with freeze_time(datetime(2020, 1, 2)):
|
with time_machine.travel(datetime(2020, 1, 2)):
|
||||||
t1.status = Status.on_hold
|
t1.status = Status.on_hold
|
||||||
t1.save(update_fields=['status', 'status_changed'])
|
t1.save(update_fields=['status', 'status_changed'])
|
||||||
|
|
||||||
|
|
@ -58,10 +58,10 @@ class StatusModelTests(TestCase):
|
||||||
accordingly when update_fields is used as an argument
|
accordingly when update_fields is used as an argument
|
||||||
with status and status_changed is not provided
|
with status and status_changed is not provided
|
||||||
'''
|
'''
|
||||||
with freeze_time(datetime(2020, 1, 1)):
|
with time_machine.travel(datetime(2020, 1, 1)):
|
||||||
t1 = Status.objects.create()
|
t1 = Status.objects.create()
|
||||||
|
|
||||||
with freeze_time(datetime(2020, 1, 2)):
|
with time_machine.travel(datetime(2020, 1, 2)):
|
||||||
t1.status = Status.on_hold
|
t1.status = Status.on_hold
|
||||||
t1.save(update_fields=['status'])
|
t1.save(update_fields=['status'])
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,14 @@
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
import time_machine
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from freezegun import freeze_time
|
|
||||||
|
|
||||||
from tests.models import TimeStamp, TimeStampWithStatusModel
|
from tests.models import TimeStamp, TimeStampWithStatusModel
|
||||||
|
|
||||||
|
|
||||||
class TimeStampedModelTests(TestCase):
|
class TimeStampedModelTests(TestCase):
|
||||||
def test_created(self):
|
def test_created(self):
|
||||||
with freeze_time(datetime(2016, 1, 1)):
|
with time_machine.travel(datetime(2016, 1, 1)):
|
||||||
t1 = TimeStamp.objects.create()
|
t1 = TimeStamp.objects.create()
|
||||||
self.assertEqual(t1.created, datetime(2016, 1, 1))
|
self.assertEqual(t1.created, datetime(2016, 1, 1))
|
||||||
|
|
||||||
|
|
@ -20,10 +20,10 @@ class TimeStampedModelTests(TestCase):
|
||||||
self.assertEqual(t1.created, t1.modified)
|
self.assertEqual(t1.created, t1.modified)
|
||||||
|
|
||||||
def test_modified(self):
|
def test_modified(self):
|
||||||
with freeze_time(datetime(2016, 1, 1)):
|
with time_machine.travel(datetime(2016, 1, 1)):
|
||||||
t1 = TimeStamp.objects.create()
|
t1 = TimeStamp.objects.create()
|
||||||
|
|
||||||
with freeze_time(datetime(2016, 1, 2)):
|
with time_machine.travel(datetime(2016, 1, 2)):
|
||||||
t1.save()
|
t1.save()
|
||||||
|
|
||||||
self.assertEqual(t1.modified, datetime(2016, 1, 2))
|
self.assertEqual(t1.modified, datetime(2016, 1, 2))
|
||||||
|
|
@ -104,10 +104,10 @@ class TimeStampedModelTests(TestCase):
|
||||||
|
|
||||||
for update_fields in tests:
|
for update_fields in tests:
|
||||||
with self.subTest(update_fields=update_fields):
|
with self.subTest(update_fields=update_fields):
|
||||||
with freeze_time(datetime(2020, 1, 1)):
|
with time_machine.travel(datetime(2020, 1, 1)):
|
||||||
t1 = TimeStamp.objects.create()
|
t1 = TimeStamp.objects.create()
|
||||||
|
|
||||||
with freeze_time(datetime(2020, 1, 2)):
|
with time_machine.travel(datetime(2020, 1, 2)):
|
||||||
t1.save(update_fields=update_fields)
|
t1.save(update_fields=update_fields)
|
||||||
self.assertEqual(t1.modified, datetime(2020, 1, 2))
|
self.assertEqual(t1.modified, datetime(2020, 1, 2))
|
||||||
|
|
||||||
|
|
@ -120,10 +120,10 @@ class TimeStampedModelTests(TestCase):
|
||||||
|
|
||||||
for update_fields in tests:
|
for update_fields in tests:
|
||||||
with self.subTest(update_fields=update_fields):
|
with self.subTest(update_fields=update_fields):
|
||||||
with freeze_time(datetime(2020, 1, 1)):
|
with time_machine.travel(datetime(2020, 1, 1)):
|
||||||
t1 = TimeStamp.objects.create()
|
t1 = TimeStamp.objects.create()
|
||||||
|
|
||||||
with freeze_time(datetime(2020, 1, 2)):
|
with time_machine.travel(datetime(2020, 1, 2)):
|
||||||
t1.test_field = 1
|
t1.test_field = 1
|
||||||
t1.save(update_fields=update_fields)
|
t1.save(update_fields=update_fields)
|
||||||
|
|
||||||
|
|
@ -132,19 +132,19 @@ class TimeStampedModelTests(TestCase):
|
||||||
self.assertEqual(t1.modified, datetime(2020, 1, 1))
|
self.assertEqual(t1.modified, datetime(2020, 1, 1))
|
||||||
|
|
||||||
def test_save_updates_modified_value_when_update_fields_explicitly_set_to_none(self):
|
def test_save_updates_modified_value_when_update_fields_explicitly_set_to_none(self):
|
||||||
with freeze_time(datetime(2020, 1, 1)):
|
with time_machine.travel(datetime(2020, 1, 1)):
|
||||||
t1 = TimeStamp.objects.create()
|
t1 = TimeStamp.objects.create()
|
||||||
|
|
||||||
with freeze_time(datetime(2020, 1, 2)):
|
with time_machine.travel(datetime(2020, 1, 2)):
|
||||||
t1.save(update_fields=None)
|
t1.save(update_fields=None)
|
||||||
|
|
||||||
self.assertEqual(t1.modified, datetime(2020, 1, 2))
|
self.assertEqual(t1.modified, datetime(2020, 1, 2))
|
||||||
|
|
||||||
def test_model_inherit_timestampmodel_and_statusmodel(self):
|
def test_model_inherit_timestampmodel_and_statusmodel(self):
|
||||||
with freeze_time(datetime(2020, 1, 1)):
|
with time_machine.travel(datetime(2020, 1, 1)):
|
||||||
t1 = TimeStampWithStatusModel.objects.create()
|
t1 = TimeStampWithStatusModel.objects.create()
|
||||||
|
|
||||||
with freeze_time(datetime(2020, 1, 2)):
|
with time_machine.travel(datetime(2020, 1, 2)):
|
||||||
t1.save(update_fields=['test_field', 'status'])
|
t1.save(update_fields=['test_field', 'status'])
|
||||||
|
|
||||||
self.assertEqual(t1.modified, datetime(2020, 1, 2))
|
self.assertEqual(t1.modified, datetime(2020, 1, 2))
|
||||||
|
|
|
||||||
2
tox.ini
2
tox.ini
|
|
@ -16,7 +16,7 @@ python =
|
||||||
|
|
||||||
[testenv]
|
[testenv]
|
||||||
deps =
|
deps =
|
||||||
freezegun==0.3.12
|
time-machine==2.4.1
|
||||||
-rrequirements-test.txt
|
-rrequirements-test.txt
|
||||||
dj22: Django==2.2.*
|
dj22: Django==2.2.*
|
||||||
dj31: Django==3.1.*
|
dj31: Django==3.1.*
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue