Files
deb-python-semantic-version/tests/test_django.py
Michael Hrivnak 5688677a89 moved django test app settings to the django test app module
... to guarantee the settings get executed before any code in that app. Since
python's unittest.TestLoader does not guarantee in what order it will import
modules while hunting for test cases, the unit tests could fail to even load if
tests.django_test_app.models was loaded before tests.test_django. This failure
was seen on ARM machines, which happened to traverse the module tree in an
inconvenient order.
2014-03-16 20:23:37 +01:00

203 lines
8.0 KiB
Python

# -*- coding: utf-8 -*-
# Copyright (c) 2012-2014 The python-semanticversion project
# This code is distributed under the two-clause BSD License.
from __future__ import unicode_literals
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
from .django_test_app import models
from django.core import serializers
try: # pragma: no cover
import south
import south.creator.freezer
import south.modelsinspector
except ImportError: # pragma: no cover
south = None
@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)
obj.full_clean()
def test_partial_spec(self):
obj = models.VersionModel(version='0.1.1', spec='==0,!=0.2')
self.assertEqual(semantic_version.Version('0.1.1'), obj.version)
self.assertEqual(semantic_version.Spec('==0,!=0.2'), obj.spec)
def test_coerce(self):
obj = models.CoerceVersionModel(version='0.1.1a+2', partial='23')
self.assertEqual(semantic_version.Version('0.1.1-a+2'), obj.version)
self.assertEqual(semantic_version.Version('23', partial=True), obj.partial)
obj2 = models.CoerceVersionModel(version='23', partial='0.1.2.3.4.5/6')
self.assertEqual(semantic_version.Version('23.0.0'), obj2.version)
self.assertEqual(semantic_version.Version('0.1.2+3.4.5-6', partial=True), obj2.partial)
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')
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)
obj.full_clean()
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)
@unittest.skipIf(not django_loaded or south is None, "Couldn't import south and django")
class SouthTestCase(unittest.TestCase):
def test_freezing_version_model(self):
frozen = south.modelsinspector.get_model_fields(models.VersionModel)
self.assertEqual(frozen['version'],
('semantic_version.django_fields.VersionField', [], {'max_length': '200'}))
self.assertEqual(frozen['spec'],
('semantic_version.django_fields.SpecField', [], {'max_length': '200'}))
def test_freezing_partial_version_model(self):
frozen = south.modelsinspector.get_model_fields(models.PartialVersionModel)
self.assertEqual(frozen['partial'],
('semantic_version.django_fields.VersionField', [], {'max_length': '200', 'partial': 'True'}))
self.assertEqual(frozen['optional'],
('semantic_version.django_fields.VersionField', [], {'max_length': '200', 'blank': 'True', 'null': 'True'}))
self.assertEqual(frozen['optional_spec'],
('semantic_version.django_fields.SpecField', [], {'max_length': '200', 'blank': 'True', 'null': 'True'}))
def test_freezing_coerce_version_model(self):
frozen = south.modelsinspector.get_model_fields(models.CoerceVersionModel)
self.assertEqual(frozen['version'],
('semantic_version.django_fields.VersionField', [], {'max_length': '200', 'coerce': 'True'}))
self.assertEqual(frozen['partial'],
('semantic_version.django_fields.VersionField', [], {'max_length': '200', 'partial': 'True', 'coerce': 'True'}))
def test_freezing_app(self):
frozen = south.creator.freezer.freeze_apps('django_test_app')
# Test VersionModel
self.assertEqual(frozen['django_test_app.versionmodel']['version'],
('semantic_version.django_fields.VersionField', [], {'max_length': '200'}))
self.assertEqual(frozen['django_test_app.versionmodel']['spec'],
('semantic_version.django_fields.SpecField', [], {'max_length': '200'}))
# Test PartialVersionModel
self.assertEqual(frozen['django_test_app.partialversionmodel']['partial'],
('semantic_version.django_fields.VersionField', [], {'max_length': '200', 'partial': 'True'}))
self.assertEqual(frozen['django_test_app.partialversionmodel']['optional'],
('semantic_version.django_fields.VersionField', [], {'max_length': '200', 'blank': 'True', 'null': 'True'}))
self.assertEqual(frozen['django_test_app.partialversionmodel']['optional_spec'],
('semantic_version.django_fields.SpecField', [], {'max_length': '200', 'blank': 'True', 'null': 'True'}))
# Test CoerceVersionModel
self.assertEqual(frozen['django_test_app.coerceversionmodel']['version'],
('semantic_version.django_fields.VersionField', [], {'max_length': '200', 'coerce': 'True'}))
self.assertEqual(frozen['django_test_app.coerceversionmodel']['partial'],
('semantic_version.django_fields.VersionField', [], {'max_length': '200', 'partial': 'True', 'coerce': 'True'}))
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