bots: Add tests for trivia_quiz bot
This commit is contained in:
parent
9096dd2918
commit
f276e46890
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"request":{
|
||||||
|
"api_url":"https://opentdb.com/api.php?amount=1&type=multiple"
|
||||||
|
},
|
||||||
|
"response":{
|
||||||
|
"response_code":0,
|
||||||
|
"results":[
|
||||||
|
{
|
||||||
|
"category":"Animals",
|
||||||
|
"type":"multiple",
|
||||||
|
"difficulty":"easy",
|
||||||
|
"question":"Which class of animals are newts members of?",
|
||||||
|
"correct_answer":"Amphibian",
|
||||||
|
"incorrect_answers":["Fish","Reptiles","Mammals"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"response-headers":{
|
||||||
|
"status":200,
|
||||||
|
"ok":true,
|
||||||
|
"content-type":"application/json; charset=utf-8"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"request": {
|
||||||
|
"api_url":"https://opentdb.com/api.php?amount=1&type=multiple"
|
||||||
|
},
|
||||||
|
"response": {
|
||||||
|
"data": {
|
||||||
|
"status_code":404
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response-headers":{
|
||||||
|
"status":404,
|
||||||
|
"content-type":"text/html"
|
||||||
|
}
|
||||||
|
}
|
71
zulip_bots/zulip_bots/bots/trivia_quiz/test_trivia_quiz.py
Normal file
71
zulip_bots/zulip_bots/bots/trivia_quiz/test_trivia_quiz.py
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
import json
|
||||||
|
|
||||||
|
from unittest.mock import patch
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from zulip_bots.test_lib import (
|
||||||
|
BotTestCase,
|
||||||
|
read_bot_fixture_data,
|
||||||
|
)
|
||||||
|
|
||||||
|
from zulip_bots.bots.trivia_quiz.trivia_quiz import (
|
||||||
|
get_quiz_from_payload,
|
||||||
|
)
|
||||||
|
|
||||||
|
class TestTriviaQuizBot(BotTestCase):
|
||||||
|
bot_name = "trivia_quiz" # type: str
|
||||||
|
|
||||||
|
new_question_response = '\nQ: Which class of animals are newts members of?\n\n' + \
|
||||||
|
'* **A** Amphibian\n' + \
|
||||||
|
'* **B** Fish\n' + \
|
||||||
|
'* **C** Reptiles\n' + \
|
||||||
|
'* **D** Mammals\n' + \
|
||||||
|
'**reply**: answer Q001 <letter>'
|
||||||
|
|
||||||
|
def _test(self, message: str, response: str, fixture: Optional[str]=None) -> None:
|
||||||
|
if fixture:
|
||||||
|
with self.mock_http_conversation(fixture):
|
||||||
|
self.verify_reply(message, response)
|
||||||
|
else:
|
||||||
|
self.verify_reply(message, response)
|
||||||
|
|
||||||
|
def test_bot_responds_to_empty_message(self) -> None:
|
||||||
|
self._test('', 'type "new" for a new question')
|
||||||
|
|
||||||
|
def test_bot_new_question(self) -> None:
|
||||||
|
with patch('random.shuffle'):
|
||||||
|
self._test('new', self.new_question_response, 'test_new_question')
|
||||||
|
|
||||||
|
def test_question_not_available(self) -> None:
|
||||||
|
self._test('new', 'Uh-Oh! Trivia service is down.', 'test_status_code')
|
||||||
|
|
||||||
|
def test_invalid_answer(self) -> None:
|
||||||
|
invalid_replies = ['answer A',
|
||||||
|
'answer A Q10',
|
||||||
|
'answer Q001 K',
|
||||||
|
'answer 001 A']
|
||||||
|
for reply in invalid_replies:
|
||||||
|
self._test(reply, 'Invalid answer format')
|
||||||
|
|
||||||
|
def test_invalid_quiz_id(self) -> None:
|
||||||
|
self._test('answer Q100 A', 'Invalid quiz id')
|
||||||
|
|
||||||
|
def test_answers(self) -> None:
|
||||||
|
quiz_payload = read_bot_fixture_data('trivia_quiz', 'test_new_question')['response']
|
||||||
|
with patch('random.shuffle'):
|
||||||
|
quiz = get_quiz_from_payload(quiz_payload)
|
||||||
|
|
||||||
|
self.assertEqual(quiz['question'], 'Which class of animals are newts members of?')
|
||||||
|
self.assertEqual(quiz['correct_letter'], 'A')
|
||||||
|
self.assertEqual(quiz['answers']['D'], 'Mammals')
|
||||||
|
|
||||||
|
# test incorrect answer
|
||||||
|
with patch('zulip_bots.bots.trivia_quiz.trivia_quiz.get_quiz_from_id',
|
||||||
|
return_value=json.dumps(quiz)):
|
||||||
|
self._test('answer Q001 B', '**WRONG!** B is not correct :disappointed:')
|
||||||
|
|
||||||
|
# test correct answer
|
||||||
|
with patch('zulip_bots.bots.trivia_quiz.trivia_quiz.get_quiz_from_id',
|
||||||
|
return_value=json.dumps(quiz)):
|
||||||
|
with patch('zulip_bots.bots.trivia_quiz.trivia_quiz.start_new_quiz') as mock_new_quiz:
|
||||||
|
self._test('answer Q001 A', '**CORRECT!** Amphibian :tada:')
|
|
@ -37,7 +37,7 @@ class TriviaQuizHandler:
|
||||||
bot_handler.send_reply(message, bot_response)
|
bot_handler.send_reply(message, bot_response)
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
quiz_payload = bot_handler.storage.get(quiz_id)
|
quiz_payload = get_quiz_from_id(quiz_id, bot_handler)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
bot_response = 'Invalid quiz id'
|
bot_response = 'Invalid quiz id'
|
||||||
bot_handler.send_reply(message, bot_response)
|
bot_handler.send_reply(message, bot_response)
|
||||||
|
@ -52,6 +52,9 @@ class TriviaQuizHandler:
|
||||||
bot_response = 'type "new" for a new question'
|
bot_response = 'type "new" for a new question'
|
||||||
bot_handler.send_reply(message, bot_response)
|
bot_handler.send_reply(message, bot_response)
|
||||||
|
|
||||||
|
def get_quiz_from_id(quiz_id: str, bot_handler: Any) -> str:
|
||||||
|
return bot_handler.storage.get(quiz_id)
|
||||||
|
|
||||||
def start_new_quiz(message: Dict[str, Any], bot_handler: Any) -> None:
|
def start_new_quiz(message: Dict[str, Any], bot_handler: Any) -> None:
|
||||||
quiz = get_trivia_quiz()
|
quiz = get_trivia_quiz()
|
||||||
quiz_id = generate_quiz_id(bot_handler.storage)
|
quiz_id = generate_quiz_id(bot_handler.storage)
|
||||||
|
|
Loading…
Reference in a new issue