예제 #1
0
class Test(DjangoTestCase):
    @classmethod
    def setUpClass(self):
        super(Test, self).setUpClass()
        self.db = Db()
        self.db.create_season(id=16)

    def setUp(self):
        super().setUp()
        self.db.delete_all(keep=[Season])
        self.c = Client()

    def test_get_1v1(self):
        p = self.db.create_player(region=Region.EU, realm=1, bid=301)
        t = self.db.create_team(mode=Mode.TEAM_1V1)

        response = self.c.get(
            '/team/id/', {
                'mode': '1v1',
                'player': 'http://eu.battle.net/sc2/en/profile/301/1/xyz'
            })

        self.assertEqual(200, response.status_code)
        data = json.loads(response.content.decode('utf-8'))
        self.assertEqual(t.id, data['team_id'])

    def test_get_4v4(self):
        p1 = self.db.create_player(region=Region.EU, realm=1, bid=301)
        p2 = self.db.create_player(region=Region.EU, realm=1, bid=302)
        p3 = self.db.create_player(region=Region.EU, realm=1, bid=303)
        p4 = self.db.create_player(region=Region.EU, realm=1, bid=304)
        t = self.db.create_team(mode=Mode.TEAM_4V4,
                                member0=p1,
                                member1=p2,
                                member2=p3,
                                member3=p4)

        qp = MultiValueDict()
        qp.setlist('player', [
            'http://eu.battle.net/sc2/en/profile/304/1/xyz',
            'http://eu.battle.net/sc2/en/profile/303/1/xyz',
            'http://eu.battle.net/sc2/en/profile/302/1/xyz',
            'http://eu.battle.net/sc2/en/profile/301/1/xyz',
        ])
        qp['mode'] = 'team-4v4'
        response = self.c.get('/team/id/', qp)

        self.assertEqual(200, response.status_code)
        data = json.loads(response.content.decode('utf-8'))
        self.assertEqual(t.id, data['team_id'])
예제 #2
0
class Test(DjangoTestCase):
    @classmethod
    def setUpClass(self):
        super(Test, self).setUpClass()
        self.db = Db()
        self.now = utcnow()
        self.today = self.now.date()

        # Required objects, not actually used in test cases.
        self.db.create_cache()
        self.db.create_ladder()

        self.s15 = self.db.create_season(id=15,
                                         start_date=self.date(days=-200),
                                         end_date=self.date(days=-101))
        self.s16 = self.db.create_season(id=16,
                                         start_date=self.date(days=-100),
                                         end_date=None)

    def setUp(self):
        super().setUp()
        cache.clear()
        self.db.clear_defaults()
        self.db.delete_all(keep=[Season, Cache, Ladder])
        self.c = Client()

    def tearDown(self):
        rankings_view_client.close()
        super(Test, self).tearDown()

    def test_simple_gets_with_various_filtering_and_sorting(self):

        p1 = self.db.create_player(tag='TL', clan='Team Liquid')
        p2 = self.db.create_player(tag='TL', clan='Team Liquid')

        t1 = self.db.create_team(member0=p1)
        t2 = self.db.create_team(member0=p2)

        self.db.create_ranking()
        self.db.create_ranking_data(data=[
            dict(team_id=t1.id,
                 league=League.GOLD,
                 region=Region.EU,
                 race0=Race.TERRAN,
                 points=20,
                 mmr=3,
                 version=Version.LOTV,
                 wins=100,
                 losses=100),
            dict(team_id=t2.id,
                 league=League.PLATINUM,
                 region=Region.AM,
                 race0=Race.ZERG,
                 points=40,
                 mmr=4,
                 version=Version.LOTV,
                 wins=200,
                 losses=200),
        ])

        def get_and_check(url, *players):
            response = self.c.get(url)
            self.assertEqual(200, response.status_code)
            teams = response.context['ladder']['teams']
            self.assertEqual(len(players), len(teams))
            for i, p in enumerate(players):
                self.assertEqual(p.name, teams[i]['m0_name'])

        get_and_check('/clan/TL/mmr/', p2, p1)
        get_and_check('/clan/TL/-played/', p1, p2)
        get_and_check('/clan/TL/wins/', p2, p1)
        get_and_check('/clan/TL/league-points/', p2, p1)

        get_and_check('/clan/TL/mmr/?f=terran', p1)
        get_and_check('/clan/TL/mmr/?f=am', p2)
        get_and_check('/clan/TL/mmr/?f=eu,zerg')

    def test_other_clan_season_mode_version_are_excluded(self):

        trs = []

        p = self.db.create_player(tag='TL',
                                  clan='Team Liquid',
                                  season=self.s16,
                                  mode=Mode.TEAM_1V1)
        t = self.db.create_team(member0=p,
                                mode=p.mode,
                                season=p.season,
                                version=Version.LOTV)
        trs.append(dict(team_id=t.id, mode=t.mode, version=t.version))
        p1 = p

        p = self.db.create_player(tag='XX',
                                  clan='Team Liquid',
                                  season=self.s16,
                                  mode=Mode.TEAM_1V1)
        t = self.db.create_team(member0=p,
                                mode=p.mode,
                                season=p.season,
                                version=Version.LOTV)
        trs.append(dict(team_id=t.id, mode=t.mode, version=t.version))

        p = self.db.create_player(tag='TL',
                                  clan='Team Liquid',
                                  season=self.s15,
                                  mode=Mode.TEAM_1V1)
        t = self.db.create_team(member0=p,
                                mode=p.mode,
                                season=p.season,
                                version=Version.LOTV)
        trs.append(dict(team_id=t.id, mode=t.mode, version=t.version))

        p = self.db.create_player(tag='TL',
                                  clan='Team Liquid',
                                  season=self.s16,
                                  mode=Mode.RANDOM_2V2)
        t = self.db.create_team(member0=p,
                                mode=p.mode,
                                season=p.season,
                                version=Version.LOTV)
        trs.append(dict(team_id=t.id, mode=t.mode, version=t.version))

        p = self.db.create_player(tag='TL',
                                  clan='Team Liquid',
                                  season=self.s16,
                                  mode=Mode.TEAM_1V1)
        t = self.db.create_team(member0=p,
                                mode=p.mode,
                                season=p.season,
                                version=Version.HOTS)
        trs.append(dict(team_id=t.id, mode=t.mode, version=t.version))

        self.db.create_ranking()
        self.db.create_ranking_data(data=trs)

        response = self.c.get('/clan/TL/mmr/')
        self.assertEqual(200, response.status_code)
        teams = response.context['ladder']['teams']
        self.assertEqual(1, len(teams))
        self.assertEqual(p1.name, teams[0]['m0_name'])

    def test_json_get(self):

        self.maxDiff = 1e9

        p1 = self.db.create_player(tag='TL')
        p2 = self.db.create_player(tag='TL')

        t1 = self.db.create_team(member0=p1)
        t2 = self.db.create_team(member0=p2)

        self.db.create_ranking()
        self.db.create_ranking_data(data=[
            dict(team_id=t1.id,
                 league=League.PLATINUM,
                 region=Region.EU,
                 race0=Race.TERRAN,
                 points=20,
                 version=Version.LOTV,
                 wins=100,
                 losses=100,
                 mmr=3000),
            dict(team_id=t2.id,
                 league=League.GOLD,
                 region=Region.AM,
                 race0=Race.ZERG,
                 points=40,
                 version=Version.LOTV,
                 wins=200,
                 losses=200,
                 mmr=2000),
        ])

        response = self.c.get('/clan/TL/mmr/?json')
        self.assertEqual(200, response.status_code)
        teams = json.loads(response.content.decode('utf-8'))
        self.assertTrue(teams[0].pop("age"))
        self.assertTrue(teams[0].pop("data_time"))
        self.assertTrue(teams[1].pop("age"))
        self.assertTrue(teams[1].pop("data_time"))
        self.assertEqual([
            dict(
                rank=1,
                team_id=t1.id,
                league="platinum",
                tier=0,
                region="eu",
                m0_race="terran",
                m0_name=p1.name,
                m0_bnet_url=
                f'https://starcraft2.com/en-gb/profile/2/1/{p1.bid}',
                mmr=3000,
                win_rate=50.0,
                wins=100,
                losses=100,
                points=20.0,
            ),
            dict(
                rank=2,
                team_id=t2.id,
                league="gold",
                tier=0,
                region="am",
                m0_race="zerg",
                m0_name=p2.name,
                m0_bnet_url=
                f'https://starcraft2.com/en-gb/profile/2/1/{p2.bid}',
                mmr=2000,
                win_rate=50.0,
                wins=200,
                losses=200,
                points=40.0,
            ),
        ], teams)
예제 #3
0
class Test(DjangoTestCase):

    @classmethod
    def setUpClass(self):
        super().setUpClass()
        self.db = Db()

    def setUp(self):
        super().setUp()
        self.now = utcnow()
        self.db.delete_all()
        self.db.create_season(id=1)
        self.db.create_ranking()

    def test_same_team_in_multiple_ladders_select_later_added_instance_and_disregards_times(self):
        # Given this, the ranker will have to rank ladders in fetch order to prevent overwriting data when teams
        # change ladder due to promotion/demotion.

        self.process_ladder(league=League.PLATINUM,
                            fetch_time=self.datetime(days=-200),
                            members=[
                                gen_member(bid=301,
                                           race=Race.ZERG,
                                           join_time=int(self.unix_time(days=-410))),
                                gen_member(bid=302,
                                           race=Race.TERRAN,
                                           join_time=int(self.unix_time(days=-400))),
                                gen_member(bid=303,
                                           race=Race.PROTOSS,
                                           join_time=int(self.unix_time(days=-400)),
                                           points=20,
                                           wins=50),
                                gen_member(bid=304,
                                           race=Race.RANDOM,
                                           join_time=int(self.unix_time(days=-400)),
                                           points=10,
                                           wins=40,
                                           losses=10),
                            ])
        
        self.process_ladder(league=League.GOLD,
                            fetch_time=self.datetime(days=-330),
                            members=[
                                gen_member(bid=302,
                                           race=Race.TERRAN,
                                           join_time=int(self.unix_time(days=-410))),
                                gen_member(bid=303,
                                           race=Race.PROTOSS,
                                           join_time=int(self.unix_time(days=-410)),
                                           points=20,
                                           wins=60),
                                gen_member(bid=304,
                                           race=Race.RANDOM,
                                           join_time=int(self.unix_time(days=-410)),
                                           points=10,
                                           wins=40,
                                           losses=20),
                            ])

        self.save_to_ranking()

        t1, t2, t3, t4 = self.db.get_teams_by_member0_bids(301, 302, 303, 304)

        self.assert_team_ranks(self.db.ranking.id,
                               dict(team_id=t1, region_count=4, region_rank=1, league=League.PLATINUM),
                               dict(team_id=t2, region_count=4, region_rank=2, league=League.GOLD),
                               dict(team_id=t3, region_count=4, region_rank=3, league=League.GOLD, wins=60),
                               dict(team_id=t4, region_count=4, region_rank=4, league=League.GOLD, wins=40, losses=20),
                               )

    def test_same_team_in_multiple_ladders_but_different_versions_and_all_are_in_the_ranking(self):
        self.process_ladder(version=Version.HOTS,
                            members=[
                                gen_member(bid=301, points=20),
                                gen_member(bid=302, points=10),
                            ])

        self.process_ladder(version=Version.WOL,
                            members=[
                                gen_member(bid=301, points=10),
                                gen_member(bid=302, points=20),
                            ])

        self.process_ladder(version=Version.LOTV,
                            members=[
                                gen_member(bid=301, points=40),
                                gen_member(bid=302, points=30),
                            ])

        self.save_to_ranking()

        t1, t2 = self.db.get_teams_by_member0_bids(301, 302)

        self.assert_team_ranks(self.db.ranking.id,
                               dict(team_id=t2, region_count=2, region_rank=1, points=20, version=Version.WOL),
                               dict(team_id=t1, region_count=2, region_rank=2, points=10, version=Version.WOL),
                               dict(team_id=t1, region_count=2, region_rank=1, points=20, version=Version.HOTS),
                               dict(team_id=t2, region_count=2, region_rank=2, points=10, version=Version.HOTS),
                               dict(team_id=t1, region_count=2, region_rank=1, points=40, version=Version.LOTV),
                               dict(team_id=t2, region_count=2, region_rank=2, points=30, version=Version.LOTV),
                               )

    def test_same_player_in_two_teams_multiple_ladders_but_different_modes_and_both_are_in_ranking(self):
        self.process_ladder(mode=Mode.RANDOM_4V4,
                            members=[
                                gen_member(bid=301, points=20),
                                gen_member(bid=302, points=10),
                            ])

        self.process_ladder(mode=Mode.RANDOM_3V3,
                            members=[
                                gen_member(bid=301, points=10),
                                gen_member(bid=302, points=20),
                            ])

        self.save_to_ranking()

        t1, t2 = self.db.get_teams_by_member0_bids(301, 302, mode=Mode.RANDOM_3V3)
        t3, t4 = self.db.get_teams_by_member0_bids(301, 302, mode=Mode.RANDOM_4V4)

        self.assert_team_ranks(self.db.ranking.id,
                               dict(team_id=t2, region_count=2, region_rank=1, points=20, mode=Mode.RANDOM_3V3),
                               dict(team_id=t1, region_count=2, region_rank=2, points=10, mode=Mode.RANDOM_3V3),
                               dict(team_id=t3, region_count=2, region_rank=1, points=20, mode=Mode.RANDOM_4V4),
                               dict(team_id=t4, region_count=2, region_rank=2, points=10, mode=Mode.RANDOM_4V4),
                               )

    def test_different_versions_are_ranked_separately(self):
        self.process_ladder(version=Version.HOTS,
                            members=[
                                gen_member(points=20),
                                gen_member(points=10),
                            ])

        self.process_ladder(version=Version.WOL,
                            members=[
                                gen_member(points=21),
                                gen_member(points=11),
                            ])

        self.process_ladder(version=Version.LOTV,
                            members=[
                                gen_member(points=22),
                                gen_member(points=12),
                            ])

        self.save_to_ranking()

        self.assert_team_ranks(self.db.ranking.id,
                               dict(region_count=2, region_rank=1, world_rank=1, points=21, version=Version.WOL),
                               dict(region_count=2, region_rank=2, world_rank=2, points=11, version=Version.WOL),
                               dict(region_count=2, region_rank=1, world_rank=1, points=20, version=Version.HOTS),
                               dict(region_count=2, region_rank=2, world_rank=2, points=10, version=Version.HOTS),
                               dict(region_count=2, region_rank=1, world_rank=1, points=22, version=Version.LOTV),
                               dict(region_count=2, region_rank=2, world_rank=2, points=12, version=Version.LOTV),
                               )

    def test_different_modes_are_ranked_separatly(self):
        self.process_ladder(mode=Mode.TEAM_1V1,
                            members=[
                                gen_member(points=110),
                                gen_member(points=111),
                            ])

        self.process_ladder(mode=Mode.ARCHON,
                            members=[
                                gen_member(points=120),
                                gen_member(points=120),
                                gen_member(points=121),
                                gen_member(points=121),
                            ])

        self.process_ladder(mode=Mode.TEAM_2V2,
                            members=[
                                gen_member(points=220),
                                gen_member(points=220),
                                gen_member(points=221),
                                gen_member(points=221),
                            ])

        self.process_ladder(mode=Mode.RANDOM_2V2,
                            members=[
                                gen_member(points=210),
                                gen_member(points=211),
                            ])

        self.process_ladder(mode=Mode.TEAM_3V3,
                            members=[
                                gen_member(points=330),
                                gen_member(points=330),
                                gen_member(points=330),
                                gen_member(points=331),
                                gen_member(points=331),
                                gen_member(points=331),
                            ])

        self.process_ladder(mode=Mode.RANDOM_3V3,
                            members=[
                                gen_member(points=310),
                                gen_member(points=311),
                            ])

        self.process_ladder(mode=Mode.TEAM_4V4,
                            members=[
                                gen_member(points=440),
                                gen_member(points=440),
                                gen_member(points=440),
                                gen_member(points=440),
                                gen_member(points=441),
                                gen_member(points=441),
                                gen_member(points=441),
                                gen_member(points=441),
                            ])

        self.process_ladder(mode=Mode.RANDOM_4V4,
                            members=[
                                gen_member(points=410),
                                gen_member(points=411),
                            ])

        self.save_to_ranking()

        self.assert_team_ranks(self.db.ranking.id,
                               dict(region_count=2, region_rank=1, world_rank=1, points=111, mode=Mode.TEAM_1V1),
                               dict(region_count=2, region_rank=2, world_rank=2, points=110, mode=Mode.TEAM_1V1),
                               dict(region_count=2, region_rank=1, world_rank=1, points=121, mode=Mode.ARCHON),
                               dict(region_count=2, region_rank=2, world_rank=2, points=120, mode=Mode.ARCHON),
                               dict(region_count=2, region_rank=1, world_rank=1, points=221, mode=Mode.TEAM_2V2),
                               dict(region_count=2, region_rank=2, world_rank=2, points=220, mode=Mode.TEAM_2V2),
                               dict(region_count=2, region_rank=1, world_rank=1, points=211, mode=Mode.RANDOM_2V2),
                               dict(region_count=2, region_rank=2, world_rank=2, points=210, mode=Mode.RANDOM_2V2),
                               dict(region_count=2, region_rank=1, world_rank=1, points=331, mode=Mode.TEAM_3V3),
                               dict(region_count=2, region_rank=2, world_rank=2, points=330, mode=Mode.TEAM_3V3),
                               dict(region_count=2, region_rank=1, world_rank=1, points=311, mode=Mode.RANDOM_3V3),
                               dict(region_count=2, region_rank=2, world_rank=2, points=310, mode=Mode.RANDOM_3V3),
                               dict(region_count=2, region_rank=1, world_rank=1, points=441, mode=Mode.TEAM_4V4),
                               dict(region_count=2, region_rank=2, world_rank=2, points=440, mode=Mode.TEAM_4V4),
                               dict(region_count=2, region_rank=1, world_rank=1, points=411, mode=Mode.RANDOM_4V4),
                               dict(region_count=2, region_rank=2, world_rank=2, points=410, mode=Mode.RANDOM_4V4),
                               )

    def test_ranking_world_region_league_tier_and_ladder_ranking_at_once_works_as_expected(self):
        self.process_ladder(region=Region.EU, league=League.SILVER,
                            members=[
                                gen_member(points=90),
                                gen_member(points=80),
                            ])

        self.process_ladder(region=Region.EU, league=League.GOLD,
                            members=[
                                gen_member(points=77),
                                gen_member(points=33),
                            ])

        self.process_ladder(region=Region.AM, league=League.GOLD,
                            members=[
                                gen_member(points=95),
                                gen_member(points=10),
                            ])

        self.process_ladder(region=Region.KR, league=League.GRANDMASTER,
                            members=[
                                gen_member(points=1),
                            ])

        self.process_ladder(region=Region.EU, league=League.SILVER, tier=1,
                            members=[
                                gen_member(points=90),
                                gen_member(points=80),
                            ])

        self.save_to_ranking()

        self.assert_team_ranks(self.db.ranking.id,
                               dict(world_rank=1,  region_rank=1,  league_rank=1,  ladder_rank=1,
                                    world_count=9, region_count=1, league_count=1, ladder_count=1,
                                    points=1, region=Region.KR, league=League.GRANDMASTER),
                               dict(world_rank=2,  region_rank=1,  league_rank=1,  ladder_rank=1,
                                    world_count=9, region_count=2, league_count=2, ladder_count=2,
                                    points=95, region=Region.AM, league=League.GOLD),
                               dict(world_rank=3,  region_rank=1,  league_rank=1,  ladder_rank=1,
                                    world_count=9, region_count=6, league_count=2, ladder_count=2,
                                    points=77, region=Region.EU, league=League.GOLD),
                               dict(world_rank=4,  region_rank=2,  league_rank=2,  ladder_rank=2,
                                    world_count=9, region_count=6, league_count=2, ladder_count=2,
                                    points=33, region=Region.EU, league=League.GOLD),
                               dict(world_rank=5,  region_rank=2,  league_rank=2,  ladder_rank=2,
                                    world_count=9, region_count=2, league_count=2, ladder_count=2,
                                    points=10, region=Region.AM, league=League.GOLD),
                               dict(world_rank=6,  region_rank=3,  league_rank=1,  ladder_rank=1, tier=0,
                                    world_count=9, region_count=6, league_count=4, ladder_count=2,
                                    points=90, region=Region.EU, league=League.SILVER),
                               dict(world_rank=7,  region_rank=4,  league_rank=2,  ladder_rank=2, tier=0,
                                    world_count=9, region_count=6, league_count=4, ladder_count=2,
                                    points=80, region=Region.EU, league=League.SILVER),
                               dict(world_rank=8,  region_rank=5,  league_rank=3,  ladder_rank=1, tier=1,
                                    world_count=9, region_count=6, league_count=4, ladder_count=2,
                                    points=90, region=Region.EU, league=League.SILVER),
                               dict(world_rank=9,  region_rank=6,  league_rank=4,  ladder_rank=2, tier=1,
                                    world_count=9, region_count=6, league_count=4, ladder_count=2,
                                    points=80, region=Region.EU, league=League.SILVER))

    def test_region_ranking_does_rank_calculation_correctly_when_teams_have_same_points(self):
        self.process_ladder(members=[
            gen_member(points=90),
            gen_member(points=90),
        ])

        self.process_ladder(members=[
            gen_member(points=90),
            gen_member(points=10),
        ])

        self.save_to_ranking()

        self.assert_team_ranks(self.db.ranking.id,
                               dict(region_rank=1, world_rank=1, points=90),
                               dict(region_rank=1, world_rank=1, points=90),
                               dict(region_rank=1, world_rank=1, points=90),
                               dict(region_rank=4, world_rank=4, points=10),
                               )

    def test_simple_world_ranking(self):
        self.process_ladder(region=Region.EU, league=League.GOLD,
                            members=[
                                gen_member(points=90),
                                gen_member(points=80),
                            ])

        self.process_ladder(region=Region.AM, league=League.GOLD,
                            members=[
                                gen_member(points=95),
                                gen_member(points=10),
                            ])

        self.save_to_ranking()

        self.assert_team_ranks(self.db.ranking.id,
                               dict(world_count=4, world_rank=1, points=95),
                               dict(world_count=4, world_rank=2, points=90),
                               dict(world_count=4, world_rank=3, points=80),
                               dict(world_count=4, world_rank=4, points=10),
                               )

    def test_simple_region_ranking(self):
        self.process_ladder(league=League.GOLD,
                            members=[
                                gen_member(points=90),
                                gen_member(points=80),
                            ])

        self.process_ladder(league=League.SILVER,
                            members=[
                                gen_member(points=95),
                                gen_member(points=10),
                            ])

        self.save_to_ranking()

        self.assert_team_ranks(self.db.ranking.id,
                               dict(region_count=4, region_rank=1, points=90, league=League.GOLD),
                               dict(region_count=4, region_rank=2, points=80, league=League.GOLD),
                               dict(region_count=4, region_rank=3, points=95, league=League.SILVER),
                               dict(region_count=4, region_rank=4, points=10, league=League.SILVER),
                               )

    def test_simple_league_ranking(self):
        self.process_ladder(members=[
            gen_member(points=90),
            gen_member(points=80),
        ])

        self.process_ladder(members=[
            gen_member(points=95),
            gen_member(points=10),
        ])

        self.save_to_ranking()

        self.assert_team_ranks(self.db.ranking.id,
                               dict(league_count=4, league_rank=1, points=95),
                               dict(league_count=4, league_rank=2, points=90),
                               dict(league_count=4, league_rank=3, points=80),
                               dict(league_count=4, league_rank=4, points=10),
                               )

    def test_simple_ladder_ranking(self):
        self.process_ladder(members=[
            gen_member(points=90),
            gen_member(points=80),
        ])

        self.save_to_ranking()

        self.assert_team_ranks(self.db.ranking.id,
                               dict(ladder_count=2, ladder_rank=1, points=90),
                               dict(ladder_count=2, ladder_rank=2, points=80),
                               )

    def test_updating_with_members_at_end_or_beginning_or_mid_works(self):
        self.process_ladder(members=[
            gen_member(bid=302, points=40),
            gen_member(bid=304, points=20),
        ])

        self.process_ladder(members=[
            gen_member(bid=301, points=50),
            gen_member(bid=303, points=30),
            gen_member(bid=305, points=10),
        ])

        self.save_to_ranking()

        t1, t2, t3, t4, t5 = self.db.get_teams_by_member0_bids(301, 302, 303, 304, 305)

        self.assert_team_ranks(self.db.ranking.id,
                               dict(team_id=t1, points=50),
                               dict(team_id=t2, points=40),
                               dict(team_id=t3, points=30),
                               dict(team_id=t4, points=20),
                               dict(team_id=t5, points=10),
                               )

    def test_updating_with_replacing_members_in_different_order_works(self):
        self.process_ladder(members=[
            gen_member(bid=301, points=50),
            gen_member(bid=302, points=30),
            gen_member(bid=303, points=10),
        ])

        self.process_ladder(members=[
            gen_member(bid=303, points=60),
            gen_member(bid=302, points=40),
            gen_member(bid=301, points=20),
        ])

        self.save_to_ranking()

        t1, t2, t3 = self.db.get_teams_by_member0_bids(301, 302, 303)

        self.assert_team_ranks(self.db.ranking.id,
                               dict(team_id=t3, points=60),
                               dict(team_id=t2, points=40),
                               dict(team_id=t1, points=20),
                               )

    def test_trigger_bug_insert_before_replace_will_make_double_insert(self):

        p1 = self.db.create_player(bid=301)
        t1 = self.db.create_team(member0=p1)

        p2 = self.db.create_player(bid=302)
        t2 = self.db.create_team(member0=p2)

        p3 = self.db.create_player(bid=303)
        t3 = self.db.create_team(member0=p3)

        self.process_ladder(members=[
            gen_member(bid=301),
            gen_member(bid=303),
        ])

        self.process_ladder(members=[
            gen_member(bid=302),
            gen_member(bid=303),
        ])

        self.save_to_ranking()

        self.assert_team_ranks(self.db.ranking.id,
                               dict(team_id=t1.id),
                               dict(team_id=t2.id),
                               dict(team_id=t3.id),
                               sort=False
                               )

    def test_trigger_insert_replace_and_add_at_the_same_time(self):

        p1 = self.db.create_player(bid=301)
        t1 = self.db.create_team(member0=p1)

        p2 = self.db.create_player(bid=302)
        t2 = self.db.create_team(member0=p2)

        p3 = self.db.create_player(bid=303)
        t3 = self.db.create_team(member0=p3)

        p4 = self.db.create_player(bid=304)
        t4 = self.db.create_team(member0=p4)

        p5 = self.db.create_player(bid=305)
        t5 = self.db.create_team(member0=p5)

        p6 = self.db.create_player(bid=306)
        t6 = self.db.create_team(member0=p6)

        self.process_ladder(members=[
            gen_member(bid=302, points=10),
            gen_member(bid=305),
        ])

        self.process_ladder(members=[
            gen_member(bid=301),
            gen_member(bid=302, points=20),
            gen_member(bid=303),
            gen_member(bid=304),
            gen_member(bid=306),
        ])

        self.save_to_ranking()

        self.assert_team_ranks(self.db.ranking.id,
                               dict(team_id=t1.id),
                               dict(team_id=t2.id, points=20),
                               dict(team_id=t3.id),
                               dict(team_id=t4.id),
                               dict(team_id=t5.id),
                               dict(team_id=t6.id),
                               sort=False
                               )

    def test_gm_is_using_points_before_season_28(self):
        self.db.create_season(id=27)
        self.db.create_ranking()

        self.process_ladder(league=League.GRANDMASTER, region=Region.EU,
                            members=[
                                gen_member(points=80),
                                gen_member(points=10),
                            ])

        self.process_ladder(league=League.GRANDMASTER, region=Region.KR,
                            members=[
                                gen_member(points=99),
                                gen_member(points=70),
                                gen_member(points=70),
                            ])

        self.process_ladder(league=League.GRANDMASTER, region=Region.AM,
                            members=[
                                gen_member(points=200),
                                gen_member(points=98),
                            ])

        self.save_to_ranking()

        self.assert_team_ranks(self.db.ranking.id,
                               dict(world_rank=1,  region_rank=1,  league_rank=1,  ladder_rank=1,
                                    points=200, region=Region.AM),
                               dict(world_rank=2,  region_rank=1,  league_rank=1,  ladder_rank=1,
                                    points=99, region=Region.KR),
                               dict(world_rank=3,  region_rank=2,  league_rank=2,  ladder_rank=2,
                                    points=98, region=Region.AM),
                               dict(world_rank=4,  region_rank=1,  league_rank=1,  ladder_rank=1,
                                    points=80, region=Region.EU),
                               dict(world_rank=5,  region_rank=2,  league_rank=2,  ladder_rank=2,
                                    points=70, region=Region.KR),
                               dict(world_rank=5,  region_rank=2,  league_rank=2,  ladder_rank=2,
                                    points=70, region=Region.KR),
                               dict(world_rank=7,  region_rank=2,  league_rank=2,  ladder_rank=2,
                                    points=10, region=Region.EU))

    def test_race3_is_not_overwritten__this_was_a_bug(self):
        self.db.create_season(id=29)
        self.db.create_ranking()

        self.process_ladder(mode=Mode.TEAM_4V4,
                            members=[
                                gen_member(race=Race.ZERG),
                                gen_member(race=Race.ZERG),
                                gen_member(race=Race.ZERG),
                                gen_member(race=Race.ZERG),
                            ])

        self.save_to_ranking()

        self.assert_team_ranks(self.db.ranking.id,
                               dict(race3=Race.ZERG))
예제 #4
0
class Test(DjangoTestCase):
    @classmethod
    def setUpClass(self):
        super(Test, self).setUpClass()
        self.db = Db()
        self.s1 = self.db.create_season(id=1)
        self.s2 = self.db.create_season(id=2)

    def setUp(self):
        super().setUp()
        self.now = utcnow()
        self.db.delete_all(keep=[Season])
        self.db.create_ranking()

    def test_player_season_is_updated_if_greater_than_current(self):
        self.db.create_player(bid=301,
                              name='arne0',
                              clan='arne0',
                              tag='arne0',
                              season=self.s1,
                              race=Race.TERRAN,
                              league=League.GOLD,
                              mode=Mode.TEAM_1V1)

        self.process_ladder(mode=Mode.TEAM_1V1,
                            league=League.GOLD,
                            season=self.s2,
                            bid=301,
                            name="arne1",
                            tag="arne1",
                            clan="arne1",
                            race=Race.TERRAN)

        self.assertEqual(1, len(Player.objects.all()))

        p = self.db.get(Player, bid=301)
        self.assertEqual("arne1", p.name)
        self.assertEqual("arne1", p.clan)
        self.assertEqual("arne1", p.tag)
        self.assertEqual(Race.TERRAN, p.race)
        self.assertEqual(League.GOLD, p.league)
        self.assertEqual(Mode.TEAM_1V1, p.mode)
        self.assertEqual(self.s2.id, p.season_id)

    def test_player_name_is_not_updated_but_other_info_is_if_new_name_is_empty__this_handles_bug_in_blizzard_api(
            self):
        self.db.create_player(bid=301,
                              name='arne0',
                              clan='arne0',
                              tag='arne0',
                              season=self.s1,
                              race=Race.TERRAN,
                              league=League.GOLD,
                              mode=Mode.TEAM_1V1)

        self.process_ladder(mode=Mode.TEAM_1V1,
                            league=League.GRANDMASTER,
                            season=self.s2,
                            bid=301,
                            name="",
                            tag="",
                            clan="",
                            race=Race.TERRAN)

        self.assertEqual(1, len(Player.objects.all()))

        p = self.db.get(Player, bid=301)
        self.assertEqual("arne0", p.name)
        self.assertEqual("arne0", p.clan)
        self.assertEqual("arne0", p.tag)
        self.assertEqual(Race.TERRAN, p.race)
        self.assertEqual(League.GRANDMASTER, p.league)
        self.assertEqual(Mode.TEAM_1V1, p.mode)
        self.assertEqual(self.s2.id, p.season_id)

    def test_race_mode_and_league_within_season_is_not_updated_if_mode_11_is_already_set(
            self):
        self.db.create_player(bid=301,
                              name='arne1',
                              clan='arne1',
                              tag='arne1',
                              season=self.s1,
                              race=Race.TERRAN,
                              league=League.GOLD,
                              mode=Mode.TEAM_1V1)

        self.process_ladder(mode=Mode.RANDOM_3V3,
                            league=League.PLATINUM,
                            season=self.s1,
                            bid=301,
                            name="arne1",
                            tag="arne1",
                            clan="arne1",
                            race=Race.ZERG)

        self.assertEqual(1, len(Player.objects.all()))

        p = self.db.get(Player, bid=301)
        self.assertEqual("arne1", p.name)
        self.assertEqual("arne1", p.clan)
        self.assertEqual("arne1", p.tag)
        self.assertEqual(Race.TERRAN, p.race)
        self.assertEqual(League.GOLD, p.league)
        self.assertEqual(Mode.TEAM_1V1, p.mode)
        self.assertEqual(self.s1.id, p.season_id)

    def test_race_is_updated_if_everything_else_is_the_same(self):
        self.db.create_player(bid=301,
                              name='arne1',
                              clan='arne1',
                              tag='arne1',
                              season=self.s1,
                              race=Race.TERRAN,
                              league=League.GOLD,
                              mode=Mode.RANDOM_2V2)

        self.process_ladder(mode=Mode.RANDOM_2V2,
                            league=League.GOLD,
                            season=self.s1,
                            bid=301,
                            name="arne1",
                            tag="arne1",
                            clan="arne1",
                            race=Race.ZERG)

        self.assertEqual(1, len(Player.objects.all()))

        p = self.db.get(Player, bid=301)
        self.assertEqual("arne1", p.name)
        self.assertEqual("arne1", p.clan)
        self.assertEqual("arne1", p.tag)
        self.assertEqual(Race.ZERG, p.race)
        self.assertEqual(League.GOLD, p.league)
        self.assertEqual(Mode.RANDOM_2V2, p.mode)
        self.assertEqual(self.s1.id, p.season_id)

    def test_race_is_updated_if_everything_else_is_the_same__but_not_if_1v1(
            self):
        self.db.create_player(bid=301,
                              name='arne1',
                              clan='arne1',
                              tag='arne1',
                              season=self.s1,
                              race=Race.TERRAN,
                              league=League.GOLD,
                              mode=Mode.TEAM_1V1)

        self.process_ladder(mode=Mode.TEAM_1V1,
                            league=League.GOLD,
                            season=self.s1,
                            bid=301,
                            name="arne1",
                            tag="arne1",
                            clan="arne1",
                            race=Race.ZERG)

        self.assertEqual(1, len(Player.objects.all()))

        p = self.db.get(Player, bid=301)
        self.assertEqual("arne1", p.name)
        self.assertEqual("arne1", p.clan)
        self.assertEqual("arne1", p.tag)
        self.assertEqual(Race.TERRAN, p.race)
        self.assertEqual(League.GOLD, p.league)
        self.assertEqual(Mode.TEAM_1V1, p.mode)
        self.assertEqual(self.s1.id, p.season_id)

    def test_three_ladders_to_see_that_correct_player_version_sticks_in_cache(
            self):
        self.db.create_player(bid=301,
                              name='arne1',
                              clan='arne1',
                              tag='arne1',
                              season=self.s1,
                              race=Race.TERRAN,
                              league=League.GOLD,
                              mode=Mode.RANDOM_3V3)

        # Loaded to cache, not updated.
        self.process_ladder(mode=Mode.RANDOM_3V3,
                            league=League.GOLD,
                            season=self.s1,
                            bid=301,
                            name="arne1",
                            tag="arne1",
                            clan="arne1",
                            race=Race.TERRAN)

        p = self.db.get(Player, bid=301)
        self.assertEqual(Race.TERRAN, p.race)
        self.assertEqual(League.GOLD, p.league)
        self.assertEqual(Mode.RANDOM_3V3, p.mode)
        self.assertEqual(self.s1.id, p.season_id)

        # Updated in db (and hopefully in cache).
        self.process_ladder(mode=Mode.RANDOM_2V2,
                            league=League.DIAMOND,
                            season=self.s1,
                            bid=301,
                            name="arne1",
                            tag="arne1",
                            clan="arne1",
                            race=Race.ZERG)

        p = self.db.get(Player, bid=301)
        self.assertEqual(Race.ZERG, p.race)
        self.assertEqual(League.DIAMOND, p.league)
        self.assertEqual(Mode.RANDOM_2V2, p.mode)
        self.assertEqual(self.s1.id, p.season_id)

        # Not updated if compared to cached version as it should.
        self.process_ladder(mode=Mode.RANDOM_4V4,
                            league=League.PLATINUM,
                            season=self.s1,
                            bid=301,
                            name="arne1",
                            tag="arne1",
                            clan="arne1",
                            race=Race.PROTOSS)

        p = self.db.get(Player, bid=301)
        self.assertEqual(Race.ZERG, p.race)
        self.assertEqual(League.DIAMOND, p.league)
        self.assertEqual(Mode.RANDOM_2V2, p.mode)
        self.assertEqual(self.s1.id, p.season_id)

    def test_race_is_updated_if_everything_else_is_the_same_even_if_mode_is_not_1v1(
            self):
        self.db.create_player(bid=301,
                              name='arne1',
                              clan='arne1',
                              tag='arne1',
                              season=self.s1,
                              race=Race.TERRAN,
                              league=League.GOLD,
                              mode=Mode.RANDOM_3V3)

        self.process_ladder(mode=Mode.RANDOM_3V3,
                            league=League.GOLD,
                            season=self.s1,
                            bid=301,
                            name="arne1",
                            tag="arne1",
                            clan="arne1",
                            race=Race.ZERG)

        self.assertEqual(1, len(Player.objects.all()))

        p = self.db.get(Player, bid=301)
        self.assertEqual("arne1", p.name)
        self.assertEqual("arne1", p.clan)
        self.assertEqual("arne1", p.tag)
        self.assertEqual(Race.ZERG, p.race)
        self.assertEqual(League.GOLD, p.league)
        self.assertEqual(Mode.RANDOM_3V3, p.mode)
        self.assertEqual(self.s1.id, p.season_id)

    def test_league_is_updated_if_better_league_and_another_mode_but_not_11_and_same_season(
            self):
        self.db.create_player(bid=301,
                              name='arne1',
                              clan='arne1',
                              tag='arne1',
                              season=self.s1,
                              race=Race.TERRAN,
                              league=League.GOLD,
                              mode=Mode.RANDOM_3V3)

        self.process_ladder(mode=Mode.RANDOM_4V4,
                            league=League.PLATINUM,
                            season=self.s1,
                            bid=301,
                            name="arne1",
                            tag="arne1",
                            clan="arne1",
                            race=Race.TERRAN)

        self.assertEqual(1, len(Player.objects.all()))

        p = self.db.get(Player, bid=301)
        self.assertEqual("arne1", p.name)
        self.assertEqual("arne1", p.clan)
        self.assertEqual("arne1", p.tag)
        self.assertEqual(Race.TERRAN, p.race)
        self.assertEqual(League.PLATINUM, p.league)
        self.assertEqual(Mode.RANDOM_4V4, p.mode)
        self.assertEqual(self.s1.id, p.season_id)

    def test_league_is_not_updated_if_worse_league_and_another_mode_but_not_11_and_same_season(
            self):
        self.db.create_player(bid=301,
                              name='arne1',
                              clan='arne1',
                              tag='arne1',
                              season=self.s1,
                              race=Race.TERRAN,
                              league=League.PLATINUM,
                              mode=Mode.RANDOM_3V3)

        self.process_ladder(mode=Mode.RANDOM_4V4,
                            league=League.GOLD,
                            season=self.s1,
                            bid=301,
                            name="arne1",
                            tag="arne1",
                            clan="arne1",
                            race=Race.TERRAN)

        self.assertEqual(1, len(Player.objects.all()))

        p = self.db.get(Player, bid=301)
        self.assertEqual("arne1", p.name)
        self.assertEqual("arne1", p.clan)
        self.assertEqual("arne1", p.tag)
        self.assertEqual(Race.TERRAN, p.race)
        self.assertEqual(League.PLATINUM, p.league)
        self.assertEqual(Mode.RANDOM_3V3, p.mode)
        self.assertEqual(self.s1.id, p.season_id)

    def test_league_is_updated_to_lower_within_mode_if_nothing_else_changes(
            self):
        self.db.create_player(bid=301,
                              name='arne1',
                              clan='arne1',
                              tag='arne1',
                              season=self.s1,
                              race=Race.TERRAN,
                              league=League.PLATINUM,
                              mode=Mode.RANDOM_3V3)

        self.process_ladder(mode=Mode.RANDOM_3V3,
                            league=League.GOLD,
                            season=self.s1,
                            bid=301,
                            name="arne1",
                            tag="arne1",
                            clan="arne1",
                            race=Race.TERRAN)

        self.assertEqual(1, len(Player.objects.all()))

        p = self.db.get(Player, bid=301)
        self.assertEqual("arne1", p.name)
        self.assertEqual("arne1", p.clan)
        self.assertEqual("arne1", p.tag)
        self.assertEqual(Race.TERRAN, p.race)
        self.assertEqual(League.GOLD, p.league)
        self.assertEqual(Mode.RANDOM_3V3, p.mode)
        self.assertEqual(self.s1.id, p.season_id)

    def test_update_from_null_works(self):
        self.db.create_player(bid=301,
                              name="arne1",
                              tag="",
                              clan="",
                              mode=None,
                              league=None,
                              race=None,
                              season=None)

        self.process_ladder(mode=Mode.RANDOM_3V3,
                            league=League.GOLD,
                            season=self.s1,
                            bid=301,
                            name="arne1",
                            tag="arne1",
                            clan="arne1",
                            race=Race.TERRAN)

        self.assertEqual(1, len(Player.objects.all()))

        p = self.db.get(Player, bid=301)
        self.assertEqual("arne1", p.name)
        self.assertEqual("arne1", p.clan)
        self.assertEqual("arne1", p.tag)
        self.assertEqual(Race.TERRAN, p.race)
        self.assertEqual(League.GOLD, p.league)
        self.assertEqual(Mode.RANDOM_3V3, p.mode)
        self.assertEqual(self.s1.id, p.season_id)

    def test_season_is_not_updated_if_season_if_after_player_season(self):

        self.db.create_player(bid=301,
                              name='arne0',
                              clan='arne0',
                              tag='arne0',
                              season=self.s2,
                              race=Race.TERRAN,
                              league=League.GOLD,
                              mode=Mode.TEAM_1V1)

        self.process_ladder(mode=Mode.TEAM_1V1,
                            league=League.GOLD,
                            season=self.s1,
                            bid=301,
                            name="arne1",
                            tag="arne1",
                            clan="arne1",
                            race=Race.TERRAN)

        self.assertEqual(1, len(Player.objects.all()))

        p = self.db.get(Player, bid=301)
        self.assertEqual("arne0", p.name)
        self.assertEqual("arne0", p.clan)
        self.assertEqual("arne0", p.tag)
        self.assertEqual(Race.TERRAN, p.race)
        self.assertEqual(League.GOLD, p.league)
        self.assertEqual(Mode.TEAM_1V1, p.mode)
        self.assertEqual(self.s2.id, p.season_id)
예제 #5
0
class Test(DjangoTestCase):

    @classmethod
    def setUpClass(self):
        super(Test, self).setUpClass()
        self.db = Db()
        self.db.create_season(id=1)

    def setUp(self):
        super().setUp()
        self.now = utcnow()
        self.db.delete_all(keep=[Season])
        self.ladder = self.db.create_ladder(bid=1, created=self.datetime(seconds=1))  # Always using same ladder.

    def test_non_existent_4v4_team_is_created(self):
        self.process_ladder(mode=Mode.TEAM_4V4,
                            members=[gen_member(bid=301, race=Race.ZERG),
                                     gen_member(bid=302, race=Race.PROTOSS),
                                     gen_member(bid=303, race=Race.TERRAN),
                                     gen_member(bid=304, race=Race.TERRAN)])
        
        p1 = self.db.get(Player, bid=301)
        p2 = self.db.get(Player, bid=302)
        p3 = self.db.get(Player, bid=303)
        p4 = self.db.get(Player, bid=304)
        t1 = self.db.all(Team)[0]
        self.assertEqual(1, len(self.db.all(Team)))
        self.assertEqual(Mode.TEAM_4V4, t1.mode)
        self.assertEqual(p1.id, t1.member0_id)
        self.assertEqual(p2.id, t1.member1_id)
        self.assertEqual(p3.id, t1.member2_id)
        self.assertEqual(p4.id, t1.member3_id)
        self.assertEqual(Race.ZERG,    t1.race0)
        self.assertEqual(Race.PROTOSS, t1.race1)
        self.assertEqual(Race.TERRAN,  t1.race2)
        self.assertEqual(Race.TERRAN,  t1.race3)

    def test_process_two_4v4_ladders_with_the_same_team_but_different_order_just_creates_one_team(self):
        self.process_ladder(mode=Mode.TEAM_4V4,
                            members=[gen_member(bid=301, race=Race.ZERG),
                                     gen_member(bid=302, race=Race.PROTOSS),
                                     gen_member(bid=303, race=Race.TERRAN),
                                     gen_member(bid=304, race=Race.RANDOM)])

        self.process_ladder(mode=Mode.TEAM_4V4,
                            members=[gen_member(bid=304, race=Race.RANDOM),
                                     gen_member(bid=303, race=Race.TERRAN),
                                     gen_member(bid=302, race=Race.PROTOSS),
                                     gen_member(bid=301, race=Race.ZERG)])

        self.assertEqual(1, len(self.db.all(Team)))

        p1 = self.db.get(Player, bid=301)
        p2 = self.db.get(Player, bid=302)
        p3 = self.db.get(Player, bid=303)
        p4 = self.db.get(Player, bid=304)
        t1 = self.db.all(Team)[0]

        self.assertEqual(1, len(self.db.all(Team)))
        self.assertEqual(Mode.TEAM_4V4, t1.mode)
        self.assertEqual(p1.id, t1.member0_id)
        self.assertEqual(p2.id, t1.member1_id)
        self.assertEqual(p3.id, t1.member2_id)
        self.assertEqual(p4.id, t1.member3_id)
        self.assertEqual(Race.ZERG,    t1.race0)
        self.assertEqual(Race.PROTOSS, t1.race1)
        self.assertEqual(Race.TERRAN,  t1.race2)
        self.assertEqual(Race.RANDOM,  t1.race3)

    def test_process_two_3v3_ladders_with_the_same_team_but_different_order_just_creates_one_team(self):
        self.process_ladder(mode=Mode.TEAM_3V3,
                            members=[gen_member(bid=301, race=Race.ZERG),
                                     gen_member(bid=302, race=Race.PROTOSS),
                                     gen_member(bid=303, race=Race.TERRAN)])

        self.process_ladder(mode=Mode.TEAM_3V3,
                            members=[gen_member(bid=303, race=Race.TERRAN),
                                     gen_member(bid=302, race=Race.PROTOSS),
                                     gen_member(bid=301, race=Race.ZERG)])

        self.assertEqual(1, len(self.db.all(Team)))

        p1 = self.db.get(Player, bid=301)
        p2 = self.db.get(Player, bid=302)
        p3 = self.db.get(Player, bid=303)
        t1 = self.db.all(Team)[0]

        self.assertEqual(Mode.TEAM_3V3, t1.mode)
        self.assertEqual(p1.id, t1.member0_id)
        self.assertEqual(p2.id, t1.member1_id)
        self.assertEqual(p3.id, t1.member2_id)
        self.assertEqual(None,  t1.member3_id)
        self.assertEqual(Race.ZERG,     t1.race0)
        self.assertEqual(Race.PROTOSS,  t1.race1)
        self.assertEqual(Race.TERRAN,   t1.race2)
        self.assertEqual(Race.UNKNOWN,  t1.race3)

    def test_process_two_2v2_ladders_with_the_same_team_but_different_order_just_creates_one_team(self):
        self.process_ladder(mode=Mode.TEAM_2V2, members=[gen_member(bid=301, race=Race.ZERG),
                                                         gen_member(bid=302, race=Race.PROTOSS)])

        self.assertEqual(1, len(self.db.all(Team)))

        p1 = self.db.get(Player, bid=301)
        p2 = self.db.get(Player, bid=302)
        t1 = self.db.all(Team)[0]

        self.assertEqual(Mode.TEAM_2V2, t1.mode)
        self.assertEqual(p1.id, t1.member0_id)
        self.assertEqual(p2.id, t1.member1_id)
        self.assertEqual(None,  t1.member2_id)
        self.assertEqual(None,  t1.member3_id)
        self.assertEqual(Race.ZERG,     t1.race0)
        self.assertEqual(Race.PROTOSS,  t1.race1)
        self.assertEqual(Race.UNKNOWN,  t1.race2)
        self.assertEqual(Race.UNKNOWN,  t1.race3)

    def test_existent_random_4v4_is_updated_with_changed_race(self):
        p1 = self.db.create_player(bid=301)
        t1 = self.db.create_team(mode=Mode.RANDOM_4V4,
                                 member0=p1,
                                 season=self.db.season,
                                 race0=Race.TERRAN)

        self.process_ladder(mode=Mode.RANDOM_4V4, bid=301, race=Race.ZERG)

        self.assertEqual(1, len(self.db.all(Team)))

        p1 = self.db.get(Player, bid=301)
        t1 = self.db.get(Team, id=t1.pk)
        self.assertEqual(1, len(Team.objects.all()))
        self.assertEqual(Mode.RANDOM_4V4, t1.mode)
        self.assertEqual(p1.id, t1.member0_id)
        self.assertEqual(None,  t1.member1_id)
        self.assertEqual(None,  t1.member2_id)
        self.assertEqual(None,  t1.member3_id)
        self.assertEqual(Race.ZERG,    t1.race0)
        self.assertEqual(Race.UNKNOWN, t1.race1)
        self.assertEqual(Race.UNKNOWN, t1.race2)
        self.assertEqual(Race.UNKNOWN, t1.race3)

    def test_existent_2v2_random_team_is_updated_even_if_there_is_a_3v3_random_team_with_the_same_member(self):
        p1 = self.db.create_player(bid=301)

        t1 = self.db.create_team(mode=Mode.RANDOM_2V2,
                                 season=self.db.season,
                                 member0=p1,
                                 race0=Race.TERRAN)

        t2 = self.db.create_team(mode=Mode.RANDOM_3V3,
                                 season=self.db.season,
                                 member0=p1,
                                 race0=Race.RANDOM)

        self.process_ladder(mode=Mode.RANDOM_2V2, bid=301, race=Race.ZERG)

        self.assertEqual(2, len(Team.objects.all()))

        p1 = self.db.get(Player, bid=301)

        t1 = self.db.get(Team, id=t1.pk)
        self.assertEqual(Mode.RANDOM_2V2, t1.mode)
        self.assertEqual(p1.id, t1.member0_id)
        self.assertEqual(None,  t1.member1_id)
        self.assertEqual(None,  t1.member2_id)
        self.assertEqual(None,  t1.member3_id)
        self.assertEqual(Race.ZERG,    t1.race0)
        self.assertEqual(Race.UNKNOWN, t1.race1)
        self.assertEqual(Race.UNKNOWN, t1.race2)
        self.assertEqual(Race.UNKNOWN, t1.race3)

        t2 = self.db.get(Team, id=t2.pk)
        self.assertEqual(Mode.RANDOM_3V3, t2.mode)
        self.assertEqual(p1.id, t2.member0_id)
        self.assertEqual(None,  t2.member1_id)
        self.assertEqual(None,  t2.member2_id)
        self.assertEqual(None,  t2.member3_id)
        self.assertEqual(Race.RANDOM,  t2.race0)
        self.assertEqual(Race.UNKNOWN, t2.race1)
        self.assertEqual(Race.UNKNOWN, t2.race2)
        self.assertEqual(Race.UNKNOWN, t2.race3)

    def test_existent_1v1_team_is_updated_on_league_change_to_better_league(self):
        p1 = self.db.create_player(bid=301)
        t1 = self.db.create_team(mode=Mode.TEAM_1V1,
                                 season=self.db.season,
                                 member0=p1,
                                 league=League.GOLD)

        self.process_ladder(mode=Mode.TEAM_1V1, league=League.PLATINUM, bid=301, race=Race.ZERG)

        self.assertEqual(1, len(Team.objects.all()))

        p1 = self.db.get(Player, bid=301)
        t1 = self.db.get(Team, id=t1.pk)
        self.assertEqual(1, len(Team.objects.all()))
        self.assertEqual(Mode.TEAM_1V1, t1.mode)
        self.assertEqual(p1.id, t1.member0_id)
        self.assertEqual(None,  t1.member1_id)
        self.assertEqual(None,  t1.member2_id)
        self.assertEqual(None,  t1.member3_id)
        self.assertEqual(League.PLATINUM, t1.league)
        self.assertEqual(Race.ZERG, t1.race0)
        self.assertEqual(Race.UNKNOWN, t1.race1)
        self.assertEqual(Race.UNKNOWN, t1.race2)
        self.assertEqual(Race.UNKNOWN, t1.race3)

    def test_existent_1v1_team_is_not_updated_on_league_change_to_worse(self):
        p1 = self.db.create_player(bid=301)
        t1 = self.db.create_team(mode=Mode.TEAM_1V1,
                                 season=self.db.season,
                                 member0=p1,
                                 league=League.GOLD)

        self.process_ladder(mode=Mode.TEAM_1V1, league=League.SILVER, bid=301, race=Race.ZERG)

        self.assertEqual(1, len(Team.objects.all()))

        p1 = self.db.get(Player, bid=301)
        t1 = self.db.get(Team, id=t1.pk)
        self.assertEqual(1, len(Team.objects.all()))
        self.assertEqual(Mode.TEAM_1V1, t1.mode)
        self.assertEqual(p1.id, t1.member0_id)
        self.assertEqual(None,  t1.member1_id)
        self.assertEqual(None,  t1.member2_id)
        self.assertEqual(None,  t1.member3_id)
        self.assertEqual(League.GOLD, t1.league)
        self.assertEqual(Race.ZERG, t1.race0)
        self.assertEqual(Race.UNKNOWN, t1.race1)
        self.assertEqual(Race.UNKNOWN, t1.race2)
        self.assertEqual(Race.UNKNOWN, t1.race3)
예제 #6
0
class Test(DjangoTestCase):
    @classmethod
    def setUpClass(self):
        super(Test, self).setUpClass()
        self.db = Db()
        self.s1 = self.db.create_season(id=1)
        self.s2 = self.db.create_season(id=2)
        self.s3 = self.db.create_season(id=3)

    def setUp(self):
        super().setUp()
        self.now = utcnow()
        self.db.delete_all(keep=[Season])
        self.ladder = self.db.create_ladder(
            bid=1,
            created=self.datetime(seconds=1))  # Always using same ladder.

    def test_team_is_updated_with_both_version_and_league_with_new_season(
            self):
        p1 = self.db.create_player(bid=301, race=Race.ZERG)

        t1 = self.db.create_team(mode=Mode.TEAM_1V1,
                                 season=self.s1,
                                 version=Version.HOTS,
                                 league=League.PLATINUM,
                                 member0=p1,
                                 race0=Race.ZERG)

        self.db.create_ranking(season=self.s2)

        self.process_ladder(mode=Mode.TEAM_1V1,
                            season=self.s2,
                            version=Version.WOL,
                            league=League.GOLD,
                            members=[gen_member(bid=301, race=Race.ZERG)])

        self.assertEqual(1, len(Team.objects.all()))

        t1 = self.db.get(Team, member0=self.db.get(Player, bid=301))

        self.assertEqual(self.s2, t1.season)
        self.assertEqual(Version.WOL, t1.version)
        self.assertEqual(League.GOLD, t1.league)

    def test_team_is_updated_with_both_version_and_league_with_new_season_test_2(
            self):
        p1 = self.db.create_player(bid=301, race=Race.ZERG)

        t1 = self.db.create_team(mode=Mode.TEAM_1V1,
                                 season=self.s1,
                                 version=Version.WOL,
                                 league=League.GOLD,
                                 member0=p1,
                                 race0=Race.ZERG)

        self.db.create_ranking(season=self.s2)

        self.process_ladder(mode=Mode.TEAM_1V1,
                            season=self.s2,
                            version=Version.HOTS,
                            league=League.PLATINUM,
                            members=[gen_member(bid=301, race=Race.ZERG)])

        self.assertEqual(1, len(Team.objects.all()))

        t1 = self.db.get(Team, member0=self.db.get(Player, bid=301))

        self.assertEqual(self.s2, t1.season)
        self.assertEqual(Version.HOTS, t1.version)
        self.assertEqual(League.PLATINUM, t1.league)

    def test_update_of_version_to_later_version_is_updated_within_same_season(
            self):
        p1 = self.db.create_player(bid=301, race=Race.ZERG)

        t1 = self.db.create_team(mode=Mode.TEAM_1V1,
                                 season=self.s1,
                                 version=Version.WOL,
                                 league=League.PLATINUM,
                                 member0=p1,
                                 race0=Race.ZERG)

        self.process_ladder(mode=Mode.TEAM_1V1,
                            season=self.s1,
                            version=Version.HOTS,
                            league=League.GOLD,
                            members=[gen_member(bid=301, race=Race.ZERG)])

        t1 = self.db.get(Team, member0=self.db.get(Player, bid=301))

        self.assertEqual(self.s1, t1.season)
        self.assertEqual(Version.HOTS, t1.version)
        self.assertEqual(League.GOLD, t1.league)

    def test_update_of_version_to_earlier_version_is_not_updated_when_in_same_season(
            self):
        p1 = self.db.create_player(bid=301, race=Race.ZERG)

        t1 = self.db.create_team(mode=Mode.TEAM_1V1,
                                 season=self.s1,
                                 version=Version.HOTS,
                                 league=League.PLATINUM,
                                 member0=p1,
                                 race0=Race.ZERG)

        self.process_ladder(mode=Mode.TEAM_1V1,
                            season=self.s1,
                            version=Version.WOL,
                            league=League.GRANDMASTER,
                            bid=301,
                            race=Race.ZERG)

        t1 = self.db.get(Team, member0=self.db.get(Player, bid=301))

        self.assertEqual(self.s1, t1.season)
        self.assertEqual(Version.HOTS, t1.version)
        self.assertEqual(League.PLATINUM, t1.league)

    def test_update_of_league_is_updated_when_version_and_season_is_then_same_1(
            self):
        p1 = self.db.create_player(bid=301, race=Race.ZERG)

        t1 = self.db.create_team(mode=Mode.RANDOM_2V2,
                                 season=self.s1,
                                 version=Version.HOTS,
                                 league=League.PLATINUM,
                                 member0=p1,
                                 race0=Race.ZERG)

        self.process_ladder(mode=Mode.RANDOM_2V2,
                            season=self.s1,
                            version=Version.HOTS,
                            league=League.GRANDMASTER,
                            bid=301,
                            race=Race.ZERG)

        t1 = self.db.get(Team, member0=self.db.get(Player, bid=301))

        self.assertEqual(self.s1, t1.season)
        self.assertEqual(Version.HOTS, t1.version)
        self.assertEqual(League.GRANDMASTER, t1.league)

    def test_update_of_league_is_updated_when_version_and_season_is_then_same_2(
            self):

        p1 = self.db.create_player(bid=301, race=Race.ZERG)

        t1 = self.db.create_team(mode=Mode.RANDOM_2V2,
                                 season=self.s1,
                                 version=Version.HOTS,
                                 league=League.GRANDMASTER,
                                 member0=p1,
                                 race0=Race.ZERG)

        self.process_ladder(mode=Mode.RANDOM_2V2,
                            season=self.s1,
                            version=Version.HOTS,
                            league=League.PLATINUM,
                            bid=301,
                            race=Race.ZERG)

        t1 = self.db.get(Team, member0=self.db.get(Player, bid=301))

        self.assertEqual(self.s1, t1.season)
        self.assertEqual(Version.HOTS, t1.version)
        self.assertEqual(League.PLATINUM, t1.league)

    def test_three_ladders_to_see_that_correct_team_version_sticks_in_cache(
            self):

        p1 = self.db.create_player(bid=301, race=Race.ZERG)

        t1 = self.db.create_team(mode=Mode.TEAM_1V1,
                                 season=self.s1,
                                 version=Version.HOTS,
                                 league=League.PLATINUM,
                                 member0=p1,
                                 race0=Race.ZERG)

        # Loaded to cache, not updated.

        self.process_ladder(mode=Mode.TEAM_1V1,
                            season=self.s1,
                            version=Version.HOTS,
                            league=League.PLATINUM,
                            bid=301,
                            race=Race.ZERG)

        t1 = self.db.get(Team, member0=self.db.get(Player, bid=301))

        self.assertEqual(self.s1, t1.season)
        self.assertEqual(Version.HOTS, t1.version)
        self.assertEqual(League.PLATINUM, t1.league)

        # Updated in db (and hopefully in cache).

        self.process_ladder(mode=Mode.TEAM_1V1,
                            season=self.s3,
                            version=Version.WOL,
                            league=League.GOLD,
                            bid=301,
                            race=Race.ZERG)

        t1 = self.db.get(Team, member0=self.db.get(Player, bid=301))

        self.assertEqual(self.s3, t1.season)
        self.assertEqual(Version.WOL, t1.version)
        self.assertEqual(League.GOLD, t1.league)

        # Not updated if compared to cached version as it should.

        self.process_ladder(mode=Mode.TEAM_1V1,
                            season=self.s2,
                            version=Version.LOTV,
                            league=League.GRANDMASTER,
                            bid=301,
                            race=Race.ZERG)

        t1 = self.db.get(Team, member0=self.db.get(Player, bid=301))

        self.assertEqual(self.s3, t1.season)
        self.assertEqual(Version.WOL, t1.version)
        self.assertEqual(League.GOLD, t1.league)
예제 #7
0
class Test(DjangoTestCase):
    @classmethod
    def setUpClass(self):
        super(Test, self).setUpClass()
        self.db = Db()

        # Required objects, not actually used in test cases.
        self.db.create_cache()
        self.db.create_ladder()

    def setUp(self):
        super().setUp()
        self.db.delete_all(keep=[Cache, Ladder])
        self.db.create_season(id=26, version=Version.LOTV)
        self.c = Client()

    def tearDown(self):
        rankings_view_client.close()
        super(Test, self).tearDown()

    def test_view_team(self):
        p1 = self.db.create_player(name="arne")
        t1 = self.db.create_team()

        self.db.create_player(name="sune")
        t2 = self.db.create_team()

        r1 = self.db.create_ranking()
        self.db.create_ranking_data(
            data=[dict(team_id=t1.id, ladder_rank=10, version=Version.WOL)])

        r2 = self.db.create_ranking()
        self.db.create_ranking_data(data=[
            dict(team_id=t1.id, ladder_rank=11, version=Version.HOTS),
            dict(team_id=t2.id, ladder_rank=8, version=Version.HOTS)
        ])

        r3 = self.db.create_ranking()
        self.db.create_ranking_data(data=[
            dict(team_id=t1.id, ladder_rank=12, version=Version.HOTS),
            dict(team_id=t1.id, ladder_rank=6, version=Version.WOL)
        ])

        r4 = self.db.create_ranking()
        self.db.create_ranking_data(data=[
            dict(team_id=t1.id, ladder_rank=4, version=Version.HOTS),
            dict(team_id=t1.id, ladder_rank=13, version=Version.LOTV)
        ])

        response = self.c.get('/team/%d/' % t1.id)
        self.assertEqual(200, response.status_code)
        self.assertEqual(t1, response.context['team'])
        self.assertEqual([p1], response.context['members'])

        response = self.c.get('/team/%d/rankings/' % t1.id)

        self.assertEqual(200, response.status_code)

        data = json.loads(response.content.decode('utf-8'))

        self.assertEqual(4, len(data))

        data0 = data[0]

        self.assertEqual(r1.id, data0['id'])
        self.assertEqual(10, data0['ladder_rank'])
        self.assertEqual(Version.WOL, data0['version'])

        data1 = data[1]

        self.assertEqual(r2.id, data1['id'])
        self.assertEqual(11, data1['ladder_rank'])
        self.assertEqual(Version.HOTS, data1['version'])

        data2 = data[2]

        self.assertEqual(r3.id, data2['id'])
        self.assertEqual(12, data2['ladder_rank'])
        self.assertEqual(Version.HOTS, data2['version'])

        data3 = data[3]

        self.assertEqual(r4.id, data3['id'])
        self.assertEqual(13, data3['ladder_rank'])
        self.assertEqual(Version.LOTV, data3['version'])

    def test_no_mmr_is_filtered_after_mmr_season(self):
        s27 = self.db.create_season(id=27)
        s28 = self.db.create_season(id=28)

        p1 = self.db.create_player(name="arne")
        t1 = self.db.create_team()

        r1 = self.db.create_ranking(season=s27)
        self.db.create_ranking_data(data=[dict(ladder_rank=10, mmr=NO_MMR)])

        r2 = self.db.create_ranking(season=s28)
        self.db.create_ranking_data(data=[dict(ladder_rank=11, mmr=NO_MMR)])

        r3 = self.db.create_ranking(season=s28)
        self.db.create_ranking_data(data=[dict(ladder_rank=12, mmr=120)])

        response = self.c.get('/team/%d/rankings/' % t1.id)

        self.assertEqual(200, response.status_code)

        data = json.loads(response.content.decode('utf-8'))

        self.assertEqual(2, len(data))

        data0 = data[0]

        self.assertEqual(r1.id, data0['id'])
        self.assertEqual(10, data0['ladder_rank'])

        data1 = data[1]

        self.assertEqual(r3.id, data1['id'])
        self.assertEqual(12, data1['ladder_rank'])
        self.assertEqual(120, data1['mmr'])
예제 #8
0
class Test(DjangoTestCase):

    @classmethod
    def setUpClass(self):
        super(Test, self).setUpClass()
        self.db = Db()
        self.db.create_season(id=29)
        self.db.create_cache()  # Ranking needs it for source.

    def setUp(self):
        super().setUp()
        self.now = utcnow()
        self.db.delete_all(keep=[Season, Cache])
        self.db.create_ranking()
        self.ladder = self.db.create_ladder(bid=1, created=self.datetime(seconds=1))  # Always using same ladder.

    def test_no_update_of_player_or_team_if_worse_with_another_race(self):
        p1 = self.db.create_player(bid=301,
                                   league=League.PLATINUM,
                                   race=Race.ZERG)

        t1 = self.db.create_team(mode=Mode.TEAM_1V1,
                                 league=League.PLATINUM,
                                 member0=p1,
                                 race0=Race.ZERG)

        self.db.create_ranking()
        self.db.create_ranking_data(data=[dict(team_id=t1.id,
                                               league=League.PLATINUM,
                                               mmr=4000,
                                               race0=Race.ZERG)]),

        self.process_ladder(load=True,
                            mode=Mode.TEAM_1V1,
                            league=League.GOLD,
                            bid=301,
                            mmr=3000,
                            race=Race.TERRAN)

        p1.refresh_from_db()
        t1.refresh_from_db()

        self.assertEqual(League.PLATINUM, t1.league)
        self.assertEqual(Race.ZERG, t1.race0)
        self.assertEqual(League.PLATINUM, p1.league)
        self.assertEqual(Race.ZERG, p1.race)

    def test_update_of_player_and_team_if_better_with_another_race(self):
        p1 = self.db.create_player(bid=301,
                                   league=League.PLATINUM,
                                   race=Race.ZERG)

        t1 = self.db.create_team(mode=Mode.TEAM_1V1,
                                 league=League.PLATINUM,
                                 member0=p1,
                                 race0=Race.ZERG)

        self.db.create_ranking()
        self.db.create_ranking_data(data=[dict(team_id=t1.id, mmr=3000, league=League.PLATINUM, race0=Race.ZERG)]),

        self.process_ladder(mode=Mode.TEAM_1V1,
                            league=League.MASTER,
                            mmr=5000,
                            bid=301,
                            race=Race.TERRAN)

        p1.refresh_from_db()
        t1.refresh_from_db()

        self.assertEqual(League.MASTER, t1.league)
        self.assertEqual(Race.TERRAN, t1.race0)
        self.assertEqual(League.MASTER, p1.league)
        self.assertEqual(Race.TERRAN, p1.race)

    def test_update_of_player_and_team_if_better_with_same_race(self):
        p1 = self.db.create_player(bid=301,
                                   league=League.PLATINUM,
                                   race=Race.ZERG)

        t1 = self.db.create_team(mode=Mode.TEAM_1V1,
                                 league=League.PLATINUM,
                                 member0=p1,
                                 race0=Race.ZERG)

        self.db.create_ranking()
        self.db.create_ranking_data(data=[dict(team_id=t1.id, league=League.PLATINUM, mmr=3000, race0=Race.ZERG)]),

        self.process_ladder(mode=Mode.TEAM_1V1,
                            league=League.MASTER,
                            mmr=5000,
                            bid=301,
                            race=Race.ZERG)

        p1.refresh_from_db()
        t1.refresh_from_db()

        self.assertEqual(League.MASTER, t1.league)
        self.assertEqual(Race.ZERG, t1.race0)
        self.assertEqual(League.MASTER, p1.league)
        self.assertEqual(Race.ZERG, p1.race)

    def test_same_1v1_can_have_multiple_rankings_with_different_races(self):
        self.process_ladder(league=League.SILVER,
                            members=[
                                gen_member(bid=1, mmr=50, race=Race.TERRAN),
                                gen_member(bid=1, mmr=40, race=Race.ZERG),
                                gen_member(bid=1, mmr=30, race=Race.RANDOM),
                            ])

        self.process_ladder(league=League.GOLD,
                            members=[
                                gen_member(bid=1, mmr=90, race=Race.TERRAN),
                                gen_member(bid=1, mmr=80, race=Race.PROTOSS),
                                gen_member(bid=1, mmr=70, race=Race.ZERG),
                            ])

        self.save_to_ranking()

        self.assert_team_ranks(
            self.db.ranking.id,
            dict(region_count=4, region_rank=1, mmr=90, race0=Race.TERRAN,  race3=9, league=League.GOLD),
            dict(region_count=4, region_rank=2, mmr=80, race0=Race.PROTOSS, race3=8, league=League.GOLD),
            dict(region_count=4, region_rank=3, mmr=70, race0=Race.ZERG,    race3=8, league=League.GOLD),
            dict(region_count=4, region_rank=4, mmr=30, race0=Race.RANDOM,  race3=8, league=League.SILVER),
        )

    def test_same_1v1_can_have_multiple_rankings_with_different_races_among_other_players(self):
        self.process_ladder(league=League.SILVER,
                            members=[
                                gen_member(bid=2, mmr=50, race=Race.ZERG),
                                gen_member(bid=1, mmr=40, race=Race.TERRAN),
                                gen_member(bid=3, mmr=30, race=Race.RANDOM),
                            ])

        self.process_ladder(league=League.GOLD,
                            members=[
                                gen_member(bid=1, mmr=90, race=Race.ZERG),
                                gen_member(bid=4, mmr=80, race=Race.PROTOSS),
                                gen_member(bid=5, mmr=70, race=Race.TERRAN),
                            ])

        self.save_to_ranking()

        self.assert_team_ranks(
            self.db.ranking.id,
            dict(region_count=6, region_rank=1, mmr=90, race0=Race.ZERG,    race3=9, league=League.GOLD),
            dict(region_count=6, region_rank=2, mmr=80, race0=Race.PROTOSS, race3=9, league=League.GOLD),
            dict(region_count=6, region_rank=3, mmr=70, race0=Race.TERRAN,  race3=9, league=League.GOLD),
            dict(region_count=6, region_rank=4, mmr=50, race0=Race.ZERG,    race3=9, league=League.SILVER),
            dict(region_count=6, region_rank=5, mmr=40, race0=Race.TERRAN,  race3=8, league=League.SILVER),
            dict(region_count=6, region_rank=6, mmr=30, race0=Race.RANDOM,  race3=9, league=League.SILVER),
        )

    def test_same_random_2v2__can_not_have_multiple_rankings_with_different_races(self):
        
        self.process_ladder(league=League.SILVER,
                            mode=Mode.RANDOM_2V2,
                            members=[
                                gen_member(bid=1, mmr=40, race=Race.TERRAN),
                            ])

        self.process_ladder(league=League.GOLD,
                            mode=Mode.RANDOM_2V2,
                            members=[
                                gen_member(bid=1, mmr=90, race=Race.ZERG),
                            ])

        self.save_to_ranking()

        self.assert_team_ranks(
            self.db.ranking.id,
            dict(region_count=1, region_rank=1, mmr=90, race0=Race.ZERG, league=League.GOLD),
        )
예제 #9
0
class Test(DjangoTestCase):
    @classmethod
    def setUpClass(self):
        super(Test, self).setUpClass()
        self.db = Db()
        self.db.create_cache()
        self.s1 = self.db.create_season(id=16)
        self.s2 = self.db.create_season(id=17)
        self.db.create_ranking()

    def setUp(self):
        super().setUp()
        cache.clear()
        self.db.delete_all(keep=[Season, Cache, Ranking])
        self.c = Client()

    def test_view_player(self):
        p = self.db.create_player(name="arne")
        t = self.db.create_team(season=self.s2)

        response = self.c.get('/player/%d/' % p.id)

        self.assertEqual(200, response.status_code)
        self.assertEqual(p, response.context['player'])
        teams = response.context['teams']
        self.assertEqual([t.id], [t.id for t in teams])
        self.assertEqual('/ladder/hots/1v1/ladder-rank/?team=%d' % t.id,
                         teams[0].ladder_url)

    def test_view_player_many_teams(self):
        p0 = self.db.create_player(name="arne0", bid=301)
        p1 = self.db.create_player(name="arne1", bid=302)
        p1 = self.db.create_player(name="arne2", bid=303)
        p2 = self.db.create_player(name="arne3", bid=304)
        p3 = self.db.create_player(name="arne4", bid=305)
        p4 = self.db.create_player(name="arne5", bid=306)
        t0 = self.db.create_team(mode=Mode.TEAM_1V1,
                                 season=self.s1,
                                 member0=p0)
        t1 = self.db.create_team(mode=Mode.TEAM_4V4,
                                 season=self.s1,
                                 member0=p3,
                                 member1=p2,
                                 member2=p1,
                                 member3=p0)
        t2 = self.db.create_team(mode=Mode.TEAM_2V2,
                                 season=self.s1,
                                 member0=p0,
                                 member1=p4)
        t3 = self.db.create_team(mode=Mode.ARCHON,
                                 season=self.s1,
                                 member0=p0,
                                 member1=p1)

        response = self.c.get('/player/%d/' % p0.id)

        self.assertEqual(200, response.status_code)
        self.assertEqual(p0, response.context['player'])
        teams = response.context['teams']
        self.assertEqual([t0.id, t3.id, t2.id, t1.id], [t.id for t in teams])
        self.assertEqual([False, False, False, False],
                         [hasattr(t, 'ladder_url') for t in teams])
예제 #10
0
class Test(DjangoTestCase):

    @classmethod
    def setUpClass(self):
        super(Test, self).setUpClass()
        self.db = Db()
        self.db.create_cache()
        self.db.create_season()
        self.db.create_ranking()

    def setUp(self):
        super().setUp()
        self.db.delete_all(keep=[Cache, Season, Ranking])
        self.c = Client()

    def test_search_by_name(self):
        p = self.db.create_player(name="arne")

        response = self.c.get('/search/', {'name': 'arne'})

        self.assertEqual(200, response.status_code)
        self.assertEqual([p], response.context['items'])
        self.assertIsNone(response.context['prev'])
        self.assertIsNone(response.context['next'])

    def test_search_by_name_prefix(self):
        p = self.db.create_player(name="sunexxxyz")

        response = self.c.get('/search/', {'name': 'sune'})

        self.assertEqual(200, response.status_code)
        self.assertEqual([p], response.context['items'])
        self.assertIsNone(response.context['prev'])
        self.assertIsNone(response.context['next'])

    def test_search_not_long_enough(self):
        response = self.c.get('/search/', {'name': 'n'})

        self.assertEqual(200, response.status_code)
        self.assertEqual(True, response.context['no_search'])

    def test_search_by_url(self):
        p = self.db.create_player(name="Kuno", bid=927, region=Region.EU, realm=1)
        p = self.db.create_player(name="Kuno", bid=927, region=Region.AM, realm=1)
        p = self.db.create_player(name="Kuno", bid=927, region=Region.KR, realm=1)
        p = self.db.create_player(name="Kuno", bid=927, region=Region.CN, realm=1)
        p = self.db.create_player(name="Kuno", bid=927, region=Region.SEA, realm=1)

        response = self.c.get('/search/', {'name': 'http://eu.battle.net/sc2/en/profile/927/1/Kuno/'})

        self.assertEqual(302, response.status_code)
        self.assertTrue('/player/' in response.url)

        response = self.c.get('/search/', {'name': 'http://us.battle.net/sc2/en/profile/927/1/Kuno/'})

        self.assertEqual(302, response.status_code)
        self.assertTrue('/player/' in response.url)

        response = self.c.get('/search/', {'name': 'http://kr.battle.net/sc2/en/profile/927/1/Kuno/'})

        self.assertEqual(302, response.status_code)
        self.assertTrue('/player/' in response.url)

        response = self.c.get('/search/', {'name': 'http://sea.battle.net/sc2/en/profile/927/1/Kuno/'})

        self.assertEqual(302, response.status_code)
        self.assertTrue('/player/' in response.url)

        response = self.c.get('/search/', {'name': 'http://www.battlenet.com.cn/sc2/en/profile/927/1/Kuno/'})

        self.assertEqual(302, response.status_code)
        self.assertTrue('/player/' in response.url)

    def test_pagination(self):
        for i in range(40):
            self.db.create_player(bid=300 + i, name='sune')

        response = self.c.get('/search/', {'name': 'sune'})

        self.assertEqual(200, response.status_code)
        self.assertEqual(32, len(response.context['items']))
        self.assertIsNone(response.context['prev'])
        self.assertEqual(32, response.context['next'])

        response = self.c.get('/search/', {'name': 'sune', 'offset': response.context['next']})

        self.assertEqual(200, response.status_code)
        self.assertEqual(8, len(response.context['items']))
        self.assertEqual(0, response.context['prev'])
        self.assertIsNone(response.context['next'])

    def test_json_api_search_by_name(self):
        p = self.db.create_player(bid=300, name='sune', race=Race.ZERG, league=League.GOLD, mode=Mode.TEAM_1V1)

        response = self.c.get('/search/', {'name': 'sune', 'json': ''})

        self.assertEqual(200, response.status_code)

        data = json.loads(response.content.decode('utf-8'))

        self.assertEqual(1, data['count'])
        self.assertEqual(0, data['offset'])
        self.assertEqual([
            {
                'name': 'sune',
                'tag': p.tag,
                'clan': p.clan,
                'race': 'zerg',
                'mode': '1v1',
                'bnet_url': 'http://eu.battle.net/sc2/en/profile/300/0/sune/',
                'region': 'eu',
                'league': 'gold',
                'season': self.db.season.id,
            }
        ], data['items'])

    def test_json_api_search_by_name_prefix_several_hits(self):
        p1 = self.db.create_player(bid=300, name='sune',
                                   race=Race.ZERG, league=League.GOLD, mode=Mode.TEAM_1V1)
        p2 = self.db.create_player(bid=301, name='sunebune',
                                   race=Race.TERRAN, league=League.PLATINUM, mode=Mode.ARCHON)
        p3 = self.db.create_player(bid=302, name='sunerune',
                                   race=Race.RANDOM, league=League.PLATINUM, mode=Mode.TEAM_1V1)

        response = self.c.get('/search/', {'name': 'sune', 'json': ''})

        self.assertEqual(200, response.status_code)

        data = json.loads(response.content.decode('utf-8'))

        self.assertEqual(3, data['count'])
        self.assertEqual(0, data['offset'])
        self.assertEqual([
            {
                'name': 'sune',
                'tag': p1.tag,
                'clan': p1.clan,
                'race': 'zerg',
                'mode': '1v1',
                'bnet_url': 'http://eu.battle.net/sc2/en/profile/300/0/sune/',
                'region': 'eu',
                'league': 'gold',
                'season': self.db.season.id,
            },
            {
                'name': 'sunerune',
                'tag': p3.tag,
                'clan': p3.clan,
                'race': 'random',
                'mode': '1v1',
                'bnet_url': 'http://eu.battle.net/sc2/en/profile/302/0/sunerune/',
                'region': 'eu',
                'league': 'platinum',
                'season': self.db.season.id,
            },
            {
                'name': 'sunebune',
                'tag': p2.tag,
                'clan': p2.clan,
                'race': 'terran',
                'mode': 'archon',
                'bnet_url': 'http://eu.battle.net/sc2/en/profile/301/0/sunebune/',
                'region': 'eu',
                'league': 'platinum',
                'season': self.db.season.id,
            },
        ], data['items'])

    def test_json_api_search_with_no_hits(self):
        p = self.db.create_player(bid=300, name='sune')

        response = self.c.get('/search/', {'name': 'kuno', 'json': ''})

        self.assertEqual(200, response.status_code)

        data = json.loads(response.content.decode('utf-8'))

        self.assertEqual(0, data['count'])
        self.assertEqual(0, data['offset'])
        self.assertEqual([], data['items'])

    def test_json_api_search_with_no_search(self):
        p = self.db.create_player(bid=300, name='sune')

        response = self.c.get('/search/', {'name': 'k', 'json': ''})

        self.assertEqual(200, response.status_code)

        data = json.loads(response.content.decode('utf-8'))

        self.assertEqual(-1, data['count'])

    def test_json_api_search_by_prefix_and_offset(self):
        p1 = self.db.create_player(bid=300, name='sune',
                                   race=Race.ZERG, league=League.GOLD, mode=Mode.TEAM_1V1)
        p2 = self.db.create_player(bid=301, name='sunebune',
                                   race=Race.TERRAN, league=League.PLATINUM, mode=Mode.ARCHON)
        p3 = self.db.create_player(bid=302, name='sunerune',
                                   race=Race.RANDOM, league=League.PLATINUM, mode=Mode.TEAM_1V1)

        response = self.c.get('/search/', {'name': 'sune', 'json': '', 'offset': '2'})

        self.assertEqual(200, response.status_code)

        data = json.loads(response.content.decode('utf-8'))

        self.assertEqual(3, data['count'])
        self.assertEqual(2, data['offset'])
        self.assertEqual([
            {
                'name': 'sunebune',
                'tag': p2.tag,
                'clan': p2.clan,
                'race': 'terran',
                'mode': 'archon',
                'bnet_url': 'http://eu.battle.net/sc2/en/profile/301/0/sunebune/',
                'region': 'eu',
                'league': 'platinum',
                'season': self.db.season.id,
            },
        ], data['items'])

    def test_json_api_search_by_prefix_and_offset_out_of_range(self):
        p = self.db.create_player(bid=300, name='sune', race=Race.ZERG, league=League.GOLD, mode=Mode.TEAM_1V1)

        response = self.c.get('/search/', {'name': 'sune', 'json': '', 'offset': '200'})

        self.assertEqual(200, response.status_code)

        data = json.loads(response.content.decode('utf-8'))

        self.assertEqual(1, data['count'])
        self.assertEqual(200, data['offset'])
        self.assertEqual([], data['items'])

        response = self.c.get('/search/', {'name': 'sune', 'json': '', 'offset': '-1'})

        self.assertEqual(200, response.status_code)

        data = json.loads(response.content.decode('utf-8'))

        self.assertEqual(1, data['count'])
        self.assertEqual(0, data['offset'])
        self.assertEqual([{
            'name': 'sune',
            'tag': p.tag,
            'clan': p.clan,
            'race': 'zerg',
            'mode': '1v1',
            'bnet_url': 'http://eu.battle.net/sc2/en/profile/300/0/sune/',
            'region': 'eu',
            'league': 'gold',
            'season': self.db.season.id,
        }], data['items'])
예제 #11
0
class Test(DjangoTestCase):
    @classmethod
    def setUpClass(self):
        super(Test, self).setUpClass()
        self.db = Db()
        self.db.create_season(id=1)

    def setUp(self):
        super().setUp()
        self.now = utcnow()
        self.db.delete_all(keep=[Season])

    def test_non_existent_player_is_created(self):
        self.process_ladder(bid=301,
                            realm=0,
                            name="player_name",
                            tag="EE",
                            clan="EE is our name")

        p = self.db.get(Player, bid=301)

        self.assertEqual(1, len(Player.objects.all()))
        self.assertEqual(0, p.realm)
        self.assertEqual(Region.EU, p.region)
        self.assertEqual("player_name", p.name)
        self.assertEqual("EE", p.tag)
        self.assertEqual("EE is our name", p.clan)

    def test_existing_player_is_updated_with_new_name_tag_clan_and_existing_other_player_is_not_touched(
            self):
        # See also whole file with player update tests.

        p1 = self.db.create_player(region=Region.EU,
                                   bid=301,
                                   realm=0,
                                   race=Race.ZERG,
                                   name="arne1",
                                   tag="arne1",
                                   clan="arne1")
        p2 = self.db.create_player(region=Region.EU,
                                   bid=302,
                                   realm=0,
                                   race=Race.ZERG,
                                   name="arne2",
                                   tag="arne2",
                                   clan="arne2")

        self.process_ladder(bid=301,
                            realm=0,
                            race=Race.ZERG,
                            name="player_name",
                            tag="EE",
                            clan="EE is our name")

        self.assertEqual(2, len(Player.objects.all()))

        p1 = self.db.get(Player, bid=301)
        self.assertEqual(0, p1.realm)
        self.assertEqual(Region.EU, p1.region)
        self.assertEqual("player_name", p1.name)
        self.assertEqual("EE", p1.tag)
        self.assertEqual("EE is our name", p1.clan)

        p2 = self.db.get(Player, bid=302)
        self.assertEqual(0, p2.realm)
        self.assertEqual(Region.EU, p2.region)
        self.assertEqual("arne2", p2.name)
        self.assertEqual("arne2", p2.tag)
        self.assertEqual("arne2", p2.clan)

    def test_player_occurs_in_several_teams_in_the_same_ladder_creates_one_player(
            self):
        # See our friend drake (bid 5305519, realm 1, region 1) in ladder 164930.

        self.db.create_ranking()
        self.process_ladder(mode=Mode.TEAM_2V2,
                            members=[
                                gen_member(bid=301,
                                           realm=0,
                                           name="arne1",
                                           race=Race.TERRAN),
                                gen_member(bid=302,
                                           realm=0,
                                           name="arne2",
                                           race=Race.TERRAN),
                                gen_member(bid=303,
                                           realm=0,
                                           name="arne3",
                                           race=Race.TERRAN),
                                gen_member(bid=301,
                                           realm=0,
                                           name="arne1",
                                           race=Race.TERRAN),
                            ])

        self.assertEqual(3, len(Player.objects.all()))

        p1 = self.db.get(Player, bid=301)
        p2 = self.db.get(Player, bid=302)
        p3 = self.db.get(Player, bid=303)

        self.assertEqual(2, len(Team.objects.all()))

        t1, t2 = self.db.filter(Team,
                                member1_id__in=(p2.id, p3.id)).order_by('id')

        self.assertEqual(t1.member0_id, p1.id)
        self.assertEqual(t1.member1_id, p2.id)
        self.assertEqual(t2.member0_id, p1.id)
        self.assertEqual(t2.member1_id, p3.id)

        self.assertEqual('arne1', p1.name)
        self.assertEqual('arne2', p2.name)
        self.assertEqual('arne3', p3.name)
예제 #12
0
class Test(DjangoTestCase):
    @classmethod
    def setUpClass(self):
        super(Test, self).setUpClass()
        self.db = Db()

        # Required objects, not actually used in test cases.
        self.db.create_cache()
        self.db.create_ladder()

        self.db.create_season()
        self.teams = self.db.create_teams(count=20)
        for i, team in enumerate(self.teams):
            setattr(self, 't%d' % i, team)
            setattr(self, 't%d_i' % i, team.id)
            setattr(self, 't%d_m0_n' % i, team.member0.name)
            setattr(self, 't%d_m0_i' % i, team.member0.id)

    def setUp(self):
        super().setUp()
        cache.clear()
        self.db.clear_defaults()
        self.db.delete_all(keep=[Season, Cache, Ladder, Team, Player])
        self.c = Client()

        # Change page size for easier testing.
        main.views.ladder.PAGE_SIZE = 10

    def tearDown(self):
        rankings_view_client.close()
        super(Test, self).tearDown()

    def get_page(self, url, content=["rank", "team_id"], page_size=10):
        """ Get the page and per team on page return the data indexed by content arg. """
        main.views.ladder.PAGE_SIZE = page_size
        cache.clear()
        response = self.c.get(url)
        self.assertEqual(200, response.status_code)
        if len(content) == 1:
            return [t[content[0]] for t in response.context['ladder']['teams']]
        else:
            return [
                tuple(t[i] for i in content)
                for t in response.context['ladder']['teams']
            ]

    def test_simple_ladder(self):
        self.db.create_ranking()
        self.db.create_ranking_data(data=[
            dict(team_id=self.t0_i, league=League.GOLD, mmr=30, tier=0),
            dict(team_id=self.t1_i, league=League.PLATINUM, mmr=60, tier=1),
            dict(team_id=self.t2_i, league=League.PLATINUM, mmr=50, tier=2),
        ])

        response = self.c.get('/ladder/hots/1v1/mmr/')
        self.assertEqual(200, response.status_code)

        self.assertEqual(1, response.context['team_size'])
        self.assertEqual(0, response.context['highlight_team_id'])
        self.assertEqual(3, response.context['ladder']['count'])
        self.assertEqual(0, response.context['ladder']['offset'])

        page = response.context['ladder']['teams']

        self.assertEqual(self.t1_m0_n, page[0]["m0_name"])
        self.assertEqual(self.t2_m0_n, page[1]["m0_name"])
        self.assertEqual(self.t0_m0_n, page[2]["m0_name"])

    def test_two_players_with_the_same_mmr_should_get_same_rank(self):
        self.db.create_ranking()
        self.db.create_ranking_data(data=[
            dict(team_id=self.t0_i, league=League.PLATINUM, mmr=50),
            dict(team_id=self.t1_i, league=League.PLATINUM, mmr=50),
            dict(team_id=self.t2_i, league=League.GOLD, mmr=20),
            dict(team_id=self.t3_i, league=League.GOLD, mmr=20),
        ])

        response = self.c.get('/ladder/hots/1v1/mmr/')
        self.assertEqual(200, response.status_code)

        page = response.context['ladder']['teams']

        self.assertEqual(self.t0_m0_n, page[0]["m0_name"])
        self.assertEqual(self.t1_m0_n, page[1]["m0_name"])
        self.assertEqual(self.t2_m0_n, page[2]["m0_name"])
        self.assertEqual(self.t3_m0_n, page[3]["m0_name"])

        self.assertEqual(1, page[0]["rank"])
        self.assertEqual(1, page[1]["rank"])
        self.assertEqual(3, page[2]["rank"])
        self.assertEqual(3, page[3]["rank"])

    def test_10_players_get_the_same_rank_works_over_pages(self):
        teams = self.teams
        data = [dict(team_id=teams[0].id, mmr=200)]
        for i in range(1, 11):
            data.append(dict(team_id=teams[i].id, mmr=199))
        for i in range(11, 20):
            data.append(dict(team_id=teams[i].id, mmr=188))
        self.db.create_ranking()
        self.db.create_ranking_data(data=data)

        response = self.c.get('/ladder/hots/1v1/mmr/')
        self.assertEqual(200, response.status_code)

        page = response.context['ladder']['teams']

        # Check that the entire first page is just 1, 2, 2, .., 2

        self.assertEqual(self.t0_m0_n, page[0]["m0_name"])
        self.assertEqual(1, page[0]["rank"])

        self.assertEqual(self.t1_m0_n, page[1]["m0_name"])
        self.assertEqual(2, page[1]["rank"])

        self.assertEqual(self.t9_m0_n, page[-1]["m0_name"])
        self.assertEqual(2, page[-1]["rank"])

        # For offset 1 team 1-10 should all have rank 2.

        response = self.c.get('/ladder/hots/1v1/mmr/?offset=1')
        self.assertEqual(200, response.status_code)

        page = response.context['ladder']['teams']

        self.assertEqual(self.t1_m0_n, page[0]["m0_name"])
        self.assertEqual(2, page[0]["rank"])

        self.assertEqual(self.t10_m0_n, page[-1]["m0_name"])
        self.assertEqual(2, page[-1]["rank"])

        # For offset 6 team 1-5 should have rank 2 and team 6-10 should have rank 12.

        response = self.c.get('/ladder/hots/1v1/mmr/?offset=6')
        self.assertEqual(200, response.status_code)

        page = response.context['ladder']['teams']

        self.assertEqual(self.t6_m0_n, page[0]["m0_name"])
        self.assertEqual(2, page[0]["rank"])

        self.assertEqual(2, page[4]["rank"])

        self.assertEqual(12, page[5]["rank"])

        self.assertEqual(self.t15_m0_n, page[-1]["m0_name"])
        self.assertEqual(12, page[-1]["rank"])

    def test_ladder_rank_sorting_sorts_on__ladder_rank__wins__losses__team_id__also_test_filters(
            self):
        self.db.default_ranking_data__data = dict(
            version=Version.HOTS,
            race0=Race.ZERG,
            region=Region.EU,
        )
        self.db.create_ranking()
        data = [
            # Outside all filters.
            dict(team_id=self.t11_i,
                 league=League.PLATINUM,
                 mmr=3000,
                 version=Version.WOL),
            dict(team_id=self.t12_i,
                 league=League.PLATINUM,
                 mmr=3000,
                 mode=Mode.RANDOM_2V2),
            # Inside most filters.
            dict(team_id=self.t0_i,
                 league=League.BRONZE,
                 mmr=0,
                 wins=0,
                 losses=2,
                 race0=Race.TERRAN),
            dict(team_id=self.t1_i,
                 league=League.BRONZE,
                 mmr=0,
                 wins=0,
                 losses=2,
                 region=Region.AM),
            dict(team_id=self.t2_i,
                 league=League.BRONZE,
                 mmr=0,
                 wins=0,
                 losses=1),
            dict(team_id=self.t3_i,
                 league=League.BRONZE,
                 mmr=0,
                 wins=1,
                 losses=1),
            dict(team_id=self.t4_i,
                 league=League.BRONZE,
                 mmr=1,
                 wins=1,
                 losses=1),
            dict(team_id=self.t5_i,
                 league=League.SILVER,
                 mmr=1000,
                 wins=0,
                 losses=4),
            dict(team_id=self.t6_i,
                 league=League.GOLD,
                 mmr=2000,
                 wins=0,
                 losses=4),
            dict(team_id=self.t7_i,
                 league=League.PLATINUM,
                 mmr=3000,
                 wins=0,
                 losses=4),
            dict(team_id=self.t8_i,
                 league=League.DIAMOND,
                 mmr=4000,
                 wins=0,
                 losses=4),
            dict(team_id=self.t9_i,
                 league=League.MASTER,
                 mmr=5000,
                 wins=0,
                 losses=4),
            dict(team_id=self.t10_i,
                 league=League.GRANDMASTER,
                 mmr=6000,
                 wins=0,
                 losses=4),
        ]
        shuffle(data)
        self.db.create_ranking_data(data=data)

        #
        # Test default filtering, (0 is before 1 because lower team_id is before).
        #

        self.assertEqual([(1, self.t10_i), (2, self.t9_i), (3, self.t8_i),
                          (4, self.t7_i), (5, self.t6_i), (6, self.t5_i),
                          (7, self.t4_i), (8, self.t3_i), (8, self.t2_i),
                          (8, self.t0_i), (8, self.t1_i)],
                         self.get_page('/ladder/hots/1v1/mmr/', page_size=20))

        self.assertEqual([
            (1, self.t1_i),
            (1, self.t0_i),
            (1, self.t2_i),
            (1, self.t3_i),
            (5, self.t4_i),
            (6, self.t5_i),
            (7, self.t6_i),
            (8, self.t7_i),
            (9, self.t8_i),
            (10, self.t9_i),
            (11, self.t10_i),
        ], self.get_page('/ladder/hots/1v1/-mmr/', page_size=20))

        #
        # Test another version filtering.
        #

        self.assertEqual([(1, self.t11_i)],
                         self.get_page('/ladder/wol/1v1/mmr/'))
        self.assertEqual([(1, self.t11_i)],
                         self.get_page('/ladder/wol/1v1/-mmr/'))

        #
        # Test another mode version filtering.
        #

        self.assertEqual([(1, self.t12_i)],
                         self.get_page('/ladder/hots/random-2v2/mmr/'))
        self.assertEqual([(1, self.t12_i)],
                         self.get_page('/ladder/hots/random-2v2/-mmr/'))

        #
        # Test league filtering.
        #

        expected_order = []
        self.assertEqual([
            (1, self.t4_i),
            (2, self.t3_i),
            (2, self.t2_i),
            (2, self.t0_i),
            (2, self.t1_i),
        ], self.get_page('/ladder/hots/1v1/mmr/?f=bronze'))

        self.assertEqual([
            (1, self.t1_i),
            (1, self.t0_i),
            (1, self.t2_i),
            (1, self.t3_i),
            (5, self.t4_i),
        ], self.get_page('/ladder/hots/1v1/-mmr/?f=bronze'))

        #
        # Test race filtering.
        #

        self.assertEqual([(1, self.t0_i)],
                         self.get_page('/ladder/hots/1v1/mmr/?f=terran'))
        self.assertEqual([(1, self.t0_i)],
                         self.get_page('/ladder/hots/1v1/-mmr/?f=terran'))

        #
        # Test region filtering.
        #

        self.assertEqual([(1, self.t1_i)],
                         self.get_page('/ladder/hots/1v1/mmr/?f=am'))
        self.assertEqual([(1, self.t1_i)],
                         self.get_page('/ladder/hots/1v1/-mmr/?f=am'))

        #
        # Test league, region and race filtering.
        #

        self.assertEqual([
            (1, self.t4_i),
            (2, self.t3_i),
            (2, self.t2_i),
        ], self.get_page('/ladder/hots/1v1/mmr/?f=bronze,zerg,eu'))

        self.assertEqual([
            (1, self.t2_i),
            (1, self.t3_i),
            (3, self.t4_i),
        ], self.get_page('/ladder/hots/1v1/-mmr/?f=bronze,zerg,eu'))

    def test_league_points_sorts_on__league__tier__points__wins__losses__team_id(
            self):
        self.db.create_ranking()
        data = [
            dict(team_id=self.t0_i,
                 league=League.DIAMOND,
                 tier=2,
                 wins=1,
                 losses=1,
                 points=1),
            dict(team_id=self.t1_i,
                 league=League.GOLD,
                 tier=0,
                 wins=1,
                 losses=1,
                 points=2),
            dict(team_id=self.t2_i,
                 league=League.GOLD,
                 tier=1,
                 wins=1,
                 losses=1,
                 points=7),
            dict(team_id=self.t3_i,
                 league=League.GOLD,
                 tier=1,
                 wins=9,
                 losses=1,
                 points=6),
            dict(team_id=self.t4_i,
                 league=League.GOLD,
                 tier=1,
                 wins=6,
                 losses=5,
                 points=6),
            dict(team_id=self.t5_i,
                 league=League.GOLD,
                 tier=1,
                 wins=6,
                 losses=8,
                 points=6),
            dict(team_id=self.t6_i,
                 league=League.GOLD,
                 tier=1,
                 wins=6,
                 losses=8,
                 points=6),
            dict(team_id=self.t7_i,
                 league=League.GOLD,
                 tier=2,
                 wins=1,
                 losses=1,
                 points=9),
            dict(team_id=self.t8_i,
                 league=League.BRONZE,
                 tier=0,
                 wins=1,
                 losses=1,
                 points=96),
        ]
        shuffle(data)
        self.db.create_ranking_data(data=data)

        self.assertEqual([
            (1, self.t0_i),
            (2, self.t1_i),
            (3, self.t2_i),
            (4, self.t3_i),
            (4, self.t4_i),
            (4, self.t5_i),
            (4, self.t6_i),
            (8, self.t7_i),
            (9, self.t8_i),
        ], self.get_page('/ladder/hots/1v1/league-points/'))

        self.assertEqual([
            (1, self.t8_i),
            (2, self.t7_i),
            (3, self.t6_i),
            (3, self.t5_i),
            (3, self.t4_i),
            (3, self.t3_i),
            (7, self.t2_i),
            (8, self.t1_i),
            (9, self.t0_i),
        ], self.get_page('/ladder/hots/1v1/-league-points/'))

    def test_games_played_sorts_on__played__mmr__wins__team_id(self):
        self.db.create_ranking()
        data = [
            dict(team_id=self.t0_i,
                 league=League.SILVER,
                 mmr=2,
                 wins=9,
                 losses=9,
                 points=2),
            dict(team_id=self.t1_i,
                 league=League.DIAMOND,
                 mmr=2,
                 wins=9,
                 losses=8,
                 points=1),
            dict(team_id=self.t2_i,
                 league=League.BRONZE,
                 mmr=1,
                 wins=9,
                 losses=8,
                 points=9),
            dict(team_id=self.t3_i,
                 league=League.GOLD,
                 mmr=1,
                 wins=8,
                 losses=9,
                 points=8),
            dict(team_id=self.t4_i,
                 league=League.DIAMOND,
                 mmr=1,
                 wins=8,
                 losses=9,
                 points=7),
        ]
        shuffle(data)
        self.db.create_ranking_data(data=data)

        self.assertEqual([
            (1, self.t0_i),
            (2, self.t1_i),
            (2, self.t2_i),
            (2, self.t3_i),
            (2, self.t4_i),
        ], self.get_page('/ladder/hots/1v1/played/'))

        self.assertEqual([
            (1, self.t4_i),
            (1, self.t3_i),
            (1, self.t2_i),
            (1, self.t1_i),
            (5, self.t0_i),
        ], self.get_page('/ladder/hots/1v1/-played/'))

    def test_wins_sorts_on__wins__mmr__losses__team_id(self):
        self.db.create_ranking()
        data = [
            dict(team_id=self.t0_i,
                 league=League.SILVER,
                 mmr=1,
                 wins=9,
                 losses=8,
                 points=2),
            dict(team_id=self.t1_i,
                 league=League.SILVER,
                 mmr=0,
                 wins=9,
                 losses=8,
                 points=5),
            dict(team_id=self.t2_i,
                 league=League.DIAMOND,
                 mmr=0,
                 wins=9,
                 losses=9,
                 points=6),
            dict(team_id=self.t3_i,
                 league=League.BRONZE,
                 mmr=0,
                 wins=8,
                 losses=9,
                 points=3),
            dict(team_id=self.t4_i,
                 league=League.GOLD,
                 mmr=0,
                 wins=8,
                 losses=9,
                 points=7),
        ]
        shuffle(data)
        self.db.create_ranking_data(data=data)

        self.assertEqual([
            (1, self.t0_i),
            (1, self.t1_i),
            (1, self.t2_i),
            (4, self.t3_i),
            (4, self.t4_i),
        ], self.get_page('/ladder/hots/1v1/wins/'))

        self.assertEqual([
            (1, self.t4_i),
            (1, self.t3_i),
            (3, self.t2_i),
            (3, self.t1_i),
            (3, self.t0_i),
        ], self.get_page('/ladder/hots/1v1/-wins/'))

    def test_losses_sorts_on__losses__wins__team_id(self):
        self.db.create_ranking()
        data = [
            dict(team_id=self.t0_i,
                 league=League.SILVER,
                 mmr=0,
                 wins=8,
                 losses=9),
            dict(team_id=self.t1_i,
                 league=League.SILVER,
                 mmr=0,
                 wins=9,
                 losses=9),
            dict(team_id=self.t2_i,
                 league=League.DIAMOND,
                 mmr=0,
                 wins=9,
                 losses=8),
            dict(team_id=self.t3_i,
                 league=League.BRONZE,
                 mmr=0,
                 wins=9,
                 losses=8),
        ]
        shuffle(data)
        self.db.create_ranking_data(data=data)

        self.assertEqual([
            (1, self.t0_i),
            (1, self.t1_i),
            (3, self.t2_i),
            (3, self.t3_i),
        ], self.get_page('/ladder/hots/1v1/losses/'))

        self.assertEqual([
            (1, self.t3_i),
            (1, self.t2_i),
            (3, self.t1_i),
            (3, self.t0_i),
        ], self.get_page('/ladder/hots/1v1/-losses/'))

    def test_win_rate_sorts_om__win_rate__played__mmr__team_id(self):
        self.db.create_ranking()
        data = [
            dict(team_id=self.t0_i,
                 league=League.SILVER,
                 mmr=2,
                 wins=9,
                 losses=1),
            dict(team_id=self.t1_i,
                 league=League.SILVER,
                 mmr=2,
                 wins=5,
                 losses=5),
            dict(team_id=self.t2_i,
                 league=League.SILVER,
                 mmr=4,
                 wins=4,
                 losses=4),
            dict(team_id=self.t3_i,
                 league=League.DIAMOND,
                 mmr=4,
                 wins=4,
                 losses=4),
            dict(team_id=self.t4_i,
                 league=League.BRONZE,
                 mmr=4,
                 wins=4,
                 losses=4),
            dict(team_id=self.t5_i,
                 league=League.BRONZE,
                 mmr=4,
                 wins=4,
                 losses=7),
        ]
        shuffle(data)
        self.db.create_ranking_data(data=data)

        self.assertEqual([
            (1, self.t0_i),
            (2, self.t1_i),
            (2, self.t2_i),
            (2, self.t3_i),
            (2, self.t4_i),
            (6, self.t5_i),
        ], self.get_page('/ladder/hots/1v1/win-rate/'))

        self.assertEqual([
            (1, self.t5_i),
            (2, self.t4_i),
            (2, self.t3_i),
            (2, self.t2_i),
            (2, self.t1_i),
            (6, self.t0_i),
        ], self.get_page('/ladder/hots/1v1/-win-rate/'))

    def test_pagination_with_no_gap_between_start_and_end_section(self):
        self.db.create_ranking()
        data = [dict(team_id=team.id) for team in self.teams]
        self.db.create_ranking_data(data=data)

        main.views.ladder.PAGE_SIZE = 3  # => 7 sections

        response = self.c.get('/ladder/hots/1v1/mmr/')

        pages = response.context['pages']

        self.assertEqual(0, response.context['current_page'])
        self.assertEqual(7, len(pages))
        self.assertEqual(0, len([p for p in pages if 'gap' in p]))

        self.assertEqual(dict(href='/ladder/hots/1v1/mmr/', index=0), pages[0])
        self.assertEqual(dict(href='/ladder/hots/1v1/mmr/?offset=18', index=6),
                         pages[6])

        response = self.c.get('/ladder/hots/1v1/mmr/?offset=18')

        pages = response.context['pages']

        self.assertEqual(6, response.context['current_page'])
        self.assertEqual(7, len(pages))
        self.assertEqual(0, len([p for p in pages if 'gap' in p]))

        self.assertEqual(dict(href='/ladder/hots/1v1/mmr/', index=0), pages[0])
        self.assertEqual(dict(href='/ladder/hots/1v1/mmr/?offset=18', index=6),
                         pages[6])

    def test_pagination_with_start_middle_and_end_section(self):
        self.db.create_ranking()
        data = [dict(team_id=team.id) for team in self.teams]
        self.db.create_ranking_data(data=data)

        main.views.ladder.PAGE_SIZE = 1  # => 20 sections, index and offset are the same.

        # Test last page with connecting start and middle section.

        response = self.c.get('/ladder/hots/1v1/mmr/?offset=7')

        pages = response.context['pages']

        self.assertEqual(7, response.context['current_page'])
        self.assertEqual(11 + 1 + 4, len(pages))
        self.assertEqual(1, len([p for p in pages if 'gap' in p]))

        self.assertEqual(0, pages[0]['index'])
        self.assertEqual(10, pages[10]['index'])
        self.assertIn('gap', pages[11])
        self.assertEqual(16, pages[12]['index'])
        self.assertEqual(19, pages[15]['index'])

        # Test first page with separate start and middle section.

        response = self.c.get('/ladder/hots/1v1/mmr/?offset=8')

        pages = response.context['pages']

        self.assertEqual(8, response.context['current_page'])
        self.assertEqual(4 + 1 + 7 + 1 + 4, len(pages))
        self.assertEqual(2, len([p for p in pages if 'gap' in p]))

        self.assertEqual(0, pages[0]['index'])
        self.assertEqual(3, pages[3]['index'])
        self.assertIn('gap', pages[4])
        self.assertEqual(5, pages[5]['index'])
        self.assertEqual(11, pages[11]['index'])
        self.assertIn('gap', pages[12])
        self.assertEqual(16, pages[13]['index'])
        self.assertEqual(19, pages[16]['index'])

        # Test last page with separate middle and end section.

        response = self.c.get('/ladder/hots/1v1/mmr/?offset=11')

        pages = response.context['pages']

        self.assertEqual(11, response.context['current_page'])
        self.assertEqual(4 + 1 + 7 + 1 + 4, len(pages))
        self.assertEqual(2, len([p for p in pages if 'gap' in p]))

        self.assertEqual(0, pages[0]['index'])
        self.assertEqual(3, pages[3]['index'])
        self.assertIn('gap', pages[4])
        self.assertEqual(8, pages[5]['index'])
        self.assertEqual(14, pages[11]['index'])
        self.assertIn('gap', pages[12])
        self.assertEqual(16, pages[13]['index'])
        self.assertEqual(19, pages[16]['index'])

        # Test first page with connecting middle and end section.

        response = self.c.get('/ladder/hots/1v1/mmr/?offset=12')

        pages = response.context['pages']

        self.assertEqual(12, response.context['current_page'])
        self.assertEqual(4 + 1 + 11, len(pages))
        self.assertEqual(1, len([p for p in pages if 'gap' in p]))

        self.assertEqual(0, pages[0]['index'])
        self.assertEqual(3, pages[3]['index'])
        self.assertIn('gap', pages[4])
        self.assertEqual(9, pages[5]['index'])
        self.assertEqual(19, pages[15]['index'])

    def test_non_aligned_pagination(self):
        self.db.create_ranking()
        data = [dict(team_id=team.id) for team in self.teams]
        data.extend(
            dict(team_id=team.id, mode=Mode.TEAM_2V2) for team in self.teams)
        self.db.create_ranking_data(data=data)

        main.views.ladder.PAGE_SIZE = 5  # => 4 sections, all visible all the time.

        response = self.c.get('/ladder/hots/1v1/mmr/?offset=7')

        pages = response.context['pages']

        self.assertEqual(2, response.context['current_page'])
        self.assertEqual(5, len(pages))
        self.assertEqual(0, len([p for p in pages if 'gap' in p]))

        self.assertEqual(dict(href='/ladder/hots/1v1/mmr/', index=0), pages[0])
        self.assertEqual(dict(href='/ladder/hots/1v1/mmr/?offset=2', index=1),
                         pages[1])
        self.assertEqual(dict(href='/ladder/hots/1v1/mmr/?offset=7', index=2),
                         pages[2])
        self.assertEqual(dict(href='/ladder/hots/1v1/mmr/?offset=12', index=3),
                         pages[3])
        self.assertEqual(dict(href='/ladder/hots/1v1/mmr/?offset=17', index=4),
                         pages[4])

        response = self.c.get('/ladder/hots/1v1/mmr/?offset=19')

        pages = response.context['pages']
        page = response.context['ladder']['teams']

        self.assertEqual(4, response.context['current_page'])
        self.assertEqual(5, len(pages))
        self.assertEqual(0, len([p for p in pages if 'gap' in p]))
        self.assertEqual(1, len(page))

        self.assertEqual(dict(href='/ladder/hots/1v1/mmr/?offset=19', index=4),
                         pages[4])

        response = self.c.get('/ladder/hots/1v1/mmr/?offset=21')

        pages = response.context['pages']
        page = response.context['ladder']['teams']

        self.assertEqual(-1, response.context['current_page'])
        self.assertEqual(4, len(pages))
        self.assertEqual(0, len([p for p in pages if 'gap' in p]))
        self.assertEqual(0, len(page))

    def test_pagination_start_offset_with_team_link(self):
        self.db.create_ranking()
        data = [dict(team_id=team.id) for team in self.teams]
        self.db.create_ranking_data(data=data)

        main.views.ladder.PAGE_SIZE = 12  # team link wants to display -10 iteams.

        response = self.c.get('/ladder/hots/1v1/mmr/?team=%d' % self.t14_i)

        pages = response.context['pages']
        page = response.context['ladder']['teams']

        self.assertEqual(1, response.context['current_page'])
        self.assertEqual(3, len(pages))

        self.assertEqual(self.t14_i, page[10]["team_id"])
        self.assertEqual(12, len(page))

        self.assertEqual(
            dict(href='/ladder/hots/1v1/mmr/?team=%d&offset=0' % self.t14_i,
                 index=0), pages[0])
        self.assertEqual(
            dict(href='/ladder/hots/1v1/mmr/?team=%d&offset=4' % self.t14_i,
                 index=1), pages[1])
        self.assertEqual(
            dict(href='/ladder/hots/1v1/mmr/?team=%d&offset=16' % self.t14_i,
                 index=2), pages[2])

    def test_team_link_with_and_without_filtering(self):
        self.db.create_ranking()
        data = [
            dict(team_id=team.id,
                 race0=(Race.ZERG if team.id % 2 == 1 else Race.TERRAN))
            for team in self.teams
        ]
        self.db.create_ranking_data(data=data)

        main.views.ladder.PAGE_SIZE = 8

        response = self.c.get('/ladder/hots/1v1/mmr/?f=zerg&team=%d' %
                              self.t14_i)

        pages = response.context['pages']
        page = response.context['ladder']['teams']

        self.assertEqual(0, response.context['current_page'])
        self.assertEqual(2, len(pages))

        self.assertEqual(self.t14_i, page[7]["team_id"])
        self.assertEqual(8, len(page))

        self.assertEqual(
            dict(href='/ladder/hots/1v1/mmr/?f=zerg&team=%d&offset=0' %
                 self.t14_i,
                 index=0), pages[0])
        self.assertEqual(
            dict(href='/ladder/hots/1v1/mmr/?f=zerg&team=%d&offset=8' %
                 self.t14_i,
                 index=1), pages[1])

        response = self.c.get('/ladder/hots/1v1/mmr/?f=terran&team=%d' %
                              self.t14_i)

        pages = response.context['pages']
        page = response.context['ladder']['teams']

        self.assertEqual(0, response.context['current_page'])
        self.assertEqual(2, len(pages))

        self.assertNotIn(self.t14_i, [p["team_id"] for p in page])
        self.assertEqual(8, len(page))

        self.assertEqual(
            dict(href='/ladder/hots/1v1/mmr/?f=terran&team=%d&offset=0' %
                 self.t14_i,
                 index=0), pages[0])
        self.assertEqual(
            dict(href='/ladder/hots/1v1/mmr/?f=terran&team=%d&offset=8' %
                 self.t14_i,
                 index=1), pages[1])

    def test_various_bad_requests_for_good_code_coverage_and_error_checking(
            self):
        self.db.create_ranking()
        self.db.create_ranking_data(data=[dict(team_id=self.t1_i)])

        response = self.c.get('/ladder/bw/1v1/mmr/')
        self.assertEqual(404, response.status_code)

        response = self.c.get('/ladder/hots/team-5v5/mmr/')
        self.assertEqual(404, response.status_code)

        response = self.c.get('/ladder/hots/1v1/ladder-rank/')
        self.assertEqual(302, response.status_code)

        response = self.c.get('/ladder/hots/1v1/mmr/?offset=%d' % 3e9)
        self.assertEqual(404, response.status_code)

        response = self.c.get('/ladder/hots/1v1/mmr/?team=%d' % 3e9)
        self.assertEqual(404, response.status_code)

    def test_race_filtering_on_archon_mode_which_normally_does_not_work_on_teams(
            self):
        self.db.default_ranking_data__data = dict(
            version=Version.LOTV,
            mode=Mode.ARCHON,
        )

        t0 = self.db.create_team(
            mode=Mode.ARCHON,
            version=Version.LOTV,
            member0=self.db.create_player(),
            race0=Race.ZERG,
            member1=self.db.create_player(),
            race1=Race.ZERG,
        )

        t1 = self.db.create_team(
            mode=Mode.ARCHON,
            version=Version.LOTV,
            member0=self.db.create_player(),
            race0=Race.PROTOSS,
            member1=self.db.create_player(),
            race1=Race.PROTOSS,
        )

        t2 = self.db.create_team(
            mode=Mode.ARCHON,
            version=Version.LOTV,
            member0=self.db.create_player(),
            race0=Race.ZERG,
            member1=self.db.create_player(),
            race1=Race.ZERG,
        )

        t3 = self.db.create_team(
            mode=Mode.ARCHON,
            version=Version.LOTV,
            member0=self.db.create_player(),
            race0=Race.TERRAN,
            member1=self.db.create_player(),
            race1=Race.TERRAN,
        )

        self.db.create_ranking()
        data = [
            dict(team_id=t0.id,
                 league=League.PLATINUM,
                 mmr=50,
                 race0=Race.ZERG,
                 race1=Race.ZERG),
            dict(team_id=t1.id,
                 league=League.PLATINUM,
                 mmr=40,
                 race0=Race.PROTOSS,
                 race1=Race.PROTOSS),
            dict(team_id=t2.id,
                 league=League.PLATINUM,
                 mmr=30,
                 race0=Race.ZERG,
                 race1=Race.ZERG),
            dict(team_id=t3.id,
                 league=League.PLATINUM,
                 mmr=20,
                 race0=Race.TERRAN,
                 race1=Race.TERRAN),
        ]
        shuffle(data)
        self.db.create_ranking_data(data=data)

        #
        # Test default filtering.
        #

        self.assertEqual([
            (1, t0.id),
            (2, t1.id),
            (3, t2.id),
            (4, t3.id),
        ], self.get_page('/ladder/lotv/archon/mmr/', page_size=20))

        #
        # Test race filtering.
        #

        self.assertEqual([(1, t0.id), (2, t2.id)],
                         self.get_page('/ladder/lotv/archon/mmr/?f=zerg'))
        self.assertEqual([(1, t1.id)],
                         self.get_page('/ladder/lotv/archon/mmr/?f=protoss'))
        self.assertEqual([(1, t3.id)],
                         self.get_page('/ladder/lotv/archon/mmr/?f=terran'))
        self.assertEqual([],
                         self.get_page('/ladder/lotv/archon/mmr/?f=random'))
예제 #13
0
class Test(DjangoTestCase):

    @classmethod
    def setUpClass(self):
        super(Test, self).setUpClass()
        self.db = Db()

        # Required objects, not actually used in test cases.
        self.db.create_cache()
        self.db.create_ladder()

        self.db.create_season()

    def setUp(self):
        super().setUp()
        self.db.delete_all(keep=[Cache, Ladder, Season])
        self.c = Client()

    def tearDown(self):
        rankings_view_client.close()
        super(Test, self).tearDown()

    def test_view_league_stats(self):
        self.db.create_player()
        t1 = self.db.create_team()

        self.db.create_player()
        t2 = self.db.create_team()

        self.db.create_player()
        t3 = self.db.create_team()

        self.db.create_ranking()
        self.db.create_ranking_data(data=[
            dict(team_id=t1.id, league=League.GOLD,     wins=11, losses=10, points=20),
            dict(team_id=t2.id, league=League.PLATINUM, wins=21, losses=20, points=40),
            dict(team_id=t3.id, league=League.PLATINUM, wins=31, losses=30, points=50),
        ])
        self.db.update_ranking_stats()

        response = self.c.get('/stats/leagues/1v1/')
        self.assertEqual(200, response.status_code)
        self.assertIn('1v1 League Distribution', response.content.decode('utf-8'))

        response = self.c.get('/stats/raw/11/')
        self.assertEqual(200, response.status_code)
        content = json.loads(response.content.decode('utf-8'))

        self.assertEqual(1, len(content))

        data = content[0]['data']

        def get_stat(league_index, type_index):
            return data[RankingStats.raw_v1_index(RankingStats.V1_DATA_SIZE, Version.HOTS_INDEX, Region.EU_INDEX,
                                                  league_index, Race.ZERG_INDEX)
                        + type_index]

        self.assertEqual(1,  get_stat(League.GOLD_INDEX,     RankingStats.V1_COUNT_INDEX))
        self.assertEqual(11, get_stat(League.GOLD_INDEX,     RankingStats.V1_WINS_INDEX))
        self.assertEqual(10, get_stat(League.GOLD_INDEX,     RankingStats.V1_LOSSES_INDEX))
        self.assertEqual(20, get_stat(League.GOLD_INDEX,     RankingStats.V1_POINT_INDEX))
        self.assertEqual(2,  get_stat(League.PLATINUM_INDEX, RankingStats.V1_COUNT_INDEX))
        self.assertEqual(52, get_stat(League.PLATINUM_INDEX, RankingStats.V1_WINS_INDEX))
        self.assertEqual(50, get_stat(League.PLATINUM_INDEX, RankingStats.V1_LOSSES_INDEX))
        self.assertEqual(90, get_stat(League.PLATINUM_INDEX, RankingStats.V1_POINT_INDEX))