You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
6.0 KiB
186 lines
6.0 KiB
""" Test Q+A. """
|
|
|
|
from asl_rulebook2.webapp.tests.utils import init_webapp, \
|
|
check_sr_filters, find_child, find_children, wait_for_elem, get_image_filename, unload_elem, unload_sr_text
|
|
from asl_rulebook2.webapp.tests.test_search import do_search
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
def test_full_qa_entry( webapp, webdriver ):
|
|
"""Test handling of a Q+A entry that has everything."""
|
|
|
|
# initialize
|
|
webapp.control_tests.set_data_dir( "qa" )
|
|
init_webapp( webapp, webdriver )
|
|
check_sr_filters( [ "index", "qa" ] )
|
|
|
|
# bring up the Q+A entry
|
|
results = do_search( "full" )
|
|
|
|
# NOTE: Because the first search result has a ruleid of F1, any Q+A that reference F1
|
|
# will auto-show in the rule info popup.
|
|
qa_entry = _unload_rule_info_qa()
|
|
expected = {
|
|
"caption": "F1",
|
|
"content": [ {
|
|
"question": "This is a full question about something [EXC: those other things].",
|
|
"icon": "question.png",
|
|
"image": "thought-bubble.png",
|
|
"answers": [
|
|
[ "On the one hand, it could be this.", "Perry Sez" ],
|
|
[ "But alternatively, it could be that.", "Perry Sez" ],
|
|
],
|
|
"see_other": "See other errata: Your guru."
|
|
}, {
|
|
"question": "As a follow-up, what is the meaning of life?",
|
|
"icon": "question.png",
|
|
"answers": [
|
|
[ "It is what you make of it [EXC: See above].", "_unknown_" ]
|
|
]
|
|
} ]
|
|
}
|
|
assert qa_entry == expected
|
|
|
|
# check the same Q+A entry in the search results
|
|
find_child( ".close-rule-info" ).click()
|
|
expected["content"][0]["question"] = expected["content"][0]["question"].replace( "full", "((full))" )
|
|
result = results[1]
|
|
del result[ "sr_type" ]
|
|
assert result == expected
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
def test_info_qa_entry( webapp, webdriver ):
|
|
"""Test handling of an informational Q+A entry."""
|
|
|
|
# initialize
|
|
webapp.control_tests.set_data_dir( "qa" )
|
|
init_webapp( webapp, webdriver )
|
|
|
|
# bring up the Q+A entry
|
|
do_search( "information" )
|
|
|
|
# check the Q_A entry in the rule info popup
|
|
qa_entry = _unload_rule_info_qa()
|
|
expected = {
|
|
"caption": "I1",
|
|
"content": [ {
|
|
"icon": "info.png",
|
|
"source": "GameSquad",
|
|
"info": [
|
|
"This Q+A has no question, just answers.",
|
|
"And another one"
|
|
],
|
|
}, {
|
|
"icon": "info.png",
|
|
"source": "GameSquad",
|
|
"info": [ "And yet another one" ],
|
|
} ]
|
|
}
|
|
assert qa_entry == expected
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
def test_missing_content( webapp, webdriver ):
|
|
"""Test handling of a Q+A entry that has no content."""
|
|
|
|
# initialize
|
|
webapp.control_tests.set_data_dir( "qa" )
|
|
init_webapp( webapp, webdriver )
|
|
|
|
# bring up the Q+A entry
|
|
results = do_search( "missing" )
|
|
|
|
# check the Q+A entry in the search results
|
|
# NOTE: Q+A captions are ignored by the search engine (since they usually just contain just ruleid's),
|
|
# so search terms are *not* highlighted.
|
|
expected = {
|
|
"caption": "((Missing)) content",
|
|
}
|
|
assert len(results) == 1
|
|
result = results[0]
|
|
del result[ "sr_type" ]
|
|
assert result == expected
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
def test_missing_answer( webapp, webdriver ):
|
|
"""Test handling of a Q+A entry that has a question but no answers."""
|
|
|
|
# initialize
|
|
webapp.control_tests.set_data_dir( "qa" )
|
|
init_webapp( webapp, webdriver )
|
|
|
|
# bring up the Q+A entry
|
|
results = do_search( "unanswerable" )
|
|
|
|
# check the Q+A entry in the search results
|
|
expected = {
|
|
"caption": "N1",
|
|
"content": [ {
|
|
"question": "An ((unanswerable)) question.",
|
|
"icon": "question.png",
|
|
} ]
|
|
}
|
|
assert len(results) == 1
|
|
result = results[0]
|
|
del result[ "sr_type" ]
|
|
assert result == expected
|
|
|
|
# ---------------------------------------------------------------------
|
|
|
|
def unload_qa( qa_elem ):
|
|
"""Unload a Q+A entry from the UI."""
|
|
|
|
# initialize
|
|
qa_entry = {}
|
|
|
|
# unload the top-level fields
|
|
unload_elem( qa_entry, "caption", find_child(".caption",qa_elem), adjust_hilites=True )
|
|
|
|
# unload each content node
|
|
qa_content = []
|
|
for content_elem in find_children( ".content", qa_elem ):
|
|
|
|
# unload the top-level fields
|
|
content = {
|
|
"icon": get_image_filename( find_child( "img.icon", content_elem ) ),
|
|
}
|
|
unload_elem( content, "question", find_child(".question",content_elem), adjust_hilites=True )
|
|
unload_elem( content, "image", find_child("img.imageZoom",content_elem) )
|
|
unload_elem( content, "see_other", find_child(".see-other",content_elem), adjust_hilites=True )
|
|
|
|
# unload the answers (if any)
|
|
answers = []
|
|
for answer_elem in find_children( ".answer", content_elem ):
|
|
answers.append( [
|
|
unload_sr_text( answer_elem ),
|
|
find_child( "img.icon", answer_elem ).get_attribute( "title" ),
|
|
] )
|
|
if answers:
|
|
content["answers"] = answers
|
|
|
|
# unload the info (if any)
|
|
info = [
|
|
c.text for c in find_children( ".info", content_elem )
|
|
]
|
|
if info:
|
|
content["info"] = info
|
|
content["source"] = find_child( "img.icon", content_elem ).get_attribute( "title" )
|
|
|
|
# save the content node
|
|
qa_content.append( content )
|
|
|
|
# save the content nodes (if any)
|
|
if qa_content:
|
|
qa_entry["content"] = qa_content
|
|
|
|
return qa_entry
|
|
|
|
def _unload_rule_info_qa():
|
|
"""Unload a Q+A entry from the rule info popup."""
|
|
popup = wait_for_elem( 2, "#rule-info" )
|
|
assert popup
|
|
elems = find_children( ".qa", popup )
|
|
assert len(elems) == 1 # nb: we assume there's only 1 Q+A entry
|
|
return unload_qa( elems[0] )
|
|
|