def test_create_player_stat(self): TestTime.set_app_time(datetime.datetime(2015, 8, 1)) DatabaseUtils.recreate_database(DatabaseUtils.get_db_connection()) conn = DatabaseUtils.get_db_connection() player_data = { 'clan_id': 1, 'account_id': 777, 'account_name': 'test player', 'total_resources_earned': 1200, 'stronghold_skirmish_battles': 100, 'stronghold_defense_battles': 10, 'seven_day_resources_earned': 320, 'thirty_day_resources_earned': 320, 'last_update': AppTime.get_now(), 'thirty_day_defense_battles': 0, 'thirty_day_skirmish_battles': 0, 'clan_battles': 10, 'thirty_day_clan_battles': 5, 'all_battles': 100, 'thirty_day_all_battles': 50 } controller = ClanController() controller.create_player_stat(conn, player_data) row = PlayerRepository.get_player(conn, player_data['clan_id'], player_data['account_id']) player_stat_dict = dict(zip(row.keys(), row)) expected = { 'clan_id': 1, 'account_id': 777, 'account_name': u'test player', 'total_resources_earned': 1200, 'stronghold_skirmish_battles': 100, 'thirty_day_skirmish_battles': 0, 'stronghold_defense_battles': 10, 'thirty_day_defense_battles': 0, 'seven_day_resources_earned': 320, 'thirty_day_resources_earned': 320, 'clan_battles': 10, 'thirty_day_clan_battles': 5, 'all_battles': 100, 'thirty_day_all_battles': 50, 'last_update': str(AppTime.get_now()) } self.assertEqual(expected, player_stat_dict) from_date = AppTime.get_now() to_date = from_date - datetime.timedelta(days=30) rows = PlayerRepository.get_player_stats(conn, player_data['clan_id'], player_data['account_id'], from_date, to_date) self.assertEqual(1, len(rows)) player_stat_snapshot_dict = dict(zip(rows[0].keys(), rows[0])) expected = { 'stronghold_defense_battles': 10, 'account_id': 777, 'stronghold_skirmish_battles': 100, 'clan_id': 1, 'total_resources_earned': 1200, 'created_date': str(AppTime.get_now()) } self.assertEqual(expected, player_stat_snapshot_dict)
def test_create_player_stat(self): TestTime.set_app_time(datetime.datetime(2015, 8, 1)) DatabaseUtils.recreate_database(DatabaseUtils.get_db_connection()) conn = DatabaseUtils.get_db_connection() player_data = {'clan_id': 1, 'account_id': 777, 'account_name': 'test player', 'total_resources_earned': 1200, 'stronghold_skirmish_battles': 100, 'stronghold_defense_battles': 10, 'seven_day_resources_earned': 320, 'thirty_day_resources_earned': 320, 'last_update': AppTime.get_now(), 'thirty_day_defense_battles': 0, 'thirty_day_skirmish_battles': 0, 'clan_battles': 10, 'thirty_day_clan_battles': 5, 'all_battles': 100, 'thirty_day_all_battles': 50} controller = ClanController() controller.create_player_stat(conn, player_data) row = PlayerRepository.get_player(conn, player_data['clan_id'], player_data['account_id']) player_stat_dict = dict(zip(row.keys(), row)) expected = {'clan_id': 1, 'account_id': 777, 'account_name': u'test player', 'total_resources_earned': 1200, 'stronghold_skirmish_battles': 100, 'thirty_day_skirmish_battles': 0, 'stronghold_defense_battles': 10, 'thirty_day_defense_battles': 0, 'seven_day_resources_earned': 320, 'thirty_day_resources_earned': 320, 'clan_battles': 10, 'thirty_day_clan_battles': 5, 'all_battles': 100, 'thirty_day_all_battles': 50, 'last_update': str(AppTime.get_now())} self.assertEqual(expected, player_stat_dict) from_date = AppTime.get_now() to_date = from_date - datetime.timedelta(days=30) rows = PlayerRepository.get_player_stats(conn, player_data['clan_id'], player_data['account_id'], from_date, to_date) self.assertEqual(1, len(rows)) player_stat_snapshot_dict = dict(zip(rows[0].keys(), rows[0])) expected = {'stronghold_defense_battles': 10, 'account_id': 777, 'stronghold_skirmish_battles': 100, 'clan_id': 1, 'total_resources_earned': 1200, 'created_date': str(AppTime.get_now())} self.assertEqual(expected, player_stat_snapshot_dict)
def map(cls, accounts_stats, account_id, account_name): player_data = {} if accounts_stats is None or not accounts_stats: return player_data data = accounts_stats['data'][str(account_id)] player_data = { "clan_id": data['clan_id'], "account_id": data['account_id'], "account_name": account_name, "total_resources_earned": data['total_resources_earned'], "stronghold_defense_battles": data['stronghold_defense']['battles'] if data['stronghold_defense'] else 0, "thirty_day_defense_battles": 0, "stronghold_skirmish_battles": data['stronghold_skirmish']['battles'] if data['stronghold_skirmish'] else 0, "thirty_day_skirmish_battles": 0, "seven_day_resources_earned": data['week_resources_earned'], "thirty_day_resources_earned": data['week_resources_earned'], "last_update": AppTime.get_now() } return player_data
def get_players_data(self, connection, app_id, clan_id, members): players_data = [] for member in members: account_id = member['account_id'] account_name = member['account_name'] try: player_data = self.get_player_data(connection, app_id, clan_id, account_id, account_name) if self.requires_recalculation(player_data): # get accounts stat account_stats = self._retrieve_account_stats( account_id, app_id) player_data = AccountStatsToPlayerDataMapper.map( account_stats, account_id, account_name) personal_stats = self._retrieve_personal_stats( account_id, app_id) player_data = AccountStatsToPlayerDataMapper.amend_player_data( player_data, personal_stats, account_id) # create snapshot self.create_snapshot(connection, player_data) # calculate 30 day from_date = AppTime.get_now() - datetime.timedelta(days=30) self._calculate_stats_at_date(connection, player_data, from_date) # update player_stat PlayerRepository.update_player_stats( connection, player_data) players_data.append(player_data) except Exception as e: print( 'Failed on player: {account_name} - error: {error}'.format( account_name=member['account_name'], error=str(e))) players_data.sort(key=lambda x: x['account_name'].lower()) return players_data
def test_one_month_of_updates(self): """" Adds stats for a month Starts with: "total_resources_earned": 5002 "week_resources_earned": 0 "battles": 731 It should end up with: "total_resources_earned": 5002 + 65 = 5067 "week_resources_earned": 20 30 day = 65 """ "" TestTime.set_app_time(datetime.datetime(2015, 8, 1)) account_stats = AccountStatsFixtures.standard_accounts_record() player_stats = AccountStatsFixtures.personal_data_response() conn = DatabaseUtils.get_db_connection() DatabaseUtils.recreate_database(conn) conn = DatabaseUtils.get_db_connection() controller = ClanController() controller._retrieve_account_stats = lambda account_id, app_id: account_stats controller._retrieve_personal_stats = lambda account_id, app_id: player_stats members = [{'account_id': 512841364, 'account_name': 'test_player'}] players_data = controller.get_players_data(conn, 123, 123, members) self.assertEqual(1, len(players_data)) TestTime.set_app_time(datetime.datetime(2015, 8, 5)) self._amend_accounts_stats(account_stats, 10, 1, 10) controller.get_players_data(conn, 123, 500050913, members) TestTime.set_app_time(datetime.datetime(2015, 8, 10)) self._amend_accounts_stats(account_stats, 35, 2, 45) controller.get_players_data(conn, 123, 500050913, members) TestTime.set_app_time(datetime.datetime(2015, 8, 15)) self._amend_accounts_stats(account_stats, 0, 2, 35) controller.get_players_data(conn, 123, 500050913, members) TestTime.set_app_time(datetime.datetime(2015, 8, 25)) self._amend_accounts_stats(account_stats, 20, 1, 20, 10) self._amend_player_stats(player_stats, 21, 10) controller.get_players_data(conn, 123, 500050913, members) TestTime.set_app_time(datetime.datetime(2015, 8, 31)) players_data = controller.get_players_data(conn, 123, 500050913, members) expected = { "clan_id": 500050913, "account_id": 512841364, "account_name": 'test_player', 'all_battles': 25367, 'clan_battles': 46, "total_resources_earned": 5067, "stronghold_defense_battles": 19, "thirty_day_defense_battles": 10, "stronghold_skirmish_battles": 737, "thirty_day_skirmish_battles": 6, "seven_day_resources_earned": 20, "thirty_day_resources_earned": 65, 'thirty_day_clan_battles': 0, 'thirty_day_all_battles': 21, "last_update": AppTime.get_now() } self.maxDiff = None self.assertEqual(expected, players_data[0])
def get_players_data(self, connection, app_id, clan_id, members): players_data = [] for member in members: account_id = member['account_id'] account_name = member['account_name'] try: player_data = self.get_player_data(connection, app_id, clan_id, account_id, account_name) if self.requires_recalculation(player_data): # get accounts stat account_stats = self._retrieve_account_stats(account_id, app_id) player_data = AccountStatsToPlayerDataMapper.map(account_stats, account_id, account_name) personal_stats = self._retrieve_personal_stats(account_id, app_id) player_data = AccountStatsToPlayerDataMapper.amend_player_data(player_data, personal_stats, account_id) # create snapshot self.create_snapshot(connection, player_data) # calculate 30 day from_date = AppTime.get_now() - datetime.timedelta(days=30) self._calculate_stats_at_date(connection, player_data, from_date) # update player_stat PlayerRepository.update_player_stats(connection, player_data) players_data.append(player_data) except Exception as e: print('Failed on player: {account_name} - error: {error}' .format(account_name=member['account_name'], error=str(e))) players_data.sort(key=lambda x: x['account_name'].lower()) return players_data
def test_player_does_not_require_calculation(self): TestTime.set_app_time(datetime.datetime(2015, 8, 1, 12, 0, 0)) player_data = {'last_update': AppTime.get_now()} controller = ClanController() result = controller.requires_recalculation(player_data) expected = False self.assertEqual(expected, result)
def test_get_player_data_that_is_not_in_database(self): TestTime.set_app_time(datetime.datetime(2015, 8, 1)) conn = DatabaseUtils.get_db_connection() DatabaseUtils.recreate_database(conn) conn = DatabaseUtils.get_db_connection() controller = ClanController() controller._retrieve_account_stats = lambda account_id, app_id: AccountStatsFixtures.standard_accounts_record( ) controller._retrieve_personal_stats = lambda account_id, app_id: AccountStatsFixtures.personal_data_response( ) player_data = controller.get_player_data(conn, 'app_id', 500050913, 512841364, 'test_player') expected = { "clan_id": 500050913, "account_id": 512841364, "account_name": 'test_player', "total_resources_earned": 5002, "stronghold_defense_battles": 9, "thirty_day_defense_battles": 0, "stronghold_skirmish_battles": 731, "thirty_day_skirmish_battles": 0, "seven_day_resources_earned": 0, "thirty_day_resources_earned": 0, 'clan_battles': 46, 'thirty_day_clan_battles': 0, 'all_battles': 25346, 'thirty_day_all_battles': 0, "last_update": AppTime.get_now() } self.maxDiff = None self.assertEqual(expected, player_data) from_date = AppTime.get_now() to_date = from_date - datetime.timedelta(days=30) rows = PlayerRepository.get_player_stats(conn, player_data['clan_id'], player_data['account_id'], from_date, to_date) self.assertEqual(1, len(rows)) player_stat_snapshot_dict = dict(zip(rows[0].keys(), rows[0])) expected = { 'stronghold_defense_battles': 9, 'account_id': 512841364, 'stronghold_skirmish_battles': 731, 'clan_id': 500050913, 'total_resources_earned': 5002, 'created_date': str(AppTime.get_now()) } self.assertEqual(expected, player_stat_snapshot_dict)
def test_one_month_of_updates(self): """" Adds stats for a month Starts with: "total_resources_earned": 5002 "week_resources_earned": 0 "battles": 731 It should end up with: "total_resources_earned": 5002 + 65 = 5067 "week_resources_earned": 20 30 day = 65 """"" TestTime.set_app_time(datetime.datetime(2015, 8, 1)) account_stats = AccountStatsFixtures.standard_accounts_record() player_stats = AccountStatsFixtures.personal_data_response() conn = DatabaseUtils.get_db_connection() DatabaseUtils.recreate_database(conn) conn = DatabaseUtils.get_db_connection() controller = ClanController() controller._retrieve_account_stats = lambda account_id, app_id: account_stats controller._retrieve_personal_stats = lambda account_id, app_id: player_stats members = [{'account_id': 512841364, 'account_name': 'test_player'}] players_data = controller.get_players_data(conn, 123, 123, members) self.assertEqual(1, len(players_data)) TestTime.set_app_time(datetime.datetime(2015, 8, 5)) self._amend_accounts_stats(account_stats, 10, 1, 10) controller.get_players_data(conn, 123, 500050913, members) TestTime.set_app_time(datetime.datetime(2015, 8, 10)) self._amend_accounts_stats(account_stats, 35, 2, 45) controller.get_players_data(conn, 123, 500050913, members) TestTime.set_app_time(datetime.datetime(2015, 8, 15)) self._amend_accounts_stats(account_stats, 0, 2, 35) controller.get_players_data(conn, 123, 500050913, members) TestTime.set_app_time(datetime.datetime(2015, 8, 25)) self._amend_accounts_stats(account_stats, 20, 1, 20, 10) self._amend_player_stats(player_stats, 21, 10) controller.get_players_data(conn, 123, 500050913, members) TestTime.set_app_time(datetime.datetime(2015, 8, 31)) players_data = controller.get_players_data(conn, 123, 500050913, members) expected = { "clan_id": 500050913, "account_id": 512841364, "account_name": 'test_player', 'all_battles':25367, 'clan_battles': 46, "total_resources_earned": 5067, "stronghold_defense_battles": 19, "thirty_day_defense_battles": 10, "stronghold_skirmish_battles": 737, "thirty_day_skirmish_battles": 6, "seven_day_resources_earned": 20, "thirty_day_resources_earned": 65, 'thirty_day_clan_battles': 0, 'thirty_day_all_battles': 21, "last_update": AppTime.get_now() } self.maxDiff = None self.assertEqual(expected, players_data[0])
def requires_recalculation(self, player_data): last_update = player_data['last_update'] \ if isinstance(player_data['last_update'], datetime.datetime) \ else datetime.datetime.strptime(player_data['last_update'], '%Y-%m-%d %H:%M:%S') diff_time = AppTime.get_now() - last_update max_delta_time = datetime.timedelta(days=1) if diff_time < max_delta_time: return False return True
def test_get_player_data_that_is_not_in_database(self): TestTime.set_app_time(datetime.datetime(2015, 8, 1)) conn = DatabaseUtils.get_db_connection() DatabaseUtils.recreate_database(conn) conn = DatabaseUtils.get_db_connection() controller = ClanController() controller._retrieve_account_stats = lambda account_id, app_id: AccountStatsFixtures.standard_accounts_record() controller._retrieve_personal_stats = lambda account_id, app_id: AccountStatsFixtures.personal_data_response() player_data = controller.get_player_data(conn, 'app_id', 500050913, 512841364, 'test_player') expected = { "clan_id": 500050913, "account_id": 512841364, "account_name": 'test_player', "total_resources_earned": 5002, "stronghold_defense_battles": 9, "thirty_day_defense_battles": 0, "stronghold_skirmish_battles": 731, "thirty_day_skirmish_battles": 0, "seven_day_resources_earned": 0, "thirty_day_resources_earned": 0, 'clan_battles': 46, 'thirty_day_clan_battles': 0, 'all_battles': 25346, 'thirty_day_all_battles': 0, "last_update": AppTime.get_now() } self.maxDiff = None self.assertEqual(expected, player_data) from_date = AppTime.get_now() to_date = from_date - datetime.timedelta(days=30) rows = PlayerRepository.get_player_stats(conn, player_data['clan_id'], player_data['account_id'], from_date, to_date) self.assertEqual(1, len(rows)) player_stat_snapshot_dict = dict(zip(rows[0].keys(), rows[0])) expected = {'stronghold_defense_battles': 9, 'account_id': 512841364, 'stronghold_skirmish_battles': 731, 'clan_id': 500050913, 'total_resources_earned': 5002, 'created_date': str(AppTime.get_now())} self.assertEqual(expected, player_stat_snapshot_dict)
def test_normal_data(self): TestTime.set_app_time(datetime.datetime(2015, 8, 1)) player_data = AccountStatsToPlayerDataMapper.map(AccountStatsFixtures.standard_accounts_record(), 512841364, 'test_player') expected = { "clan_id": 500050913, "account_id": 512841364, "account_name": 'test_player', "total_resources_earned": 5002, "stronghold_defense_battles": 9, "thirty_day_defense_battles": 0, "stronghold_skirmish_battles": 731, "thirty_day_skirmish_battles": 0, "seven_day_resources_earned": 0, "thirty_day_resources_earned": 0, "last_update": AppTime.get_now() } self.assertEqual(expected, player_data)
def test_normal_data(self): TestTime.set_app_time(datetime.datetime(2015, 8, 1)) player_data = AccountStatsToPlayerDataMapper.map( AccountStatsFixtures.standard_accounts_record(), 512841364, 'test_player') expected = { "clan_id": 500050913, "account_id": 512841364, "account_name": 'test_player', "total_resources_earned": 5002, "stronghold_defense_battles": 9, "thirty_day_defense_battles": 0, "stronghold_skirmish_battles": 731, "thirty_day_skirmish_battles": 0, "seven_day_resources_earned": 0, "thirty_day_resources_earned": 0, "last_update": AppTime.get_now() } self.assertEqual(expected, player_data)
def update_player_stats(cls, connection, player_data): sql = """ UPDATE player_stats SET total_resources_earned = ?, stronghold_defense_battles = ?, stronghold_skirmish_battles = ?, seven_day_resources_earned = ?, clan_battles = ?, all_battles = ?, thirty_day_resources_earned = ?, thirty_day_defense_battles = ?, thirty_day_skirmish_battles = ?, thirty_day_clan_battles = ?, thirty_day_all_battles = ?, last_update = ? WHERE clan_id = ? AND account_id = ? """ values = [ player_data['total_resources_earned'], player_data['stronghold_defense_battles'], player_data['stronghold_skirmish_battles'], player_data['seven_day_resources_earned'], player_data['clan_battles'], player_data['all_battles'], player_data['thirty_day_resources_earned'], player_data['thirty_day_defense_battles'], player_data['thirty_day_skirmish_battles'], player_data['thirty_day_clan_battles'], player_data['thirty_day_all_battles'], AppTime.get_now(), player_data['clan_id'], player_data['account_id'] ] with connection: cur = connection.cursor() cur.execute(sql, values)
def test_map(self): now = AppTime.get_now() record = { "clan_id": 500050913, "account_id": 512841364, "account_name": 'test_player', "total_resources_earned": 5002, "stronghold_defense_battles": 9, "thirty_day_defense_battles": 0, "stronghold_skirmish_battles": 731, "thirty_day_skirmish_battles": 0, "seven_day_resources_earned": 0, "thirty_day_resources_earned": 0, 'clan_battles': 3, 'thirty_day_clan_battles': 0, 'all_battles': 9401, 'thirty_day_all_battles': 0, "last_update": now } expected = { "clan_id": 500050913, "account_id": 512841364, "account_name": 'test_player', "total_resources_earned": 5002, "stronghold_defense_battles": 9, "thirty_day_defense_battles": 0, "stronghold_skirmish_battles": 731, "thirty_day_skirmish_battles": 0, "seven_day_resources_earned": 0, "thirty_day_resources_earned": 0, 'clan_battles': 3, 'thirty_day_clan_battles': 0, 'all_battles': 9401, 'thirty_day_all_battles': 0, "last_update": now } result = RecordToPlayerDataMapper.map(record) self.assertEqual(expected, result)
def test_map(self): now = AppTime.get_now() record = {"clan_id": 500050913, "account_id": 512841364, "account_name": 'test_player', "total_resources_earned": 5002, "stronghold_defense_battles": 9, "thirty_day_defense_battles": 0, "stronghold_skirmish_battles": 731, "thirty_day_skirmish_battles": 0, "seven_day_resources_earned": 0, "thirty_day_resources_earned": 0, 'clan_battles': 3, 'thirty_day_clan_battles': 0, 'all_battles': 9401, 'thirty_day_all_battles': 0, "last_update": now } expected = { "clan_id": 500050913, "account_id": 512841364, "account_name": 'test_player', "total_resources_earned": 5002, "stronghold_defense_battles": 9, "thirty_day_defense_battles": 0, "stronghold_skirmish_battles": 731, "thirty_day_skirmish_battles": 0, "seven_day_resources_earned": 0, "thirty_day_resources_earned": 0, 'clan_battles': 3, 'thirty_day_clan_battles': 0, 'all_battles': 9401, 'thirty_day_all_battles': 0, "last_update": now } result = RecordToPlayerDataMapper.map(record) self.assertEqual(expected, result)