Commit 05e13b9e by E. Kolpakov

Refactored tests:

Moved data files to dedicated folder
Split huge do_attempt test into individual tests running on plain and html'ed zones and items
parent 5d0ac94a
import logging import logging
import json import json
import unittest
from webob import Request from webob import Request
from mock import Mock from mock import Mock
...@@ -73,81 +75,110 @@ def test_studio_submit(): ...@@ -73,81 +75,110 @@ def test_studio_submit():
assert_equals(block.data, {'foo': 1}) assert_equals(block.data, {'foo': 1})
def do_ajax(orig_file, get_file): class BaseDragAndDropAjaxFixture(object):
_oldMaxDiff = None
ZONE_A = None
ZONE_B = None
FEEDBACK = {
0: {"correct": None, "incorrect": None},
1: {"correct": None, "incorrect": None},
2: {"correct": None, "incorrect": None}
}
FINAL_FEEDBACK = None
def __init__(self, *args, **kwargs):
self._initial_data = None
self._block = None
super(BaseDragAndDropAjaxFixture, self).__init__(*args, **kwargs)
@classmethod
def setUpClass(cls):
cls._oldMaxDiff = assert_equals.__self__.maxDiff
assert_equals.__self__.maxDiff = None assert_equals.__self__.maxDiff = None
block = make_block() @classmethod
def tearDownClass(cls):
assert_equals.__self__.maxDiff = cls._oldMaxDiff
def setUp(self):
self._block = make_block()
self._initial_data = self.initial_data()
self._block.data = self._initial_data
with open(orig_file) as f: def tearDown(self):
block.data = json.load(f) self._block = None
initial_data = block.data def initial_data(self):
zoneA = initial_data["items"][0]["zone"] raise NotImplemented
zoneB = initial_data["items"][1]["zone"]
feedback_finish = initial_data["feedback"]["finish"]
get_item_feedback = lambda item, type: initial_data["items"][item]["feedback"][type]
with open(get_file) as f: def get_data_response(self):
get_data = json.loads(block.handle('get_data', Mock()).body) raise NotImplemented
assert_equals(json.load(f), get_data)
# Wrong with feedback def test_get_data_returns_expected_data(self):
data = json.dumps({"val":0,"zone":zoneB,"top":"31px","left":"216px"}) expected_response = self.get_data_response()
res = json.loads(block.handle('do_attempt', make_request(data)).body) get_data_response = json.loads(self._block.handle('get_data', Mock()).body)
assert_equals(expected_response, get_data_response)
def test_do_attempt_wrong_with_feedback(self):
item_id, zone_id = 0, self.ZONE_B
data = json.dumps({"val": item_id, "zone": zone_id, "top": "31px", "left": "216px"})
res = json.loads(self._block.handle('do_attempt', make_request(data)).body)
assert_equals(res, { assert_equals(res, {
"final_feedback": None, "final_feedback": None,
"finished": False, "finished": False,
"correct": False, "correct": False,
"feedback": get_item_feedback(0, "incorrect") "feedback": self.FEEDBACK[item_id]["incorrect"]
}) })
with open(get_file) as f:
get_data = json.loads(block.handle('get_data', Mock()).body)
assert_equals(json.load(f), get_data)
# Wrong without feedback def test_do_attempt_wrong_without_feedback(self):
data = json.dumps({"val":2,"zone":zoneB,"top":"42px","left":"100px"}) item_id, zone_id = 2, self.ZONE_A
res = json.loads(block.handle('do_attempt', make_request(data)).body) data = json.dumps({"val": item_id, "zone": zone_id, "top": "42px", "left": "100px"})
res = json.loads(self._block.handle('do_attempt', make_request(data)).body)
assert_equals(res, { assert_equals(res, {
"final_feedback": None, "final_feedback": None,
"finished": False, "finished": False,
"correct": False, "correct": False,
"feedback": get_item_feedback(2, "incorrect") "feedback": self.FEEDBACK[item_id]["incorrect"]
}) })
with open(get_file) as f:
get_data = json.loads(block.handle('get_data', Mock()).body)
assert_equals(json.load(f), get_data)
# Correct def test_do_attempt_correct(self):
data = json.dumps({"val":0,"zone":zoneA,"top":"11px","left":"111px"}) item_id, zone_id = 0, self.ZONE_A
res = json.loads(block.handle('do_attempt', make_request(data)).body) data = json.dumps({"val": item_id, "zone": zone_id, "top": "11px", "left": "111px"})
res = json.loads(self._block.handle('do_attempt', make_request(data)).body)
assert_equals(res, { assert_equals(res, {
"final_feedback": None, "final_feedback": None,
"finished": False, "finished": False,
"correct": True, "correct": True,
"feedback": get_item_feedback(0, "correct") "feedback": self.FEEDBACK[item_id]["correct"]
}) })
with open(get_file) as f:
expected = json.load(f) def test_do_attempt_final(self):
data = json.dumps({"val": 0, "zone": self.ZONE_A, "top": "11px", "left": "111px"})
self._block.handle('do_attempt', make_request(data))
expected = self.get_data_response()
expected["state"] = { expected["state"] = {
"items": { "items": {
"0": ["11px", "111px"] "0": ["11px", "111px"]
}, },
"finished": False "finished": False
} }
get_data = json.loads(block.handle('get_data', Mock()).body) get_data = json.loads(self._block.handle('get_data', Mock()).body)
assert_equals(expected, get_data) assert_equals(expected, get_data)
# Final data = json.dumps({"val": 1, "zone": self.ZONE_B, "top": "22px", "left": "222px"})
data = json.dumps({"val":1,"zone":zoneB,"top":"22px","left":"222px"}) res = json.loads(self._block.handle('do_attempt', make_request(data)).body)
res = json.loads(block.handle('do_attempt', make_request(data)).body)
assert_equals(res, { assert_equals(res, {
"final_feedback": feedback_finish, "final_feedback": self.FINAL_FEEDBACK,
"finished": True, "finished": True,
"correct": True, "correct": True,
"feedback": get_item_feedback(1, "correct") "feedback": self.FEEDBACK[1]["correct"]
}) })
with open(get_file) as f:
expected = json.load(f) expected = self.get_data_response()
expected["state"] = { expected["state"] = {
"items": { "items": {
"0": ["11px", "111px"], "0": ["11px", "111px"],
...@@ -155,16 +186,51 @@ def do_ajax(orig_file, get_file): ...@@ -155,16 +186,51 @@ def do_ajax(orig_file, get_file):
}, },
"finished": True "finished": True
} }
expected["feedback"]["finish"] = feedback_finish expected["feedback"]["finish"] = self.FINAL_FEEDBACK
get_data = json.loads(block.handle('get_data', Mock()).body) get_data = json.loads(self._block.handle('get_data', Mock()).body)
assert_equals(expected, get_data) assert_equals(expected, get_data)
def test_ajax():
do_ajax('tests/test_data.json', 'tests/test_get_data.json')
class TestDragAndDropHtmlData(BaseDragAndDropAjaxFixture, unittest.TestCase):
ZONE_A = "Zone <i>A</i>"
ZONE_B = "Zone <b>B</b>"
FEEDBACK = {
0: {"correct": "Yes <b>A</b>", "incorrect": "No <b>A</b>"},
1: {"correct": "Yes <i>B</i>", "incorrect": "No <i>B</i>"},
2: {"correct": "", "incorrect": ""}
}
FINAL_FEEDBACK = "Final <b>Feed</b>"
def initial_data(self):
with open('tests/data/test_html_data.json') as f:
return json.load(f)
def get_data_response(self):
with open('tests/data/test_get_html_data.json') as f:
return json.load(f)
class TestDragAndDropPlainData(BaseDragAndDropAjaxFixture, unittest.TestCase):
ZONE_A = "Zone A"
ZONE_B = "Zone B"
FEEDBACK = {
0: {"correct": "Yes A", "incorrect": "No A"},
1: {"correct": "Yes B", "incorrect": "No B"},
2: {"correct": "", "incorrect": ""}
}
FINAL_FEEDBACK = "Final Feed"
def initial_data(self):
with open('tests/data/test_data.json') as f:
return json.load(f)
def test_html_ajax(): def get_data_response(self):
do_ajax('tests/test_html_data.json', 'tests/test_get_html_data.json') with open('tests/data/test_get_data.json') as f:
return json.load(f)
def test_ajax_solve_and_reset(): def test_ajax_solve_and_reset():
block = make_block() block = make_block()
...@@ -178,7 +244,7 @@ def test_ajax_solve_and_reset(): ...@@ -178,7 +244,7 @@ def test_ajax_solve_and_reset():
block.handle('do_attempt', make_request(data)) block.handle('do_attempt', make_request(data))
assert_true(block.completed) assert_true(block.completed)
assert_equals(block.item_state, {0:("11px", "111px"), 1:("22px", "222px")}) assert_equals(block.item_state, {0: ("11px", "111px"), 1: ("22px", "222px")})
block.handle('reset', make_request("{}")) block.handle('reset', make_request("{}"))
......
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