Commit 32ab5550 by Ned Batchelder

Merge pull request #9095 from solashirai/sola/feature_csh

(WIP) Crowdsource Hinter Prototype
parents 161b8f94 82936a0f
...@@ -232,6 +232,7 @@ Daniel Naranjo <daniel.naranjo@edunext.co> ...@@ -232,6 +232,7 @@ Daniel Naranjo <daniel.naranjo@edunext.co>
Vedran Karačić <vedran@edx.org> Vedran Karačić <vedran@edx.org>
William Ono <william.ono@ubc.ca> William Ono <william.ono@ubc.ca>
Dongwook Yoon <dy252@cornell.edu> Dongwook Yoon <dy252@cornell.edu>
Sola Shirai <sola@edx.org>
Awais Qureshi <awais.qureshi@arbisoft.com> Awais Qureshi <awais.qureshi@arbisoft.com>
Eric Fischer <efischer@edx.org> Eric Fischer <efischer@edx.org>
Brian Beggs <macdiesel@gmail.com> Brian Beggs <macdiesel@gmail.com>
......
"""
PageObject for Crowdsourcehinter
"""
from bok_choy.page_object import PageObject
class CrowdsourcehinterProblemPage(PageObject):
"""
A PageObject representing the Crowdsourcehinter xblock.
"""
url = None
def __init__(self, browser):
"""
Args:
browser (selenium.webdriver): The Selenium-controlled browser that this page is loaded in.
"""
super(CrowdsourcehinterProblemPage, self).__init__(browser)
def is_browser_on_page(self):
return len(self.browser.find_elements_by_class_name('crowdsourcehinter_block')) > 0
def submit_text_answer(self, text):
"""
Submit an answer to the problem block
"""
self.q(css='input[type="text"]').fill(text)
self.q(css='.action [data-value="Check"]').click()
self.wait_for_ajax()
def get_hint_text(self):
"""
Return the hint shown to the student
"""
return self.q(css='div.csh_hint_text').text
def get_student_answer_text(self):
"""
Check the student answer is set correctly
"""
return self.q(css='div.csh_hint_text').attrs('student_answer')
def rate_hint(self):
"""
Click the rate_hint button
"""
self.q(css='div.csh_rate_hint').click()
self.wait_for_ajax()
def submit_new_hint(self, text):
"""
Fill in the textbox and submit a new hint
"""
self.q(css='.csh_student_hint_creation input[type="button"]').click()
self.wait_for_ajax()
self.q(css='.csh_student_text_input input[type="text"]').fill(text)
self.q(css='.csh_submit_new input[type="button"]').click()
self.wait_for_ajax()
"""
Javascript tests for the crowdsourcehinter xblock
"""
from textwrap import dedent
from common.test.acceptance.fixtures.course import CourseFixture, XBlockFixtureDesc
from common.test.acceptance.pages.lms.courseware import CoursewarePage
from common.test.acceptance.pages.xblock.crowdsourcehinter_problem import CrowdsourcehinterProblemPage
from common.test.acceptance.pages.studio.auto_auth import AutoAuthPage
from common.test.acceptance.tests.helpers import UniqueCourseTest
class CrowdsourcehinterProblemTest(UniqueCourseTest):
"""
Test scenario for the hinter.
"""
USERNAME = "STAFF_TESTER"
EMAIL = "johndoe@example.com"
def setUp(self):
super(CrowdsourcehinterProblemTest, self).setUp()
self.courseware_page = CoursewarePage(self.browser, self.course_id)
# Install a course with sections/problems, tabs, updates, and handouts
course_fix = CourseFixture(
self.course_info['org'], self.course_info['number'],
self.course_info['run'], self.course_info['display_name']
)
problem_data = dedent('''
<problem>
<p>A text input problem accepts a line of text from the student, and evaluates the input for correctness based on an expected answer.</p>
<p>The answer is correct if it matches every character of the expected answer. This can be a problem with international spelling, dates, or anything where the format of the answer is not clear.</p>
<p>Which US state has Lansing as its capital?</p>
<stringresponse answer="Michigan" type="ci" >
<textline label="Which US state has Lansing as its capital?" size="20"/>
</stringresponse>
<solution>
<div class="detailed-solution">
<p>Explanation</p>
<p>Lansing is the capital of Michigan, although it is not Michigan's largest city, or even the seat of the county in which it resides.</p>
</div>
</solution>
</problem>
''')
children = XBlockFixtureDesc('chapter', 'Test Section').add_children(
XBlockFixtureDesc('sequential', 'Test Subsection').add_children(
XBlockFixtureDesc('vertical', 'Test Unit').add_children(
XBlockFixtureDesc('problem', 'text input problem', data=problem_data),
XBlockFixtureDesc('crowdsourcehinter', 'test crowdsourcehinter')
)
)
)
course_fix.add_children(children).install()
# Auto-auth register for the course.
AutoAuthPage(self.browser, username=self.USERNAME, email=self.EMAIL,
course_id=self.course_id, staff=False).visit()
def _goto_csh_problem_page(self):
"""
Visit the page courseware page containing the hinter
"""
self.courseware_page.visit()
csh_problem_page = CrowdsourcehinterProblemPage(self.browser)
self.assertGreater(len(self.browser.find_elements_by_class_name('crowdsourcehinter_block')), 0)
return csh_problem_page
def test_student_hint_workflow(self):
"""
Test the basic workflow of a student recieving hints. The student should submit an incorrect answer and
receive a hint (in this case no hint since none are set), be able to rate that hint, see a different UX
after submitting a correct answer, and be capable of contributing a new hint to the system.
"""
csh_problem_page = self._goto_csh_problem_page()
csh_problem_page.submit_text_answer("michigann")
csh_problem_page.wait_for_ajax()
self.assertEqual(csh_problem_page.get_hint_text()[0], u"Hint: Sorry, there are no hints for this answer.")
self.assertGreater(len(self.browser.find_elements_by_class_name('csh_rate_hint')), 0)
csh_problem_page.rate_hint()
csh_problem_page.wait_for_ajax()
csh_problem_page.submit_text_answer("michigan")
csh_problem_page.wait_for_ajax()
self.assertGreater(len(self.browser.find_elements_by_id('show_hint_rating_ux')), 0)
csh_problem_page.submit_new_hint("new hint text")
...@@ -84,6 +84,7 @@ git+https://github.com/edx/ease.git@release-2015-07-14#egg=ease==0.1.3 ...@@ -84,6 +84,7 @@ git+https://github.com/edx/ease.git@release-2015-07-14#egg=ease==0.1.3
git+https://github.com/edx/i18n-tools.git@v0.2#egg=i18n-tools==v0.2 git+https://github.com/edx/i18n-tools.git@v0.2#egg=i18n-tools==v0.2
git+https://github.com/edx/edx-val.git@0.0.9#egg=edxval==0.0.9 git+https://github.com/edx/edx-val.git@0.0.9#egg=edxval==0.0.9
-e git+https://github.com/pmitros/RecommenderXBlock.git@518234bc354edbfc2651b9e534ddb54f96080779#egg=recommender-xblock -e git+https://github.com/pmitros/RecommenderXBlock.git@518234bc354edbfc2651b9e534ddb54f96080779#egg=recommender-xblock
git+https://github.com/solashirai/crowdsourcehinter.git@518605f0a95190949fe77bd39158450639e2e1dc#egg=crowdsourcehinter-xblock==0.1
-e git+https://github.com/pmitros/RateXBlock.git@367e19c0f6eac8a5f002fd0f1559555f8e74bfff#egg=rate-xblock -e git+https://github.com/pmitros/RateXBlock.git@367e19c0f6eac8a5f002fd0f1559555f8e74bfff#egg=rate-xblock
-e git+https://github.com/pmitros/DoneXBlock.git@857bf365f19c904d7e48364428f6b93ff153fabd#egg=done-xblock -e git+https://github.com/pmitros/DoneXBlock.git@857bf365f19c904d7e48364428f6b93ff153fabd#egg=done-xblock
git+https://github.com/edx/edx-milestones.git@v0.1.8#egg=edx-milestones==0.1.8 git+https://github.com/edx/edx-milestones.git@v0.1.8#egg=edx-milestones==0.1.8
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment