199 lines
6.5 KiB
Python
199 lines
6.5 KiB
Python
#pylint: disable=C0111
|
|
|
|
import os
|
|
from django.contrib.auth.models import User
|
|
from lettuce import world, step
|
|
from lettuce.django import django_url
|
|
from common import course_id
|
|
|
|
from student.models import CourseEnrollment
|
|
|
|
|
|
@step('I view the LTI and error is shown$')
|
|
def lti_is_not_rendered(_step):
|
|
# error is shown
|
|
assert world.is_css_present('.error_message')
|
|
|
|
# iframe is not presented
|
|
assert not world.is_css_present('iframe')
|
|
|
|
# link is not presented
|
|
assert not world.is_css_present('.link_lti_new_window')
|
|
|
|
|
|
def check_lti_iframe_content(text):
|
|
#inside iframe test content is presented
|
|
location = world.scenario_dict['LTI'].location.html_id()
|
|
iframe_name = 'ltiLaunchFrame-' + location
|
|
with world.browser.get_iframe(iframe_name) as iframe:
|
|
# iframe does not contain functions from terrain/ui_helpers.py
|
|
assert iframe.is_element_present_by_css('.result', wait_time=5)
|
|
assert (text == world.retry_on_exception(
|
|
lambda: iframe.find_by_css('.result')[0].text,
|
|
max_attempts=5
|
|
))
|
|
|
|
|
|
@step('I view the LTI and it is rendered in (.*)$')
|
|
def lti_is_rendered(_step, rendered_in):
|
|
if rendered_in.strip() == 'iframe':
|
|
assert world.is_css_present('iframe')
|
|
assert not world.is_css_present('.link_lti_new_window')
|
|
assert not world.is_css_present('.error_message')
|
|
|
|
# iframe is visible
|
|
assert world.css_visible('iframe')
|
|
check_lti_iframe_content("This is LTI tool. Success.")
|
|
|
|
elif rendered_in.strip() == 'new page':
|
|
assert not world.is_css_present('iframe')
|
|
assert world.is_css_present('.link_lti_new_window')
|
|
assert not world.is_css_present('.error_message')
|
|
check_lti_popup()
|
|
else: # incorrent rendered_in parameter
|
|
assert False
|
|
|
|
|
|
@step('I view the LTI but incorrect_signature warning is rendered$')
|
|
def incorrect_lti_is_rendered(_step):
|
|
assert world.is_css_present('iframe')
|
|
assert not world.is_css_present('.link_lti_new_window')
|
|
assert not world.is_css_present('.error_message')
|
|
#inside iframe test content is presented
|
|
check_lti_iframe_content("Wrong LTI signature")
|
|
|
|
|
|
@step('the course has correct LTI credentials$')
|
|
def set_correct_lti_passport(_step):
|
|
coursenum = 'test_course'
|
|
metadata = {
|
|
'lti_passports': ["correct_lti_id:{}:{}".format(
|
|
world.lti_server.oauth_settings['client_key'],
|
|
world.lti_server.oauth_settings['client_secret']
|
|
)]
|
|
}
|
|
i_am_registered_for_the_course(coursenum, metadata)
|
|
|
|
|
|
@step('the course has incorrect LTI credentials$')
|
|
def set_incorrect_lti_passport(_step):
|
|
coursenum = 'test_course'
|
|
metadata = {
|
|
'lti_passports': ["test_lti_id:{}:{}".format(
|
|
world.lti_server.oauth_settings['client_key'],
|
|
"incorrect_lti_secret_key"
|
|
)]
|
|
}
|
|
i_am_registered_for_the_course(coursenum, metadata)
|
|
|
|
|
|
@step('the course has an LTI component with (.*) fields, new_page is(.*)$')
|
|
def add_correct_lti_to_course(_step, fields, new_page):
|
|
category = 'lti'
|
|
lti_id = 'correct_lti_id'
|
|
launch_url = world.lti_server.oauth_settings['lti_base'] + world.lti_server.oauth_settings['lti_endpoint']
|
|
if fields.strip() == 'incorrect_lti_id': # incorrect fields
|
|
lti_id = 'incorrect_lti_id'
|
|
elif fields.strip() == 'correct': # correct fields
|
|
pass
|
|
elif fields.strip() == 'no_launch_url':
|
|
launch_url = u''
|
|
else: # incorrect parameter
|
|
assert False
|
|
|
|
if new_page.strip().lower() == 'false':
|
|
new_page = False
|
|
else: # default is True
|
|
new_page = True
|
|
|
|
world.scenario_dict['LTI'] = world.ItemFactory.create(
|
|
parent_location=world.scenario_dict['SEQUENTIAL'].location,
|
|
category=category,
|
|
display_name='LTI',
|
|
metadata={
|
|
'lti_id': lti_id,
|
|
'launch_url': launch_url,
|
|
'open_in_a_new_page': new_page
|
|
}
|
|
)
|
|
course = world.scenario_dict["COURSE"]
|
|
chapter_name = world.scenario_dict['SECTION'].display_name.replace(
|
|
" ", "_")
|
|
section_name = chapter_name
|
|
path = "/courses/{org}/{num}/{name}/courseware/{chapter}/{section}".format(
|
|
org=course.org,
|
|
num=course.number,
|
|
name=course.display_name.replace(' ', '_'),
|
|
chapter=chapter_name,
|
|
section=section_name)
|
|
url = django_url(path)
|
|
|
|
world.browser.visit(url)
|
|
|
|
|
|
def create_course(course, metadata):
|
|
|
|
# First clear the modulestore so we don't try to recreate
|
|
# the same course twice
|
|
# This also ensures that the necessary templates are loaded
|
|
world.clear_courses()
|
|
|
|
# Create the course
|
|
# We always use the same org and display name,
|
|
# but vary the course identifier (e.g. 600x or 191x)
|
|
world.scenario_dict['COURSE'] = world.CourseFactory.create(
|
|
org='edx',
|
|
number=course,
|
|
display_name='Test Course',
|
|
metadata=metadata
|
|
)
|
|
|
|
# Add a section to the course to contain problems
|
|
world.scenario_dict['SECTION'] = world.ItemFactory.create(
|
|
parent_location=world.scenario_dict['COURSE'].location,
|
|
display_name='Test Section'
|
|
)
|
|
world.scenario_dict['SEQUENTIAL'] = world.ItemFactory.create(
|
|
parent_location=world.scenario_dict['SECTION'].location,
|
|
category='sequential',
|
|
display_name='Test Section')
|
|
|
|
|
|
def i_am_registered_for_the_course(course, metadata):
|
|
# Create the course
|
|
create_course(course, metadata)
|
|
|
|
# Create the user
|
|
world.create_user('robot', 'test')
|
|
usr = User.objects.get(username='robot')
|
|
|
|
# If the user is not already enrolled, enroll the user.
|
|
CourseEnrollment.enroll(usr, course_id(course))
|
|
|
|
world.log_in(username='robot', password='test')
|
|
|
|
|
|
def check_lti_popup():
|
|
parent_window = world.browser.current_window # Save the parent window
|
|
world.css_find('.link_lti_new_window').first.click()
|
|
|
|
assert len(world.browser.windows) != 1
|
|
|
|
for window in world.browser.windows:
|
|
world.browser.switch_to_window(window) # Switch to a different window (the pop-up)
|
|
# Check if this is the one we want by comparing the url
|
|
url = world.browser.url
|
|
basename = os.path.basename(url)
|
|
pathname = os.path.splitext(basename)[0]
|
|
|
|
if pathname == u'correct_lti_endpoint':
|
|
break
|
|
|
|
result = world.css_find('.result').first.text
|
|
assert result == u'This is LTI tool. Success.'
|
|
|
|
world.browser.driver.close() # Close the pop-up window
|
|
world.browser.switch_to_window(parent_window) # Switch to the main window again
|
|
|
|
|