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)
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)
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)
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)
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)
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)
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)
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)
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))
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)
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)
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)
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)
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)
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)
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)
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)
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)
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()
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))