def test_all_but_photo(self, member): for q in [ a for a in Question.SUPPORTED_ATTRIBUTES if a != Question.PHOTO ]: for h in Question.SUPPORTED_ATTRIBUTES: if h != q: for m in [True, False]: text = question_text(member, q, h, m) assert isinstance(text, str) assert text != '' assert '{' not in text assert '}' not in text for q in [ k for k in Question.SUPPORTED_ATTRIBUTES if k != Question.PHOTO ]: for h in [ k for k in Question.SUPPORTED_ATTRIBUTES if k != Question.PHOTO ]: if h not in q and q not in h: for m in [True, False]: text = question_text(member, q, h, m) assert isinstance(text, str) assert text != '' assert '{' not in text assert '}' not in text
def test_hint_value(self, member): text = question_text( member, Question.FULL_NAME, Question.INSTRUMENT, multiple_choice=False, hint_value='foo', ) assert 'foo' in text assert member.instruments_str not in text
def test_photo(self, member): q = Question.PHOTO for h in [a for a in Question.SUPPORTED_ATTRIBUTES if a != q]: with pytest.raises(ValueError, match='Photos are'): question_text(member, q, h, False) text = question_text(member, q, h, True) assert text != '' assert '{' not in text assert '}' not in text q = 'photo_file_id' for h in [ k for k in Question.SUPPORTED_ATTRIBUTES if k != Question.PHOTO ]: with pytest.raises(ValueError, match='Photos are'): question_text(member, q, h, False) text = question_text(member, q, h, True) assert text != '' assert '{' not in text assert '}' not in text
def test_errors(self): with pytest.raises(ValueError, match='Unsupported'): question_text(member, 'abc', Question.FULL_NAME) with pytest.raises(ValueError, match='Unsupported'): question_text(member, Question.FULL_NAME, 'abc')
def ask_question(self) -> None: """ Asks the next question, if there is another. Raises: RuntimeError: If there are no more questions to be asked. """ if self.number_of_questions_asked == self.number_of_questions: raise RuntimeError('No more questions to ask!') hint_manager, question_manager = random.choice(self.questionable()) hint_attribute = hint_manager.description question_attribute = question_manager.description if question_manager.description == Question.PHOTO: multiple_choice = True photo_question = True else: multiple_choice = self.multiple_choice photo_question = False if multiple_choice: member, hint, opts, index = hint_manager.build_question_with( question_manager, multiple_choice=True, exclude_members=[self.member] ) question = question_text( member, question_attribute, hint_attribute, multiple_choice=True ) options = list(str(o) for o in opts) # Truncate long options for idx, opt in enumerate(options): if len(opt) > 100: options[idx] = opt[:96] + ' ...' # Send photos if needed if photo_question: self.bot.send_media_group( chat_id=self.member.user_id, media=[InputMediaPhoto(options[0]), InputMediaPhoto(options[1])], ) self.bot.send_media_group( chat_id=self.member.user_id, media=[InputMediaPhoto(options[2]), InputMediaPhoto(options[3])], ) if hint_attribute == Question.PHOTO: self.bot.send_photo(chat_id=self.member.user_id, photo=hint) # Send the question poll = self.bot.send_poll( chat_id=self.member.user_id, question=question, options=(PHOTO_OPTIONS if photo_question else options), is_anonymous=False, type=Poll.QUIZ, correct_option_id=index, ).poll self.current_question = Question( member, question_attribute, poll=poll, multiple_choice=multiple_choice ) else: member, hint, _ = hint_manager.build_question_with( question_manager, multiple_choice=False, exclude_members=[self.member] ) question = question_text( member, question_attribute, hint_attribute, multiple_choice=False, hint_value=hint ) if hint_attribute == Question.PHOTO: self.bot.send_photo( chat_id=self.member.user_id, photo=member.photo_file_id, caption=question ) else: self.bot.send_message(chat_id=self.member.user_id, text=question) self.current_question = Question( member, question_attribute, multiple_choice=multiple_choice ) self.number_of_questions_asked += 1