Fixed tests for removing hash access to hints. Fixed instructor view for same.
This commit is contained in:
@@ -188,6 +188,7 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule):
|
||||
if not self.validate_answer(answer):
|
||||
# Answer is not in the right form.
|
||||
log.exception('Answer not valid: ' + str(answer))
|
||||
return
|
||||
if answer not in self.user_submissions:
|
||||
self.user_submissions += [answer]
|
||||
# Look for a hint to give.
|
||||
@@ -219,12 +220,12 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule):
|
||||
self.previous_answers += [[best_hint_answer, [best_hint_index]]]
|
||||
for i in xrange(min(2, n_hints-1)):
|
||||
# Keep making random hints until we hit a target, or run out.
|
||||
(hint_index, (rand_hint, votes, hint_answer)) =\
|
||||
random.choice(matching_hints.items())
|
||||
if rand_hint in hints:
|
||||
# Don't show the same hint twice. Try again.
|
||||
i -= 1
|
||||
continue
|
||||
go_on = False
|
||||
while not go_on:
|
||||
(hint_index, (rand_hint, votes, hint_answer)) =\
|
||||
random.choice(matching_hints.items())
|
||||
if not rand_hint in hints:
|
||||
go_on = True
|
||||
hints.append(rand_hint)
|
||||
self.previous_answers += [[hint_index, [hint_answer]]]
|
||||
return {'hints': hints,
|
||||
|
||||
@@ -55,6 +55,7 @@ class CHModuleFactory(object):
|
||||
@staticmethod
|
||||
def create(hints=None,
|
||||
previous_answers=None,
|
||||
user_submissions=None,
|
||||
user_voted=None,
|
||||
moderate=None,
|
||||
mod_queue=None):
|
||||
@@ -87,9 +88,14 @@ class CHModuleFactory(object):
|
||||
else:
|
||||
model_data['previous_answers'] = [
|
||||
['24.0', [0, 3, 4]],
|
||||
['29.0', [None, None, None]]
|
||||
['29.0', []]
|
||||
]
|
||||
|
||||
if user_submissions is not None:
|
||||
model_data['user_submissions'] = user_submissions
|
||||
else:
|
||||
model_data['user_submissions'] = ['24.0', '29.0']
|
||||
|
||||
if user_voted is not None:
|
||||
model_data['user_voted'] = user_voted
|
||||
|
||||
@@ -104,7 +110,24 @@ class CHModuleFactory(object):
|
||||
|
||||
# Make a fake capa module.
|
||||
capa_module = MagicMock()
|
||||
capa_module.responders = {'responder0': MagicMock()}
|
||||
capa_module.lcp = MagicMock()
|
||||
responder = MagicMock()
|
||||
|
||||
def validate_answer(answer):
|
||||
""" A mock answer validator - simulates a numerical response"""
|
||||
try:
|
||||
float(answer)
|
||||
return True
|
||||
except ValueError:
|
||||
return False
|
||||
responder.validate_answer = validate_answer
|
||||
|
||||
def answer_compare(a, b):
|
||||
""" A fake answer comparer """
|
||||
return a == b
|
||||
responder.answer_compare = answer_compare
|
||||
|
||||
capa_module.lcp.responders = {'responder0': responder}
|
||||
capa_module.displayable_items = lambda: [capa_module]
|
||||
|
||||
system = get_test_system()
|
||||
@@ -122,28 +145,6 @@ class CHModuleFactory(object):
|
||||
|
||||
return module
|
||||
|
||||
@staticmethod
|
||||
def setup_formula_response(module):
|
||||
"""
|
||||
Adds additional mock methods to the module, so that we can test
|
||||
formula responses.
|
||||
"""
|
||||
# Do a bunch of monkey patching, to mock the lon-capa problem.
|
||||
responder = MagicMock()
|
||||
responder.randomize_variables = MagicMock(return_value=4)
|
||||
|
||||
def fake_hash_answers(answer, test_values):
|
||||
""" A fake answer hasher """
|
||||
if test_values == 4 and answer == 'x*y^2':
|
||||
return 'good'
|
||||
raise StudentInputError
|
||||
|
||||
responder.hash_answers = fake_hash_answers
|
||||
lcp = MagicMock()
|
||||
lcp.responders = {'responder0': responder}
|
||||
module.get_display_items()[0].lcp = lcp
|
||||
return module
|
||||
|
||||
|
||||
class VerticalWithModulesFactory(object):
|
||||
"""
|
||||
@@ -288,46 +289,6 @@ class CrowdsourceHinterTest(unittest.TestCase):
|
||||
parsed = mock_module.formula_answer_to_str(get)
|
||||
self.assertTrue(parsed == 'x*y^2')
|
||||
|
||||
def test_numerical_answer_signature(self):
|
||||
"""
|
||||
Tests answer signature generator for numerical responses.
|
||||
"""
|
||||
mock_module = CHModuleFactory.create()
|
||||
answer = '4*5+3'
|
||||
signature = mock_module.numerical_answer_signature(answer)
|
||||
print signature
|
||||
self.assertTrue(signature == '23.0')
|
||||
|
||||
def test_numerical_answer_signature_failure(self):
|
||||
"""
|
||||
Makes sure that unparsable numerical answers return None.
|
||||
"""
|
||||
mock_module = CHModuleFactory.create()
|
||||
answer = 'fish'
|
||||
signature = mock_module.numerical_answer_signature(answer)
|
||||
print signature
|
||||
self.assertTrue(signature is None)
|
||||
|
||||
def test_formula_answer_signature(self):
|
||||
"""
|
||||
Tests the answer signature generator for formula responses.
|
||||
"""
|
||||
mock_module = CHModuleFactory.create()
|
||||
mock_module = CHModuleFactory.setup_formula_response(mock_module)
|
||||
answer = 'x*y^2'
|
||||
out = mock_module.formula_answer_signature(answer)
|
||||
self.assertTrue(out == 'good')
|
||||
|
||||
def test_formula_answer_signature_failure(self):
|
||||
"""
|
||||
Makes sure that bad answer strings return None as a signature.
|
||||
"""
|
||||
mock_module = CHModuleFactory.create()
|
||||
mock_module = CHModuleFactory.setup_formula_response(mock_module)
|
||||
answer = 'fish'
|
||||
out = mock_module.formula_answer_signature(answer)
|
||||
self.assertTrue(out is None)
|
||||
|
||||
def test_gethint_0hint(self):
|
||||
"""
|
||||
Someone asks for a hint, when there's no hint to give.
|
||||
@@ -337,8 +298,9 @@ class CrowdsourceHinterTest(unittest.TestCase):
|
||||
mock_module = CHModuleFactory.create()
|
||||
json_in = {'problem_name': '26.0'}
|
||||
out = mock_module.get_hint(json_in)
|
||||
print mock_module.previous_answers
|
||||
self.assertTrue(out is None)
|
||||
self.assertTrue(['26.0', [None, None, None]] in mock_module.previous_answers)
|
||||
self.assertTrue('26.0' in mock_module.user_submissions)
|
||||
|
||||
def test_gethint_unparsable(self):
|
||||
"""
|
||||
@@ -359,10 +321,13 @@ class CrowdsourceHinterTest(unittest.TestCase):
|
||||
"""
|
||||
mock_module = CHModuleFactory.create()
|
||||
old_answers = copy.deepcopy(mock_module.previous_answers)
|
||||
old_user_submissions = copy.deepcopy(mock_module.user_submissions)
|
||||
json_in = {'problem1': 'fish'}
|
||||
out = mock_module.get_hint(json_in)
|
||||
self.assertTrue(out is None)
|
||||
self.assertTrue(mock_module.previous_answers == old_answers)
|
||||
self.assertTrue(mock_module.user_submissions == old_user_submissions)
|
||||
|
||||
|
||||
def test_gethint_1hint(self):
|
||||
"""
|
||||
@@ -372,7 +337,11 @@ class CrowdsourceHinterTest(unittest.TestCase):
|
||||
mock_module = CHModuleFactory.create()
|
||||
json_in = {'problem_name': '25.0'}
|
||||
out = mock_module.get_hint(json_in)
|
||||
self.assertTrue(out['best_hint'] == 'Really popular hint')
|
||||
self.assertTrue('Really popular hint' in out['hints'])
|
||||
# Also make sure that the input gets added to user_submissions,
|
||||
# and that the hint is logged in previous_answers.
|
||||
self.assertTrue('25.0' in mock_module.user_submissions)
|
||||
self.assertTrue(['25.0', ['1']] in mock_module.previous_answers)
|
||||
|
||||
def test_gethint_manyhints(self):
|
||||
"""
|
||||
@@ -385,9 +354,8 @@ class CrowdsourceHinterTest(unittest.TestCase):
|
||||
mock_module = CHModuleFactory.create()
|
||||
json_in = {'problem_name': '24.0'}
|
||||
out = mock_module.get_hint(json_in)
|
||||
self.assertTrue(out['best_hint'] == 'Best hint')
|
||||
self.assertTrue('rand_hint_1' in out)
|
||||
self.assertTrue('rand_hint_2' in out)
|
||||
self.assertTrue('Best hint' in out['hints'])
|
||||
self.assertTrue(len(out['hints']) == 3)
|
||||
|
||||
def test_getfeedback_0wronganswers(self):
|
||||
"""
|
||||
@@ -527,8 +495,7 @@ class CrowdsourceHinterTest(unittest.TestCase):
|
||||
# Make a hint request.
|
||||
json_in = {'problem name': '25.0'}
|
||||
out = mock_module.get_hint(json_in)
|
||||
self.assertTrue((out['best_hint'] == 'This is a new hint.')
|
||||
or (out['rand_hint_1'] == 'This is a new hint.'))
|
||||
self.assertTrue('This is a new hint.' in out['hints'])
|
||||
|
||||
def test_submithint_moderate(self):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user