| Total Complexity | 8 |
| Total Lines | 89 |
| Duplicated Lines | 43.82 % |
Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
| 1 | from django.core.cache import cache |
||
| 7 | class ModelConstructionTests(AppTestCase): |
||
| 8 | """ |
||
| 9 | Test model construction |
||
| 10 | """ |
||
| 11 | |||
| 12 | def test_manual_model(self): |
||
| 13 | """ |
||
| 14 | Test the metaclass of the model. |
||
| 15 | """ |
||
| 16 | # Test whether the link has taken place |
||
| 17 | self.assertIsInstance(ManualModel().translations, Manager) # RelatedManager class |
||
| 18 | self.assertIs(ManualModel().translations.model, ManualModelTranslations) |
||
| 19 | self.assertIs(ManualModel._parler_meta.root_model, ManualModelTranslations) |
||
| 20 | |||
| 21 | def test_simple_model(self): |
||
| 22 | """ |
||
| 23 | Test the simple model syntax. |
||
| 24 | """ |
||
| 25 | self.assertIs(SimpleModel().translations.model, SimpleModel._parler_meta.root_model) |
||
| 26 | |||
| 27 | View Code Duplication | def test_inherited_model(self): |
|
|
|
|||
| 28 | """ |
||
| 29 | Test the inherited model syntax. |
||
| 30 | """ |
||
| 31 | # First level has 1 ParlerMeta object |
||
| 32 | self.assertEqual(Level1._parler_meta.root.rel_name, 'l1_translations') |
||
| 33 | self.assertEqual(Level1._parler_meta.root.model.__name__, 'Level1Translation') |
||
| 34 | self.assertEqual(len(Level1._parler_meta), 1) |
||
| 35 | |||
| 36 | # Second level has 2 ParlerMeta objects. |
||
| 37 | self.assertEqual(len(Level2._parler_meta), 2) |
||
| 38 | self.assertEqual(Level2._parler_meta[0].rel_name, 'l1_translations') |
||
| 39 | self.assertEqual(Level2._parler_meta[1].rel_name, 'l2_translations') |
||
| 40 | self.assertEqual(Level2._parler_meta[1].model.__name__, 'Level2Translation') |
||
| 41 | |||
| 42 | # Level 2 root attributes should point to the top-level object (Level1) |
||
| 43 | self.assertEqual(Level2._parler_meta.root_model.__name__, 'Level1Translation') |
||
| 44 | self.assertEqual(Level2._parler_meta.root_rel_name, 'l1_translations') |
||
| 45 | self.assertEqual(Level2._parler_meta.root, Level1._parler_meta.root) |
||
| 46 | |||
| 47 | View Code Duplication | def test_proxy_model(self): |
|
| 48 | """ |
||
| 49 | Test whether proxy models can get new translations |
||
| 50 | """ |
||
| 51 | # First level has 1 ParlerMeta object |
||
| 52 | self.assertEqual(ProxyBase._parler_meta.root.rel_name, 'base_translations') |
||
| 53 | self.assertEqual(len(ProxyBase._parler_meta), 1) |
||
| 54 | |||
| 55 | # Second level has 2 ParlerMeta objects |
||
| 56 | self.assertEqual(len(ProxyModel._parler_meta), 2) |
||
| 57 | self.assertEqual(ProxyModel._parler_meta[0].rel_name, 'base_translations') |
||
| 58 | self.assertEqual(ProxyModel._parler_meta[1].rel_name, 'proxy_translations') |
||
| 59 | |||
| 60 | self.assertEqual(ProxyModel._parler_meta[0].model.__name__, 'ProxyBaseTranslation') |
||
| 61 | self.assertEqual(ProxyModel._parler_meta[1].model.__name__, 'ProxyModelTranslation') |
||
| 62 | |||
| 63 | # Second inheritance level attributes should point to the top-level object (ProxyBase) |
||
| 64 | self.assertEqual(ProxyModel._parler_meta.root_model.__name__, 'ProxyBaseTranslation') |
||
| 65 | self.assertEqual(ProxyModel._parler_meta.root_rel_name, 'base_translations') |
||
| 66 | self.assertEqual(ProxyModel._parler_meta.root, ProxyBase._parler_meta.root) |
||
| 67 | |||
| 68 | def test_double_translation_table(self): |
||
| 69 | """ |
||
| 70 | Test how assigning two translation tables works. |
||
| 71 | """ |
||
| 72 | self.assertIsNone(DoubleModel._parler_meta.base) # Should call .add_meta() instead of overwriting/chaining it. |
||
| 73 | self.assertEqual(len(DoubleModel._parler_meta), 2) |
||
| 74 | self.assertEqual(DoubleModel._parler_meta[0].rel_name, "base_translations") |
||
| 75 | self.assertEqual(DoubleModel._parler_meta[1].rel_name, "more_translations") |
||
| 76 | |||
| 77 | def test_overlapping_proxy_model(self): |
||
| 78 | """ |
||
| 79 | Test the simple model syntax. |
||
| 80 | """ |
||
| 81 | from parler.tests.testapp.invalid_models import RegularModelProxy |
||
| 82 | |||
| 83 | # Create an object without translations |
||
| 84 | RegularModel.objects.create(id=98, original_field='untranslated') |
||
| 85 | self.assertEqual(RegularModelProxy.objects.count(), 1) |
||
| 86 | |||
| 87 | # Refetch from db, should raise an error. |
||
| 88 | self.assertRaises(RuntimeError, lambda: RegularModelProxy.objects.all()[0]) |
||
| 89 | |||
| 90 | def test_model_with_different_pks(self): |
||
| 91 | """ |
||
| 92 | Test that TranslatableModels works with different types of pks |
||
| 93 | """ |
||
| 94 | self.assertIsInstance(SimpleModel.objects.create(tr_title='Test'), SimpleModel) |
||
| 95 | self.assertIsInstance(CharModel.objects.create(pk='test', tr_title='Test'), CharModel) |
||
| 96 |