bots: Add tests for trivia_quiz bot

This commit is contained in:
Rhea Parekh 2018-06-04 02:55:32 +05:30 committed by showell
parent 9096dd2918
commit f276e46890
4 changed files with 112 additions and 1 deletions

View file

@ -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"
}
}

View file

@ -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"
}
}

View 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:')

View file

@ -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)