Add ability to display LTI module in a new window. Iframe will be still supported. Fix python test Update acceptance tests Fix in acceptance tests, they are stable now Fix Acceptance tests. Adding Jasmine tests for LTI. Fixing Jasmine tests. Adding the rest of Jasmine tests.
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 parametetr
|
|
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
|
|
|
|
|