コード例 #1
0
 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
コード例 #2
0
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()
コード例 #3
0
 def test_get_instance__runtime_error(self):
     del StatsService._instance
     with self.assertRaises(RuntimeError):
         StatsService.get_instance()
コード例 #4
0
 def test_get_instance__ok(self):
     self.assertEqual(StatsService.get_instance(), self.stats_service)
コード例 #5
0
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},
            )