1
0
mirror of synced 2025-01-31 04:03:45 +01:00

Bring tests under typing checks, fix existing type errors.

This commit is contained in:
Jennifer Taylor 2021-08-19 19:20:13 +00:00
parent 6efd07d02f
commit fa0b2bd6cd
9 changed files with 104 additions and 91 deletions

View File

@ -2,7 +2,7 @@
import os
import sys
import unittest
from typing import Container, List, Dict, Any
from typing import Iterable, List, Dict, Any
# Supress custom handler tracebacks inside handler frames
@ -14,7 +14,7 @@ class ExtendedTestCase(unittest.TestCase):
def verbose(self) -> bool:
return ("-v" in sys.argv) or ("--verbose" in sys.argv)
def assertItemsEqual(self, a: Container[Any], b: Container[Any]) -> None:
def assertItemsEqual(self, a: Iterable[Any], b: Iterable[Any]) -> None:
a_items = {x for x in a}
b_items = {x for x in b}
self.assertEqual(a_items, b_items)

View File

@ -15,10 +15,10 @@ class TestCardCipher(unittest.TestCase):
for pair in test_ciphers:
inp = bytes(pair[0])
out = bytes(pair[1])
encoded = CardCipher._encode(inp) # type: ignore
self.assertEqual(encoded, out, f"Card encode {encoded} doesn't match expected {out}")
decoded = CardCipher._decode(out) # type: ignore
self.assertEqual(decoded, inp, f"Card decode {decoded} doesn't match expected {inp}")
encoded = CardCipher._encode(inp)
self.assertEqual(encoded, out, f"Card encode {encoded!r} doesn't match expected {out!r}")
decoded = CardCipher._decode(out)
self.assertEqual(decoded, inp, f"Card decode {decoded!r} doesn't match expected {inp!r}")
def test_external_cipher(self) -> None:
test_cards = [

View File

@ -2,6 +2,7 @@
import unittest
from unittest.mock import Mock
from bemani.common import GameConstants
from bemani.data.mysql.game import GameData
from bemani.tests.helpers import FakeCursor
@ -13,20 +14,20 @@ class TestGameData(unittest.TestCase):
# Verify that we catch incorrect input order
with self.assertRaises(Exception) as context:
game.put_time_sensitive_settings('game', 1, 'work', {'start_time': 12345, 'end_time': 12340})
game.put_time_sensitive_settings(GameConstants.BISHI_BASHI, 1, 'work', {'start_time': 12345, 'end_time': 12340})
self.assertTrue('Start time is greater than end time!' in str(context.exception))
# Verify that we catch events spanning no time
with self.assertRaises(Exception) as context:
game.put_time_sensitive_settings('game', 1, 'work', {'start_time': 12345, 'end_time': 12345})
game.put_time_sensitive_settings(GameConstants.BISHI_BASHI, 1, 'work', {'start_time': 12345, 'end_time': 12345})
self.assertTrue('This setting spans zero seconds!' in str(context.exception))
# Verify that we ignore finding ourselves before updating
game.execute = Mock(return_value=FakeCursor([{'start_time': 12345, 'end_time': 12346}]))
game.put_time_sensitive_settings('game', 1, 'work', {'start_time': 12345, 'end_time': 12346})
game.execute = Mock(return_value=FakeCursor([{'start_time': 12345, 'end_time': 12346}])) # type: ignore
game.put_time_sensitive_settings(GameConstants.BISHI_BASHI, 1, 'work', {'start_time': 12345, 'end_time': 12346})
# Verify that we catch events overlapping other events in the DB
game.execute = Mock(return_value=FakeCursor([{'start_time': 12345, 'end_time': 12350}]))
game.execute = Mock(return_value=FakeCursor([{'start_time': 12345, 'end_time': 12350}])) # type: ignore
with self.assertRaises(Exception) as context:
game.put_time_sensitive_settings('game', 1, 'work', {'start_time': 12347, 'end_time': 12355})
game.put_time_sensitive_settings(GameConstants.BISHI_BASHI, 1, 'work', {'start_time': 12347, 'end_time': 12355})
self.assertTrue('This event overlaps an existing one with start time 12345 and end time 12350' in str(context.exception))

View File

@ -58,12 +58,12 @@ class TestJubeatProp(unittest.TestCase):
self.assertEqual(
JubeatProp._get_league_buckets(
[
(5, 12345),
(UserID(5), 12345),
],
),
(
[
5,
UserID(5),
],
[],
[],
@ -74,17 +74,17 @@ class TestJubeatProp(unittest.TestCase):
self.assertEqual(
JubeatProp._get_league_buckets(
[
(5, 12345),
(7, 54321),
(UserID(5), 12345),
(UserID(7), 54321),
],
),
(
[
7,
UserID(7),
],
[],
[
5,
UserID(5),
],
),
)
@ -93,20 +93,20 @@ class TestJubeatProp(unittest.TestCase):
self.assertEqual(
JubeatProp._get_league_buckets(
[
(5, 12345),
(7, 54321),
(9, 33333),
(UserID(5), 12345),
(UserID(7), 54321),
(UserID(9), 33333),
],
),
(
[
7,
UserID(7),
],
[
9,
UserID(9),
],
[
5,
UserID(5),
],
),
)
@ -115,34 +115,34 @@ class TestJubeatProp(unittest.TestCase):
self.assertEqual(
JubeatProp._get_league_buckets(
[
(5, 55555),
(7, 77777),
(9, 99999),
(1, 11111),
(6, 66666),
(8, 88888),
(2, 22222),
(3, 33333),
(10, 100000),
(4, 44444),
(UserID(5), 55555),
(UserID(7), 77777),
(UserID(9), 99999),
(UserID(1), 11111),
(UserID(6), 66666),
(UserID(8), 88888),
(UserID(2), 22222),
(UserID(3), 33333),
(UserID(10), 100000),
(UserID(4), 44444),
],
),
(
[
10,
9,
8,
UserID(10),
UserID(9),
UserID(8),
],
[
7,
6,
5,
4,
UserID(7),
UserID(6),
UserID(5),
UserID(4),
],
[
3,
2,
1,
UserID(3),
UserID(2),
UserID(1),
],
),
)
@ -171,7 +171,7 @@ class TestJubeatProp(unittest.TestCase):
JubeatProp._get_league_scores(
data,
999,
[(UserID(1337), {})],
[(UserID(1337), ValidatedDict())],
),
(
[(1337, 1368)],
@ -193,7 +193,7 @@ class TestJubeatProp(unittest.TestCase):
JubeatProp._get_league_scores(
data,
999,
[(UserID(1337), {})],
[(UserID(1337), ValidatedDict())],
),
(
[],
@ -230,14 +230,14 @@ class TestJubeatProp(unittest.TestCase):
JubeatProp._get_league_absentees(
data,
999,
[1337],
[UserID(1337)],
),
[],
)
data.local.user.get_achievements.assert_called_once_with(
JubeatProp.game,
JubeatProp.version,
1337,
UserID(1337),
)
data.local.user.get_achievements.reset_mock()
@ -249,14 +249,14 @@ class TestJubeatProp(unittest.TestCase):
JubeatProp._get_league_absentees(
data,
999,
[1337],
[UserID(1337)],
),
[],
)
data.local.user.get_achievements.assert_called_once_with(
JubeatProp.game,
JubeatProp.version,
1337,
UserID(1337),
)
data.local.user.get_achievements.reset_mock()
@ -268,14 +268,14 @@ class TestJubeatProp(unittest.TestCase):
JubeatProp._get_league_absentees(
data,
999,
[1337],
[UserID(1337)],
),
[1337],
[UserID(1337)],
)
data.local.user.get_achievements.assert_called_once_with(
JubeatProp.game,
JubeatProp.version,
1337,
UserID(1337),
)
data.local.user.get_achievements.reset_mock()
@ -288,14 +288,14 @@ class TestJubeatProp(unittest.TestCase):
JubeatProp._get_league_absentees(
data,
999,
[1337],
[UserID(1337)],
),
[],
)
data.local.user.get_achievements.assert_called_once_with(
JubeatProp.game,
JubeatProp.version,
1337,
UserID(1337),
)
data.local.user.get_achievements.reset_mock()
@ -307,14 +307,14 @@ class TestJubeatProp(unittest.TestCase):
JubeatProp._get_league_absentees(
data,
999,
[1337],
[UserID(1337)],
),
[1337],
[UserID(1337)],
)
data.local.user.get_achievements.assert_called_once_with(
JubeatProp.game,
JubeatProp.version,
1337,
UserID(1337),
)
data.local.user.get_achievements.reset_mock()
@ -330,7 +330,7 @@ class TestJubeatProp(unittest.TestCase):
}))
JubeatProp._modify_profile(
data,
1337,
UserID(1337),
'demote',
)
self.assertFalse(data.local.user.put_profile.called)
@ -342,7 +342,7 @@ class TestJubeatProp(unittest.TestCase):
}))
JubeatProp._modify_profile(
data,
1337,
UserID(1337),
'promote',
)
self.assertFalse(data.local.user.put_profile.called)
@ -355,13 +355,13 @@ class TestJubeatProp(unittest.TestCase):
}))
JubeatProp._modify_profile(
data,
1337,
UserID(1337),
'promote',
)
data.local.user.put_profile.assert_called_once_with(
JubeatProp.game,
JubeatProp.version,
1337,
UserID(1337),
{
'league_class': 1,
'league_subclass': 4,
@ -382,13 +382,13 @@ class TestJubeatProp(unittest.TestCase):
}))
JubeatProp._modify_profile(
data,
1337,
UserID(1337),
'demote',
)
data.local.user.put_profile.assert_called_once_with(
JubeatProp.game,
JubeatProp.version,
1337,
UserID(1337),
{
'league_class': 1,
'league_subclass': 4,
@ -413,13 +413,13 @@ class TestJubeatProp(unittest.TestCase):
}))
JubeatProp._modify_profile(
data,
1337,
UserID(1337),
'demote',
)
data.local.user.put_profile.assert_called_once_with(
JubeatProp.game,
JubeatProp.version,
1337,
UserID(1337),
{
'league_class': 1,
'league_subclass': 5,

View File

@ -3,6 +3,7 @@ import unittest
from unittest.mock import Mock
from freezegun import freeze_time
from bemani.common import GameConstants
from bemani.data.mysql.network import NetworkData
from bemani.tests.helpers import FakeCursor
@ -32,20 +33,20 @@ class TestNetworkData(unittest.TestCase):
with freeze_time('2016-01-01'):
# Check for should schedule if nothing in DB
network.execute = Mock(return_value=FakeCursor([]))
self.assertTrue(network.should_schedule('game', 1, 'work', 'daily'))
self.assertTrue(network.should_schedule('game', 1, 'work', 'weekly'))
network.execute = Mock(return_value=FakeCursor([])) # type: ignore
self.assertTrue(network.should_schedule(GameConstants.BISHI_BASHI, 1, 'work', 'daily'))
self.assertTrue(network.should_schedule(GameConstants.BISHI_BASHI, 1, 'work', 'weekly'))
# Check for don't schedule if DB time is our current time
network.execute = Mock(return_value=FakeCursor([{'year': 2016, 'day': 1}]))
self.assertFalse(network.should_schedule('game', 1, 'work', 'daily'))
network.execute = Mock(return_value=FakeCursor([{'year': 2016, 'day': 1}])) # type: ignore
self.assertFalse(network.should_schedule(GameConstants.BISHI_BASHI, 1, 'work', 'daily'))
network.execute = Mock(return_value=FakeCursor([{'year': None, 'day': 16797}]))
self.assertFalse(network.should_schedule('game', 1, 'work', 'weekly'))
network.execute = Mock(return_value=FakeCursor([{'year': None, 'day': 16797}])) # type: ignore
self.assertFalse(network.should_schedule(GameConstants.BISHI_BASHI, 1, 'work', 'weekly'))
# Check for do schedule if DB time is older than our current time
network.execute = Mock(return_value=FakeCursor([{'year': 2015, 'day': 365}]))
self.assertTrue(network.should_schedule('game', 1, 'work', 'daily'))
network.execute = Mock(return_value=FakeCursor([{'year': 2015, 'day': 365}])) # type: ignore
self.assertTrue(network.should_schedule(GameConstants.BISHI_BASHI, 1, 'work', 'daily'))
network.execute = Mock(return_value=FakeCursor([{'year': None, 'day': 16790}]))
self.assertTrue(network.should_schedule('game', 1, 'work', 'weekly'))
network.execute = Mock(return_value=FakeCursor([{'year': None, 'day': 16790}])) # type: ignore
self.assertTrue(network.should_schedule(GameConstants.BISHI_BASHI, 1, 'work', 'weekly'))

View File

@ -1,4 +1,5 @@
# vim: set fileencoding=utf-8
from abc import ABC
import unittest
from bemani.common import Parallel
@ -66,23 +67,27 @@ class TestParallel(unittest.TestCase):
self.assertEqual(results, [20, -20, 4, -4, 2])
def test_class(self) -> None:
class A:
class Base(ABC):
def fun(self, x: int) -> int:
...
class A(Base):
def fun(self, x: int) -> int:
return x * 10
class B:
class B(Base):
def fun(self, x: int) -> int:
return x * 20
class C:
class C(Base):
def fun(self, x: int) -> int:
return x * 30
class D:
class D(Base):
def fun(self, x: int) -> int:
return x * 40
class E:
class E(Base):
def fun(self, x: int) -> int:
return x * 50

View File

@ -1,6 +1,5 @@
# vim: set fileencoding=utf-8
import unittest
from typing import Optional
from bemani.protocol import EAmuseProtocol, Node
@ -9,7 +8,7 @@ class TestProtocol(unittest.TestCase):
# Define a function that just encrypts/decrypts and encode/decodes, verify
# that we can get the same thing back.
def assertLoopback(self, root: Node) -> Optional[int]:
def assertLoopback(self, root: Node) -> None:
proto = EAmuseProtocol()
for encoding in [EAmuseProtocol.BINARY, EAmuseProtocol.XML]:
@ -36,7 +35,7 @@ class TestProtocol(unittest.TestCase):
newroot = proto.decode('lz77', None, binary)
self.assertEqual(newroot, root, f"Round trip with {loop_name}, no encryption and lz77 compression doesn't match!")
def test_game_packet1(self) -> Node:
def test_game_packet1(self) -> None:
root = Node.void('call')
root.set_attribute('model', 'M39:J:B:A:2014061900')
root.set_attribute('srcid', '012010000000DEADBEEF')
@ -58,7 +57,7 @@ class TestProtocol(unittest.TestCase):
self.assertLoopback(root)
def test_game_packet2(self) -> Node:
def test_game_packet2(self) -> None:
root = Node.void('call')
root.set_attribute('model', 'LDJ:A:A:A:2015060700')
root.set_attribute('srcid', '012010000000DEADBEEF')
@ -79,13 +78,13 @@ class TestProtocol(unittest.TestCase):
self.assertLoopback(root)
def test_game_packet3(self) -> Node:
def test_game_packet3(self) -> None:
root = Node.void('response')
root.add_child(Node.void('music'))
self.assertLoopback(root)
def test_game_packet4(self) -> Node:
def test_game_packet4(self) -> None:
root = Node.void('response')
game = Node.void('game')
root.add_child(game)
@ -111,7 +110,7 @@ class TestProtocol(unittest.TestCase):
self.assertLoopback(root)
def test_game_packet5(self) -> Node:
def test_game_packet5(self) -> None:
root = Node.void('call')
root.set_attribute('model', 'LDJ:A:A:A:2015060700')
root.set_attribute('srcid', '012010000000DEADBEEF')
@ -271,7 +270,7 @@ class TestProtocol(unittest.TestCase):
self.assertLoopback(root)
def test_game_packet6(self) -> Node:
def test_game_packet6(self) -> None:
root = Node.void('response')
facility = Node.void('facility')
root.add_child(facility)
@ -327,7 +326,7 @@ class TestProtocol(unittest.TestCase):
self.assertLoopback(root)
def test_packet1(self) -> Node:
def test_packet1(self) -> None:
root = Node.void('test')
root.set_attribute('test', 'test string value')

View File

@ -13,6 +13,7 @@ types-requests
types-PyYAML
types-Werkzeug
types-Flask
types-freezegun
flake8
typed-ast
freezegun

View File

@ -31,6 +31,12 @@ do
cmdline+=("bemani.utils.$project")
done
for test in `find bemani/tests/ -name "test_*.py" | sed 's,.*/,,' | sed 's,\.py,,'`
do
cmdline+=('-m')
cmdline+=("bemani.tests.$test")
done
MYPYPATH=$(python -c "import os; print(os.path.realpath('.'))") mypy \
"${cmdline[@]}" \
--warn-redundant-casts \