コード例 #1
0
 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,
             },
         ]
     })
コード例 #2
0
 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',
             },
         ],
     })
コード例 #3
0
 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(),
             },
         ],
     })
コード例 #4
0
 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],
     })
コード例 #5
0
 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,
             },
         ],
     })
コード例 #6
0
 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],
     })
コード例 #7
0
 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],
     })
コード例 #8
0
 async def test_nonsense_end(self):
     stranger = STRANGER2_1
     setup_db({
         'strangers': [stranger],
         })
     receive_message(stranger['telegram_id'], '/end')
     assert_db({
         'strangers': [stranger],
         })
コード例 #9
0
 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')
コード例 #10
0
 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],
     })
コード例 #11
0
 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],
     })
コード例 #12
0
 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.',
     )
コード例 #13
0
 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.',
     )
コード例 #14
0
 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,
             },
         ],
     })
コード例 #15
0
 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.',
     )
コード例 #16
0
 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,
             },
         ],
     })
コード例 #17
0
 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],
     })
コード例 #18
0
 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.',
     )
コード例 #19
0
 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,
             },
         ],
     })
コード例 #20
0
 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(),
                 },
             ],
         })
コード例 #21
0
 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],
     })
コード例 #22
0
 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],
     })
コード例 #23
0
 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,
                 },
             ],
         })
コード例 #24
0
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,
    )
コード例 #25
0
 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\.',
             ),
         )
コード例 #26
0
 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\.',
             ),
         )
コード例 #27
0
 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\.',
             ),
         )
コード例 #28
0
 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,
     )
コード例 #29
0
 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,
     )
コード例 #30
0
 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(),
                 },
             ],
         })