async def test_send_missing_data(self): """In this test, the user uses neither email, telegram or sms.""" user_id = self.db.add_user_to_icu( self.admin, self.icu.icu_id, store.User(name='user1') ) user = self.db.get_user(user_id) msg = message.Message(self.icu, user, 'some_url') self.assertFalse(await self.sender.send(msg, user))
def messages(self): """For debug purpose only""" users = self.db.get_users() result = [] for user in users: for icu in user.icus: url = self.updater.get_user_url(user, icu.icu_id) result.append(message.Message(icu, user, url)) return result
def schedule(self, user, icu, delay: Optional[int] = None) -> bool: user_icus = {i.icu_id: i for i in user.icus} if not user.is_active or not icu.is_active or icu.icu_id not in user_icus: user_id, icu_id = user.user_id, icu.icu_id logging.info(f'Cannot send message to user {user_id} in icu {icu_id}') return False url = self.updater.get_user_url(user, icu.icu_id) msg = message.Message(icu, user, url) return self.schedule_message(msg, delay)
def test_format(self): url = 'some url' msg = message.Message(self.icu, self.user, url) self.formatter.format(msg) self.assertNotEmpty(msg.text) self.assertNotEmpty(msg.html) to_be_tested = itertools.product([url, self.user.name, self.icu.name], [msg.text, msg.html]) for item, text in to_be_tested: self.assertContainsSubsequence(text, item)
def test_schedule_message(self): msg = message.Message(self.icu, self.user, url='url') self.assertEqual(len(self.scheduler.timeouts), 0) delay = 100 success = self.scheduler.schedule_message(msg, delay=delay) self.assertTrue(success) self.assertEqual(len(self.scheduler.timeouts), 1) key = self.user_id, self.icu_id timeout = self.scheduler.timeouts.get(key, None) self.assertIsNotNone(timeout) self.assertTrue(timeout.when, fake_now + delay) # another message with smaller delay: in offset = -2 success = self.scheduler.schedule_message(msg, delay=delay + offset) self.assertTrue(success) timeout = self.scheduler.timeouts.get(key, None) self.assertIsNotNone(timeout) self.assertTrue(timeout.when, fake_now + delay + offset) # another message with negative delay success = self.scheduler.schedule_message(msg, delay=-1) self.assertFalse(success) # Another user same icu: another entry user = store.User(name='jacqueline', telephone='12333') userid = self.db.add_user_to_icu(self.admin, self.icu_id, user) user = self.db.get_user(userid) offset = 100 msg2 = message.Message(self.icu, user, url='url') success = self.scheduler.schedule_message(msg2, delay=delay + offset) self.assertTrue(success) self.assertEqual(len(self.scheduler.timeouts), 2) # Same user new icu: new entry icuid = self.db.add_icu(self.admin, store.ICU(name='anothericu')) self.db.assign_user_to_icu(self.admin, userid, icuid) icu = self.db.get_icu(icuid) msg3 = message.Message(icu, user, url='url') success = self.scheduler.schedule_message(msg3, delay=delay + offset) self.assertTrue(success) self.assertEqual(len(self.scheduler.timeouts), 3)
async def test_do_send(self): msg = message.Message(self.icu, self.user, url='url') await self.scheduler.do_send(msg) # response = self.wait() self.assertEqual(len(self.queue.data), 1) self.assertEqual(msg.first_sent, fake_now) self.assertEqual(msg.attempts, 1) self.assertEqual(len(self.scheduler.timeouts), 1) timeout = self.scheduler.timeouts.get(msg.key, None) self.assertIsNotNone(timeout) self.assertEqual(timeout.when, self.scheduler.reminder_delay + fake_now)
async def test_send_bot(self): """In this test, the user uses neither email, telegram or sms.""" user_id = self.db.add_user_to_icu( self.admin, self.icu.icu_id, store.User(name='user1', telegram_chat_id='65451') ) user = self.db.get_user(user_id) url = 'some_url' msg = message.Message(self.icu, user, url) self.assertTrue(await self.sender.send(msg, user)) self.assertGreater(len(self.bot.client.requests), 0) self.assertIn(url, self.bot.client.requests[-1].body.decode())
def build_messages(self): """Build the messages to be sent to each user depending on its ICU.""" users_df = self.db.get_users() self.messages = [] for index, row in users_df.iterrows(): url = "{}{}?id={}".format( self.base_url, update.UpdateHandler.ROUTE.strip('/'), self.token_encoder.encode_icu(row.icu_id, row.icu_name)) text = self.MESSAGE_TEMPLATE.format(row['name'], row['icu_name'], url) self.urls.append(f'{row.icu_name}: {url}') self.messages.append( message.Message(text, row.telephone, row.icu_id, row.icu_name))
async def test_send_email(self): """In this test, the user uses neither email, telegram or sms.""" user_id = self.db.add_user_to_icu( self.admin, self.icu.icu_id, store.User(name='user1', email='*****@*****.**') ) # Reset the sender allowing SMTP self.config.SMTP_HOST = 'some_host' self.sender = sender.Sender( self.config, self.db, self.queue, tg_bot=self.bot ) user = self.db.get_user(user_id) msg = message.Message(self.icu, user, 'some_url') self.assertTrue(await self.sender.send(msg, user))