diff --git a/cms/djangoapps/contentstore/features/common.py b/cms/djangoapps/contentstore/features/common.py index 2495ea83b2..cb24af47e0 100644 --- a/cms/djangoapps/contentstore/features/common.py +++ b/cms/djangoapps/contentstore/features/common.py @@ -14,10 +14,6 @@ logger = getLogger(__name__) from terrain.browser import reset_data -_COURSE_NAME = 'Robot Super Course' -_COURSE_NUM = '999' -_COURSE_ORG = 'MITx' - ########### STEP HELPERS ############## @@ -124,9 +120,9 @@ def create_studio_user( def fill_in_course_info( - name=_COURSE_NAME, - org=_COURSE_ORG, - num=_COURSE_NUM): + name='Robot Super Course', + org='MITx', + num='999'): world.css_fill('.new-course-name', name) world.css_fill('.new-course-org', org) world.css_fill('.new-course-number', num) @@ -151,15 +147,21 @@ def log_into_studio( login_form.find_by_name('submit').click() world.retry_on_exception(fill_login_form) assert_true(world.is_css_present('.new-course-button')) + world.scenario_dict['USER'] = get_user_by_email(email) def create_a_course(): - world.CourseFactory.create(org=_COURSE_ORG, course=_COURSE_NUM, display_name=_COURSE_NAME) + world.scenario_dict['COURSE'] = world.CourseFactory.create(org='MITx', course='999', display_name='Robot Super Course') # Add the user to the instructor group of the course # so they will have the permissions to see it in studio - course = world.GroupFactory.create(name='instructor_MITx/{course_num}/{course_name}'.format(course_num=_COURSE_NUM, course_name=_COURSE_NAME.replace(" ", "_"))) - user = get_user_by_email('robot+studio@edx.org') + + course = world.GroupFactory.create(name='instructor_MITx/{}/{}'.format(world.scenario_dict['COURSE'].number, + world.scenario_dict['COURSE'].display_name.replace(" ", "_"))) + if world.scenario_dict.get('USER') is None: + user = world.scenario_dict['USER'] + else: + user = get_user_by_email('robot+studio@edx.org') user.groups.add(course) user.save() world.browser.reload() diff --git a/cms/djangoapps/contentstore/features/course-team.py b/cms/djangoapps/contentstore/features/course-team.py index 71d9d9fb02..ad5d31977c 100644 --- a/cms/djangoapps/contentstore/features/course-team.py +++ b/cms/djangoapps/contentstore/features/course-team.py @@ -2,7 +2,7 @@ #pylint: disable=W0621 from lettuce import world, step -from common import create_studio_user, log_into_studio, _COURSE_NAME +from common import create_studio_user, log_into_studio PASSWORD = 'test' EMAIL_EXTENSION = '@edx.org' @@ -50,9 +50,9 @@ def see_course(_step, doesnt_see_course, gender): all_courses = world.css_find(class_css, wait_time=1) all_names = [item.html for item in all_courses] if doesnt_see_course: - assert not _COURSE_NAME in all_names + assert not world.scenario_dict['COURSE'].display_name in all_names else: - assert _COURSE_NAME in all_names + assert world.scenario_dict['COURSE'].display_name in all_names @step(u's?he cannot delete users') diff --git a/cms/djangoapps/contentstore/features/courses.py b/cms/djangoapps/contentstore/features/courses.py index 5b279d402f..2feafce361 100644 --- a/cms/djangoapps/contentstore/features/courses.py +++ b/cms/djangoapps/contentstore/features/courses.py @@ -45,7 +45,7 @@ def courseware_page_has_loaded_in_studio(step): @step('I see the course listed in My Courses$') def i_see_the_course_in_my_courses(step): course_css = 'span.class-name' - assert world.css_has_text(course_css, 'Robot Super Course') + assert world.css_has_text(course_css, world.scenario_dict['COURSE'].display_name) @step('I am on the "([^"]*)" tab$') diff --git a/cms/djangoapps/contentstore/features/grading.py b/cms/djangoapps/contentstore/features/grading.py index 090ca79096..0b60510bf5 100644 --- a/cms/djangoapps/contentstore/features/grading.py +++ b/cms/djangoapps/contentstore/features/grading.py @@ -64,7 +64,9 @@ def change_assignment_name(step, old_name, new_name): @step(u'I go back to the main course page') def main_course_page(step): - main_page_link_css = 'a[href="/MITx/999/course/Robot_Super_Course"]' + main_page_link_css = 'a[href="/%s/%s/course/%s"]' % (world.scenario_dict['COURSE'].org, + world.scenario_dict['COURSE'].number, + world.scenario_dict['COURSE'].display_name.replace(' ', '_'),) world.css_click(main_page_link_css) diff --git a/common/djangoapps/terrain/browser.py b/common/djangoapps/terrain/browser.py index 0c1303ed1a..ec361a9aff 100644 --- a/common/djangoapps/terrain/browser.py +++ b/common/djangoapps/terrain/browser.py @@ -89,6 +89,13 @@ def reset_data(scenario): """ LOGGER.debug("Flushing the test database...") call_command('flush', interactive=False) + world.absorb({}, 'scenario_dict') + + +@after.each_scenario +def clear_data(scenario): + world.spew('scenario_dict') + @after.each_scenario diff --git a/common/djangoapps/terrain/course_helpers.py b/common/djangoapps/terrain/course_helpers.py index 7da49e6315..27bf95099d 100644 --- a/common/djangoapps/terrain/course_helpers.py +++ b/common/djangoapps/terrain/course_helpers.py @@ -17,14 +17,14 @@ from urllib import quote_plus @world.absorb -def create_user(uname): +def create_user(uname, password): # If the user already exists, don't try to create it again if len(User.objects.filter(username=uname)) > 0: return portal_user = UserFactory.build(username=uname, email=uname + '@edx.org') - portal_user.set_password('test') + portal_user.set_password(password) portal_user.save() registration = world.RegistrationFactory(user=portal_user) @@ -43,8 +43,8 @@ def log_in(username, password): """ # Authenticate the user - user = authenticate(username=username, password=password) - assert(user is not None and user.is_active) + world.scenario_dict['USER'] = authenticate(username=username, password=password) + assert(world.scenario_dict['USER'] is not None and world.scenario_dict['USER'].is_active) # Send a fake HttpRequest to log the user in # We need to process the request using @@ -53,7 +53,7 @@ def log_in(username, password): request = HttpRequest() SessionMiddleware().process_request(request) AuthenticationMiddleware().process_request(request) - login(request, user) + login(request, world.scenario_dict['USER']) # Save the session request.session.save() diff --git a/common/djangoapps/terrain/steps.py b/common/djangoapps/terrain/steps.py index e69476a5b7..bd0b448e11 100644 --- a/common/djangoapps/terrain/steps.py +++ b/common/djangoapps/terrain/steps.py @@ -93,7 +93,7 @@ def i_log_in(step): @step('I am a logged in user$') def i_am_logged_in_user(step): - world.create_user('robot') + world.create_user('robot', 'test') world.log_in('robot', 'test') @@ -139,7 +139,7 @@ def should_see_in_the_page(step, doesnt_appear, text): @step('I am logged in$') def i_am_logged_in(step): - world.create_user('robot') + world.create_user('robot', 'test') world.log_in('robot', 'test') world.browser.visit(django_url('/')) # You should not see the login link @@ -148,12 +148,12 @@ def i_am_logged_in(step): @step(u'I am an edX user$') def i_am_an_edx_user(step): - world.create_user('robot') + world.create_user('robot', 'test') @step(u'User "([^"]*)" is an edX user$') def registered_edx_user(step, uname): - world.create_user(uname) + world.create_user(uname, 'test') @step(u'All dialogs should be closed$') diff --git a/common/test/data/uploads/test b/common/test/data/uploads/test index f019db7176..0424951e34 100644 --- a/common/test/data/uploads/test +++ b/common/test/data/uploads/test @@ -1 +1 @@ -R2FUIGM88K \ No newline at end of file +This is an arbitrary file for testing uploads diff --git a/lms/djangoapps/courseware/features/common.py b/lms/djangoapps/courseware/features/common.py index 50679fec6f..0aa079ebac 100644 --- a/lms/djangoapps/courseware/features/common.py +++ b/lms/djangoapps/courseware/features/common.py @@ -18,10 +18,6 @@ from xmodule import seq_module, vertical_module from logging import getLogger logger = getLogger(__name__) -TEST_COURSE_ORG = 'edx' -TEST_COURSE_NAME = 'Test Course' -TEST_SECTION_NAME = 'Test Section' - @step(u'The course "([^"]*)" exists$') def create_course(step, course): @@ -34,17 +30,17 @@ def create_course(step, course): # Create the course # We always use the same org and display name, # but vary the course identifier (e.g. 600x or 191x) - course = world.CourseFactory.create(org=TEST_COURSE_ORG, + world.scenario_dict['COURSE'] = world.CourseFactory.create(org='edx', number=course, - display_name=TEST_COURSE_NAME) + display_name='Test Course') # Add a section to the course to contain problems - section = world.ItemFactory.create(parent_location=course.location, - display_name=TEST_SECTION_NAME) + world.scenario_dict['SECTION'] = world.ItemFactory.create(parent_location=world.scenario_dict['COURSE'].location, + display_name='Test Section') - problem_section = world.ItemFactory.create(parent_location=section.location, + problem_section = world.ItemFactory.create(parent_location=world.scenario_dict['SECTION'].location, template='i4x://edx/templates/sequential/Empty', - display_name=TEST_SECTION_NAME) + display_name='Test Section') @step(u'I am registered for the course "([^"]*)"$') @@ -53,7 +49,7 @@ def i_am_registered_for_the_course(step, course): create_course(step, course) # Create the user - world.create_user('robot') + world.create_user('robot', 'test') u = User.objects.get(username='robot') # If the user is not already enrolled, enroll the user. @@ -71,24 +67,24 @@ def add_tab_to_course(step, course, extra_tab_name): def course_id(course_num): - return "%s/%s/%s" % (TEST_COURSE_ORG, course_num, - TEST_COURSE_NAME.replace(" ", "_")) + return "%s/%s/%s" % (world.scenario_dict['COURSE'].org, course_num, + world.scenario_dict['COURSE'].display_name.replace(" ", "_")) def course_location(course_num): return Location(loc_or_tag="i4x", - org=TEST_COURSE_ORG, + org=world.scenario_dict['COURSE'].org, course=course_num, category='course', - name=TEST_COURSE_NAME.replace(" ", "_")) + name=world.scenario_dict['COURSE'].display_name.replace(" ", "_")) def section_location(course_num): return Location(loc_or_tag="i4x", - org=TEST_COURSE_ORG, + org=world.scenario_dict['COURSE'].org, course=course_num, category='sequential', - name=TEST_SECTION_NAME.replace(" ", "_")) + name=world.scenario_dict['SECTION'].display_name.replace(" ", "_")) def get_courses(): diff --git a/lms/djangoapps/courseware/features/navigation.py b/lms/djangoapps/courseware/features/navigation.py index 96d5a3de93..7c2474ae1a 100644 --- a/lms/djangoapps/courseware/features/navigation.py +++ b/lms/djangoapps/courseware/features/navigation.py @@ -8,8 +8,6 @@ from student.models import CourseEnrollment from common import course_id, course_location from problems_setup import PROBLEM_DICT -TEST_COURSE_ORG = 'edx' -TEST_COURSE_NAME = 'Test Course' TEST_SECTION_NAME = 'Test Section' TEST_SUBSECTION_NAME = 'Test Subsection' @@ -18,11 +16,11 @@ TEST_SUBSECTION_NAME = 'Test Subsection' def view_course_multiple_sections(step): create_course() # Add a section to the course to contain problems - section1 = world.ItemFactory.create(parent_location=course_location('model_course'), + section1 = world.ItemFactory.create(parent_location=course_location(world.scenario_dict['COURSE'].number), display_name=section_name(1)) # Add a section to the course to contain problems - section2 = world.ItemFactory.create(parent_location=course_location('model_course'), + section2 = world.ItemFactory.create(parent_location=course_location(world.scenario_dict['COURSE'].number), display_name=section_name(2)) place1 = world.ItemFactory.create(parent_location=section1.location, @@ -44,7 +42,7 @@ def view_course_multiple_subsections(step): create_course() # Add a section to the course to contain problems - section1 = world.ItemFactory.create(parent_location=course_location('model_course'), + section1 = world.ItemFactory.create(parent_location=course_location(world.scenario_dict['COURSE'].number), display_name=section_name(1)) place1 = world.ItemFactory.create(parent_location=section1.location, @@ -64,7 +62,7 @@ def view_course_multiple_subsections(step): def view_course_multiple_sequences(step): create_course() # Add a section to the course to contain problems - section1 = world.ItemFactory.create(parent_location=course_location('model_course'), + section1 = world.ItemFactory.create(parent_location=course_location(world.scenario_dict['COURSE'].number), display_name=section_name(1)) place1 = world.ItemFactory.create(parent_location=section1.location, @@ -144,16 +142,14 @@ def subsection_name(section): def create_course(): world.clear_courses() - world.CourseFactory.create(org=TEST_COURSE_ORG, - number="model_course", - display_name=TEST_COURSE_NAME) + world.scenario_dict['COURSE'] = world.CourseFactory.create(org='edx', number='model_course', display_name='Test Course') def create_user_and_visit_course(): - world.create_user('robot') + world.create_user('robot', 'test') u = User.objects.get(username='robot') - CourseEnrollment.objects.get_or_create(user=u, course_id=course_id("model_course")) + CourseEnrollment.objects.get_or_create(user=u, course_id=course_id(world.scenario_dict['COURSE'].number)) world.log_in('robot', 'test') chapter_name = (TEST_SECTION_NAME + "1").replace(" ", "_") diff --git a/lms/djangoapps/courseware/features/problems.py b/lms/djangoapps/courseware/features/problems.py index e97533f4db..82bb4959a8 100644 --- a/lms/djangoapps/courseware/features/problems.py +++ b/lms/djangoapps/courseware/features/problems.py @@ -7,7 +7,7 @@ Steps for problem.feature lettuce tests from lettuce import world, step from lettuce.django import django_url -from common import i_am_registered_for_the_course, TEST_SECTION_NAME +from common import i_am_registered_for_the_course from problems_setup import PROBLEM_DICT, answer_problem, problem_has_answer, add_problem_to_course from nose.tools import assert_equal @@ -17,15 +17,15 @@ def view_problem_with_attempts(step, problem_type, attempts): i_am_registered_for_the_course(step, 'model_course') # Ensure that the course has this problem type - add_problem_to_course('model_course', problem_type, {'attempts': attempts}) + add_problem_to_course(world.scenario_dict['COURSE'].number, problem_type, {'attempts': attempts}) # Go to the one section in the factory-created course # which should be loaded with the correct problem - chapter_name = TEST_SECTION_NAME.replace(" ", "_") + chapter_name = world.scenario_dict['SECTION'].display_name.replace(" ", "_") section_name = chapter_name - url = django_url('/courses/edx/model_course/Test_Course/courseware/%s/%s' % - (chapter_name, section_name)) - + url = django_url('/courses/%s/%s/%s/courseware/%s/%s' % + (world.scenario_dict['COURSE'].org, world.scenario_dict['COURSE'].number, world.scenario_dict['COURSE'].display_name.replace(' ', '_'), + chapter_name, section_name,)) world.browser.visit(url) @@ -38,11 +38,11 @@ def view_problem_with_show_answer(step, problem_type, answer): # Go to the one section in the factory-created course # which should be loaded with the correct problem - chapter_name = TEST_SECTION_NAME.replace(" ", "_") + chapter_name = world.scenario_dict['SECTION'].display_name.replace(" ", "_") section_name = chapter_name - url = django_url('/courses/edx/model_course/Test_Course/courseware/%s/%s' % - (chapter_name, section_name)) - + url = django_url('/courses/%s/%s/%s/courseware/%s/%s' % + (world.scenario_dict['COURSE'].org, world.scenario_dict['COURSE'].number, world.scenario_dict['COURSE'].display_name.replace(' ', '_'), + chapter_name, section_name,)) world.browser.visit(url) @@ -55,11 +55,11 @@ def view_problem(step, problem_type): # Go to the one section in the factory-created course # which should be loaded with the correct problem - chapter_name = TEST_SECTION_NAME.replace(" ", "_") + chapter_name = world.scenario_dict['SECTION'].display_name.replace(" ", "_") section_name = chapter_name - url = django_url('/courses/edx/model_course/Test_Course/courseware/%s/%s' % - (chapter_name, section_name)) - + url = django_url('/courses/%s/%s/%s/courseware/%s/%s' % + (world.scenario_dict['COURSE'].org, world.scenario_dict['COURSE'].number, world.scenario_dict['COURSE'].display_name.replace(' ', '_'), + chapter_name, section_name,)) world.browser.visit(url) diff --git a/lms/djangoapps/courseware/features/registration.py b/lms/djangoapps/courseware/features/registration.py index e5edb41575..b54416c661 100644 --- a/lms/djangoapps/courseware/features/registration.py +++ b/lms/djangoapps/courseware/features/registration.py @@ -3,13 +3,12 @@ from lettuce import world, step from lettuce.django import django_url -from common import TEST_COURSE_ORG, TEST_COURSE_NAME @step('I register for the course "([^"]*)"$') def i_register_for_the_course(_step, course): - cleaned_name = TEST_COURSE_NAME.replace(' ', '_') - url = django_url('courses/%s/%s/%s/about' % (TEST_COURSE_ORG, course, cleaned_name)) + cleaned_name = world.scenario_dict['COURSE'].display_name.replace(' ', '_') + url = django_url('courses/%s/%s/%s/about' % (world.scenario_dict['COURSE'].org, course, cleaned_name)) world.browser.visit(url) world.css_click('section.intro a.register') diff --git a/lms/djangoapps/courseware/features/video.py b/lms/djangoapps/courseware/features/video.py index cd1bdcf60f..6b05af51b5 100644 --- a/lms/djangoapps/courseware/features/video.py +++ b/lms/djangoapps/courseware/features/video.py @@ -2,7 +2,7 @@ from lettuce import world, step from lettuce.django import django_url -from common import TEST_COURSE_NAME, TEST_SECTION_NAME, i_am_registered_for_the_course, section_location +from common import i_am_registered_for_the_course, section_location ############### ACTIONS #################### @@ -14,31 +14,31 @@ def does_autoplay(_step): @step('the course has a Video component') def view_video(_step): - coursename = TEST_COURSE_NAME.replace(' ', '_') - i_am_registered_for_the_course(step, coursename) + coursenum = 'test_course' + i_am_registered_for_the_course(step, coursenum) # Make sure we have a video - add_video_to_course(coursename) - chapter_name = TEST_SECTION_NAME.replace(" ", "_") + add_video_to_course(coursenum) + chapter_name = world.scenario_dict['SECTION'].display_name.replace(" ", "_") section_name = chapter_name - url = django_url('/courses/edx/Test_Course/Test_Course/courseware/%s/%s' % - (chapter_name, section_name)) - + url = django_url('/courses/%s/%s/%s/courseware/%s/%s' % + (world.scenario_dict['COURSE'].org, world.scenario_dict['COURSE'].number, world.scenario_dict['COURSE'].display_name.replace(' ', '_'), + chapter_name, section_name,)) world.browser.visit(url) @step('the course has a VideoAlpha component') def view_videoalpha(step): - coursename = TEST_COURSE_NAME.replace(' ', '_') - i_am_registered_for_the_course(step, coursename) + coursenum = 'test_course' + i_am_registered_for_the_course(step, coursenum) # Make sure we have a videoalpha - add_videoalpha_to_course(coursename) - chapter_name = TEST_SECTION_NAME.replace(" ", "_") + add_videoalpha_to_course(coursenum) + chapter_name = world.scenario_dict['SECTION'].display_name.replace(" ", "_") section_name = chapter_name - url = django_url('/courses/edx/Test_Course/Test_Course/courseware/%s/%s' % - (chapter_name, section_name)) - + url = django_url('/courses/%s/%s/%s/courseware/%s/%s' % + (world.scenario_dict['COURSE'].org, world.scenario_dict['COURSE'].number, world.scenario_dict['COURSE'].display_name.replace(' ', '_'), + chapter_name, section_name,)) world.browser.visit(url)