Hello community, here is the log from the commit of package python-django-webtest for openSUSE:Factory checked in at 2018-12-11 15:49:44 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-django-webtest (Old) and /work/SRC/openSUSE:Factory/.python-django-webtest.new.19453 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-django-webtest" Tue Dec 11 15:49:44 2018 rev:2 rq:657149 version:1.9.4 Changes: -------- --- /work/SRC/openSUSE:Factory/python-django-webtest/python-django-webtest.changes 2017-12-23 12:19:57.350209902 +0100 +++ /work/SRC/openSUSE:Factory/.python-django-webtest.new.19453/python-django-webtest.changes 2018-12-11 15:49:48.334075762 +0100 @@ -1,0 +2,13 @@ +Tue Dec 11 11:36:29 UTC 2018 - Tomáš Chvátal <tchva...@suse.com> + +- Version update to 1.9.4: + * allow to use positionnal args; fixed #89 + * remove deprecated pytest.yield_fixture functions. use pytest.fixture instead; fixed #88 + * Don't add duplicate WebtestUserMiddleware to the list of middlewares in WebTestMixin. fixed #87 + * restore MIDDLEWARE_CLASSES support; fixed #84 + * Passing user=None to get/post/etc. methods will clear a user previously set with set_user instead of doing nothing. + * Avoid sharing settings between tests in pytest plugin + * Fix middleware settings name used +- Enable tests + +------------------------------------------------------------------- Old: ---- django-webtest-1.9.2.tar.gz New: ---- django-webtest-1.9.4.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-django-webtest.spec ++++++ --- /var/tmp/diff_new_pack.8f7j4r/_old 2018-12-11 15:49:49.770074176 +0100 +++ /var/tmp/diff_new_pack.8f7j4r/_new 2018-12-11 15:49:49.774074171 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-django-webtest # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -12,21 +12,27 @@ # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. -# Please submit bugfixes or comments via http://bugs.opensuse.org/ +# Please submit bugfixes or comments via https://bugs.opensuse.org/ # %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-django-webtest -Version: 1.9.2 +Version: 1.9.4 Release: 0 Summary: Django integration for WebTest License: MIT Group: Development/Languages/Python -Url: https://github.com/django-webtest/django-webtest +URL: https://github.com/django-webtest/django-webtest Source: https://files.pythonhosted.org/packages/source/d/django-webtest/django-webtest-%{version}.tar.gz +BuildRequires: %{python_module Django} +BuildRequires: %{python_module WebTest >= 1.3.3} +BuildRequires: %{python_module pytest-django} +BuildRequires: %{python_module pytest} BuildRequires: %{python_module setuptools} +BuildRequires: fdupes BuildRequires: python-rpm-macros +Requires: python-Django Requires: python-WebTest >= 1.3.3 %python_subpackages @@ -41,9 +47,16 @@ %install %python_install +%python_expand %fdupes %{buildroot}%{$python_sitelib} + +%check +pushd django_webtest_tests +%python_exec runtests.py +popd %files %{python_files} -%doc AUTHORS.txt CHANGES.rst LICENSE.txt README.rst +%license LICENSE.txt +%doc AUTHORS.txt CHANGES.rst README.rst %{python_sitelib}/* %changelog ++++++ django-webtest-1.9.2.tar.gz -> django-webtest-1.9.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/CHANGES.rst new/django-webtest-1.9.4/CHANGES.rst --- old/django-webtest-1.9.2/CHANGES.rst 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/CHANGES.rst 2018-10-27 10:58:09.000000000 +0200 @@ -2,6 +2,32 @@ CHANGES ======= +1.9.4 (2018-10-27) +------------------ + +- py34 and Django 1.8 are no longer tested (but may works) + +- allow to use positionnal args; fixed #89 + +- remove deprecated pytest.yield_fixture functions. use pytest.fixture instead; + fixed #88 + +- Don't add duplicate WebtestUserMiddleware to the list of middlewares in + WebTestMixin. fixed #87 + +- restore MIDDLEWARE_CLASSES support; fixed #84 + +1.9.3 (2018-05-03) +------------------ + +- Passing `user=None` to get/post/etc. methods will clear a user + previously set with `set_user` instead of doing nothing. + +- Avoid sharing settings between tests in pytest plugin + +- Fix middleware settings name used + + 1.9.2 (2017-05-17) ------------------ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/PKG-INFO new/django-webtest-1.9.4/PKG-INFO --- old/django-webtest-1.9.2/PKG-INFO 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/PKG-INFO 2018-10-27 10:58:09.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: django-webtest -Version: 1.9.2 +Version: 1.9.4 Summary: Instant integration of Ian Bicking's WebTest (http://docs.pylonsproject.org/projects/webtest/) with django's testing framework. Home-page: https://github.com/django-webtest/django-webtest Author: Mikhail Korobov @@ -63,11 +63,14 @@ (``django_webtest.WebTest``) that creates ``webtest.TestApp`` around django wsgi interface and makes it available in tests as ``self.app``. - It also features optional ``user`` argument for ``self.app.get`` and - ``self.app.post`` methods to help making authorized requests. This argument + It also features an optional ``user`` argument for ``self.app.get``, + ``self.app.post``, etc. to help making authorized requests. This argument should be a django.contrib.auth.models.User instance or a string with user's ``username`` for the user who is supposed to be logged in. To log out again, - call ``self.app.reset``, clearing all cookies. + call ``self.app.reset``, clearing all cookies. To make a bunch of calls + with the same user, call ``app.set_user(user)`` before your requests; if + you want to disable that user, call ``app.get(..., user=None)`` for one + request or ``app.set_user(None)`` to unset the user for all following calls. For 500 errors original traceback is shown instead of usual html result from handler500. @@ -105,6 +108,7 @@ class MyTestCase(WebTest): csrf_checks = False + def test_post(self) self.app.post('/') @@ -180,6 +184,32 @@ CHANGES ======= + 1.9.4 (2018-10-27) + ------------------ + + - py34 and Django 1.8 are no longer tested (but may works) + + - allow to use positionnal args; fixed #89 + + - remove deprecated pytest.yield_fixture functions. use pytest.fixture instead; + fixed #88 + + - Don't add duplicate WebtestUserMiddleware to the list of middlewares in + WebTestMixin. fixed #87 + + - restore MIDDLEWARE_CLASSES support; fixed #84 + + 1.9.3 (2018-05-03) + ------------------ + + - Passing `user=None` to get/post/etc. methods will clear a user + previously set with `set_user` instead of doing nothing. + + - Avoid sharing settings between tests in pytest plugin + + - Fix middleware settings name used + + 1.9.2 (2017-05-17) ------------------ @@ -440,12 +470,11 @@ Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.2 -Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Software Development :: Libraries :: Python Modules diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/README.rst new/django-webtest-1.9.4/README.rst --- old/django-webtest-1.9.2/README.rst 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/README.rst 2018-10-27 10:58:09.000000000 +0200 @@ -55,11 +55,14 @@ (``django_webtest.WebTest``) that creates ``webtest.TestApp`` around django wsgi interface and makes it available in tests as ``self.app``. -It also features optional ``user`` argument for ``self.app.get`` and -``self.app.post`` methods to help making authorized requests. This argument +It also features an optional ``user`` argument for ``self.app.get``, +``self.app.post``, etc. to help making authorized requests. This argument should be a django.contrib.auth.models.User instance or a string with user's ``username`` for the user who is supposed to be logged in. To log out again, -call ``self.app.reset``, clearing all cookies. +call ``self.app.reset``, clearing all cookies. To make a bunch of calls +with the same user, call ``app.set_user(user)`` before your requests; if +you want to disable that user, call ``app.get(..., user=None)`` for one +request or ``app.set_user(None)`` to unset the user for all following calls. For 500 errors original traceback is shown instead of usual html result from handler500. @@ -97,6 +100,7 @@ class MyTestCase(WebTest): csrf_checks = False + def test_post(self) self.app.post('/') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/django_webtest/__init__.py new/django-webtest-1.9.4/django_webtest/__init__.py --- old/django-webtest-1.9.2/django_webtest/__init__.py 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/django_webtest/__init__.py 2018-10-27 10:58:09.000000000 +0200 @@ -33,6 +33,10 @@ from django_webtest.compat import to_string, to_wsgi_safe_string +# sentinel to differentiate user=None / user param not given +_notgiven = object() + + class DjangoTestApp(TestApp): response_class = DjangoWebtestResponse @@ -43,24 +47,30 @@ def get_wsgi_handler(self): return StaticFilesHandler(WSGIHandler()) - def set_user(self, user=None): - """Update the user used by the app globaly. If user is None then user - is unset""" + def set_user(self, user): + """Update the user used by the app globall; pass None to unset.""" if user is None and 'WEBTEST_USER' in self.extra_environ: del self.extra_environ['WEBTEST_USER'] if user is not None: self.extra_environ = self._update_environ(self.extra_environ, user) - def _update_environ(self, environ, user=None): + def _update_environ(self, environ, user=_notgiven): environ = environ or {} environ.setdefault('HTTP_HOST', 'testserver') - if user: - username = _get_username(user) - environ['WEBTEST_USER'] = to_wsgi_safe_string(username) + + if user is not _notgiven: + if user is None: + # We can't just delete the key here, the test request is built + # from self.extra_environ + this environ, so the header defined + # by set_user will be found in self.extra_environ. + environ['WEBTEST_USER'] = '' + else: + username = _get_username(user) + environ['WEBTEST_USER'] = to_wsgi_safe_string(username) + return environ def do_request(self, req, status, expect_errors): - # Django closes the database connection after every request; # this breaks the use of transactions in your tests. if close_old_connections is not None: # Django 1.6+ @@ -115,13 +125,13 @@ else: # Django < 1.6 signals.request_finished.connect(close_connection) - def get(self, url, **kwargs): + def get(self, url, *args, **kwargs): extra_environ = kwargs.get('extra_environ') - user = kwargs.pop('user', None) + user = kwargs.pop('user', _notgiven) auto_follow = kwargs.pop('auto_follow', False) kwargs['extra_environ'] = self._update_environ(extra_environ, user) - response = super(DjangoTestApp, self).get(url, **kwargs) + response = super(DjangoTestApp, self).get(url, *args, **kwargs) def is_redirect(r): return r.status_int >= 300 and r.status_int < 400 @@ -130,65 +140,65 @@ return response - def post(self, url, **kwargs): + def post(self, url, *args, **kwargs): extra_environ = kwargs.get('extra_environ') - user = kwargs.pop('user', None) + user = kwargs.pop('user', _notgiven) kwargs['extra_environ'] = self._update_environ(extra_environ, user) - return super(DjangoTestApp, self).post(url, **kwargs) + return super(DjangoTestApp, self).post(url, *args, **kwargs) - def put(self, url, **kwargs): + def put(self, url, *args, **kwargs): extra_environ = kwargs.get('extra_environ') - user = kwargs.pop('user', None) + user = kwargs.pop('user', _notgiven) kwargs['extra_environ'] = self._update_environ(extra_environ, user) - return super(DjangoTestApp, self).put(url, **kwargs) + return super(DjangoTestApp, self).put(url, *args, **kwargs) - def patch(self, url, **kwargs): + def patch(self, url, *args, **kwargs): extra_environ = kwargs.get('extra_environ') - user = kwargs.pop('user', None) + user = kwargs.pop('user', _notgiven) kwargs['extra_environ'] = self._update_environ(extra_environ, user) - return super(DjangoTestApp, self).patch(url, **kwargs) + return super(DjangoTestApp, self).patch(url, *args, **kwargs) - def head(self, url, **kwargs): + def head(self, url, *args, **kwargs): extra_environ = kwargs.get('extra_environ') - user = kwargs.pop('user', None) + user = kwargs.pop('user', _notgiven) kwargs['extra_environ'] = self._update_environ(extra_environ, user) - return super(DjangoTestApp, self).head(url, **kwargs) + return super(DjangoTestApp, self).head(url, *args, **kwargs) - def options(self, url, **kwargs): + def options(self, url, *args, **kwargs): extra_environ = kwargs.get('extra_environ') - user = kwargs.pop('user', None) + user = kwargs.pop('user', _notgiven) kwargs['extra_environ'] = self._update_environ(extra_environ, user) - return super(DjangoTestApp, self).options(url, **kwargs) + return super(DjangoTestApp, self).options(url, *args, **kwargs) - def delete(self, url, **kwargs): + def delete(self, url, *args, **kwargs): extra_environ = kwargs.get('extra_environ') - user = kwargs.pop('user', None) + user = kwargs.pop('user', _notgiven) kwargs['extra_environ'] = self._update_environ(extra_environ, user) - return super(DjangoTestApp, self).delete(url, **kwargs) + return super(DjangoTestApp, self).delete(url, *args, **kwargs) - def post_json(self, url, **kwargs): + def post_json(self, url, *args, **kwargs): extra_environ = kwargs.get('extra_environ') - user = kwargs.pop('user', None) + user = kwargs.pop('user', _notgiven) kwargs['extra_environ'] = self._update_environ(extra_environ, user) - return super(DjangoTestApp, self).post_json(url, **kwargs) + return super(DjangoTestApp, self).post_json(url, *args, **kwargs) - def put_json(self, url, **kwargs): + def put_json(self, url, *args, **kwargs): extra_environ = kwargs.get('extra_environ') - user = kwargs.pop('user', None) + user = kwargs.pop('user', _notgiven) kwargs['extra_environ'] = self._update_environ(extra_environ, user) - return super(DjangoTestApp, self).put_json(url, **kwargs) + return super(DjangoTestApp, self).put_json(url, *args, **kwargs) - def patch_json(self, url, **kwargs): + def patch_json(self, url, *args, **kwargs): extra_environ = kwargs.get('extra_environ') - user = kwargs.pop('user', None) + user = kwargs.pop('user', _notgiven) kwargs['extra_environ'] = self._update_environ(extra_environ, user) - return super(DjangoTestApp, self).patch_json(url, **kwargs) + return super(DjangoTestApp, self).patch_json(url, *args, **kwargs) - def delete_json(self, url, **kwargs): + def delete_json(self, url, *args, **kwargs): extra_environ = kwargs.get('extra_environ') - user = kwargs.pop('user', None) + user = kwargs.pop('user', _notgiven) kwargs['extra_environ'] = self._update_environ(extra_environ, user) - return super(DjangoTestApp, self).delete_json(url, **kwargs) + return super(DjangoTestApp, self).delete_json(url, *args, **kwargs) @property def session(self): @@ -206,8 +216,8 @@ self.extra_environ = self._update_environ(self.extra_environ) return super(DjangoTestApp, self).set_cookie(*args, **kwargs) -class WebTestMixin(object): +class WebTestMixin(object): extra_environ = {} csrf_checks = True setup_auth = True @@ -262,10 +272,9 @@ # middleware to the end. If appending causes problems # _setup_auth_middleware method can be overriden by a subclass. self.settings_middleware.append(webtest_auth_middleware) - else: + elif webtest_auth_middleware not in self.settings_middleware: index = self.settings_middleware.index(django_auth_middleware) - self.settings_middleware.insert(index + 1, - webtest_auth_middleware) + self.settings_middleware.insert(index + 1, webtest_auth_middleware) def _setup_auth_backend(self): backend_name = 'django_webtest.backends.WebtestUserBackend' @@ -276,7 +285,7 @@ try: return self._middleware_setting_name except AttributeError: - if hasattr(settings, 'MIDDLEWARE') and settings.MIDDLEWARE: + if getattr(settings, 'MIDDLEWARE', None) is not None: name = 'MIDDLEWARE' else: name = 'MIDDLEWARE_CLASSES' @@ -319,9 +328,17 @@ Return user's username. ``user`` can be standard Django User instance, a custom user model or just an username (as string). """ - if hasattr(user, 'get_username'): # custom user, django 1.5+ - return user.get_username() - elif hasattr(user, 'username'): # standard User - return user.username - else: # assume user is just an username - return user + value = None + # custom user, django 1.5+ + get_username = getattr(user, 'get_username', None) + if get_username is not None: + value = get_username() + if value is None: + # standard User + username = getattr(user, 'username', None) + if username is not None: + value = username + else: + # assume user is just an username + value = user + return value diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/django_webtest/backends.py new/django-webtest-1.9.4/django_webtest/backends.py --- old/django-webtest-1.9.2/django_webtest/backends.py 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/django_webtest/backends.py 2018-10-27 10:58:09.000000000 +0200 @@ -1,7 +1,7 @@ from __future__ import absolute_import from django.utils.version import get_complete_version from django.contrib.auth.backends import RemoteUserBackend -from .compat import from_wsgi_safe_string +from django_webtest.compat import from_wsgi_safe_string class WebtestUserBackend(RemoteUserBackend): """ Auth backend for django-webtest auth system """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/django_webtest/compat.py new/django-webtest-1.9.4/django_webtest/compat.py --- old/django-webtest-1.9.2/django_webtest/compat.py 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/django_webtest/compat.py 2018-10-27 10:58:09.000000000 +0200 @@ -36,3 +36,9 @@ if django.VERSION < (1, 10): return user.is_authenticated() return user.is_authenticated + + +def is_anonymous(user): + if django.VERSION < (1, 10): + return user.is_anonymous() + return user.is_anonymous diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/django_webtest/middleware.py new/django-webtest-1.9.4/django_webtest/middleware.py --- old/django-webtest-1.9.2/django_webtest/middleware.py 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/django_webtest/middleware.py 2018-10-27 10:58:09.000000000 +0200 @@ -8,7 +8,7 @@ else: MiddlewareMixin = object -from .compat import is_authenticated +from django_webtest.compat import is_authenticated class WebtestUserMiddleware(RemoteUserMiddleware): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/django_webtest/pytest_plugin.py new/django-webtest-1.9.4/django_webtest/pytest_plugin.py --- old/django-webtest-1.9.2/django_webtest/pytest_plugin.py 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/django_webtest/pytest_plugin.py 2018-10-27 10:58:09.000000000 +0200 @@ -3,13 +3,25 @@ import pytest +class MixinWithInstanceVariables(WebTestMixin): + """ + Override WebTestMixin to make all of its variables instance variables + not class variables; otherwise multiple django_app_factory fixtures contend + for the same class variables + """ + def __init__(self): + self.extra_environ = {} + self.csrf_checks = True + self.setup_auth = True + + @pytest.fixture(scope='session') def django_app_mixin(): - app_mixin = WebTestMixin() + app_mixin = MixinWithInstanceVariables() return app_mixin -@pytest.yield_fixture +@pytest.fixture def django_app(django_app_mixin): django_app_mixin._patch_settings() django_app_mixin.renew_app() @@ -17,11 +29,10 @@ django_app_mixin._unpatch_settings() -@pytest.yield_fixture +@pytest.fixture def django_app_factory(): - app_mixin = WebTestMixin() - def factory(csrf_checks=True, extra_environ=None): + app_mixin = MixinWithInstanceVariables() app_mixin.csrf_checks = csrf_checks if extra_environ: app_mixin.extra_environ = extra_environ @@ -30,4 +41,3 @@ return app_mixin.app yield factory - app_mixin._unpatch_settings() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/django_webtest.egg-info/PKG-INFO new/django-webtest-1.9.4/django_webtest.egg-info/PKG-INFO --- old/django-webtest-1.9.2/django_webtest.egg-info/PKG-INFO 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/django_webtest.egg-info/PKG-INFO 2018-10-27 10:58:09.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: django-webtest -Version: 1.9.2 +Version: 1.9.4 Summary: Instant integration of Ian Bicking's WebTest (http://docs.pylonsproject.org/projects/webtest/) with django's testing framework. Home-page: https://github.com/django-webtest/django-webtest Author: Mikhail Korobov @@ -63,11 +63,14 @@ (``django_webtest.WebTest``) that creates ``webtest.TestApp`` around django wsgi interface and makes it available in tests as ``self.app``. - It also features optional ``user`` argument for ``self.app.get`` and - ``self.app.post`` methods to help making authorized requests. This argument + It also features an optional ``user`` argument for ``self.app.get``, + ``self.app.post``, etc. to help making authorized requests. This argument should be a django.contrib.auth.models.User instance or a string with user's ``username`` for the user who is supposed to be logged in. To log out again, - call ``self.app.reset``, clearing all cookies. + call ``self.app.reset``, clearing all cookies. To make a bunch of calls + with the same user, call ``app.set_user(user)`` before your requests; if + you want to disable that user, call ``app.get(..., user=None)`` for one + request or ``app.set_user(None)`` to unset the user for all following calls. For 500 errors original traceback is shown instead of usual html result from handler500. @@ -105,6 +108,7 @@ class MyTestCase(WebTest): csrf_checks = False + def test_post(self) self.app.post('/') @@ -180,6 +184,32 @@ CHANGES ======= + 1.9.4 (2018-10-27) + ------------------ + + - py34 and Django 1.8 are no longer tested (but may works) + + - allow to use positionnal args; fixed #89 + + - remove deprecated pytest.yield_fixture functions. use pytest.fixture instead; + fixed #88 + + - Don't add duplicate WebtestUserMiddleware to the list of middlewares in + WebTestMixin. fixed #87 + + - restore MIDDLEWARE_CLASSES support; fixed #84 + + 1.9.3 (2018-05-03) + ------------------ + + - Passing `user=None` to get/post/etc. methods will clear a user + previously set with `set_user` instead of doing nothing. + + - Avoid sharing settings between tests in pytest plugin + + - Fix middleware settings name used + + 1.9.2 (2017-05-17) ------------------ @@ -440,12 +470,11 @@ Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.2 -Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: Implementation :: PyPy Classifier: Topic :: Software Development :: Libraries :: Python Modules diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/django_webtest.egg-info/requires.txt new/django-webtest-1.9.4/django_webtest.egg-info/requires.txt --- old/django-webtest-1.9.2/django_webtest.egg-info/requires.txt 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/django_webtest.egg-info/requires.txt 2018-10-27 10:58:09.000000000 +0200 @@ -1 +1 @@ -webtest >= 1.3.3 +webtest>=1.3.3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/django_webtest_tests/settings.py new/django-webtest-1.9.4/django_webtest_tests/settings.py --- old/django-webtest-1.9.2/django_webtest_tests/settings.py 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/django_webtest_tests/settings.py 2018-10-27 10:58:09.000000000 +0200 @@ -1,29 +1,21 @@ -# Django settings for django_webtest_tests project. -import os, sys +import os +import sys import django + PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) join = lambda p: os.path.abspath(os.path.join(PROJECT_ROOT, p)) +# TODO configure pytest testpaths instead of doing this sys.path.insert(0, join('..')) - -DEBUG = True -TEMPLATE_DEBUG = DEBUG - -ADMINS = ( - # ('Your Name', 'your_em...@domain.com'), -) - -MANAGERS = ADMINS - DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. - 'NAME': join('db.sqlite'), # Or path to database file if using sqlite3. - 'USER': '', # Not used with sqlite3. - 'PASSWORD': '', # Not used with sqlite3. - 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. - 'PORT': '', # Set to empty string for default. Not used with sqlite3. + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': join('db.sqlite'), + 'USER': '', + 'PASSWORD': '', + 'HOST': '', + 'PORT': '', } } @@ -31,49 +23,30 @@ DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql_psycopg2' DATABASES['default']['NAME'] = 'django_webtest_tests' -# Local time zone for this installation. Choices can be found here: -# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name -# although not all choices may be available on all operating systems. -# On Unix systems, a value of None will cause Django to use the same -# timezone as the operating system. -# If running in a Windows environment this must be set to the same as your -# system time zone. -TIME_ZONE = 'America/Chicago' - -# Language code for this installation. All choices can be found here: -# http://www.i18nguy.com/unicode/language-identifiers.html -LANGUAGE_CODE = 'en-us' SITE_ID = 1 +ROOT_URLCONF = 'urls' +SECRET_KEY = '5mcs97ar-(nnxhfkx0%^+0^sr!e(ax=x$2-!8dqy25ff-l1*a=' +DEBUG = False -# If you set this to False, Django will make some optimizations so as not -# to load the internationalization machinery. USE_I18N = True - -# If you set this to False, Django will not format dates, numbers and -# calendars according to the current locale USE_L10N = True +TIME_ZONE = 'America/Chicago' +LANGUAGE_CODE = 'en-us' -# Absolute path to the directory that holds media. -# Example: "/home/media/media.lawrence.com/" MEDIA_ROOT = join('media') - -# URL that handles the media served from MEDIA_ROOT. Make sure to use a -# trailing slash if there is a path component (optional in other cases). -# Examples: "http://media.lawrence.com", "http://example.com/media/" MEDIA_URL = '/media/' - STATIC_URL = '/static/' +LOGIN_REDIRECT_URL = '/template/index.html' -# Make this unique, and don't share it with anybody. -SECRET_KEY = '5mcs97ar-(nnxhfkx0%^+0^sr!e(ax=x$2-!8dqy25ff-l1*a=' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [ ], + 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { + 'debug': DEBUG, 'context_processors': [ 'django.contrib.auth.context_processors.auth', 'django.template.context_processors.debug', @@ -87,31 +60,33 @@ }, ] -# List of callables that know how to import templates from various sources. -# left here for compatibility with django < 1.8 -TEMPLATE_LOADERS = ( - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', -# 'django.template.loaders.eggs.Loader', -) -TEMPLATE_DIRS = ( - join('templates'), -) +if django.VERSION < (1, 10): + TEMPLATE_DEBUG = DEBUG -MIDDLEWARE_CLASSES = ( - 'django.middleware.common.CommonMiddleware', + TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + ) + + TEMPLATE_DIRS = ( + join('templates'), + ) + + +MIDDLEWARE = ( 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'testapp_tests.middleware.UserMiddleware', ) -if django.VERSION >= (1, 10): - MIDDLEWARE = MIDDLEWARE_CLASSES +if django.VERSION < (1, 10): + MIDDLEWARE_CLASSES = MIDDLEWARE + del MIDDLEWARE -ROOT_URLCONF = 'urls' INSTALLED_APPS = ( 'django.contrib.auth', @@ -119,11 +94,7 @@ 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', - # Uncomment the next line to enable the admin: - # 'django.contrib.admin', 'django_webtest', 'django_webtest_tests', 'django_webtest_tests.testapp_tests', ) - -LOGIN_REDIRECT_URL = '/template/index.html' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/django_webtest_tests/templates/index.html new/django-webtest-1.9.4/django_webtest_tests/templates/index.html --- old/django-webtest-1.9.2/django_webtest_tests/templates/index.html 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/django_webtest_tests/templates/index.html 2018-10-27 10:58:09.000000000 +0200 @@ -1,6 +1,8 @@ <!DOCTYPE html> <h1>Hello :)</h1> +<p>User: {{ user }}</p> + {% if bar %} <ul> {% for bar in foo %} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/django_webtest_tests/testapp_tests/tests.py new/django-webtest-1.9.4/django_webtest_tests/testapp_tests/tests.py --- old/django-webtest-1.9.2/django_webtest_tests/testapp_tests/tests.py 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/django_webtest_tests/testapp_tests/tests.py 2018-10-27 10:58:09.000000000 +0200 @@ -1,11 +1,22 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals, absolute_import -from webtest import AppError, TestApp + import django -from django_webtest import WebTest from django.contrib.auth.models import User -from django.core.urlresolvers import reverse +try: + from django.urls import reverse +except ImportError: + from django.core.urlresolvers import reverse +from django.test.testcases import override_settings +from unittest import skipIf + + +from webtest import AppError, TestApp + +from django_webtest import WebTest +from django_webtest.compat import is_authenticated, is_anonymous + class MethodsTest(WebTest): @@ -78,23 +89,26 @@ self.assertMethodWorks(self.app.options, 'OPTIONS') def test_get_auto_follow_default(self): - response = self.app.get(reverse('remove-prefix-redirect', args=('template/index.html',))) + response = self.app.get(reverse('remove-prefix-redirect', + args=('template/index.html',))) self.assertEqual(response.status_code, 302) def test_get_auto_follow_true(self): - response = self.app.get(reverse('remove-prefix-redirect', args=('template/index.html',)), + response = self.app.get(reverse('remove-prefix-redirect', + args=('template/index.html',)), auto_follow=True) self.assertEqual(response.status_code, 200) self.assertContains(response, 'Hello') def test_get_auto_follow_and_expect_errors(self): - response = self.app.get(reverse('remove-prefix-redirect', args=('some-404/',)), + response = self.app.get(reverse('remove-prefix-redirect', + args=('some-404/',)), auto_follow=True, expect_errors=True) self.assertEqual(response.status_code, 404) def test_get_with_positional_args(self): - with self.assertRaises(TypeError): - self.app.get('/', {}) + response = self.app.get('/', {}) + self.assertEqual(response.status_code, 200) class PostRequestTest(WebTest): @@ -175,7 +189,7 @@ def assertCanLogin(self, user): response = self.app.get('/template/index.html', user=user) res_user = response.context['user'] - assert res_user.is_authenticated() + assert is_authenticated(res_user) if isinstance(user, User): self.assertEqual(res_user, user) @@ -188,7 +202,7 @@ def test_not_logged_in(self): response = self.app.get('/template/index.html') user = response.context['user'] - assert not user.is_authenticated() + assert not is_authenticated(user) def test_logged_using_username(self): self.assertCanLogin('foo') @@ -253,7 +267,7 @@ response = self.app.get('/template/index.html', user=custom_user) user = response.context['user'] - assert user.is_authenticated() + assert is_authenticated(user) self.assertEqual(user, custom_user) def test_normal_user(self): @@ -268,15 +282,43 @@ def test_set_user(self): self.app.set_user(self.user.username) environ = self.app.extra_environ - self.assertTrue(environ['WEBTEST_USER'] == self.user.username) + self.assertEqual(environ['WEBTEST_USER'], self.user.username) resp = self.app.get('/template/index.html') + environ = resp.request.environ - self.assertTrue(environ['WEBTEST_USER'] == self.user.username) + self.assertEqual(environ['WEBTEST_USER'], self.user.username) + resp.mustcontain('User: {}'.format(self.user.username)) - self.app.set_user() + def test_set_user_reset(self): + self.app.set_user(self.user.username) + self.app.set_user(None) environ = self.app.extra_environ - self.assertTrue('WEBTEST_USER' not in environ) + self.assertNotIn('WEBTEST_USER', environ) + + resp = self.app.get('/template/index.html') + + environ = resp.request.environ + self.assertNotIn('WEBTEST_USER', environ) + resp.mustcontain('User: AnonymousUser') + + def test_user_param(self): + resp = self.app.get('/template/index.html', user='bob_morane') + + self.assertEqual(resp.request.environ['WEBTEST_USER'], 'bob_morane') + + resp.mustcontain('User: bob_morane') + + def test_user_param_reset(self): + self.app.set_user(self.user.username) + resp = self.app.get('/template/index.html', user=None) + + # this request had no user + self.assertEqual(resp.request.environ['WEBTEST_USER'], '') + resp.mustcontain('User: AnonymousUser') + # app object is unchanged + self.assertEqual(self.app.extra_environ['WEBTEST_USER'], + self.user.username) class EnvironTest(BaseAuthTest): @@ -291,7 +333,7 @@ resp2 = self.app.get('/template/index.html') environ = resp2.request.environ - self.assertTrue('WEBTEST_USER' not in environ) + self.assertNotIn('WEBTEST_USER', environ) self.assertEqual(environ['REMOTE_ADDR'], '127.0.0.2') resp3 = self.app.get('/template/index.html', @@ -313,7 +355,7 @@ # cookies were dropped page2 = self.app.get('/template/form.html') - self.assertTrue(page2.context['user'].is_anonymous()) + self.assertTrue(is_anonymous(page2.context['user'])) # but cookies are still there while browsing from stored page page1_1 = page1.click('Login') @@ -371,7 +413,8 @@ def test_no_auth(self): from django.conf import settings - assert 'django_webtest.middleware.WebtestUserMiddleware' not in settings.MIDDLEWARE_CLASSES + middleware = getattr(settings, 'MIDDLEWARE', None) or settings.MIDDLEWARE_CLASSES + assert 'django_webtest.middleware.WebtestUserMiddleware' not in middleware assert 'django_webtest.backends.WebtestUserBackend' not in settings.AUTHENTICATION_BACKENDS @@ -394,7 +437,7 @@ self.assertEqual({}, self.app.session) def test_session_not_empty(self): - response = self.app.get(reverse('set_session')) + self.app.get(reverse('set_session')) self.assertEqual('foo', self.app.session['test']) @@ -415,3 +458,26 @@ self.app.set_cookie(str('test_cookie'), str('cookie monster!')) rsp = self.app.get(reverse('cookie_test')) self.assertContains(rsp, 'cookie monster!') + + +@skipIf(django.VERSION < (1, 10), 'MIDDLEWARE is added in Django 1.10') +@override_settings(MIDDLEWARE=[]) +class MiddlewareTest(WebTest): + + def test_middleware_setting_name(self): + self.assertEqual( + self.middleware_setting_name, + 'MIDDLEWARE' + ) + + +@skipIf(django.VERSION < (1, 10) or django.VERSION >= (2, 0), + 'MIDDLEWARE is added in Django 1.10') +@override_settings(MIDDLEWARE=None, MIDDLEWARE_CLASSES=[]) +class MiddlewareClassesTest(WebTest): + + def test_middleware_setting_name(self): + self.assertEqual( + self.middleware_setting_name, + 'MIDDLEWARE_CLASSES' + ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/django_webtest_tests/tox2travis.py new/django-webtest-1.9.4/django_webtest_tests/tox2travis.py --- old/django-webtest-1.9.2/django_webtest_tests/tox2travis.py 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/django_webtest_tests/tox2travis.py 2018-10-27 10:58:09.000000000 +0200 @@ -2,9 +2,10 @@ TRAVIS_CONF = ''' language: python -python: 3.5 # this is needed to get travis to have python3.5 as well -sudo: false +cache: + directories: + - $HOME/.cache/pip addons: postgresql: "9.3" @@ -17,11 +18,13 @@ - pip install tox script: - tox -env: +matrix: + include: ''' if __name__ == '__main__': - import subprocess, sys + import subprocess + import sys p = subprocess.check_output('tox -l', shell=True) if sys.version_info.major == 3: p = p.decode('utf-8') @@ -30,4 +33,17 @@ for env in p.split('\n'): env = env.strip() if env and env not in ('travis',): - fd.write(' - TOXENV={}\n'.format(env)) + dist = None + if env.startswith('pypy'): + py = 'pypy' + else: + py = '{0}.{1}'.format(env[2], env[3]) + if int(env[2] + env[3]) > 36: + # looks like psql dos not work on xenial... skip 3.7 + # for now + continue + dist = 'xenial' + fd.write(' - python: "{}"\n'.format(py)) + fd.write(' env: TOXENV={}\n'.format(env)) + if dist is not None: + fd.write(' dist: {}\n'.format(dist)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/django_webtest_tests/urls.py new/django-webtest-1.9.4/django_webtest_tests/urls.py --- old/django-webtest-1.9.2/django_webtest_tests/urls.py 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/django_webtest_tests/urls.py 2018-10-27 10:58:09.000000000 +0200 @@ -1,40 +1,47 @@ - -# prevent DeprecationWarning for more recent django versions try: from django.conf.urls import url except ImportError: - from django.conf.urls.defaults import patterns, url, handler404, handler500 + from django.conf.urls.defaults import url from django.http import HttpResponse from django.shortcuts import render -from django.contrib.auth.views import login from testapp_tests.views import check_password, search, set_session, \ - protected, redirect_to_protected, remove_prefix_redirect, cookie_test \ + protected, redirect_to_protected, remove_prefix_redirect, cookie_test + +try: + from django.contrib.auth.views import login +except ImportError: + # django 2+ + from django.contrib.auth.views import LoginView + login = LoginView.as_view() -# Uncomment the next two lines to enable the admin: -# from django.contrib import admin -# admin.autodiscover() def simple_method_test(request): return HttpResponse(str(request.method)) + def simple_template_render(request, template_name): return render(request, template_name, { + 'user': request.user, 'foo': ('a', 'b', 'c'), 'bar': True, 'spam': None, }) + urlpatterns = ( url(r'^$', simple_method_test, name='simple-method-test'), - url(r'^template/(.*)$', simple_template_render, name='simple-template-test'), + url(r'^template/(.*)$', simple_template_render, + name='simple-template-test'), url(r'^check-password/$', check_password, name='check_password'), url(r'^search/$', search, name='search'), url(r'^login/$', login, name='auth_login'), url(r'^set-session/$', set_session, name='set_session'), url(r'^protected/$', protected, name='protected'), - url(r'^redirect-to-protected/$', redirect_to_protected, name='redirect-to-protected'), - url(r'^remove-prefix-redirect/(.*)/$', remove_prefix_redirect, name='remove-prefix-redirect'), + url(r'^redirect-to-protected/$', + redirect_to_protected, name='redirect-to-protected'), + url(r'^remove-prefix-redirect/(.*)/$', + remove_prefix_redirect, name='remove-prefix-redirect'), url(r'^cookie-test/$', cookie_test, name='cookie_test'), ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/setup.cfg new/django-webtest-1.9.4/setup.cfg --- old/django-webtest-1.9.2/setup.cfg 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/setup.cfg 2018-10-27 10:58:09.000000000 +0200 @@ -4,5 +4,4 @@ [egg_info] tag_build = tag_date = 0 -tag_svn_revision = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/setup.py new/django-webtest-1.9.4/setup.py --- old/django-webtest-1.9.2/setup.py 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/setup.py 2018-10-27 10:58:09.000000000 +0200 @@ -4,7 +4,7 @@ from setuptools import setup -version = '1.9.2' +version = '1.9.4' def _read(name): @@ -52,12 +52,11 @@ 'License :: OSI Approved :: MIT License', 'Programming Language :: Python', 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.6', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.2', - 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: Implementation :: CPython', 'Programming Language :: Python :: Implementation :: PyPy', 'Topic :: Software Development :: Libraries :: Python Modules', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/django-webtest-1.9.2/tox.ini new/django-webtest-1.9.4/tox.ini --- old/django-webtest-1.9.2/tox.ini 2017-05-17 10:52:10.000000000 +0200 +++ new/django-webtest-1.9.4/tox.ini 2018-10-27 10:58:09.000000000 +0200 @@ -2,18 +2,18 @@ skip_missing_interpreters = true envlist = pypy-django19-std, - {py27,py34}-django{18,19,110,111}-{std,clocale,postgres}, - py35-django{18,19,110,111}-{std,clocale,postgres} + py27-django{19,110,111}-{std,clocale,postgres}, + {py35,py36,py37}-django{19,110,111,20}-{std,clocale,postgres} [testenv] deps= pytest pytest-django postgres: psycopg2 - django18: django >=1.8, < 1.9 django19: django >=1.9, < 1.9.9 django110: django >=1.10, < 1.11 django111: django >=1.11, < 2.0 + django20: django ~= 2.0 setenv= clocale: LC_ALL=C postgres: USE_POSTGRES=True