Files
edx-platform/xmodule/capa/tests/test_correctmap.py
Soban Javed 9eba9f983a refactor!: move common/lib/capa/capa to xmodule/capa
As part of dissolving our sub-projects in edx-platform, we are moving this package under the xmodule directory.
We have fixed all the occurences of import of this package and also fixed all documents related references.
This might break your platform if you have any reference of `import capa` or `from capa import` in your codebase or in any Xblock.

Ref: https://openedx.atlassian.net/browse/BOM-2582
2022-07-19 12:20:04 +05:00

224 lines
6.9 KiB
Python

"""
Tests to verify that CorrectMap behaves correctly
"""
import datetime
import unittest
import pytest
from xmodule.capa.correctmap import CorrectMap
class CorrectMapTest(unittest.TestCase):
"""
Tests to verify that CorrectMap behaves correctly
"""
def setUp(self):
super(CorrectMapTest, self).setUp() # lint-amnesty, pylint: disable=super-with-arguments
self.cmap = CorrectMap()
def test_set_input_properties(self):
# Set the correctmap properties for three inputs
self.cmap.set(
answer_id='1_2_1',
correctness='correct',
npoints=5,
msg='Test message',
hint='Test hint',
hintmode='always',
queuestate={
'key': 'secretstring',
'time': '20130228100026'
}
)
self.cmap.set(
answer_id='2_2_1',
correctness='incorrect',
npoints=None,
msg=None,
hint=None,
hintmode=None,
queuestate=None
)
self.cmap.set(
answer_id='3_2_1',
correctness='partially-correct',
npoints=3,
msg=None,
hint=None,
hintmode=None,
queuestate=None
)
# Assert that each input has the expected properties
assert self.cmap.is_correct('1_2_1')
assert not self.cmap.is_correct('2_2_1')
assert self.cmap.is_correct('3_2_1')
assert self.cmap.is_partially_correct('3_2_1')
assert not self.cmap.is_partially_correct('2_2_1')
# Intentionally testing an item that's not in cmap.
assert not self.cmap.is_partially_correct('9_2_1')
assert self.cmap.get_correctness('1_2_1') == 'correct'
assert self.cmap.get_correctness('2_2_1') == 'incorrect'
assert self.cmap.get_correctness('3_2_1') == 'partially-correct'
assert self.cmap.get_npoints('1_2_1') == 5
assert self.cmap.get_npoints('2_2_1') == 0
assert self.cmap.get_npoints('3_2_1') == 3
assert self.cmap.get_msg('1_2_1') == 'Test message'
assert self.cmap.get_msg('2_2_1') is None
assert self.cmap.get_hint('1_2_1') == 'Test hint'
assert self.cmap.get_hint('2_2_1') is None
assert self.cmap.get_hintmode('1_2_1') == 'always'
assert self.cmap.get_hintmode('2_2_1') is None
assert self.cmap.is_queued('1_2_1')
assert not self.cmap.is_queued('2_2_1')
assert self.cmap.get_queuetime_str('1_2_1') == '20130228100026'
assert self.cmap.get_queuetime_str('2_2_1') is None
assert self.cmap.is_right_queuekey('1_2_1', 'secretstring')
assert not self.cmap.is_right_queuekey('1_2_1', 'invalidstr')
assert not self.cmap.is_right_queuekey('1_2_1', '')
assert not self.cmap.is_right_queuekey('1_2_1', None)
assert not self.cmap.is_right_queuekey('2_2_1', 'secretstring')
assert not self.cmap.is_right_queuekey('2_2_1', 'invalidstr')
assert not self.cmap.is_right_queuekey('2_2_1', '')
assert not self.cmap.is_right_queuekey('2_2_1', None)
def test_get_npoints(self):
# Set the correctmap properties for 4 inputs
# 1) correct, 5 points
# 2) correct, None points
# 3) incorrect, 5 points
# 4) incorrect, None points
# 5) correct, 0 points
# 4) partially correct, 2.5 points
# 5) partially correct, None points
self.cmap.set(
answer_id='1_2_1',
correctness='correct',
npoints=5.3
)
self.cmap.set(
answer_id='2_2_1',
correctness='correct',
npoints=None
)
self.cmap.set(
answer_id='3_2_1',
correctness='incorrect',
npoints=5
)
self.cmap.set(
answer_id='4_2_1',
correctness='incorrect',
npoints=None
)
self.cmap.set(
answer_id='5_2_1',
correctness='correct',
npoints=0
)
self.cmap.set(
answer_id='6_2_1',
correctness='partially-correct',
npoints=2.5
)
self.cmap.set(
answer_id='7_2_1',
correctness='partially-correct',
npoints=None
)
# Assert that we get the expected points
# If points assigned --> npoints
# If no points assigned and correct --> 1 point
# If no points assigned and partially correct --> 1 point
# If no points assigned and incorrect --> 0 points
assert self.cmap.get_npoints('1_2_1') == 5.3
assert self.cmap.get_npoints('2_2_1') == 1
assert self.cmap.get_npoints('3_2_1') == 5
assert self.cmap.get_npoints('4_2_1') == 0
assert self.cmap.get_npoints('5_2_1') == 0
assert self.cmap.get_npoints('6_2_1') == 2.5
assert self.cmap.get_npoints('7_2_1') == 1
def test_set_overall_message(self):
# Default is an empty string string
assert self.cmap.get_overall_message() == ''
# Set a message that applies to the whole question
self.cmap.set_overall_message("Test message")
# Retrieve the message
assert self.cmap.get_overall_message() == 'Test message'
# Setting the message to None --> empty string
self.cmap.set_overall_message(None)
assert self.cmap.get_overall_message() == ''
def test_update_from_correctmap(self):
# Initialize a CorrectMap with some properties
self.cmap.set(
answer_id='1_2_1',
correctness='correct',
npoints=5,
msg='Test message',
hint='Test hint',
hintmode='always',
queuestate={
'key': 'secretstring',
'time': '20130228100026'
}
)
self.cmap.set_overall_message("Test message")
# Create a second cmap, then update it to have the same properties
# as the first cmap
other_cmap = CorrectMap()
other_cmap.update(self.cmap)
# Assert that it has all the same properties
assert other_cmap.get_overall_message() == self.cmap.get_overall_message()
assert other_cmap.get_dict() == self.cmap.get_dict()
def test_update_from_invalid(self):
# Should get an exception if we try to update() a CorrectMap
# with a non-CorrectMap value
invalid_list = [None, "string", 5, datetime.datetime.today()]
for invalid in invalid_list:
with pytest.raises(Exception):
self.cmap.update(invalid)
def test_set_none_state(self):
"""
Test that if an invalid state is set to correct map, the state does not
update at all.
"""
invalid_list = [None, "", False, 0]
for invalid in invalid_list:
self.cmap.set_dict(invalid)
assert not self.cmap.get_dict()