GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Pull Request — develop (#307)
by
unknown
48s
created

test_draw()   C

Complexity

Conditions 13

Size

Total Lines 20

Duplication

Lines 20
Ratio 100 %

Importance

Changes 0
Metric Value
cc 13
dl 20
loc 20
rs 5.2936
c 0
b 0
f 0

How to fix   Complexity   

Complexity

Complex classes like test_draw() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
# coding=utf-8
2
from unittest.mock import MagicMock, Mock
3
import pytest
4
from server.stats.division_service import *
5
from tests import CoroMock
6
7
8
class MockDivisionAccessor(DivisionAccessor):
9
    def __init__(self):
10
        self.update_player = CoroMock()
11
        self.add_player = CoroMock()
12
        self._divisions = [Division(1, "League 1 - Division A", 1, 10.0),
13
                           Division(2, "League 1 - Division B", 1, 30.0),
14
                           Division(3, "League 1 - Division C", 1, 50.0),
15
                           Division(4, "League 2 - Division D", 2, 20.0),
16
                           Division(5, "League 2 - Division E", 2, 60.0),
17
                           Division(6, "League 2 - Division F", 2, 100.0),
18
                           Division(7, "League 3 - Division D", 3, 100.0),
19
                           Division(8, "League 3 - Division E", 3, 200.0),
20
                           Division(9, "League 3 - Division F", 3, 9999.0)]
21
22
    async def get_divisions(self) -> List['Division']:
23
        return self._divisions
24
25
    async def update_player(self, player: 'PlayerDivisionInfo') -> None:
26
        pass
27
28
    async def add_player(self, player: 'PlayerDivisionInfo') -> None:
29
        pass
30
31
32
@pytest.fixture()
33
def sample_players() -> List[PlayerDivisionInfo]:
34 View Code Duplication
    return [PlayerDivisionInfo(1, 1, 9.5),
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
35
            PlayerDivisionInfo(2, 1, 49.5),
36
            PlayerDivisionInfo(3, 2, 0.0),
37
            PlayerDivisionInfo(4, 3, 10.0)]
38
39
40
@pytest.fixture()
41
def division_service(sample_players) -> DivisionService:
42
    accessor = Mock()
43
    accessor.get_divisions = CoroMock()
44
45
    return DivisionService(sample_players, MockDivisionAccessor())
46
47
48
async def asyncAssertPlayerDivision(division_service: DivisionService, player_id: int, division_id: int):
49
    assert (await division_service.get_player_division(player_id)).id == division_id
50
51
52
@pytest.mark.asyncio
53
async def test_match_in_same_division(division_service):
54
    assert division_service.players[1].league == 1
55
    assert division_service.players[1].score == 9.5
56 View Code Duplication
    await asyncAssertPlayerDivision(division_service, 1, 1)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
57
    assert division_service.players[2].league == 1
58
    assert division_service.players[2].score == 49.5
59
    await asyncAssertPlayerDivision(division_service, 2, 3)
60
61
    await division_service.post_result(1, 2, 1)
62
63
    division_service.accessor.add_player.assert_not_called()
64
    division_service.accessor.update_player.assert_any_call(division_service.players[1])
65
    division_service.accessor.update_player.assert_any_call(division_service.players[2])
66
67
    assert division_service.players[1].league == 1
68
    assert division_service.players[1].score == 10.5
69
    await asyncAssertPlayerDivision(division_service, 1, 2)
70
    assert division_service.players[2].league == 1
71
    assert division_service.players[2].score == 49.0
72
    await asyncAssertPlayerDivision(division_service, 2, 3)
73
74
75
@pytest.mark.asyncio
76
async def test_match_in_same_division_inverted(division_service):
77
    assert division_service.players[1].league == 1
78 View Code Duplication
    assert division_service.players[1].score == 9.5
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
79
    await asyncAssertPlayerDivision(division_service, 1, 1)
80
    assert division_service.players[2].league == 1
81
    assert division_service.players[2].score == 49.5
82
    await asyncAssertPlayerDivision(division_service, 2, 3)
83
84
    await division_service.post_result(2, 1, 2)
85
86
    division_service.accessor.add_player.assert_not_called()
87
    division_service.accessor.update_player.assert_any_call(division_service.players[1])
88
    division_service.accessor.update_player.assert_any_call(division_service.players[2])
89
90
    assert division_service.players[1].league == 1
91
    assert division_service.players[1].score == 10.5
92
    await asyncAssertPlayerDivision(division_service, 1, 2)
93
    assert division_service.players[2].league == 1
94
    assert division_service.players[2].score == 49.0
95
    await asyncAssertPlayerDivision(division_service, 2, 3)
96
97
98
@pytest.mark.asyncio
99
async def test_match_winner_ascends_league(division_service):
100 View Code Duplication
    assert division_service.players[1].league == 1
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
101
    assert division_service.players[1].score == 9.5
102
    await asyncAssertPlayerDivision(division_service, 1, 1)
103
    assert division_service.players[2].league == 1
104
    assert division_service.players[2].score == 49.5
105
    await asyncAssertPlayerDivision(division_service, 2, 3)
106
107
    await division_service.post_result(2, 1, 1)
108
109
    division_service.accessor.add_player.assert_not_called()
110
    division_service.accessor.update_player.assert_any_call(division_service.players[1])
111
    division_service.accessor.update_player.assert_any_call(division_service.players[2])
112
113
    assert division_service.players[1].league == 1
114
    assert division_service.players[1].score == 9.0
115
    await asyncAssertPlayerDivision(division_service, 1, 1)
116
    assert division_service.players[2].league == 2
117
    assert division_service.players[2].score == 0.0
118 View Code Duplication
    await asyncAssertPlayerDivision(division_service, 2, 4)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
119
120
121
@pytest.mark.asyncio
122
async def test_do_not_fall_below_0(division_service):
123
    assert division_service.players[1].league == 1
124
    assert division_service.players[1].score == 9.5
125
    assert division_service.players[3].league == 2
126
    assert division_service.players[3].score == 0.0
127
128
    await division_service.post_result(1, 3, 1)
129
130
    division_service.accessor.add_player.assert_not_called()
131
    division_service.accessor.update_player.assert_any_call(division_service.players[1])
132
    division_service.accessor.update_player.assert_any_call(division_service.players[3])
133
134
    assert division_service.players[1].league == 1
135
    assert division_service.players[1].score == 11.0
136
    assert division_service.players[3].league == 2
137
    assert division_service.players[3].score == 0.0
138
139
140
@pytest.mark.asyncio
141
async def test_gain_loss_winner_inferior(division_service):
142
    division_service.players[3].score = 11.0
143
144
    assert division_service.players[1].league == 1
145
    assert division_service.players[1].score == 9.5
146
    assert division_service.players[3].league == 2
147
    assert division_service.players[3].score == 11.0
148
149
    await division_service.post_result(1, 3, 1)
150
151
    division_service.accessor.add_player.assert_not_called()
152
    division_service.accessor.update_player.assert_any_call(division_service.players[1])
153
    division_service.accessor.update_player.assert_any_call(division_service.players[3])
154
155
    assert division_service.players[1].league == 1
156
    assert division_service.players[1].score == 11.0
157
    assert division_service.players[3].league == 2
158
    assert division_service.players[3].score == 10.0
159
160
161
@pytest.mark.asyncio
162
async def test_gain_loss_winner_superior(division_service):
163
    division_service.players[3].score = 11.0
164
165
    assert division_service.players[1].league == 1
166
    assert division_service.players[1].score == 9.5
167
    assert division_service.players[3].league == 2
168
    assert division_service.players[3].score == 11.0
169
170
    await division_service.post_result(1, 3, 2)
171
172
    division_service.accessor.add_player.assert_not_called()
173 View Code Duplication
    division_service.accessor.update_player.assert_any_call(division_service.players[1])
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
174
    division_service.accessor.update_player.assert_any_call(division_service.players[3])
175
176
    assert division_service.players[1].league == 1
177
    assert division_service.players[1].score == 9.0
178
    assert division_service.players[3].league == 2
179
    assert division_service.players[3].score == 11.5
180
181
182
@pytest.mark.asyncio
183
async def test_new_player(division_service):
184
    assert 98 not in division_service.players
185
    assert 99 not in division_service.players
186
187
    await division_service.post_result(98, 99, 2)
188
189
    assert division_service.accessor.add_player.call_count == 2
190
    assert division_service.accessor.update_player.call_count == 2
191
192
    assert division_service.players[98].league == 1
193
    assert division_service.players[98].score == 0.0
194
    assert division_service.players[99].league == 1
195
    assert division_service.players[99].score == 1.0
196
197
198
@pytest.mark.asyncio
199
async def test_draw(division_service):
200
    assert division_service.players[1].league == 1
201
    assert division_service.players[1].score == 9.5
202
    await asyncAssertPlayerDivision(division_service, 1, 1)
203
    assert division_service.players[2].league == 1
204
    assert division_service.players[2].score == 49.5
205
    await asyncAssertPlayerDivision(division_service, 2, 3)
206
207
    await division_service.post_result(1, 2, 0)
208
209
    division_service.accessor.add_player.assert_not_called()
210
    division_service.accessor.update_player.assert_any_call(division_service.players[1])
211
    division_service.accessor.update_player.assert_any_call(division_service.players[2])
212
213
    assert division_service.players[1].league == 1
214
    assert division_service.players[1].score == 9.5
215
    await asyncAssertPlayerDivision(division_service, 1, 1)
216
    assert division_service.players[2].league == 1
217
    assert division_service.players[2].score == 49.5
218
    await asyncAssertPlayerDivision(division_service, 2, 3)
219