108 lines
3.7 KiB
Python
108 lines
3.7 KiB
Python
'''
|
|
Tests for the DoneXBlock.
|
|
|
|
This is nice as a simple example of the edX XBlock test framework.
|
|
'''
|
|
|
|
from __future__ import absolute_import
|
|
|
|
from openedx.tests.xblock_integration.xblock_testcase import XBlockTestCase
|
|
|
|
|
|
# pylint: disable=abstract-method
|
|
class TestDone(XBlockTestCase):
|
|
"""
|
|
Simple tests for the completion XBlock. We set up a page with two
|
|
of the block, make sure the page renders, toggle them a few times,
|
|
make sure they've toggled, and reconfirm the page renders.
|
|
"""
|
|
|
|
olx_scenarios = { # Currently not used
|
|
"two_done_block_test_case": """<vertical>
|
|
<done urlname="done0"/>
|
|
<done urlname="done1"/>
|
|
</vertical>"""
|
|
}
|
|
|
|
# This is a stop-gap until we can load OLX and/or OLX from
|
|
# normal workbench scenarios
|
|
test_configuration = [
|
|
{
|
|
"urlname": "two_done_block_test_case_0",
|
|
#"olx": self.olx_scenarios[0],
|
|
"xblocks": [ # Stopgap until we handle OLX
|
|
{
|
|
'blocktype': 'done',
|
|
'urlname': 'done_0'
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"urlname": "two_done_block_test_case_1",
|
|
#"olx": self.olx_scenarios[0],
|
|
"xblocks": [ # Stopgap until we handle OLX
|
|
{
|
|
'blocktype': 'done',
|
|
'urlname': 'done_1'
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
def toggle_button(self, block, data, desired_state):
|
|
"""
|
|
Make an AJAX call to the XBlock, and assert the state is as
|
|
desired.
|
|
"""
|
|
resp = self.ajax('toggle_button', block, data)
|
|
self.assertEqual(resp.status_code, 200)
|
|
self.assertEqual(resp.data, {"state": desired_state})
|
|
|
|
# pylint: disable=unused-argument
|
|
def check_response(self, block_urlname, rendering):
|
|
"""
|
|
Confirm that we have a 200 response code (no server error)
|
|
|
|
In the future, visual diff test the response.
|
|
"""
|
|
response = self.render_block(block_urlname)
|
|
self.assertEqual(response.status_code, 200)
|
|
# To do: Below method needs to be implemented
|
|
#self.assertXBlockScreenshot(block_urlname, rendering)
|
|
|
|
def test_done(self):
|
|
"""
|
|
Walk through a few toggles. Make sure the blocks don't mix up
|
|
state between them, initial state is correct, and final state
|
|
is correct.
|
|
"""
|
|
# We confirm we don't have errors rendering the student view
|
|
self.check_response('done_0', 'done-unmarked')
|
|
self.check_response('done_1', 'done-unmarked')
|
|
|
|
# We confirm the block is initially false
|
|
self.toggle_button('done_0', {}, False)
|
|
self.reset_published_events()
|
|
self.toggle_button('done_1', {}, False)
|
|
self.assert_no_events_published("edx.done.toggled")
|
|
|
|
# We confirm we can toggle state both ways
|
|
self.reset_published_events()
|
|
self.toggle_button('done_0', {'done': True}, True)
|
|
self.assert_event_published('edx.done.toggled', event_fields={"done": True})
|
|
self.reset_published_events()
|
|
self.toggle_button('done_1', {'done': False}, False)
|
|
self.assert_event_published('edx.done.toggled', event_fields={"done": False})
|
|
self.toggle_button('done_0', {'done': False}, False)
|
|
self.assert_grade(0)
|
|
self.toggle_button('done_1', {'done': True}, True)
|
|
self.assert_grade(1)
|
|
|
|
# We confirm state sticks around
|
|
self.toggle_button('done_0', {}, False)
|
|
self.toggle_button('done_1', {}, True)
|
|
|
|
# And confirm we render correctly
|
|
self.check_response('done_0', 'done-unmarked')
|
|
self.check_response('done_1', 'done-marked')
|