From fea5a2def3fa2f451b6b1eef6345600e87970892 Mon Sep 17 00:00:00 2001 From: Jules Robichaud-Gagnon Date: Mon, 11 Mar 2024 14:35:37 -0400 Subject: [PATCH 1/3] Add failing test for traits chaining with RelatedFactory and SubFactory --- tests/test_using.py | 54 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/tests/test_using.py b/tests/test_using.py index 5b2200a6..28a192f9 100644 --- a/tests/test_using.py +++ b/tests/test_using.py @@ -1421,6 +1421,60 @@ class Params: dict(one=None, two=False, three=None, four=True, five=None), ) + def test_chaining_traits_and_related_with_nested_factories(self): + class TestRelatedObject: + def __init__(self, obj=None, one=None, two=None, nested=None): + obj.related = self + self.nested = nested + self.one = one + self.two = two + + class TestNestedObject: + def __init__(self, one=None, two=None): + self.one = one + self.two = two + + class TestNestedObjectFactory(factory.Factory): + class Meta: + model = TestNestedObject + one = 1 + two = 2 + + class TestRelatedObjectFactory(factory.Factory): + class Meta: + model = TestRelatedObject + one = 1 + two = 2 + + nested = factory.SubFactory(TestNestedObjectFactory, one=None, two=None) + + class TestObjectFactory(factory.Factory): + class Meta: + model = TestObject + one = 1 + two = 2 + + class Params: + with_related = factory.Trait( + related_obj=factory.RelatedFactory( + TestRelatedObjectFactory, + factory_related_name='obj', + nested__one=1, + ), + ) + with_related_nested_override = factory.Trait( + with_related=True, + related_obj__nested__two=2, + ) + + obj = TestObjectFactory.build(with_related_nested_override=True) + self.assertEqual(1, obj.one) + self.assertEqual(2, obj.two) + self.assertEqual(1, obj.related.one) + self.assertEqual(2, obj.related.two) + self.assertEqual(1, obj.related.nested.one) + self.assertEqual(2, obj.related.nested.two) + def test_prevent_cyclic_traits(self): with self.assertRaises(errors.CyclicDefinitionError): From 229d11e1c0805f87e9702f5d0b929050a26a677e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Freitag?= Date: Sun, 24 Mar 2024 17:46:01 +0100 Subject: [PATCH 2/3] Simplify test setup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The attribute “two” is not used. Show the override using different values. --- tests/test_using.py | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/tests/test_using.py b/tests/test_using.py index 28a192f9..b03554fd 100644 --- a/tests/test_using.py +++ b/tests/test_using.py @@ -1423,57 +1423,53 @@ class Params: def test_chaining_traits_and_related_with_nested_factories(self): class TestRelatedObject: - def __init__(self, obj=None, one=None, two=None, nested=None): + def __init__(self, obj=None, attr=None, nested=None): obj.related = self self.nested = nested - self.one = one - self.two = two + self.attr = attr class TestNestedObject: - def __init__(self, one=None, two=None): - self.one = one - self.two = two + def __init__(self, attr=None): + self.attr = attr class TestNestedObjectFactory(factory.Factory): class Meta: model = TestNestedObject - one = 1 - two = 2 + attr = 1 class TestRelatedObjectFactory(factory.Factory): class Meta: model = TestRelatedObject - one = 1 - two = 2 + attr = 1 - nested = factory.SubFactory(TestNestedObjectFactory, one=None, two=None) + nested = factory.SubFactory(TestNestedObjectFactory, attr=None) class TestObjectFactory(factory.Factory): class Meta: model = TestObject - one = 1 - two = 2 class Params: with_related = factory.Trait( related_obj=factory.RelatedFactory( TestRelatedObjectFactory, factory_related_name='obj', - nested__one=1, + nested__attr=2, ), ) with_related_nested_override = factory.Trait( with_related=True, - related_obj__nested__two=2, + related_obj__nested__attr=3, ) obj = TestObjectFactory.build(with_related_nested_override=True) - self.assertEqual(1, obj.one) - self.assertEqual(2, obj.two) - self.assertEqual(1, obj.related.one) - self.assertEqual(2, obj.related.two) - self.assertEqual(1, obj.related.nested.one) - self.assertEqual(2, obj.related.nested.two) + self.assertEqual(1, obj.related.attr) + self.assertEqual(3, obj.related.nested.attr) + obj = TestObjectFactory.build(with_related_nested_override=True, related_obj__nested__attr=4) + self.assertEqual(1, obj.related.attr) + self.assertEqual(4, obj.related.nested.attr) + obj = TestObjectFactory.build(with_related_nested_override=False) + with self.assertRaises(AttributeError): + obj.related def test_prevent_cyclic_traits(self): From dab55da60bf5aca983a553b5587708df5dadc8d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Freitag?= Date: Mon, 25 Mar 2024 08:41:55 +0100 Subject: [PATCH 3/3] Verify with_related=True behavior --- tests/test_using.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_using.py b/tests/test_using.py index b03554fd..96b6baff 100644 --- a/tests/test_using.py +++ b/tests/test_using.py @@ -1467,6 +1467,9 @@ class Params: obj = TestObjectFactory.build(with_related_nested_override=True, related_obj__nested__attr=4) self.assertEqual(1, obj.related.attr) self.assertEqual(4, obj.related.nested.attr) + obj = TestObjectFactory.build(with_related=True) + self.assertEqual(1, obj.related.attr) + self.assertEqual(2, obj.related.nested.attr) obj = TestObjectFactory.build(with_related_nested_override=False) with self.assertRaises(AttributeError): obj.related