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 |