Rework test matrix and structure
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,3 +1,5 @@
|
|||||||
*.pyc
|
*.pyc
|
||||||
.coverage
|
.coverage
|
||||||
htmlcov
|
htmlcov
|
||||||
|
*.egg-info
|
||||||
|
.tox
|
||||||
|
|||||||
76
.travis.yml
76
.travis.yml
@@ -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
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
from .widgets import JSignatureWidgetTest
|
|
||||||
from .forms import JSignatureFormFieldTest
|
|
||||||
from .fields import JSignatureFieldTest
|
|
||||||
from .mixins import JSignatureFieldsMixinTest
|
|
||||||
from .utils import UtilsTest
|
|
||||||
82
quicktest.py
82
quicktest.py
@@ -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
15
runtests.py
Executable 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
0
tests/__init__.py
Normal 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
34
tests/settings.py
Normal 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,
|
||||||
|
},
|
||||||
|
]
|
||||||
@@ -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):
|
||||||
@@ -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):
|
||||||
@@ -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]}]
|
||||||
@@ -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]}]
|
||||||
@@ -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
23
tox.ini
Normal 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
|
||||||
Reference in New Issue
Block a user