Skip to content

Commit

Permalink
Merge pull request openedx#16957 from edx/jmbowman/PLAT-1858
Browse files Browse the repository at this point in the history
PLAT-1858 Better capture of deprecation warnings
  • Loading branch information
Jeremy Bowman authored Jan 16, 2018
2 parents 5553e7d + 7d436a1 commit 7e2a231
Show file tree
Hide file tree
Showing 12 changed files with 103 additions and 42 deletions.
10 changes: 0 additions & 10 deletions cms/envs/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
from .common import *
import os
from path import Path as path
from warnings import filterwarnings, simplefilter
from uuid import uuid4
from util.db import NoOpMigrationModules
from openedx.core.lib.derived import derive_settings
Expand Down Expand Up @@ -175,15 +174,6 @@
},
}

# hide ratelimit warnings while running tests
filterwarnings('ignore', message='No request passed to the backend, unable to rate-limit')

# Ignore deprecation warnings (so we don't clutter Jenkins builds/production)
# https://docs.python.org/2/library/warnings.html#the-warnings-filter
# Change to "default" to see the first instance of each hit
# or "error" to convert all into errors
simplefilter('ignore')

################################# CELERY ######################################

CELERY_ALWAYS_EAGER = True
Expand Down
5 changes: 5 additions & 0 deletions cms/pytest.ini
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
[pytest]
DJANGO_SETTINGS_MODULE = cms.envs.test
addopts = --nomigrations --reuse-db --durations=20 -p no:randomly
# Enable default handling for all warnings, including those that are ignored by default;
# but hide rate-limit warnings, because we deliberately don't throttle test user logins
filterwarnings =
default
ignore:No request passed to the backend, unable to rate-limit:UserWarning
norecursedirs = envs
python_classes =
python_files = tests.py test_*.py *_tests.py
23 changes: 15 additions & 8 deletions common/djangoapps/student/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@

# TODO: Remove Django 1.11 upgrade shim
# SHIM: Compensate for behavior change of default authentication backend in 1.10
if django.VERSION[0] == 1 and django.VERSION[1] < 10:
if django.VERSION < (1, 10):
NEW_USER_AUTH_BACKEND = 'django.contrib.auth.backends.ModelBackend'
else:
# We want to allow inactive users to log in only when their account is first created
Expand All @@ -171,6 +171,18 @@
# pylint: disable=logging-format-interpolation


def authenticate_new_user(request, username, password):
"""
Immediately after a user creates an account, we log them in. They are only
logged in until they close the browser. They can't log in again until they click
the activation link from the email.
"""
backend = load_backend(NEW_USER_AUTH_BACKEND)
user = backend.authenticate(request=request, username=username, password=password)
user.backend = NEW_USER_AUTH_BACKEND
return user


def csrf_token(context):
"""A csrf token that can be included in a form."""
token = context.get('csrf_token', '')
Expand Down Expand Up @@ -2126,12 +2138,7 @@ def create_account_with_params(request, params):
else:
compose_and_send_activation_email(user, profile, registration)

# Immediately after a user creates an account, we log them in. They are only
# logged in until they close the browser. They can't log in again until they click
# the activation link from the email.
backend = load_backend(NEW_USER_AUTH_BACKEND)
new_user = backend.authenticate(request=request, username=user.username, password=params['password'])
new_user.backend = NEW_USER_AUTH_BACKEND
new_user = authenticate_new_user(request, user.username, params['password'])
login(request, new_user)
request.session.set_expiry(0)

Expand Down Expand Up @@ -2447,7 +2454,7 @@ def auto_auth(request):

# Log in as the user
if login_when_done:
user = authenticate(username=username, password=password)
user = authenticate_new_user(request, username, password)
login(request, user)

create_comments_service_user(user)
Expand Down
5 changes: 5 additions & 0 deletions common/lib/pytest.ini
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
[pytest]
DJANGO_SETTINGS_MODULE = openedx.tests.settings
addopts = --nomigrations --reuse-db --durations=20
# Enable default handling for all warnings, including those that are ignored by default;
# but hide rate-limit warnings, because we deliberately don't throttle test user logins
filterwarnings =
default
ignore:No request passed to the backend, unable to rate-limit:UserWarning
norecursedirs = .cache
python_classes =
python_files = tests.py test_*.py tests_*.py *_tests.py __init__.py
5 changes: 5 additions & 0 deletions common/test/pytest.ini
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
[pytest]
addopts = -p no:randomly --durations=20
# Enable default handling for all warnings, including those that are ignored by default;
# but hide rate-limit warnings, because we deliberately don't throttle test user logins
filterwarnings =
default
ignore:No request passed to the backend, unable to rate-limit:UserWarning
norecursedirs = .cache
10 changes: 0 additions & 10 deletions lms/envs/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import os
from path import Path as path
from uuid import uuid4
from warnings import filterwarnings, simplefilter

from util.db import NoOpMigrationModules
from openedx.core.lib.derived import derive_settings
Expand Down Expand Up @@ -232,15 +231,6 @@
# Dummy secret key for dev
SECRET_KEY = '85920908f28904ed733fe576320db18cabd7b6cd'

# hide ratelimit warnings while running tests
filterwarnings('ignore', message='No request passed to the backend, unable to rate-limit')

# Ignore deprecation warnings (so we don't clutter Jenkins builds/production)
# https://docs.python.org/2/library/warnings.html#the-warnings-filter
# Change to "default" to see the first instance of each hit
# or "error" to convert all into errors
simplefilter('ignore')

############################# SECURITY SETTINGS ################################
# Default to advanced security in common.py, so tests can reset here to use
# a simpler security model
Expand Down
3 changes: 3 additions & 0 deletions openedx/tests/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,12 @@
'djcelery',
'openedx.core.djangoapps.video_config',
'openedx.core.djangoapps.video_pipeline',
'openedx.core.djangoapps.bookmarks.apps.BookmarksConfig',
'edxval',
'courseware',
'student',
'certificates.apps.CertificatesConfig',
'openedx.core.djangoapps.user_api',
'course_modes.apps.CourseModesConfig',
'lms.djangoapps.verify_student.apps.VerifyStudentConfig',
'openedx.core.djangoapps.dark_lang',
Expand All @@ -71,6 +73,7 @@
'openedx.core.djangoapps.self_paced',
'milestones',
'celery_utils',
'lms.djangoapps.completion.apps.CompletionAppConfig',
)

LMS_ROOT_URL = 'http://localhost:8000'
Expand Down
1 change: 1 addition & 0 deletions openedx/tests/util/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ def expected_redirect_url(relative_url, hostname='testserver'):
"""
Get the expected redirect URL for the current Django version and the
given relative URL:
* Django 1.8 and earlier redirect URLs beginning with a slash to absolute
URLs, later versions redirect to relative ones.
* Django 1.8 and earlier leave URLs without a leading slash alone, later
Expand Down
18 changes: 4 additions & 14 deletions scripts/generic-ci-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -131,14 +131,8 @@ case "$TEST_SUITE" in

"lms-unit")
case "$SHARD" in
"all")
$TOX paver test_system -s lms --disable_capture $PAVER_ARGS $PARALLEL 2> lms-tests.log
;;
[1-3])
$TOX paver test_system -s lms --disable_capture --eval-attr="shard==$SHARD" $PAVER_ARGS $PARALLEL 2> lms-tests.$SHARD.log
;;
4|"noshard")
$TOX paver test_system -s lms --disable_capture --eval-attr='not shard' $PAVER_ARGS $PARALLEL 2> lms-tests.4.log
"all"|[1-4]|"noshard")
$TOX bash scripts/unit-tests.sh
;;
*)
# If no shard is specified, rather than running all tests, create an empty xunit file. This is a
Expand All @@ -151,12 +145,8 @@ case "$TEST_SUITE" in
esac
;;

"cms-unit")
$TOX paver test_system -s cms --disable_capture $PAVER_ARGS 2> cms-tests.log
;;

"commonlib-unit")
$TOX paver test_lib --disable_capture $PAVER_ARGS 2> common-tests.log
"cms-unit"|"commonlib-unit")
$TOX bash scripts/unit-tests.sh
;;

"js-unit")
Expand Down
58 changes: 58 additions & 0 deletions scripts/unit-tests.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#!/bin/bash
set -e

###############################################################################
#
# unit-tests.sh
#
# Execute Python unit tests for edx-platform.
#
# This script is typically called from generic-ci-tests.sh, which defines
# these environment variables:
#
# `TEST_SUITE` defines which kind of test to run.
# Possible values are:
#
# - "lms-unit": Run the LMS Python unit tests
# - "cms-unit": Run the CMS Python unit tests
# - "commonlib-unit": Run Python unit tests from the common/lib directory
#
# `SHARD` is a number indicating which subset of the tests to build.
#
# For "lms-unit", the tests are put into shard groups
# using the 'attr' decorator (e.g. "@attr(shard=1)"). Anything with
# the 'shard=n' attribute will run in the nth shard. If there isn't a
# shard explicitly assigned, the test will run in the last shard.
#
# This script is broken out so it can be run by tox and redirect stderr to
# the specified file before tox gets a chance to redirect it to stdout.
#
###############################################################################

PAVER_ARGS="-v"
PARALLEL="--processes=-1"

case "${TEST_SUITE}" in

"lms-unit")
case "$SHARD" in
"all")
paver test_system -s lms --disable_capture ${PAVER_ARGS} ${PARALLEL} 2> lms-tests.log
;;
[1-3])
paver test_system -s lms --disable_capture --eval-attr="shard==$SHARD" ${PAVER_ARGS} ${PARALLEL} 2> lms-tests.${SHARD}.log
;;
4|"noshard")
paver test_system -s lms --disable_capture --eval-attr='not shard' ${PAVER_ARGS} ${PARALLEL} 2> lms-tests.4.log
;;
esac
;;

"cms-unit")
paver test_system -s cms --disable_capture ${PAVER_ARGS} 2> cms-tests.log
;;

"commonlib-unit")
paver test_lib --disable_capture ${PAVER_ARGS} 2> common-tests.log
;;
esac
5 changes: 5 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ process-timeout=300
[tool:pytest]
DJANGO_SETTINGS_MODULE = lms.envs.test
addopts = --nomigrations --reuse-db --durations=20
# Enable default handling for all warnings, including those that are ignored by default;
# but hide rate-limit warnings, because we deliberately don't throttle test user logins
filterwarnings =
default
ignore:No request passed to the backend, unable to rate-limit:UserWarning
norecursedirs = .* *.egg build conf dist node_modules test_root cms/envs lms/envs
python_classes =
python_files = tests.py test_*.py tests_*.py *_tests.py __init__.py
Expand Down
2 changes: 2 additions & 0 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ passenv =
SELENIUM_BROWSER
SELENIUM_HOST
SELENIUM_PORT
SHARD
TEST_SUITE
deps =
django18: Django>=1.8,<1.9
django19: Django>=1.9,<1.10
Expand Down

0 comments on commit 7e2a231

Please sign in to comment.