add --skip-fetch flag, update start_urls, update auto_auth to include redirect_to param
This commit is contained in:
@@ -219,6 +219,17 @@ class AutoAuthEnabledTestCase(UrlResetMixin, TestCase):
|
||||
|
||||
self.assertTrue(response.url.endswith(url_pattern)) # pylint: disable=no-member
|
||||
|
||||
def test_redirect_to_specified(self):
|
||||
# Create user and redirect to specified url
|
||||
url_pattern = '/u/test#about_me'
|
||||
response = self._auto_auth({
|
||||
'username': 'test',
|
||||
'redirect_to': url_pattern,
|
||||
'staff': 'true',
|
||||
}, status_code=302)
|
||||
|
||||
self.assertTrue(response.url.endswith(url_pattern)) # pylint: disable=no-member
|
||||
|
||||
def _auto_auth(self, params=None, status_code=None, **kwargs):
|
||||
"""
|
||||
Make a request to the auto-auth end-point and check
|
||||
|
||||
@@ -1906,8 +1906,9 @@ def auto_auth(request):
|
||||
* `course_id`: Enroll the student in the course with `course_id`
|
||||
* `roles`: Comma-separated list of roles to grant the student in the course with `course_id`
|
||||
* `no_login`: Define this to create the user but not login
|
||||
* `redirect`: Set to "true" will redirect to course if course_id is defined, otherwise it will redirect to dashboard
|
||||
|
||||
* `redirect`: Set to "true" will redirect to the `redirect_to` value if set, or
|
||||
course home page if course_id is defined, otherwise it will redirect to dashboard
|
||||
* `redirect_to`: will redirect to to this url
|
||||
If username, email, or password are not provided, use
|
||||
randomly generated credentials.
|
||||
"""
|
||||
@@ -1923,6 +1924,7 @@ def auto_auth(request):
|
||||
is_staff = request.GET.get('staff', None)
|
||||
is_superuser = request.GET.get('superuser', None)
|
||||
course_id = request.GET.get('course_id', None)
|
||||
redirect_to = request.GET.get('redirect_to', None)
|
||||
|
||||
# mode has to be one of 'honor'/'professional'/'verified'/'audit'/'no-id-professional'/'credit'
|
||||
enrollment_mode = request.GET.get('enrollment_mode', 'honor')
|
||||
@@ -1931,7 +1933,7 @@ def auto_auth(request):
|
||||
if course_id:
|
||||
course_key = CourseLocator.from_string(course_id)
|
||||
role_names = [v.strip() for v in request.GET.get('roles', '').split(',') if v.strip()]
|
||||
redirect_when_done = request.GET.get('redirect', '').lower() == 'true'
|
||||
redirect_when_done = request.GET.get('redirect', '').lower() == 'true' or redirect_to
|
||||
login_when_done = 'no_login' not in request.GET
|
||||
|
||||
form = AccountCreationForm(
|
||||
@@ -1996,8 +1998,11 @@ def auto_auth(request):
|
||||
# Provide the user with a valid CSRF token
|
||||
# then return a 200 response unless redirect is true
|
||||
if redirect_when_done:
|
||||
# Redirect to specific page if specified
|
||||
if redirect_to:
|
||||
redirect_url = redirect_to
|
||||
# Redirect to course info page if course_id is known
|
||||
if course_id:
|
||||
elif course_id:
|
||||
try:
|
||||
# redirect to course info page in LMS
|
||||
redirect_url = reverse(
|
||||
|
||||
@@ -3,7 +3,7 @@ Run acceptance tests that use the bok-choy framework
|
||||
http://bok-choy.readthedocs.org/en/latest/
|
||||
"""
|
||||
from paver.easy import task, needs, cmdopts, sh
|
||||
from pavelib.utils.test.suites.bokchoy_suite import BokChoyTestSuite, A11yCrawler
|
||||
from pavelib.utils.test.suites.bokchoy_suite import BokChoyTestSuite, Pa11yCrawler
|
||||
from pavelib.utils.envs import Env
|
||||
from pavelib.utils.test.utils import check_firefox_version
|
||||
from optparse import make_option
|
||||
@@ -24,6 +24,7 @@ BOKCHOY_OPTS = [
|
||||
('extra_args=', 'e', 'adds as extra args to the test command'),
|
||||
('default_store=', 's', 'Default modulestore'),
|
||||
('test_dir=', 'd', 'Directory for finding tests (relative to common/test/acceptance)'),
|
||||
('imports_dir=', 'i', 'Directory containing (un-archived) courses to be imported'),
|
||||
('num_processes=', 'n', 'Number of test threads (for multiprocessing)'),
|
||||
('verify_xss', 'x', 'Run XSS vulnerability tests'),
|
||||
make_option("--verbose", action="store_const", const=2, dest="verbosity"),
|
||||
@@ -53,6 +54,7 @@ def parse_bokchoy_opts(options):
|
||||
'extra_args': getattr(options, 'extra_args', ''),
|
||||
'pdb': getattr(options, 'pdb', False),
|
||||
'test_dir': getattr(options, 'test_dir', 'tests'),
|
||||
'imports_dir': getattr(options, 'imports_dir', None),
|
||||
'save_screenshots': getattr(options, 'save_screenshots', False),
|
||||
}
|
||||
|
||||
@@ -115,15 +117,12 @@ def test_a11y(options):
|
||||
|
||||
@task
|
||||
@needs('pavelib.prereqs.install_prereqs')
|
||||
@cmdopts(BOKCHOY_OPTS + [
|
||||
('imports_dir=', 'd', 'Directory containing (un-archived) courses to be imported'),
|
||||
])
|
||||
@cmdopts(BOKCHOY_OPTS)
|
||||
def perf_report_bokchoy(options):
|
||||
"""
|
||||
Generates a har file for with page performance info.
|
||||
"""
|
||||
opts = parse_bokchoy_opts(options)
|
||||
opts['imports_dir'] = getattr(options, 'imports_dir', None)
|
||||
opts['test_dir'] = 'performance'
|
||||
|
||||
run_bokchoy(**opts)
|
||||
@@ -133,6 +132,13 @@ def perf_report_bokchoy(options):
|
||||
@needs('pavelib.prereqs.install_prereqs')
|
||||
@cmdopts(BOKCHOY_OPTS + [
|
||||
('with-html', 'w', 'Include html reports'),
|
||||
make_option('--course-key', help='Course key for test course'),
|
||||
make_option(
|
||||
"--skip-fetch",
|
||||
action="store_false",
|
||||
dest="should_fetch_course",
|
||||
help='Course key for test course',
|
||||
),
|
||||
])
|
||||
def pa11ycrawler(options):
|
||||
"""
|
||||
@@ -146,7 +152,9 @@ def pa11ycrawler(options):
|
||||
opts = parse_bokchoy_opts(options)
|
||||
opts['report_dir'] = Env.PA11YCRAWLER_REPORT_DIR
|
||||
opts['coveragerc'] = Env.PA11YCRAWLER_COVERAGERC
|
||||
test_suite = A11yCrawler('a11y_crawler', **opts)
|
||||
opts['should_fetch_course'] = getattr(options, 'should_fetch_course', None)
|
||||
opts['course_key'] = getattr(options, 'course-key', None)
|
||||
test_suite = Pa11yCrawler('a11y_crawler', **opts)
|
||||
test_suite.run()
|
||||
|
||||
if getattr(options, 'with_html', False):
|
||||
|
||||
@@ -8,7 +8,7 @@ import unittest
|
||||
from mock import patch, call
|
||||
from test.test_support import EnvironmentVarGuard
|
||||
from paver.easy import BuildFailure
|
||||
from pavelib.utils.test.suites import BokChoyTestSuite, A11yCrawler
|
||||
from pavelib.utils.test.suites import BokChoyTestSuite, Pa11yCrawler
|
||||
|
||||
REPO_DIR = os.getcwd()
|
||||
|
||||
@@ -171,7 +171,7 @@ class TestPaverBokChoyCmd(unittest.TestCase):
|
||||
BokChoyTestSuite.verbosity_processes_string(suite)
|
||||
|
||||
|
||||
class TestPaverPa11ycrawlerCmd(unittest.TestCase):
|
||||
class TestPaverPa11yCrawlerCmd(unittest.TestCase):
|
||||
|
||||
"""
|
||||
Paver pa11ycrawler command test cases. Most of the functionality is
|
||||
@@ -179,7 +179,7 @@ class TestPaverPa11ycrawlerCmd(unittest.TestCase):
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
super(TestPaverPa11ycrawlerCmd, self).setUp()
|
||||
super(TestPaverPa11yCrawlerCmd, self).setUp()
|
||||
|
||||
# Mock shell commands
|
||||
mock_sh = patch('pavelib.utils.test.suites.bokchoy_suite.sh')
|
||||
@@ -188,41 +188,32 @@ class TestPaverPa11ycrawlerCmd(unittest.TestCase):
|
||||
# Cleanup mocks
|
||||
self.addCleanup(mock_sh.stop)
|
||||
|
||||
def _expected_command(self, report_dir):
|
||||
def _expected_command(self, report_dir, start_urls):
|
||||
"""
|
||||
Returns the expected command to run pa11ycrawler.
|
||||
"""
|
||||
cms_start_url = (
|
||||
"http://localhost:8031/auto_auth?redirect=true&course_id=course-v1"
|
||||
"%3AedX%2BTest101%2Bcourse&staff=true"
|
||||
)
|
||||
|
||||
lms_start_url = (
|
||||
"http://localhost:8003/auto_auth?redirect=true&course_id=course-v1"
|
||||
"%3AedX%2BTest101%2Bcourse&staff=true"
|
||||
)
|
||||
|
||||
expected_statement = (
|
||||
'pa11ycrawler run "{cms_start_url}" "{lms_start_url}" '
|
||||
'pa11ycrawler run {start_urls} '
|
||||
'--pa11ycrawler-allowed-domains=localhost '
|
||||
'--pa11ycrawler-reports-dir={report_dir} '
|
||||
'--pa11ycrawler-deny-url-matcher=logout '
|
||||
'--pa11y-reporter="1.0-json" '
|
||||
'--depth-limit=6 '
|
||||
).format(
|
||||
cms_start_url=cms_start_url,
|
||||
lms_start_url=lms_start_url,
|
||||
start_urls=start_urls,
|
||||
report_dir=report_dir,
|
||||
)
|
||||
return expected_statement
|
||||
|
||||
def test_default(self):
|
||||
suite = A11yCrawler('')
|
||||
suite = Pa11yCrawler('')
|
||||
self.assertEqual(
|
||||
suite.cmd, self._expected_command(suite.pa11y_report_dir))
|
||||
suite.cmd,
|
||||
self._expected_command(suite.pa11y_report_dir, suite.start_urls)
|
||||
)
|
||||
|
||||
def test_get_test_course(self):
|
||||
suite = A11yCrawler('')
|
||||
suite = Pa11yCrawler('')
|
||||
suite.get_test_course()
|
||||
self._mock_sh.assert_has_calls([
|
||||
call(
|
||||
@@ -232,7 +223,7 @@ class TestPaverPa11ycrawlerCmd(unittest.TestCase):
|
||||
])
|
||||
|
||||
def test_generate_html_reports(self):
|
||||
suite = A11yCrawler('')
|
||||
suite = Pa11yCrawler('')
|
||||
suite.generate_html_reports()
|
||||
self._mock_sh.assert_has_calls([
|
||||
call(
|
||||
|
||||
@@ -6,4 +6,4 @@ from .nose_suite import NoseTestSuite, SystemTestSuite, LibTestSuite
|
||||
from .python_suite import PythonTestSuite
|
||||
from .js_suite import JsTestSuite
|
||||
from .acceptance_suite import AcceptanceTestSuite
|
||||
from .bokchoy_suite import BokChoyTestSuite, A11yCrawler
|
||||
from .bokchoy_suite import BokChoyTestSuite, Pa11yCrawler
|
||||
|
||||
@@ -260,22 +260,55 @@ class BokChoyTestSuite(TestSuite):
|
||||
return cmd
|
||||
|
||||
|
||||
class A11yCrawler(BokChoyTestSuite):
|
||||
class Pa11yCrawler(BokChoyTestSuite):
|
||||
"""
|
||||
Sets up test environment with mega-course loaded, and runs pa11ycralwer
|
||||
against it.
|
||||
"""
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(A11yCrawler, self).__init__(*args, **kwargs)
|
||||
super(Pa11yCrawler, self).__init__(*args, **kwargs)
|
||||
self.course_key = kwargs.get('course_key', "course-v1:edX+Test101+course")
|
||||
if self.imports_dir:
|
||||
# If imports_dir has been specified, assume the files are
|
||||
# already there -- no need to fetch them from github. This
|
||||
# allows someome to crawl a different course. They are responsible
|
||||
# for putting it, un-archived, in the directory.
|
||||
self.should_fetch_course = False
|
||||
else:
|
||||
# Otherwise, obey `--skip-fetch` command and use the default
|
||||
# test course. Note that the fetch will also be skipped when
|
||||
# using `--fast`.
|
||||
self.should_fetch_course = kwargs.get('should_fetch_course', not self.fasttest)
|
||||
self.imports_dir = path('test_root/courses/')
|
||||
|
||||
self.pa11y_report_dir = os.path.join(self.report_dir, 'pa11ycrawler_reports')
|
||||
self.imports_dir = path('test_root/courses/')
|
||||
self.tar_gz_file = "https://github.com/edx/demo-test-course/archive/master.tar.gz"
|
||||
|
||||
self.start_urls = []
|
||||
auto_auth_params = {
|
||||
"redirect": 'true',
|
||||
"staff": 'true',
|
||||
"course_id": self.course_key,
|
||||
}
|
||||
cms_params = urlencode(auto_auth_params)
|
||||
self.start_urls.append("\"http://localhost:8031/auto_auth?{}\"".format(cms_params))
|
||||
|
||||
sequence_url = "/api/courses/v1/blocks/?{}".format(
|
||||
urlencode({
|
||||
"course_id": self.course_key,
|
||||
"depth": "all",
|
||||
"all_blocks": "true",
|
||||
})
|
||||
)
|
||||
auto_auth_params.update({'redirect_to': sequence_url})
|
||||
lms_params = urlencode(auto_auth_params)
|
||||
self.start_urls.append("\"http://localhost:8003/auto_auth?{}\"".format(lms_params))
|
||||
|
||||
def __enter__(self):
|
||||
self.get_test_course()
|
||||
super(A11yCrawler, self).__enter__()
|
||||
if self.should_fetch_course:
|
||||
self.get_test_course()
|
||||
super(Pa11yCrawler, self).__enter__()
|
||||
|
||||
def get_test_course(self):
|
||||
"""
|
||||
@@ -319,23 +352,15 @@ class A11yCrawler(BokChoyTestSuite):
|
||||
"""
|
||||
Runs pa11ycrawler as staff user against the test course.
|
||||
"""
|
||||
params = urlencode({
|
||||
"redirect": 'true',
|
||||
"staff": 'true',
|
||||
"course_id": "course-v1:edX+Test101+course",
|
||||
})
|
||||
cms_start_url = 'http://localhost:8031/auto_auth?{}'.format(params)
|
||||
lms_start_url = 'http://localhost:8003/auto_auth?{}'.format(params)
|
||||
cmd_str = (
|
||||
'pa11ycrawler run "{cms_start_url}" "{lms_start_url}" '
|
||||
'pa11ycrawler run {start_urls} '
|
||||
'--pa11ycrawler-allowed-domains={allowed_domains} '
|
||||
'--pa11ycrawler-reports-dir={report_dir} '
|
||||
'--pa11ycrawler-deny-url-matcher={dont_go_here} '
|
||||
'--pa11y-reporter="{reporter}" '
|
||||
'--depth-limit={depth} '
|
||||
).format(
|
||||
cms_start_url=cms_start_url,
|
||||
lms_start_url=lms_start_url,
|
||||
start_urls=self.start_urls,
|
||||
allowed_domains='localhost',
|
||||
report_dir=self.pa11y_report_dir,
|
||||
reporter="1.0-json",
|
||||
|
||||
Reference in New Issue
Block a user