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):
assert_equals.__self__.maxDiff = None _oldMaxDiff = None
block = make_block() ZONE_A = None
ZONE_B = None
with open(orig_file) as f:
block.data = json.load(f) FEEDBACK = {
0: {"correct": None, "incorrect": None},
initial_data = block.data 1: {"correct": None, "incorrect": None},
zoneA = initial_data["items"][0]["zone"] 2: {"correct": None, "incorrect": None}
zoneB = initial_data["items"][1]["zone"] }
feedback_finish = initial_data["feedback"]["finish"]
get_item_feedback = lambda item, type: initial_data["items"][item]["feedback"][type] FINAL_FEEDBACK = None
with open(get_file) as f: def __init__(self, *args, **kwargs):
get_data = json.loads(block.handle('get_data', Mock()).body) self._initial_data = None
assert_equals(json.load(f), get_data) self._block = None
super(BaseDragAndDropAjaxFixture, self).__init__(*args, **kwargs)
# Wrong with feedback
data = json.dumps({"val":0,"zone":zoneB,"top":"31px","left":"216px"}) @classmethod
res = json.loads(block.handle('do_attempt', make_request(data)).body) def setUpClass(cls):
assert_equals(res, { cls._oldMaxDiff = assert_equals.__self__.maxDiff
"final_feedback": None, assert_equals.__self__.maxDiff = None
"finished": False,
"correct": False, @classmethod
"feedback": get_item_feedback(0, "incorrect") def tearDownClass(cls):
}) assert_equals.__self__.maxDiff = cls._oldMaxDiff
with open(get_file) as f:
get_data = json.loads(block.handle('get_data', Mock()).body) def setUp(self):
assert_equals(json.load(f), get_data) self._block = make_block()
self._initial_data = self.initial_data()
# Wrong without feedback self._block.data = self._initial_data
data = json.dumps({"val":2,"zone":zoneB,"top":"42px","left":"100px"})
res = json.loads(block.handle('do_attempt', make_request(data)).body) def tearDown(self):
assert_equals(res, { self._block = None
"final_feedback": None,
"finished": False, def initial_data(self):
"correct": False, raise NotImplemented
"feedback": get_item_feedback(2, "incorrect")
}) def get_data_response(self):
with open(get_file) as f: raise NotImplemented
get_data = json.loads(block.handle('get_data', Mock()).body)
assert_equals(json.load(f), get_data) def test_get_data_returns_expected_data(self):
expected_response = self.get_data_response()
# Correct get_data_response = json.loads(self._block.handle('get_data', Mock()).body)
data = json.dumps({"val":0,"zone":zoneA,"top":"11px","left":"111px"}) assert_equals(expected_response, get_data_response)
res = json.loads(block.handle('do_attempt', make_request(data)).body)
assert_equals(res, { def test_do_attempt_wrong_with_feedback(self):
"final_feedback": None, item_id, zone_id = 0, self.ZONE_B
"finished": False, data = json.dumps({"val": item_id, "zone": zone_id, "top": "31px", "left": "216px"})
"correct": True, res = json.loads(self._block.handle('do_attempt', make_request(data)).body)
"feedback": get_item_feedback(0, "correct") assert_equals(res, {
}) "final_feedback": None,
with open(get_file) as f: "finished": False,
expected = json.load(f) "correct": False,
"feedback": self.FEEDBACK[item_id]["incorrect"]
})
def test_do_attempt_wrong_without_feedback(self):
item_id, zone_id = 2, self.ZONE_A
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, {
"final_feedback": None,
"finished": False,
"correct": False,
"feedback": self.FEEDBACK[item_id]["incorrect"]
})
def test_do_attempt_correct(self):
item_id, zone_id = 0, self.ZONE_A
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, {
"final_feedback": None,
"finished": False,
"correct": True,
"feedback": self.FEEDBACK[item_id]["correct"]
})
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": self.FINAL_FEEDBACK,
"final_feedback": feedback_finish, "finished": True,
"finished": True, "correct": True,
"correct": True, "feedback": self.FEEDBACK[1]["correct"]
"feedback": get_item_feedback(1, "correct") })
})
with open(get_file) as f: expected = self.get_data_response()
expected = json.load(f)
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