From d9b0d76f3a7944c78e259652c8a09657c360629c Mon Sep 17 00:00:00 2001 From: Rich Rauenzahn Date: Tue, 31 May 2022 00:32:32 -0700 Subject: [PATCH] [tests] Check cases when reverse related field DoesNotExist. (#252) --- auditlog_tests/models.py | 13 +++++++++++-- auditlog_tests/tests.py | 36 ++++++++++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/auditlog_tests/models.py b/auditlog_tests/models.py index f11e1d2..1d08aa1 100644 --- a/auditlog_tests/models.py +++ b/auditlog_tests/models.py @@ -60,12 +60,21 @@ class ProxyModel(SimpleModel): proxy = True -class RelatedModel(models.Model): +class RelatedModelParent(models.Model): + """ + Use multi table inheritance to make a OneToOneRel field + """ + + +class RelatedModel(RelatedModelParent): """ A model with a foreign key. """ - related = models.ForeignKey(to="self", on_delete=models.CASCADE) + related = models.ForeignKey(to="SimpleModel", on_delete=models.CASCADE) + one_to_one = models.OneToOneField( + to="SimpleModel", on_delete=models.CASCADE, related_name="reverse_one_to_one" + ) history = AuditlogHistoryField() diff --git a/auditlog_tests/tests.py b/auditlog_tests/tests.py index 2f4f28c..91e4b5e 100644 --- a/auditlog_tests/tests.py +++ b/auditlog_tests/tests.py @@ -927,7 +927,7 @@ class RegisterModelSettingsTest(TestCase): self.assertTrue(self.test_auditlog.contains(SimpleExcludeModel)) self.assertTrue(self.test_auditlog.contains(ChoicesFieldModel)) - self.assertEqual(len(self.test_auditlog.get_models()), 17) + self.assertEqual(len(self.test_auditlog.get_models()), 18) def test_register_models_register_model_with_attrs(self): self.test_auditlog._register_models( @@ -1276,7 +1276,39 @@ class JSONModelTest(TestCase): class ModelInstanceDiffTest(TestCase): - def test_when_field_doesnt_exit(self): + def test_diff_models_with_related_fields(self): + """No error is raised when comparing models with related fields.""" + + # This tests that track_field() does indeed ignore related fields. + + # a model without reverse relations + simple1 = SimpleModel() + simple1.save() + + # a model with reverse relations + simple2 = SimpleModel() + simple2.save() + related = RelatedModel(related=simple2, one_to_one=simple2) + related.save() + + # Demonstrate that simple1 can have DoesNotExist on reverse + # OneToOne relation. + with self.assertRaises( + SimpleModel.reverse_one_to_one.RelatedObjectDoesNotExist + ): + simple1.reverse_one_to_one # equals None + + # accessing relatedmodel_set won't trigger DoesNotExist. + self.assertEqual(simple1.relatedmodel_set.count(), 0) + + # simple2 DOES have these relations + self.assertEqual(simple2.reverse_one_to_one, related) + self.assertEqual(simple2.relatedmodel_set.count(), 1) + + model_instance_diff(simple2, simple1) + model_instance_diff(simple1, simple2) + + def test_when_field_doesnt_exist(self): """No error is raised and the default is returned.""" first = SimpleModel(boolean=True) second = SimpleModel()