async def test_finish_setup__filled_stranger(self): stranger = { 'id': 1, 'invitation': '11_invitation', 'languages': '["en"]', 'partner_sex': 'male', 'sex': 'female', 'telegram_id': 110, 'wizard': 'setup', 'wizard_step': 'sex', } setup_db({ 'strangers': [stranger], }) receive_message(stranger['telegram_id'], '/end') await assert_sent_message( stranger['telegram_id'], '*Rand Talk:* Thanks for info. 😋 Use /begin to start looking for a conversational partner, once you\'re matched you can use /end to finish the conversation.', reply_markup={ 'hide_keyboard': True, }, ) assert_db({ 'strangers': [ { 'id': stranger['id'], 'wizard': 'none', 'wizard_step': None, }, ] })
async def test_sex(self): stranger = { 'id': 1, 'invitation': '11_invitation', 'languages': '["en"]', 'partner_sex': None, 'sex': None, 'telegram_id': 110, 'wizard': 'setup', 'wizard_step': 'sex', } setup_db({ 'strangers': [stranger], }) receive_message(stranger['telegram_id'], 'Female') await assert_sent_message( stranger['telegram_id'], '*Rand Talk:* Choose your partner\'s sex', reply_markup={ 'keyboard': [ ['Female', 'Male'], ['Not specified'], ], 'one_time_keyboard': True, }, ) assert_db({ 'strangers': [ { 'id': stranger['id'], 'sex': 'female', 'wizard_step': 'partner_sex', }, ], })
async def test_message_from_partner1_to_partner2__partner2_has_blocked_the_bot( self): setup_db({ 'strangers': [STRANGER1_1, STRANGER1_2], 'talks': [TALK1], }) add_bot_blockers_ids(STRANGER1_2['telegram_id']) receive_message(STRANGER1_1['telegram_id'], 'Hello') await assert_sent_message( STRANGER1_1['telegram_id'], '*Rand Talk:* Your partner has blocked me! How did you do that?! 😕', ) await assert_sent_message( STRANGER1_1['telegram_id'], '*Rand Talk:* Chat was finished. Feel free to /begin a new one.', ) assert_db({ 'talks': [ { 'id': TALK1['id'], 'partner1_sent': TALK1['partner1_sent'], 'end': datetime.datetime.utcnow(), }, ], })
async def test_finish_setup__stranger_wasnt_filled(self): stranger = { 'id': 1, 'invitation': '11_invitation', 'languages': '["en"]', 'partner_sex': None, 'sex': None, 'telegram_id': 110, 'wizard': 'setup', 'wizard_step': 'sex', } setup_db({ 'strangers': [stranger], }) receive_message(stranger['telegram_id'], '/begin') await assert_sent_message( stranger['telegram_id'], '*Rand Talk:* Finish setup process please. After that you can start using bot.', ) await assert_sent_message( stranger['telegram_id'], '*Rand Talk:* Set up your sex. If you pick “Not Specified” you can\'t choose your' ' partner\'s sex.', reply_markup={ 'keyboard': [ ['Female', 'Male'], ['Not specified'], ], 'one_time_keyboard': True, }, ) assert_db({ 'strangers': [stranger], })
async def test_stranger_was_rewarded_for_invite(self): setup_db({ 'strangers': [STRANGER1_1_INVITER, STRANGER1_1, STRANGER1_2], 'talks': [TALK1], }) receive_message(STRANGER1_1['telegram_id'], 'Hello') expected_bonuses_count = STRANGER1_1_INVITER['bonus_count'] + 1 await assert_sent_message(STRANGER1_2['telegram_id'], 'Hello') await assert_sent_message( STRANGER1_1_INVITER['telegram_id'], '*Rand Talk:* You\'ve received one bonus for inviting a person to the bot. Bonuses' ' will help you to find partners quickly. Total bonuses count:' f' {expected_bonuses_count}. Congratulations! 🤑\n' 'To mute this notifications, use /mute\\_bonuses.', ) assert_db({ 'strangers': [ { 'id': STRANGER1_1['id'], 'was_invited_as': STRANGER1_1['sex'], }, { 'id': STRANGER1_1_INVITER['id'], 'bonus_count': expected_bonuses_count, }, ], })
async def test_sex(self): setup_db({ 'strangers': [STRANGER_SEX], }) receive_message(STRANGER_SEX['telegram_id'], 'Female') await assert_partner_sex_prompt(STRANGER_SEX['telegram_id']) assert_db({ 'strangers': [STRANGER_PARTNER_SEX], })
async def test_language(self): setup_db({ 'strangers': [STRANGER_LANGUAGES], }) receive_message(STRANGER_LANGUAGES['telegram_id'], 'English') await assert_sex_prompt(STRANGER_LANGUAGES) assert_db({ 'strangers': [STRANGER_SEX], })
async def test_nonsense_end(self): stranger = STRANGER2_1 setup_db({ 'strangers': [stranger], }) receive_message(stranger['telegram_id'], '/end') assert_db({ 'strangers': [stranger], })
async def test_muting_bonuses(self): setup_db({ 'strangers': [STRANGER1_1_INVITER, STRANGER1_1, STRANGER1_2], 'talks': [TALK1], }) receive_message(STRANGER1_1_INVITER['telegram_id'], '/mute_bonuses') await assert_sent_message( STRANGER1_1_INVITER['telegram_id'], '*Rand Talk:* Notifications about bonuses were muted for 1 hour 🤐', ) receive_message(STRANGER1_1['telegram_id'], 'Hello') await assert_sent_message(STRANGER1_2['telegram_id'], 'Hello')
async def test_message_editing(self): setup_db({ 'strangers': [STRANGER1_1], }) receive_message(STRANGER1_1['telegram_id'], 'Hello', is_edit=True) await assert_sent_message( STRANGER1_1['telegram_id'], '*Rand Talk:* Messages editing isn\'t supported 😟', ) assert_db({ 'strangers': [STRANGER1_1], })
async def test_partners_sex__wrong_sex(self): setup_db({ 'strangers': [STRANGER_PARTNER_SEX], }) receive_message(STRANGER_PARTNER_SEX['telegram_id'], 'foobar') await assert_sent_message( STRANGER_SEX['telegram_id'], '*Rand Talk:* Unknown sex: “foobar” — is not a valid sex name. Are you sure you' ' aren\'t mistaken? 😉', ) await assert_partner_sex_prompt(STRANGER_PARTNER_SEX['telegram_id']) assert_db({ 'strangers': [STRANGER_PARTNER_SEX], })
async def test_language__no_languages(self): setup_db({ 'strangers': [STRANGER_LANGUAGES], }) receive_message(STRANGER_LANGUAGES['telegram_id'], ',') await assert_sent_message( STRANGER_LANGUAGES['telegram_id'], '*Rand Talk:* Please specify at least one language', ) await assert_language_prompt( STRANGER_LANGUAGES, '*Rand Talk:* Enumerate the languages you speak like this: “English,' ' Italian” — in descending order of your speaking convenience or just' ' pick one at special keyboard.', )
async def test_language__unknown(self): setup_db({ 'strangers': [STRANGER_LANGUAGES], }) receive_message(STRANGER_LANGUAGES['telegram_id'], 'Foobar') await assert_sent_message( STRANGER_LANGUAGES['telegram_id'], '*Rand Talk:* Language “Foobar” wasn\'t found. 😳 Try to specify language in English.', ) await assert_language_prompt( STRANGER_LANGUAGES, '*Rand Talk:* Enumerate the languages you speak like this: “English,' ' Italian” — in descending order of your speaking convenience or just' ' pick one at special keyboard.', )
async def test_message_from_partner2_to_partner1_was_sent(self): setup_db({ 'strangers': [STRANGER1_1, STRANGER1_2], 'talks': [TALK1], }) receive_message(STRANGER1_2['telegram_id'], 'Hi') await assert_sent_message(STRANGER1_1['telegram_id'], 'Hi') assert_db({ 'talks': [ { 'id': TALK1['id'], 'partner2_sent': TALK1['partner2_sent'] + 1, }, ], })
async def test_first_message(self): stranger = { 'id': 1, 'languages': None, 'sex': None, 'partner_sex': None, 'telegram_id': 110, } receive_message(stranger['telegram_id'], '/start') await assert_language_prompt( stranger, '*Rand Talk:* Enumerate the languages you speak like this: “English,' ' Italian” — in descending order of your speaking convenience or just' ' pick one at special keyboard.', )
async def test_partners_sex(self): setup_db({ 'strangers': [STRANGER_PARTNER_SEX], }) receive_message(STRANGER_PARTNER_SEX['telegram_id'], 'Male') await assert_setup_finished(STRANGER_PARTNER_SEX['telegram_id']) assert_db({ 'strangers': [ { 'id': STRANGER_PARTNER_SEX['id'], 'partner_sex': 'male', 'wizard': 'none', 'wizard_step': None, }, ], })
async def test_message_from_partner1_to_partner2__reply(self): setup_db({ 'strangers': [STRANGER1_1, STRANGER1_2], 'talks': [TALK1], }) receive_message(STRANGER1_1['telegram_id'], 'Hello', reply_to_message=31416) await assert_sent_message( STRANGER1_1['telegram_id'], '*Rand Talk:* Messages of this type aren\'t supported 😞', ) assert_db({ 'strangers': [STRANGER1_1, STRANGER1_2], 'talks': [TALK1], })
async def test_language__too_much_languages(self): setup_db({ 'strangers': [STRANGER_LANGUAGES], }) receive_message(STRANGER_LANGUAGES['telegram_id'], 'en, ru, fr, uk, it, de, pt') await assert_sent_message( STRANGER_LANGUAGES['telegram_id'], '*Rand Talk:* Too much languages were specified. Please shorten your list to 6' ' languages.', ) await assert_language_prompt( STRANGER_LANGUAGES, '*Rand Talk:* Enumerate the languages you speak like this: “English,' ' Italian” — in descending order of your speaking convenience or just' ' pick one at special keyboard.', )
async def test_sex__not_specified(self): setup_db({ 'strangers': [STRANGER_SEX], }) receive_message(STRANGER_SEX['telegram_id'], 'Not specified') await assert_setup_finished(STRANGER_SEX['telegram_id']) assert_db({ 'strangers': [ { 'id': STRANGER_SEX['id'], 'sex': 'not_specified', 'partner_sex': 'not_specified', 'wizard': 'none', 'wizard_step': None, }, ], })
async def test_end_chat__last_bonus_was_spent(self): stranger3_1_last_bonus = { 'id': 31, 'bonus_count': 1, 'invitation': '31_invitation', 'languages': '["en"]', 'partner_sex': 'not_specified', 'sex': 'not_specified', 'telegram_id': 310, } talk3_spending_last_bonus = { 'id': 1, 'partner1_id': stranger3_1_last_bonus['id'], 'partner1_sent': 1, 'partner2_id': STRANGER3_2['id'], 'partner2_sent': 1, 'searched_since': datetime.datetime(1970, 1, 1) } setup_db({ 'strangers': [stranger3_1_last_bonus, STRANGER3_2], 'talks': [talk3_spending_last_bonus], }) receive_message(stranger3_1_last_bonus['telegram_id'], '/end') await assert_sent_message( stranger3_1_last_bonus['telegram_id'], '*Rand Talk:* Chat was finished. You\'ve used your last bonus. Feel free' ' to /begin a new one.', ) await assert_sent_message( STRANGER3_2['telegram_id'], '*Rand Talk:* Your partner has left chat. 😿 Feel free to /begin a new one.', ) assert_db({ 'strangers': [ { 'id': stranger3_1_last_bonus['id'], 'bonus_count': 0, }, ], 'talks': [ { 'id': talk3_spending_last_bonus['id'], 'end': datetime.datetime.utcnow(), }, ], })
async def test_start_by_wrong_invitation__invalid_json(self): setup_db({ 'strangers': [STRANGER1_2], }) receive_message( STRANGER1_2['telegram_id'], get_invitation_message(invitation_json='{\"foo\"', ), ) await assert_sent_message( STRANGER1_2['telegram_id'], '*Rand Talk:* *Manual*\n\n' 'Use /begin to start looking for a conversational partner, once you\'re matched you' ' can use /end to finish the conversation.', ) assert_db({ 'strangers': [STRANGER1_2], })
async def test_start_by_invitation_repeatedly(self): setup_db({ 'strangers': [STRANGER1_1_INVITER, STRANGER1_1], }) receive_message( STRANGER1_1['telegram_id'], get_invitation_message( invitation=STRANGER1_1_INVITER['invitation']), ) await assert_sent_message( STRANGER1_1['telegram_id'], '*Rand Talk:* *Manual*\n\n' 'Use /begin to start looking for a conversational partner, once you\'re matched you' ' can use /end to finish the conversation.', ) assert_db({ 'strangers': [STRANGER1_1_INVITER, STRANGER1_1], })
async def test_end_search(self): stranger = STRANGER2_1 setup_db({ 'strangers': [stranger], }) receive_message(stranger['telegram_id'], '/end') await assert_sent_message( stranger['telegram_id'], '*Rand Talk:* Looking for partner was stopped', ) assert_db({ 'strangers': [ { 'id': stranger['id'], 'looking_for_partner_from': None, }, ], })
async def test_unsuccessful_search(ratio, text): from randtalkbot.stranger import asyncio as asyncio_mock setup_db({ 'strangers': [STRANGER1_1, STRANGER1_2, STRANGER2_1], 'talks': [TALK3], }) with patch('randtalkbot.stranger.StatsService'): from randtalkbot.stranger import StatsService as stats_service_mock stats_service_mock.get_instance \ .return_value \ .get_stats \ .return_value \ .get_sex_ratio \ .return_value = ratio with patch('randtalkbot.stranger.asyncio.sleep', CoroutineMock()): receive_message(STRANGER1_1['telegram_id'], '/begin') await assert_sent_message( STRANGER1_1['telegram_id'], '*Rand Talk:* Looking for a stranger for you 🤔', ) asyncio_mock.sleep.assert_called_once_with(30) assert_db({ 'strangers': [ { 'id': STRANGER1_1['id'], 'looking_for_partner_from': datetime.datetime.utcnow() }, ], }) await assert_sent_message(STRANGER1_1['telegram_id'], text, disable_notification=True) await assert_sent_message( STRANGER1_1['telegram_id'], '*Rand Talk:* Do[\u2009](http://randtalk.ml/static/img/logo-125x125.png) you want' ' to talk with somebody, practice in foreign languages or you just' ' want to have some fun? Rand Talk will help you! It\'s a bot matching you' ' with a random stranger of desired sex speaking on your language. [Check it out!]' '(https://telegram.me/RandTalkBot?start=eyJpIjoiZm9vX2ludml0YXRpb24ifQ==)', disable_notification=True, )
async def test_successful_search__matches_the_longest_waiting_stranger_2(self): setup_db({ 'strangers': [STRANGER4_1, STRANGER4_WAITED_LONGER, STRANGER4_WAITED_LONGEST], }) receive_message(STRANGER4_1['telegram_id'], '/begin') assert_db({ 'talks': [TALK4_2], }) await assert_sent_message( STRANGER4_WAITED_LONGEST['telegram_id'], '*Rand Talk:* Your partner is here. Have a nice chat 🤗', ) await assert_sent_message( STRANGER4_1['telegram_id'], re.compile( r'\*Rand Talk:\* Your partner is here\. Your partner\'s been looking for you for' r' \d+ hr\. Say him “Hello” — if he doesn\'t respond to you, launch search again' r' by /begin command\.', ), )
async def test_successful_search__matches_stranger_with_proper_sex_1(self): setup_db({ 'strangers': [STRANGER5_1, STRANGER5_FEMALE_1, STRANGER5_MALE], }) receive_message(STRANGER5_1['telegram_id'], '/begin') assert_db({ 'talks': [TALK5], }) await assert_sent_message( STRANGER5_MALE['telegram_id'], '*Rand Talk:* Your partner is here. Have a nice chat 🤗', ) await assert_sent_message( STRANGER5_1['telegram_id'], re.compile( r'\*Rand Talk:\* Your partner is here\. Your partner\'s been looking for you for' r' \d+ hr\. Say him “Hello” — if he doesn\'t respond to you, launch search again' r' by /begin command\.', ), )
async def test_successful_search__matches_stranger_speaking_on_preferred_language_2(self): setup_db({ 'strangers': [STRANGER7_1, STRANGER7_SPEAKS_RU, STRANGER7_SPEAKS_FA], }) receive_message(STRANGER7_1['telegram_id'], '/begin') assert_db({ 'talks': [TALK7_2], }) await assert_sent_message( STRANGER7_SPEAKS_FA['telegram_id'], '*Rand Talk:* Your partner is here. Have a nice chat 🤗', ) await assert_sent_message( STRANGER7_1['telegram_id'], re.compile( r'\*Rand Talk:\* Your partner is here\. Use فارسی please\. Your partner\'s been' r' looking for you for \d+ hr\. Say him “Hello” — if he doesn\'t respond to you,' r' launch search again by /begin command\.', ), )
async def test_start__has_one_language(self): stranger = { 'id': 1, 'invitation': '11_invitation', 'languages': '["en"]', 'sex': 'male', 'partner_sex': 'male', 'telegram_id': 110, } setup_db({ 'strangers': [stranger], }) receive_message(stranger['telegram_id'], '/setup') await assert_language_prompt( stranger, '*Rand Talk:* Your current language is English. Enumerate the languages you speak like' ' this: “English, Italian” — in descending order of your speaking convenience or just' ' pick one at special keyboard.', leave_language_unchanged=True, )
async def test_start__has_many_languages(self): stranger = { 'id': 1, 'invitation': '11_invitation', 'languages': '["en", "fr"]', 'sex': 'female', 'partner_sex': 'female', 'telegram_id': 110, } setup_db({ 'strangers': [stranger], }) receive_message(stranger['telegram_id'], '/setup') await assert_language_prompt( stranger, '*Rand Talk:* Your current languages are: English, French. Enumerate the languages you' ' speak the same way, in descending order of your speaking convenience or just' ' pick one at special keyboard.', leave_languages_unchanged=True, )
async def test_end_chat__no_bonuses(self): setup_db({ 'strangers': [STRANGER3_1, STRANGER3_2], 'talks': [TALK3], }) receive_message(STRANGER3_1['telegram_id'], '/end') await assert_sent_message( STRANGER3_1['telegram_id'], '*Rand Talk:* Chat was finished. Feel free to /begin a new one.', ) await assert_sent_message( STRANGER3_2['telegram_id'], '*Rand Talk:* Your partner has left chat. 😿 Feel free to /begin a new one.', ) assert_db({ 'talks': [ { 'id': TALK3['id'], 'end': datetime.datetime.utcnow(), }, ], })