def setUp(self): stats.database_proxy.initialize(self.database) self.database.create_tables([Stats]) self.update_stats = StatsService._update_stats StatsService._update_stats = Mock() self.stats_service = StatsService() self.stats = Mock() self.stats.created = datetime.datetime(1990, 1, 1) self.stats_service._stats = self.stats
def run(ctx): debug = False if debug: logging.basicConfig( format='%(asctime)s %(name)s:%(funcName)s - %(message)s', level=logging.DEBUG, ) bot = Bot(get_configuration_mock()) loop = asyncio.get_event_loop() ctx.task = loop.create_task(bot.run()) ctx.database = SqliteDatabase(':memory:') stats.DATABASE_PROXY.initialize(ctx.database) stranger.DATABASE_PROXY.initialize(ctx.database) talk.DATABASE_PROXY.initialize(ctx.database) ctx.database.create_tables([Stats, Stranger, Talk]) StatsService()
def test_get_instance__runtime_error(self): del StatsService._instance with self.assertRaises(RuntimeError): StatsService.get_instance()
def test_get_instance__ok(self): self.assertEqual(StatsService.get_instance(), self.stats_service)
class TestStatsService(asynctest.TestCase): def __init__(self, *args, **kwargs): super(TestStatsService, self).__init__(*args, **kwargs) self.database = SqliteDatabase(':memory:') def setUp(self): stats.database_proxy.initialize(self.database) self.database.create_tables([Stats]) self.update_stats = StatsService._update_stats StatsService._update_stats = Mock() self.stats_service = StatsService() self.stats = Mock() self.stats.created = datetime.datetime(1990, 1, 1) self.stats_service._stats = self.stats def tearDown(self): self.database.drop_tables([Stats]) StatsService._update_stats = self.update_stats @asynctest.ignore_loop def test_init__no_stats_in_db(self): self.stats_service._update_stats.assert_called_once_with() stats_service = StatsService() self.assertEqual(stats_service._stats, None) @asynctest.ignore_loop def test_init__some_stats_in_db_1(self): stats1 = Stats.create(data_json='', created=datetime.datetime(1980, 1, 1)) stats2 = Stats.create(data_json='', created=datetime.datetime(1990, 1, 1)) stats_service = StatsService() self.assertEqual(stats_service._stats, stats2) @asynctest.ignore_loop def test_init__some_stats_in_db_2(self): stats1 = Stats.create(data_json='', created=datetime.datetime(1990, 1, 1)) stats2 = Stats.create(data_json='', created=datetime.datetime(1980, 1, 1)) stats_service = StatsService() self.assertEqual(stats_service._stats, stats1) @asynctest.ignore_loop def test_get_instance__ok(self): self.assertEqual(StatsService.get_instance(), self.stats_service) @asynctest.ignore_loop def test_get_instance__runtime_error(self): del StatsService._instance with self.assertRaises(RuntimeError): StatsService.get_instance() @asynctest.ignore_loop def test_get_stats(self): self.assertEqual(self.stats_service.get_stats(), self.stats) @patch('randtalkbot.stats_service.asyncio', CoroutineMock()) @patch('randtalkbot.stats_service.datetime', Mock()) async def test_run__ok(self): from randtalkbot.stats_service import asyncio from randtalkbot.stats_service import datetime as datetime_mock self.stats_service._update_stats.reset_mock() datetime_mock.datetime.utcnow.side_effect = [datetime.datetime(1990, 1, 1, 3), RuntimeError] with self.assertRaises(RuntimeError): await self.stats_service.run() asyncio.sleep.assert_called_once_with(3600) self.stats_service._update_stats.assert_called_once_with() @patch('randtalkbot.stats_service.asyncio') @patch('randtalkbot.stats_service.datetime', Mock()) async def test_run__too_late(self, asyncio): from randtalkbot.stats_service import datetime as datetime_mock self.stats_service._update_stats.reset_mock() datetime_mock.datetime.utcnow.side_effect = [ datetime.datetime(1990, 1, 1, 4, 0, 1), RuntimeError, ] with self.assertRaises(RuntimeError): await self.stats_service.run() asyncio.sleep.assert_not_called() self.stats_service._update_stats.assert_called_once_with() @asynctest.ignore_loop @patch('randtalkbot.stranger_service.StrangerService', Mock()) @patch('randtalkbot.stranger_sender_service.StrangerSenderService', Mock()) @patch('randtalkbot.talk.Talk', Mock()) def test_update_stats__no_stats_in_db(self): from randtalkbot.stranger_service import StrangerService from randtalkbot.talk import Talk stranger_service = StrangerService.get_instance.return_value stranger_service.get_full_strangers = get_strangers Talk.get_not_ended_talks.return_value = get_talks(NOT_ENDED_TALKS) Talk.get_ended_talks.return_value = get_talks(ENDED_TALKS) self.stats_service._update_stats = types.MethodType(self.update_stats, self.stats_service) self.stats_service._stats = None self.stats_service._update_stats() Talk.get_not_ended_talks.assert_called_once_with(after=None) Talk.get_ended_talks.assert_called_once_with(after=None) Talk.delete_old.assert_not_called() self.assertEqual( json.loads(self.stats_service._stats.data_json), {'languages_count_distribution': [[1, 88], [2, 13]], 'languages_popularity': [['en', 67], ['it', 34], ['ru', 12]], 'languages_to_orientation': [['en', {'female female': 6, 'female male': 5, 'female not_specified': 11, 'male female': 5, 'male male': 10, 'male not_specified': 6, 'not_specified female': 7, 'not_specified male': 11, 'not_specified not_specified': 6}], ['it', {'female female': 5, 'female male': 2, 'female not_specified': 2, 'male female': 7, 'male male': 5, 'male not_specified': 3, 'not_specified female': 4, 'not_specified male': 1, 'not_specified not_specified': 5}], ['ru', {'female female': 2, 'female male': 2, 'female not_specified': 3, 'male male': 2, 'male not_specified': 2, 'not_specified male': 1}]], 'partner_sex_distribution': {'female': 31, 'male': 38, 'not_specified': 32}, 'sex_distribution': {'female': 33, 'male': 36, 'not_specified': 32}, 'talks_duration': {'average': 7092.79, 'count': 100, 'distribution': {'10': 0, '60': 0, '1800': 8, '300': 4, 'more': 88}}, 'talks_sent': {'average': 210.6, 'count': 100, 'distribution': {'4': 0, '16': 1, '256': 63, '64': 7, 'more': 29}}, 'talks_waiting': {'average': 7536.865384615385, 'count': 104, 'distribution': {'10800': 77, '1800': 3, '300': 3, '60': 0, '10': 0, 'more': 21}}, 'total_count': 101}, ) @asynctest.ignore_loop @patch('randtalkbot.stranger_service.StrangerService', Mock()) @patch('randtalkbot.stranger_sender_service.StrangerSenderService', Mock()) @patch('randtalkbot.talk.Talk', Mock()) def test_update_stats__some_stats_in_db(self): from randtalkbot.stranger_service import StrangerService from randtalkbot.stranger_sender_service import StrangerSenderService from randtalkbot.talk import Talk stranger_service = StrangerService.get_instance.return_value stranger_service.get_full_strangers = get_strangers stranger_sender_service = StrangerSenderService.get_instance.return_value Talk.get_not_ended_talks.return_value = get_talks(NOT_ENDED_TALKS) Talk.get_ended_talks.return_value = get_talks(ENDED_TALKS) self.stats_service._update_stats = types.MethodType(self.update_stats, self.stats_service) # self.stats_service._stats is not None now. self.stats_service._update_stats() Talk.get_not_ended_talks.assert_called_once_with(after=datetime.datetime(1990, 1, 1)) Talk.get_ended_talks.assert_called_once_with(after=datetime.datetime(1990, 1, 1)) Talk.delete_old.assert_called_once_with(before=datetime.datetime(1990, 1, 1)) stranger_service.get_cache_size.assert_called_once_with() stranger_sender_service.get_cache_size.assert_called_once_with() @asynctest.ignore_loop @patch('randtalkbot.stranger_service.StrangerService', Mock()) @patch('randtalkbot.stranger_sender_service.StrangerSenderService', Mock()) @patch('randtalkbot.talk.Talk', Mock()) def test_update_stats__no_talks(self): from randtalkbot.stranger_service import StrangerService from randtalkbot.talk import Talk stranger_service = StrangerService.get_instance.return_value stranger_service.get_full_strangers.return_value = [] Talk.get_not_ended_talks.return_value = [] Talk.get_ended_talks.return_value = [] self.stats_service._update_stats = types.MethodType(self.update_stats, self.stats_service) # self.stats_service._stats is not None now. self.stats_service._update_stats() self.assertEqual( json.loads(self.stats_service._stats.data_json), {'languages_count_distribution': [], 'languages_popularity': [], 'languages_to_orientation': [], 'partner_sex_distribution': {}, 'sex_distribution': {}, 'talks_duration': {'average': 0, 'count': 0, 'distribution': {'10': 0, '1800': 0, '300': 0, '60': 0, 'more': 0}}, 'talks_sent': {'average': 0, 'count': 0, 'distribution': {'16': 0, '256': 0, '4': 0, '64': 0, 'more': 0}}, 'talks_waiting': {'average': 0, 'count': 0, 'distribution': {'10': 0, '10800': 0, '1800': 0, '300': 0, '60': 0, 'more': 0}}, 'total_count': 0}, )