summaryrefslogtreecommitdiff
path: root/tests/test_django.py
blob: b4a3c29b548718061c7a2172c063ce4ea79aa621 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2012 Raphaƫl Barrois

try:  # pragma: no cover
    import unittest2 as unittest
except ImportError:  # pragma: no cover
    import unittest

import semantic_version

try:  # pragma: no cover
    from django.conf import settings
    django_loaded = True
except ImportError:  # pragma: no cover
    django_loaded = False

if django_loaded:  # pragma: no cover
    if not settings.configured:
        settings.configure(
            DATABASES={
                'default': {
                    'ENGINE': 'django.db.backends.sqlite3',
                    'NAME': 'tests/db/test.sqlite',
                }
            },
            INSTALLED_APPS=[
                'tests.django_test_app',
            ]
        )
    from django_test_app import models
    from django.core import serializers


@unittest.skipIf(not django_loaded, "Django not installed")
class DjangoFieldTestCase(unittest.TestCase):
    def test_version(self):
        obj = models.VersionModel(version='0.1.1', spec='==0.1.1,!=0.1.1-alpha')

        self.assertEqual(semantic_version.Version('0.1.1'), obj.version)
        self.assertEqual(semantic_version.Spec('==0.1.1,!=0.1.1-alpha'), obj.spec)

        alt_obj = models.VersionModel(version=obj.version, spec=obj.spec)

        self.assertEqual(semantic_version.Version('0.1.1'), alt_obj.version)
        self.assertEqual(semantic_version.Spec('==0.1.1,!=0.1.1-alpha'), alt_obj.spec)
        self.assertEqual(obj.spec, alt_obj.spec)
        self.assertEqual(obj.version, alt_obj.version)

    def test_invalid_input(self):
        self.assertRaises(ValueError, models.VersionModel,
            version='0.1.1', spec='blah')
        self.assertRaises(ValueError, models.VersionModel,
            version='0.1', spec='==0.1.1,!=0.1.1-alpha')
        self.assertRaises(ValueError, models.VersionModel,
            version='0.1.1', spec='==0,!=0.2')

    def test_partial(self):
        obj = models.PartialVersionModel(partial='0.1.0')

        self.assertEqual(semantic_version.Version('0.1.0', partial=True), obj.partial)
        self.assertIsNone(obj.optional)
        self.assertIsNone(obj.optional_spec)

        # Copy values to another model
        alt_obj = models.PartialVersionModel(
            partial=obj.partial,
            optional=obj.optional,
            optional_spec=obj.optional_spec,
        )

        self.assertEqual(semantic_version.Version('0.1.0', partial=True), alt_obj.partial)
        self.assertEqual(obj.partial, alt_obj.partial)
        self.assertIsNone(obj.optional)
        self.assertIsNone(obj.optional_spec)

    def test_serialization(self):
        o1 = models.VersionModel(version='0.1.1', spec='==0.1.1,!=0.1.1-alpha')
        o2 = models.VersionModel(version='0.4.3-rc3+build3',
            spec='<=0.1.1-rc2,!=0.1.1-rc1')

        data = serializers.serialize('json', [o1, o2])

        obj1, obj2 = serializers.deserialize('json', data)
        self.assertEqual(o1, obj1.object)
        self.assertEqual(o2, obj2.object)

    def test_serialization_partial(self):
        o1 = models.PartialVersionModel(partial='0.1.1', optional='0.2.4-rc42',
            optional_spec=None)
        o2 = models.PartialVersionModel(partial='0.4.3-rc3+build3', optional='',
            optional_spec='==0.1.1,!=0.1.1-alpha')

        data = serializers.serialize('json', [o1, o2])

        obj1, obj2 = serializers.deserialize('json', data)
        self.assertEqual(o1, obj1.object)
        self.assertEqual(o2, obj2.object)


if django_loaded:
    from django.test import TestCase
    from django.test.simple import DjangoTestSuiteRunner

    class DbInteractingTestCase(TestCase):

        @classmethod
        def setUpClass(cls):
            cls.old_state = DjangoTestSuiteRunner().setup_databases()

        @classmethod
        def tearDownClass(cls):
            DjangoTestSuiteRunner().teardown_databases(cls.old_state)

        def test_db_interaction(self):
            o1 = models.VersionModel(version='0.1.1', spec='<0.2.4-rc42')
            o2 = models.VersionModel(version='0.4.3-rc3+build3', spec='==0.4.3')

            o1.save()
            o2.save()

            obj1 = models.VersionModel.objects.get(pk=o1.pk)
            self.assertEqual(o1.version, obj1.version)

            obj2 = models.VersionModel.objects.get(pk=o2.pk)
            self.assertEqual(o2.version, obj2.version)

else:  # pragma: no cover
    pass