예제 #1
0
 def test_filter_messages_by_sender_username(self):
     # Add dummy messages
     Message.generate_fake(5)
     # Add 2 legit messages
     Message(sender_username='******').save()
     Message(sender_username='******').save()
     # Get messages
     msgs = procedures.filter_messages(username='******')
     self.assertEqual(len(msgs), 2)
예제 #2
0
 def test_filter_messages_by_time(self):
     # Add dummy messages
     Message.generate_fake(10)
     # Add 2 legit messages
     Message(date=datetime.now() - timedelta(minutes=30)).save()
     Message(date=datetime.now() - timedelta(minutes=60)).save()
     # Get messages
     msgs = procedures.filter_messages(time_min=90)
     self.assertEqual(len(msgs), 2)
예제 #3
0
 def test_filter_messages_by_botid(self):
     # Add dummy messages
     Message.generate_fake(5)
     # Add 2 legit messages
     Message(bot_id=1234).save()
     Message(bot_id=1234).save()
     # Get messages
     msgs = procedures.filter_messages(botid=1234)
     self.assertEqual(len(msgs), 2)
예제 #4
0
 def test_filter_messages_by_sender_text(self):
     # Add dummy messages
     Message.generate_fake(5)
     # Add 2 legit messages
     Message(text_content='text-12345').save()
     Message(text_content='TEXT-abcde').save()
     # Get messages
     msgs = procedures.filter_messages(text='text')
     self.assertEqual(len(msgs), 2)
예제 #5
0
 def test_filter_messages_by_sender_lastname(self):
     # Add dummy messages
     Message.generate_fake(5)
     # Add 2 legit messages
     Message(sender_firstname='doe', sender_lastname='john').save()
     Message(sender_firstname='angel', sender_lastname='johnny').save()
     # Get messages
     msgs = procedures.filter_messages(name='john')
     self.assertEqual(len(msgs), 2)
예제 #6
0
 def test_filter_messages_by_chatid(self):
     for _ in range(3):
         Message(chatid=123).save()
         Message(chatid=random.randint(200, 300)).save()
     # Get messages
     response = self.client.get(url_for('botapi.filter_messages_by_chatid',
                                        chatid=123),
                                headers=self.get_api_headers())
     self.assertEqual(response.status_code, 200)
     json_response = json.loads(response.data.decode('utf-8'))
     self.assertEqual(json_response['result'], 'success')
     self.assertEqual(len(json_response['messages']), 3)
예제 #7
0
 def test_filter_messages_by_sender_firstname_lastname(self):
     # Add dummy messages
     Message.generate_fake(10)
     # Remove any message with (possibly) matching names.
     Message.objects(
         Q(sender_firstname__icontains='john')
         | Q(sender_lastname__icontains='john')).delete()
     # Add 2 legit messages
     Message(sender_firstname='doe', sender_lastname='john').save()
     Message(sender_firstname='johnathen', sender_lastname='angel').save()
     # Get messages
     msgs = procedures.filter_messages(name='john')
     self.assertEqual(len(msgs), 2)
예제 #8
0
 def test_filter_messages_by_username(self):
     for _ in range(3):
         Message(sender_username='******').save()
         Message(sender_username='******' +
                 str(random.randint(2, 10))).save()
     # Get messages
     response = self.client.get(url_for(
         'botapi.filter_messages_by_username', username='******'),
                                headers=self.get_api_headers())
     self.assertEqual(response.status_code, 200)
     json_response = json.loads(response.data.decode('utf-8'))
     self.assertEqual(json_response['result'], 'success')
     self.assertEqual(len(json_response['messages']), 3)
예제 #9
0
def log_message(bot, update):
    """
    Handler for logging incoming messages to the database. It extracts
    sender's information i.e. username, firstname, lastname from incoming
    message along with message_text, ID of bot which received the message as
    well as message and chat id. The extracted information is logged into the
    database.
    :param bot: telegram.bot object receiving the message.
    :param update: message update received by the bot.
    :return:
    """
    message = update.message
    sender = message.from_user
    try:
        Message(msg_id=message.message_id,
                date=message.date,
                sender_username=sender.username,
                sender_firstname=sender.first_name,
                sender_lastname=sender.last_name,
                chatid=message.chat_id,
                text_content=message.text,
                bot_id=bot.id).save()
        proc_logger.info(
            'New message:{msg_id} logged for chat:{chatid} by bot:'
            '{bot_uname}'.format(msg_id=message.message_id,
                                 chatid=update.message.chatid,
                                 bot_uname=bot.username))
    except Exception as e:
        raise ValueError(
            'Unable to log message. Reason{reason}'.format(reason=e.message))
예제 #10
0
    def test_filter_messages_using_user_firstname_lastname(self):
        # Add some dummy messages
        Message.generate_fake(5)
        Message(sender_firstname='testuser').save()
        Message(sender_lastname='usertest').save()
        Message(sender_firstname='test', sender_lastname='user').save()
        Message(sender_firstname='user', sender_lastname='test').save()
        self.assertEqual(Message.objects.count(), 5 + 4)

        # Get filtered messages
        response = self.client.get(url_for('botapi.filter_messages',
                                           botid=0,
                                           time_off=0,
                                           text='#',
                                           username='******',
                                           name='test'),
                                   headers=self.get_api_headers())
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertEqual(json_response['result'], 'success')
        self.assertEqual(len(json_response['messages']), 4)
예제 #11
0
    def test_filter_messages_using_no_criteria(self):
        # Add some dummy messages
        Message.generate_fake(5)
        Message(bot_id=1234).save()
        Message(date=datetime.now() - timedelta(hours=1.5)).save()
        Message(text_content='message1234').save()
        Message(sender_username='******').save()
        Message(sender_firstname='test', sender_lastname='user').save()
        self.assertEqual(Message.objects.count(), 5 + 5)

        # Get filtered messages
        response = self.client.get(url_for('botapi.filter_messages',
                                           botid=0,
                                           time_off=0,
                                           text='#',
                                           username='******',
                                           name='#'),
                                   headers=self.get_api_headers())
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertEqual(json_response['result'], 'success')
        self.assertEqual(len(json_response['messages']), 10)
예제 #12
0
    def test_filter_messages_using_all_criteria(self):
        # Add dummy messages
        Message.generate_fake(5)
        # Add partially matching messages.
        Message(
            date=datetime.now() - timedelta(minutes=30),  # Un-match time.
            sender_username='******',
            sender_firstname='test',
            sender_lastname='bot',
            text_content='testmessage',
            bot_id=12345).save()
        Message(
            date=datetime.now() - timedelta(minutes=10),
            sender_username='******',  # Non-matching sender-username.
            sender_firstname='test',
            sender_lastname='bot',
            text_content='testmessage',
            bot_id=12345).save()
        Message(
            date=datetime.now() - timedelta(minutes=10),
            sender_username='******',
            sender_firstname='abc',  # Non-matching first-name, last-name
            sender_lastname='def',
            text_content='testmessage',
            bot_id=12345).save()
        Message(
            date=datetime.now() - timedelta(minutes=10),
            sender_username='******',
            sender_firstname='test',
            sender_lastname='bot',
            text_content='message',  # Non-matching text content
            bot_id=12345).save()
        Message(date=datetime.now() - timedelta(minutes=10),
                sender_username='******',
                sender_firstname='Test',
                sender_lastname='Bot',
                text_content='testmessage',
                bot_id=11111).save()  # Non-matching botid
        # Add expected message.
        Message(date=datetime.now() - timedelta(minutes=10),
                sender_username='******',
                sender_firstname='test',
                sender_lastname='bot',
                text_content='testmessage',
                bot_id=12345).save()

        # Get filtered messages
        response = self.client.get(url_for('botapi.filter_messages',
                                           botid=12345,
                                           time_off=15,
                                           text='test',
                                           username='******',
                                           name='test'),
                                   headers=self.get_api_headers())
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertEqual(json_response['result'], 'success')
        self.assertEqual(len(json_response['messages']), 1)
예제 #13
0
 def test_message_creation(self):
     m_id = random.randint(1, 100000)
     Message(msg_id=m_id,
             date=datetime.now(),
             sender_username='******',
             sender_firstname='test',
             sender_lastname='sender',
             chatid=random.randint(1, 1000),
             text_content='text message',
             bot_id=random.randint(1, 25)).save()
     msg = Message.objects(msg_id=m_id).first()
     self.assertIsNotNone(msg)
     self.assertEqual(msg.sender_username, 'test_sender')
     self.assertEqual(msg.sender_firstname, 'test')
     self.assertEqual(msg.sender_lastname, 'sender')
     self.assertEqual(msg.text_content, 'text message')
     self.assertEqual(Message.objects.count(), 1)
예제 #14
0
 def test_filter_messages_by_all_criteria(self):
     # Add dummy messages
     Message.generate_fake(5)
     # Add partially matching messages.
     Message(
         date=datetime.now() - timedelta(minutes=30),  # Un-match time.
         sender_username='******',
         sender_firstname='test',
         sender_lastname='bot',
         text_content='testmessage',
         bot_id=12345).save()
     Message(
         date=datetime.now() - timedelta(minutes=10),
         sender_username='******',  # Non-matching sender-username.
         sender_firstname='test',
         sender_lastname='bot',
         text_content='testmessage',
         bot_id=12345).save()
     Message(
         date=datetime.now() - timedelta(minutes=10),
         sender_username='******',
         sender_firstname='abc',  # Non-matching first-name, last-name
         sender_lastname='def',
         text_content='testmessage',
         bot_id=12345).save()
     Message(
         date=datetime.now() - timedelta(minutes=10),
         sender_username='******',
         sender_firstname='test',
         sender_lastname='bot',
         text_content='message',  # Non-matching text content
         bot_id=12345).save()
     Message(date=datetime.now() - timedelta(minutes=10),
             sender_username='******',
             sender_firstname='Test',
             sender_lastname='Bot',
             text_content='testmessage',
             bot_id=11111).save()  # Non-matching botid
     # Add expected message.
     Message(date=datetime.now() - timedelta(minutes=10),
             sender_username='******',
             sender_firstname='test',
             sender_lastname='bot',
             text_content='testmessage',
             bot_id=12345).save()
     # Get messages
     msgs = procedures.filter_messages(botid=12345,
                                       time_min=15,
                                       text='test',
                                       username='******',
                                       name='test')
     self.assertEqual(len(msgs), 1)
예제 #15
0
    def test_filter_messages_using_time_off(self):
        # Add some dummy messages
        Message.generate_fake(5)
        for _ in range(5):
            Message(date=datetime.now() - timedelta(minutes=20)).save()
        self.assertEqual(Message.objects.count(), 5 + 5)

        # Get filtered messages
        response = self.client.get(url_for('botapi.filter_messages',
                                           botid=0,
                                           time_off=40,
                                           text='#',
                                           username='******',
                                           name='#'),
                                   headers=self.get_api_headers())
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertEqual(json_response['result'], 'success')
        self.assertEqual(len(json_response['messages']), 5)
예제 #16
0
    def test_filter_messages_using_text(self):
        # Add some dummy messages
        Message.generate_fake(5)
        for _ in range(5):
            Message(text_content='message:' +
                    random.choice(string.ascii_letters)).save()
        self.assertEqual(Message.objects.count(), 5 + 5)

        # Get filtered messages
        response = self.client.get(url_for('botapi.filter_messages',
                                           botid=0,
                                           time_off=0,
                                           text='message',
                                           username='******',
                                           name='#'),
                                   headers=self.get_api_headers())
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertEqual(json_response['result'], 'success')
        self.assertEqual(len(json_response['messages']), 5)
예제 #17
0
    def test_filter_messages_using_botid(self):
        # Add some dummy messages
        MyBot.generate_fake(1)
        Message.generate_fake(5)
        bot = MyBot(bot_id=11111, token='dummy-token', test_bot=True).save()
        self.assertIsNotNone(bot)
        for _ in range(3):
            Message(bot_id=bot.bot_id).save()
        self.assertEqual(Message.objects.count(), 5 + 3)

        # Get filtered messages
        response = self.client.get(url_for('botapi.filter_messages',
                                           botid=bot.bot_id,
                                           time_off=0,
                                           text='#',
                                           username='******',
                                           name='#'),
                                   headers=self.get_api_headers())
        self.assertEqual(response.status_code, 200)
        json_response = json.loads(response.data.decode('utf-8'))
        self.assertEqual(json_response['result'], 'success')
        self.assertEqual(len(json_response['messages']), 3)
예제 #18
0
    def test_get_bot_info(self):
        base_address = 'http://127.0.0.1:5000/web/index'
        # Add a special bot and some expected messages.
        bot = MyBot(bot_id=123456,
                    username='******',
                    token='special-dummy-token',
                    first_name='special',
                    last_name='bot').save()
        for i in range(5):
            Message(bot_id=bot.bot_id, text_content='message' + str(i)).save()

        # navigate to home page
        self.client.get(base_address)
        # Navigate to filtering page
        self.client.find_element_by_link_text('Get-Bot-Info').click()
        self.assertTrue(
            re.search('Get Bot Information', self.client.page_source,
                      re.IGNORECASE))

        self.client.find_element_by_name('choose_bot').send_keys(bot.username)
        self.client.find_element_by_name('submit').click()

        # Redirected to bot information page. Make Assertions.
        self.assertTrue(
            re.search(bot.username, self.client.page_source, re.IGNORECASE))
        self.assertTrue(
            re.search(
                '{fname}\s+{lname}'.format(fname=bot.first_name,
                                           lname=bot.last_name),
                self.client.page_source, re.IGNORECASE))
        self.assertTrue(
            re.search('Token:\s+{token}'.format(token=bot.token),
                      self.client.page_source, re.IGNORECASE))
        msgs = Message.objects(bot_id=bot.bot_id).all()
        for msg in msgs:
            self.assertTrue(msg.text_content in self.client.page_source)
예제 #19
0
 def test_invalid_message_creation(self):
     with self.assertRaises(mongoengine.ValidationError):
         # Invalid datetime
         Message(msg_id=1,
                 date='a',
                 sender_lastname='sender',
                 sender_username='******',
                 sender_firstname='test',
                 chatid=1,
                 text_content='text message',
                 bot_id=1).save()
     with self.assertRaises(mongoengine.ValidationError):
         # Invalid sender_lastname
         Message(msg_id=1,
                 date=datetime.now(),
                 sender_lastname=1,
                 sender_username='******',
                 sender_firstname='test',
                 chatid=1,
                 text_content='text message',
                 bot_id=1).save()
     with self.assertRaises(mongoengine.ValidationError):
         # Invalid sender_username
         Message(msg_id=1,
                 date=datetime.now(),
                 sender_lastname='test',
                 sender_username=1,
                 sender_firstname='test',
                 chatid=1,
                 text_content='text message',
                 bot_id=1).save()
     with self.assertRaises(mongoengine.ValidationError):
         # Invalid sender_firstname
         Message(msg_id=1,
                 date=datetime.now(),
                 sender_lastname='test',
                 sender_username='******',
                 sender_firstname=1,
                 chatid=1,
                 text_content='text message',
                 bot_id=1).save()
     with self.assertRaises(mongoengine.ValidationError):
         # Invalid chatid
         Message(msg_id=1,
                 date=datetime.now(),
                 sender_lastname='test',
                 sender_username='******',
                 sender_firstname='test',
                 chatid='a',
                 text_content='text message',
                 bot_id=1).save()
     with self.assertRaises(mongoengine.ValidationError):
         # Invalid text_content
         Message(msg_id=1,
                 date=datetime.now(),
                 sender_lastname='test',
                 sender_username='******',
                 sender_firstname='test',
                 chatid=1,
                 text_content=2,
                 bot_id=1).save()
     with self.assertRaises(mongoengine.ValidationError):
         # Invalid bot_id
         Message(msg_id=1,
                 date=datetime.now(),
                 sender_lastname='test',
                 sender_username='******',
                 sender_firstname='test',
                 chatid=1,
                 text_content='text-content',
                 bot_id='id').save()
예제 #20
0
    def test_filtering_method(self):
        bot = MyBot.objects.first()
        # Add partially matching messages.
        Message(
            date=datetime.now() - timedelta(minutes=30),
            # Un-match time.
            sender_username='******',
            sender_firstname='test',
            sender_lastname='bot',
            text_content='testmessage',
            bot_id=bot.bot_id).save()
        Message(
            date=datetime.now() - timedelta(minutes=10),
            sender_username='******',  # Non-matching sender-username.
            sender_firstname='test',
            sender_lastname='bot',
            text_content='testmessage',
            bot_id=bot.bot_id).save()
        Message(
            date=datetime.now() - timedelta(minutes=10),
            sender_username='******',
            sender_firstname='abc',
            # Non-matching first-name, last-name
            sender_lastname='def',
            text_content='testmessage',
            bot_id=bot.bot_id).save()
        Message(
            date=datetime.now() - timedelta(minutes=10),
            sender_username='******',
            sender_firstname='test',
            sender_lastname='bot',
            text_content='message',  # Non-matching text content
            bot_id=bot.bot_id).save()
        Message(date=datetime.now() - timedelta(minutes=10),
                sender_username='******',
                sender_firstname='Test',
                sender_lastname='Bot',
                text_content='testmessage',
                bot_id=11111).save()  # Non-matching botid
        # Add expected message.
        Message(date=datetime.now() - timedelta(minutes=10),
                sender_username='******',
                sender_firstname='test',
                sender_lastname='bot',
                text_content='testmessage',
                bot_id=bot.bot_id).save()

        base_address = 'http://127.0.0.1:5000/web/index'
        # navigate to home page
        self.client.get(base_address)

        # Navigate to filering page
        self.client.find_element_by_link_text('Filter').click()
        self.assertTrue(
            re.search('Decide Filtering Criteria', self.client.page_source,
                      re.IGNORECASE))

        # Add some filtering criteria
        self.client.find_element_by_name('fn_ln_field').send_keys('test')
        self.client.find_element_by_name('time_field').send_keys('30')
        self.client.find_element_by_name('time_int_field').send_keys('30')
        self.client.find_element_by_name('username_field').send_keys('tester1')
        self.client.find_element_by_name('text_field').send_keys('test')
        self.client.find_element_by_name('submit').click()
        # Ensure that we went to right page
        self.assertTrue(
            re.search('Filtered Messages', self.client.page_source,
                      re.IGNORECASE))
        self.assertTrue(
            re.search('Text:\s+test', self.client.page_source, re.IGNORECASE))
        self.assertTrue(
            re.search('sender username:\s+tester1', self.client.page_source,
                      re.IGNORECASE))
        self.assertTrue(
            re.search('sender name:\s+test', self.client.page_source,
                      re.IGNORECASE))
        self.assertTrue(
            re.search('Time:\s+30', self.client.page_source, re.IGNORECASE))
        self.assertTrue(
            re.search('received from:\s+test\s+bot', self.client.page_source,
                      re.IGNORECASE))