Rework test matrix and structure

This commit is contained in:
Sebastien Corbin
2020-04-18 18:53:42 +02:00
parent c5f7c10d23
commit 622f3ea10b
15 changed files with 127 additions and 149 deletions

2
.gitignore vendored
View File

@@ -1,3 +1,5 @@
*.pyc *.pyc
.coverage .coverage
htmlcov htmlcov
*.egg-info
.tox

View File

@@ -1,42 +1,46 @@
language: python language: python
python: matrix:
- 2.6 fast_finish: true
- 2.7 allow_failures:
- 3.2 - env: DJANGO=master
- 3.3 include:
- 3.4 - python: 2.7
env: DJANGO=1.11
env: - python: 3.5
- DJANGO_VERSION=1.4 MODULE=jsignature env: DJANGO=1.11
- DJANGO_VERSION=1.5 MODULE=jsignature - python: 3.5
- DJANGO_VERSION=1.6 MODULE=jsignature.tests env: DJANGO=2.2
- DJANGO_VERSION=1.7 MODULE=jsignature.tests
- python: 3.6
env: DJANGO=1.11
- python: 3.6
env: DJANGO=2.2
- python: 3.6
env: DJANGO=3.0
- python: 3.6
env: DJANGO=master
- python: 3.7
env: DJANGO=2.2
- python: 3.7
env: DJANGO=3.0
- python: 3.7
env: DJANGO=master
- python: 3.8
env: DJANGO=2.2
- python: 3.8
env: DJANGO=3.0
- python: 3.8
env: DJANGO=master
install: install:
- pip install -r requirements.txt --use-mirrors - pip install tox tox-travis
- pip install -q Django==$DJANGO_VERSION --use-mirrors script:
- pip install coverage - tox
script: coverage run quicktest.py $MODULE
after_success: after_success:
- pip install coveralls - pip install coveralls
- coveralls - coveralls
# We need to exclude old versions of Django for tests with python 3.
# We need to exclude old versions of Python for tests with Django >= 1.7.
matrix:
exclude:
- python: 3.2
env: DJANGO_VERSION=1.4 MODULE=jsignature
- python: 3.3
env: DJANGO_VERSION=1.4 MODULE=jsignature
- python: 3.4
env: DJANGO_VERSION=1.4 MODULE=jsignature
- python: 3.4
env: DJANGO_VERSION=1.5 MODULE=jsignature
- python: 3.4
env: DJANGO_VERSION=1.6 MODULE=jsignature.tests
- python: 2.6
env: DJANGO_VERSION=1.7 MODULE=jsignature.tests

View File

@@ -2,6 +2,7 @@
A django mixin providing fields to store a signature captured A django mixin providing fields to store a signature captured
with jSignature jQuery plugin with jSignature jQuery plugin
""" """
import json
from datetime import datetime from datetime import datetime
from django.db import models from django.db import models
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@@ -28,7 +29,7 @@ class JSignatureFieldsMixin(models.Model):
original = not is_new and self.__class__.objects.get(pk=self.pk) original = not is_new and self.__class__.objects.get(pk=self.pk)
if self.signature: if self.signature:
if is_new or self.signature != original.signature: if is_new or json.dumps(self.signature) != original.signature:
self.signature_date = datetime.now() self.signature_date = datetime.now()
else: else:
self.signature_date = None self.signature_date = None

View File

@@ -1,5 +0,0 @@
from .widgets import JSignatureWidgetTest
from .forms import JSignatureFormFieldTest
from .fields import JSignatureFieldTest
from .mixins import JSignatureFieldsMixinTest
from .utils import UtilsTest

View File

@@ -1,82 +0,0 @@
import os
import sys
import argparse
from django.conf import settings
class QuickDjangoTest(object):
"""
A quick way to run the Django test suite without a fully-configured project.
Example usage:
>>> QuickDjangoTest('app1', 'app2')
Based on a script published by Lukasz Dziedzia at:
http://stackoverflow.com/questions/3841725/how-to-launch-tests-for-django-reusable-app
"""
DIRNAME = os.path.dirname(__file__)
INSTALLED_APPS = (
)
def __init__(self, *args, **kwargs):
self.apps = args
self.run_tests()
def run_tests(self):
"""
Fire up the Django test suite developed for version 1.2
"""
settings.configure(
TEMPLATE_DIRS = ('jsignature/templates/',),
ROOT_URLCONF = 'jsignature.tests',
DEBUG = True,
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(self.DIRNAME, 'database.db'),
'USER': '',
'PASSWORD': '',
'HOST': '',
'PORT': '',
}
},
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
),
INSTALLED_APPS = self.INSTALLED_APPS + self.apps
)
# Setup is needed for Django >= 1.7
import django
if hasattr(django, 'setup'):
django.setup()
try:
from django.test.runner import DiscoverRunner
failures = DiscoverRunner().run_tests(self.apps, verbosity=1)
except ImportError:
# DjangoTestSuiteRunner has been deprecated in Django 1.7
from django.test.simple import DjangoTestSuiteRunner
failures = DjangoTestSuiteRunner().run_tests(self.apps, verbosity=1)
if failures: # pragma: no cover
sys.exit(failures)
if __name__ == '__main__':
"""
What do when the user hits this file from the shell.
Example usage:
$ python quicktest.py app1 app2
"""
parser = argparse.ArgumentParser(
usage="[args]",
description="Run Django tests on the provided applications."
)
parser.add_argument('apps', nargs='+', type=str)
args = parser.parse_args()
QuickDjangoTest(*args.apps)

15
runtests.py Executable file
View File

@@ -0,0 +1,15 @@
#!/usr/bin/env python
import os
import sys
import django
from django.conf import settings
from django.test.utils import get_runner
if __name__ == "__main__":
os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.settings'
django.setup()
TestRunner = get_runner(settings)
test_runner = TestRunner()
failures = test_runner.run_tests(["tests"])
sys.exit(bool(failures))

0
tests/__init__.py Normal file
View File

View File

@@ -1,5 +1,5 @@
""" Provides a dummy model implementing JSignatureFieldsMixin """ """ Provides a dummy model implementing JSignatureFieldsMixin """
from ..mixins import JSignatureFieldsMixin from jsignature.mixins import JSignatureFieldsMixin
class JSignatureTestModel(JSignatureFieldsMixin): class JSignatureTestModel(JSignatureFieldsMixin):

34
tests/settings.py Normal file
View File

@@ -0,0 +1,34 @@
import os
DEBUG = True
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
SECRET_KEY = 'thisisntactuallysecretatall'
ALLOWED_HOSTS = ['*']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
}
}
# ROOT_URLCONF = 'tests.urls'
INSTALLED_APPS = [
'jsignature',
'tests',
]
PASSWORD_HASHERS = {
'django.contrib.auth.hashers.MD5PasswordHasher',
}
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True,
},
]

View File

@@ -4,8 +4,8 @@ import six
from django.test import SimpleTestCase from django.test import SimpleTestCase
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from ..fields import JSignatureField from jsignature.fields import JSignatureField
from ..forms import JSignatureField as JSignatureFormField from jsignature.forms import JSignatureField as JSignatureFormField
class JSignatureFieldTest(SimpleTestCase): class JSignatureFieldTest(SimpleTestCase):

View File

@@ -1,8 +1,8 @@
from django.test import SimpleTestCase from django.test import SimpleTestCase
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from ..widgets import JSignatureWidget from jsignature.widgets import JSignatureWidget
from ..forms import JSignatureField from jsignature.forms import JSignatureField
class JSignatureFormFieldTest(SimpleTestCase): class JSignatureFormFieldTest(SimpleTestCase):

View File

@@ -1,24 +1,10 @@
from datetime import date from datetime import date
from django.conf import settings from django.test import TestCase
from django.db.models import loading
from django.test import SimpleTestCase
from django.core.management import call_command
from .models import JSignatureTestModel from .models import JSignatureTestModel
class JSignatureFieldsMixinTest(SimpleTestCase): class JSignatureFieldsMixinTest(TestCase):
def setUp(self):
self.old_installed_apps = settings.INSTALLED_APPS
settings.INSTALLED_APPS = list(settings.INSTALLED_APPS)
settings.INSTALLED_APPS.append('jsignature.tests')
loading.cache.loaded = False
call_command('syncdb', verbosity=0)
def tearDown(self):
settings.INSTALLED_APPS = self.old_installed_apps
def test_save_create(self): def test_save_create(self):
# If an object is created signed, signature date must be set # If an object is created signed, signature date must be set
signature_value = [{"x": [1, 2], "y": [3, 4]}] signature_value = [{"x": [1, 2], "y": [3, 4]}]

View File

@@ -4,7 +4,7 @@ import imghdr
from PIL import Image from PIL import Image
from django.test import SimpleTestCase from django.test import SimpleTestCase
from ..utils import draw_signature from jsignature.utils import draw_signature
DUMMY_VALUE = [{"x": [205, 210], "y": [59, 63]}, DUMMY_VALUE = [{"x": [205, 210], "y": [59, 63]},
{"x": [205, 207], "y": [67, 64]}] {"x": [205, 207], "y": [67, 64]}]

View File

@@ -5,8 +5,8 @@ import six
from django.test import SimpleTestCase from django.test import SimpleTestCase
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from ..widgets import JSignatureWidget from jsignature.widgets import JSignatureWidget
from ..settings import JSIGNATURE_HEIGHT from jsignature.settings import JSIGNATURE_HEIGHT
class JSignatureWidgetTest(SimpleTestCase): class JSignatureWidgetTest(SimpleTestCase):
@@ -15,7 +15,7 @@ class JSignatureWidgetTest(SimpleTestCase):
widget = JSignatureWidget() widget = JSignatureWidget()
media = widget.media media = widget.media
media_js = list(media.render_js()) media_js = list(media.render_js())
self.assertEqual(2, len(media_js)) self.assertEqual(3, len(media_js))
media_js_str = "".join(media_js) media_js_str = "".join(media_js)
self.assertIn('jSignature.min.js', media_js_str) self.assertIn('jSignature.min.js', media_js_str)
self.assertIn('django_jsignature.js', media_js_str) self.assertIn('django_jsignature.js', media_js_str)

23
tox.ini Normal file
View File

@@ -0,0 +1,23 @@
[tox]
envlist =
{py27,py35,py36}-django111,
{py35,py36,py37,py38}-django22,
{py36,py37,py38}-django{30,master}
[testenv]
deps=
django111: Django>=1.11,<2.0
django22: Django>=2.2,<3.0
django30: Django>=3.0,<4.0
djangomaster: https://github.com/django/django/archive/master.tar.gz
-r requirements.txt
coverage
commands= coverage run ./runtests.py
[travis:env]
DJANGO =
1.11: django111
2.2: django22
3.0: django30
master: djangomaster