ModelConstructionTests   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 89
Duplicated Lines 43.82 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 8
dl 39
loc 89
c 1
b 0
f 0
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A test_simple_model() 0 5 1
A test_overlapping_proxy_model() 0 12 2
A test_proxy_model() 20 20 1
A test_model_with_different_pks() 0 6 1
A test_double_translation_table() 0 8 1
A test_inherited_model() 19 19 1
A test_manual_model() 0 8 1

How to fix   Duplicated Code   

Duplicated Code

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
2
from django.db.models import Manager
3
from .utils import AppTestCase
4
from .testapp.models import ManualModel, ManualModelTranslations, SimpleModel, Level1, Level2, ProxyBase, ProxyModel, DoubleModel, RegularModel, CharModel
5
6
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):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
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):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
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