def test_check_update_free_text(self, member): valid_update = Update(1, message=Message(1, None, None, None, text='text')) invalid_update = Update(1, poll_answer=PollAnswer(123, None, [1])) for attr in [ a for a in Question.SUPPORTED_ATTRIBUTES if a != Question.PHOTO ]: q = Question(member, attr, multiple_choice=False) assert q.check_update(valid_update) assert not q.check_update(invalid_update) q = Question(member, Question.ADDRESS, multiple_choice=False) valid_update = Update(1, message=Message(1, None, None, None, location=Location(longitude=1, latitude=1))) invalid_update = Update(1, poll_answer=PollAnswer(123, None, [1])) assert q.check_update(valid_update) assert not q.check_update(invalid_update)
def test_check_answer_multiple_choice(self, member): correct_update = Update(1, poll_answer=PollAnswer(123, None, [1])) false_update = Update(1, poll_answer=PollAnswer(123, None, [0])) for attr in Question.SUPPORTED_ATTRIBUTES: q = Question(member, attr, poll=self.poll) assert q.check_answer(correct_update) assert not q.check_answer(false_update) assert q.correct_answer == 'Opt2'
def test_check_update_multiple_choice(self, member): valid_update = Update(1, poll_answer=PollAnswer(123, None, [1])) invalid_update = Update(1, message=True) for attr in Question.SUPPORTED_ATTRIBUTES: q = Question(member, attr, poll=self.poll) assert q.check_update(valid_update) assert not q.check_update(invalid_update)
def test_equality(self): a = PollAnswer(123, self.user, [2]) b = PollAnswer(123, User(1, 'first', False), [2]) c = PollAnswer(123, self.user, [1, 2]) d = PollAnswer(456, self.user, [2]) e = PollOption('Text', 1) assert a == b assert hash(a) == hash(b) assert a != c assert hash(a) != hash(c) assert a != d assert hash(a) != hash(d) assert a != e assert hash(a) != hash(e)
def test_de_json(self): json_dict = { 'poll_id': self.poll_id, 'user': self.user.to_dict(), 'option_ids': self.option_ids, } poll_answer = PollAnswer.de_json(json_dict, None) assert poll_answer.poll_id == self.poll_id assert poll_answer.user == self.user assert poll_answer.option_ids == self.option_ids
def test_de_json(self): json_dict = { "poll_id": self.poll_id, "user": self.user.to_dict(), "option_ids": self.option_ids, } poll_answer = PollAnswer.de_json(json_dict, None) assert poll_answer.poll_id == self.poll_id assert poll_answer.user == self.user assert poll_answer.option_ids == self.option_ids
def test_no_current_question(self, bot, chat_id, populated_orchestra, empty_member): populated_orchestra.register_member(empty_member) questioner = Questioner( user_id=int(chat_id), orchestra=populated_orchestra, hint_attributes=[], question_attributes=[], number_of_questions=42, bot=bot, ) update = Update(123, poll_answer=PollAnswer(chat_id, User(chat_id, '', False), [1])) assert not questioner.check_update(update) with pytest.raises(RuntimeError, match='current question'): questioner.handle_update(update)
def test_init(self, bot, populated_orchestra, empty_member): orchestra = populated_orchestra orchestra.register_member(empty_member) questioner = Questioner( user_id=empty_member.user_id, orchestra=orchestra, hint_attributes=[], question_attributes=[], number_of_questions=42, bot=bot, multiple_choice=True, ) assert questioner.member == empty_member assert questioner.orchestra is orchestra assert questioner.bot is bot assert questioner.multiple_choice is True assert questioner.score.answers == 0 assert not questioner.current_question assert not questioner.check_update(Update(123)) assert not questioner.check_update( Update(123, poll_answer=PollAnswer(123, User(123, '', False), [1])) )
def poll_answer(bot): return Update(0, poll_answer=PollAnswer(1, User(2, "test user", False), [0, 1]))
def poll_answer(): return PollAnswer(poll_id=TestPollAnswer.poll_id, user=TestPollAnswer.user, option_ids=TestPollAnswer.poll_id)
"") }, { "shipping_query": ShippingQuery("id", User(1, "", False), "", None) }, { "pre_checkout_query": PreCheckoutQuery("id", User(1, "", False), "", 0, "") }, { "poll": Poll("id", "?", [PollOption(".", 1)], False, False, False, Poll.REGULAR, True) }, { "poll_answer": PollAnswer("id", User(1, "", False), [1]) }, { "my_chat_member": chat_member_updated }, { "chat_member": chat_member_updated }, { "chat_join_request": chat_join_request }, # Must be last to conform with `ids` below! { "callback_query": CallbackQuery(1, User(1, "", False), "chat") }, ]
def test_ask_question_free_text( self, bot, chat_id, populated_orchestra, empty_member, monkeypatch, runs ): poll_message = None answer_message_text = '' def send_poll(*args, **kwargs): nonlocal poll_message poll_message = fake_poll() return poll_message def send_message(*args, **kwargs): nonlocal answer_message_text answer_message_text = kwargs['text'] return answer_message_text def send_pass(*args, **kwargs): pass orchestra = populated_orchestra orchestra.register_member(empty_member) questioner = Questioner( user_id=int(chat_id), orchestra=orchestra, hint_attributes=[], question_attributes=[], number_of_questions=42, bot=bot, multiple_choice=False, ) monkeypatch.setattr(questioner.bot, 'send_poll', send_poll) monkeypatch.setattr(questioner.bot, 'send_message', send_message) monkeypatch.setattr(questioner.bot, 'send_photo', send_pass) monkeypatch.setattr(questioner.bot, 'send_media_group', send_pass) try: questioner.ask_question() except RuntimeError as e: if 'currently not hintable' in str(e): pytest.xfail('This test may be flaky depending on the orchestra constellation') assert questioner.number_of_questions_asked == 1 assert questioner.current_question if questioner.current_question.multiple_choice: assert questioner.current_question.attribute == Question.PHOTO assert questioner.current_question.poll is poll_message.poll else: assert not questioner.current_question.poll if questioner.current_question.multiple_choice: update = Update( 123, poll_answer=PollAnswer( poll_message.poll.id, User(123, 'foo', False), [(poll_message.poll.correct_option_id + 1) % 4], ), ) else: update = Update( 123, message=Message( message_id=123, from_user=User(123, 'foo', False), chat=Chat(123, Chat.PRIVATE), date=None, text='some very false answer', bot=bot, ), ) assert not questioner.check_update(update) if questioner.current_question.multiple_choice: update = Update( 123, poll_answer=PollAnswer( poll_message.poll.id, User(chat_id, 'foo', False), [(poll_message.poll.correct_option_id + 1) % 4], ), ) else: update = Update( 123, message=Message( message_id=123, from_user=User(chat_id, 'foo', False), date=None, chat=Chat(chat_id, Chat.PRIVATE), text='some very false answer', bot=bot, ), ) assert questioner.check_update(update) questioner.handle_update(update) assert questioner.score.answers == 1 assert questioner.score.correct == 0 if not questioner.current_question.multiple_choice: assert 'nicht korrekt' in answer_message_text if questioner.current_question.multiple_choice: update = Update( 123, poll_answer=PollAnswer( poll_message.poll.id, User(chat_id, 'foo', False), [poll_message.poll.correct_option_id], ), ) else: if isinstance(questioner.current_question.correct_answer, list): text = str(random.choice(questioner.current_question.correct_answer)) else: text = questioner.current_question.correct_answer update = Update( 123, message=Message( message_id=123, from_user=User(chat_id, 'foo', False), date=None, chat=Chat(chat_id, Chat.PRIVATE), text=text, bot=bot, ), ) assert questioner.check_update(update) questioner.handle_update(update) assert questioner.score.answers == 2 assert questioner.score.correct == 1 if not questioner.current_question.multiple_choice: assert 'richtig!' in answer_message_text
def test_ask_question_multiple_choice( self, bot, chat_id, populated_orchestra, empty_member, monkeypatch, runs ): poll_message = None def send_poll(*args, **kwargs): nonlocal poll_message poll_message = fake_poll() return poll_message def send_pass(*args, **kwargs): pass orchestra = populated_orchestra orchestra.register_member(empty_member) questioner = Questioner( user_id=int(chat_id), orchestra=orchestra, hint_attributes=[], question_attributes=[], number_of_questions=42, bot=bot, multiple_choice=True, ) monkeypatch.setattr(questioner.bot, 'send_poll', send_poll) monkeypatch.setattr(questioner.bot, 'send_photo', send_pass) monkeypatch.setattr(questioner.bot, 'send_media_group', send_pass) questioner.ask_question() assert questioner.number_of_questions_asked == 1 assert questioner.current_question assert questioner.current_question.poll is poll_message.poll update = Update( 123, poll_answer=PollAnswer( poll_message.poll.id, User(123, 'foo', False), [(poll_message.poll.correct_option_id + 1) % 4], ), ) assert not questioner.check_update(update) update = Update( 123, poll_answer=PollAnswer( '4654654', User(chat_id, 'foo', False), [(poll_message.poll.correct_option_id + 1) % 4], ), ) assert not questioner.check_update(update) update = Update( 123, poll_answer=PollAnswer( poll_message.poll.id, User(chat_id, 'foo', False), [(poll_message.poll.correct_option_id + 1) % 4], ), ) assert questioner.check_update(update) questioner.handle_update(update) assert questioner.score.answers == 1 assert questioner.score.correct == 0 update = Update( 123, poll_answer=PollAnswer( poll_message.poll.id, User(chat_id, 'foo', False), [poll_message.poll.correct_option_id], ), ) assert questioner.check_update(update) questioner.handle_update(update) assert questioner.score.answers == 2 assert questioner.score.correct == 1