2021-08-25 01:18:53 +02:00
|
|
|
# vim: set fileencoding=utf-8
|
|
|
|
import unittest
|
|
|
|
from freezegun import freeze_time
|
|
|
|
from typing import Dict, Any
|
|
|
|
from unittest.mock import Mock
|
|
|
|
|
|
|
|
from bemani.backend.base import Base
|
|
|
|
from bemani.common import GameConstants, Time, ValidatedDict
|
|
|
|
from bemani.data import UserID
|
|
|
|
|
|
|
|
|
|
|
|
# Make the normally-abstract base instantiable so we can test it.
|
|
|
|
class InstantiableBase(Base):
|
|
|
|
game = GameConstants.BISHI_BASHI
|
|
|
|
version = -1
|
|
|
|
name = "Test Class"
|
|
|
|
|
|
|
|
|
|
|
|
# Make an easier mock implementation of load/save stats.
|
|
|
|
def mock_stats(existing_value: Dict[str, Any]) -> Mock:
|
|
|
|
data = Mock()
|
|
|
|
data.local = Mock()
|
|
|
|
data.local.game = Mock()
|
2022-10-15 20:56:30 +02:00
|
|
|
data.local.game.get_settings = Mock(
|
|
|
|
return_value=ValidatedDict(existing_value) if existing_value else None
|
|
|
|
)
|
2021-08-25 01:18:53 +02:00
|
|
|
data.local.game.put_settings = Mock()
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
|
|
def saved_stats(mock: Mock) -> ValidatedDict:
|
|
|
|
return ValidatedDict(mock.local.game.put_settings.call_args.args[2])
|
|
|
|
|
|
|
|
|
|
|
|
class TestPlayStats(unittest.TestCase):
|
|
|
|
def test_get_brand_new_profile(self) -> None:
|
2022-10-15 20:56:30 +02:00
|
|
|
with freeze_time("2021-08-24"):
|
2021-08-25 01:18:53 +02:00
|
|
|
stats = None
|
|
|
|
data = mock_stats(stats)
|
|
|
|
base = InstantiableBase(data, Mock(), Mock())
|
|
|
|
|
|
|
|
settings = base.get_play_statistics(UserID(1337))
|
|
|
|
|
|
|
|
self.assertEqual(settings.game, GameConstants.BISHI_BASHI)
|
|
|
|
self.assertEqual(settings.total_plays, 1)
|
|
|
|
self.assertEqual(settings.today_plays, 1)
|
|
|
|
self.assertEqual(settings.total_days, 1)
|
|
|
|
self.assertEqual(settings.consecutive_days, 1)
|
|
|
|
self.assertEqual(settings.first_play_timestamp, Time.now())
|
|
|
|
self.assertEqual(settings.last_play_timestamp, Time.now())
|
|
|
|
|
|
|
|
def test_put_brand_new_profile(self) -> None:
|
2022-10-15 20:56:30 +02:00
|
|
|
with freeze_time("2021-08-24"):
|
2021-08-25 01:18:53 +02:00
|
|
|
stats = None
|
|
|
|
data = mock_stats(stats)
|
|
|
|
base = InstantiableBase(data, Mock(), Mock())
|
|
|
|
|
|
|
|
settings = base.get_play_statistics(UserID(1337))
|
|
|
|
base.update_play_statistics(UserID(1337), settings)
|
|
|
|
new_settings = saved_stats(data)
|
|
|
|
|
2022-10-15 20:56:30 +02:00
|
|
|
self.assertEqual(new_settings.get_int("total_plays"), 1)
|
|
|
|
self.assertEqual(new_settings.get_int("today_plays"), 1)
|
|
|
|
self.assertEqual(new_settings.get_int("total_days"), 1)
|
|
|
|
self.assertEqual(new_settings.get_int("consecutive_days"), 1)
|
|
|
|
self.assertEqual(new_settings.get_int("first_play_timestamp"), Time.now())
|
|
|
|
self.assertEqual(new_settings.get_int("last_play_timestamp"), Time.now())
|
|
|
|
self.assertEqual(
|
|
|
|
new_settings.get_int_array("last_play_date", 3), Time.todays_date()
|
|
|
|
)
|
2021-08-25 01:18:53 +02:00
|
|
|
|
|
|
|
def test_get_played_today(self) -> None:
|
2022-10-15 20:56:30 +02:00
|
|
|
with freeze_time("2021-08-24"):
|
2021-08-25 01:18:53 +02:00
|
|
|
play_date = Time.todays_date()
|
|
|
|
stats = {
|
2022-10-15 20:56:30 +02:00
|
|
|
"total_plays": 1234,
|
|
|
|
"today_plays": 420,
|
|
|
|
"total_days": 10,
|
|
|
|
"first_play_timestamp": 1234567890,
|
|
|
|
"last_play_timestamp": 9876543210,
|
|
|
|
"consecutive_days": 69,
|
|
|
|
"last_play_date": [play_date[0], play_date[1], play_date[2]],
|
2021-08-25 01:18:53 +02:00
|
|
|
}
|
|
|
|
data = mock_stats(stats)
|
|
|
|
base = InstantiableBase(data, Mock(), Mock())
|
|
|
|
|
|
|
|
settings = base.get_play_statistics(UserID(1337))
|
|
|
|
|
|
|
|
self.assertEqual(settings.game, GameConstants.BISHI_BASHI)
|
|
|
|
self.assertEqual(settings.total_plays, 1235)
|
|
|
|
self.assertEqual(settings.today_plays, 421)
|
|
|
|
self.assertEqual(settings.total_days, 10)
|
|
|
|
self.assertEqual(settings.consecutive_days, 69)
|
|
|
|
self.assertEqual(settings.first_play_timestamp, 1234567890)
|
|
|
|
self.assertEqual(settings.last_play_timestamp, 9876543210)
|
|
|
|
|
|
|
|
def test_put_played_today(self) -> None:
|
2022-10-15 20:56:30 +02:00
|
|
|
with freeze_time("2021-08-24"):
|
2021-08-25 01:18:53 +02:00
|
|
|
play_date = Time.todays_date()
|
|
|
|
stats = {
|
2022-10-15 20:56:30 +02:00
|
|
|
"total_plays": 1234,
|
|
|
|
"today_plays": 420,
|
|
|
|
"total_days": 10,
|
|
|
|
"first_play_timestamp": 1234567890,
|
|
|
|
"last_play_timestamp": 1234567890,
|
|
|
|
"consecutive_days": 69,
|
|
|
|
"last_play_date": [play_date[0], play_date[1], play_date[2]],
|
2021-08-25 01:18:53 +02:00
|
|
|
}
|
|
|
|
data = mock_stats(stats)
|
|
|
|
base = InstantiableBase(data, Mock(), Mock())
|
|
|
|
|
|
|
|
settings = base.get_play_statistics(UserID(1337))
|
|
|
|
base.update_play_statistics(UserID(1337), settings)
|
|
|
|
new_settings = saved_stats(data)
|
|
|
|
|
2022-10-15 20:56:30 +02:00
|
|
|
self.assertEqual(new_settings.get_int("total_plays"), 1235)
|
|
|
|
self.assertEqual(new_settings.get_int("today_plays"), 421)
|
|
|
|
self.assertEqual(new_settings.get_int("total_days"), 10)
|
|
|
|
self.assertEqual(new_settings.get_int("consecutive_days"), 69)
|
|
|
|
self.assertEqual(new_settings.get_int("first_play_timestamp"), 1234567890)
|
|
|
|
self.assertEqual(new_settings.get_int("last_play_timestamp"), Time.now())
|
|
|
|
self.assertEqual(
|
|
|
|
new_settings.get_int_array("last_play_date", 3), Time.todays_date()
|
|
|
|
)
|
2021-08-25 01:18:53 +02:00
|
|
|
|
|
|
|
def test_get_played_yesterday(self) -> None:
|
2022-10-15 20:56:30 +02:00
|
|
|
with freeze_time("2021-08-24"):
|
2021-08-25 01:18:53 +02:00
|
|
|
play_date = Time.yesterdays_date()
|
|
|
|
stats = {
|
2022-10-15 20:56:30 +02:00
|
|
|
"total_plays": 1234,
|
|
|
|
"today_plays": 420,
|
|
|
|
"total_days": 10,
|
|
|
|
"first_play_timestamp": 1234567890,
|
|
|
|
"last_play_timestamp": 9876543210,
|
|
|
|
"consecutive_days": 69,
|
|
|
|
"last_play_date": [play_date[0], play_date[1], play_date[2]],
|
2021-08-25 01:18:53 +02:00
|
|
|
}
|
|
|
|
data = mock_stats(stats)
|
|
|
|
base = InstantiableBase(data, Mock(), Mock())
|
|
|
|
|
|
|
|
settings = base.get_play_statistics(UserID(1337))
|
|
|
|
|
|
|
|
self.assertEqual(settings.game, GameConstants.BISHI_BASHI)
|
|
|
|
self.assertEqual(settings.total_plays, 1235)
|
|
|
|
self.assertEqual(settings.today_plays, 1)
|
|
|
|
self.assertEqual(settings.total_days, 11)
|
|
|
|
self.assertEqual(settings.consecutive_days, 70)
|
|
|
|
self.assertEqual(settings.first_play_timestamp, 1234567890)
|
|
|
|
self.assertEqual(settings.last_play_timestamp, 9876543210)
|
|
|
|
|
|
|
|
def test_put_played_yesterday(self) -> None:
|
2022-10-15 20:56:30 +02:00
|
|
|
with freeze_time("2021-08-24"):
|
2021-08-25 01:18:53 +02:00
|
|
|
play_date = Time.yesterdays_date()
|
|
|
|
stats = {
|
2022-10-15 20:56:30 +02:00
|
|
|
"total_plays": 1234,
|
|
|
|
"today_plays": 420,
|
|
|
|
"total_days": 10,
|
|
|
|
"first_play_timestamp": 1234567890,
|
|
|
|
"last_play_timestamp": 1234567890,
|
|
|
|
"consecutive_days": 69,
|
|
|
|
"last_play_date": [play_date[0], play_date[1], play_date[2]],
|
2021-08-25 01:18:53 +02:00
|
|
|
}
|
|
|
|
data = mock_stats(stats)
|
|
|
|
base = InstantiableBase(data, Mock(), Mock())
|
|
|
|
|
|
|
|
settings = base.get_play_statistics(UserID(1337))
|
|
|
|
base.update_play_statistics(UserID(1337), settings)
|
|
|
|
new_settings = saved_stats(data)
|
|
|
|
|
2022-10-15 20:56:30 +02:00
|
|
|
self.assertEqual(new_settings.get_int("total_plays"), 1235)
|
|
|
|
self.assertEqual(new_settings.get_int("today_plays"), 1)
|
|
|
|
self.assertEqual(new_settings.get_int("total_days"), 11)
|
|
|
|
self.assertEqual(new_settings.get_int("consecutive_days"), 70)
|
|
|
|
self.assertEqual(new_settings.get_int("first_play_timestamp"), 1234567890)
|
|
|
|
self.assertEqual(new_settings.get_int("last_play_timestamp"), Time.now())
|
|
|
|
self.assertEqual(
|
|
|
|
new_settings.get_int_array("last_play_date", 3), Time.todays_date()
|
|
|
|
)
|
2021-08-25 01:18:53 +02:00
|
|
|
|
|
|
|
def test_get_played_awhile_ago(self) -> None:
|
2022-10-15 20:56:30 +02:00
|
|
|
with freeze_time("2021-08-24"):
|
2021-08-25 01:18:53 +02:00
|
|
|
stats = {
|
2022-10-15 20:56:30 +02:00
|
|
|
"total_plays": 1234,
|
|
|
|
"today_plays": 420,
|
|
|
|
"total_days": 10,
|
|
|
|
"first_play_timestamp": 1234567890,
|
|
|
|
"last_play_timestamp": 9876543210,
|
|
|
|
"consecutive_days": 69,
|
|
|
|
"last_play_date": [2010, 4, 20],
|
2021-08-25 01:18:53 +02:00
|
|
|
}
|
|
|
|
data = mock_stats(stats)
|
|
|
|
base = InstantiableBase(data, Mock(), Mock())
|
|
|
|
|
|
|
|
settings = base.get_play_statistics(UserID(1337))
|
|
|
|
|
|
|
|
self.assertEqual(settings.game, GameConstants.BISHI_BASHI)
|
|
|
|
self.assertEqual(settings.total_plays, 1235)
|
|
|
|
self.assertEqual(settings.today_plays, 1)
|
|
|
|
self.assertEqual(settings.total_days, 11)
|
|
|
|
self.assertEqual(settings.consecutive_days, 1)
|
|
|
|
self.assertEqual(settings.first_play_timestamp, 1234567890)
|
|
|
|
self.assertEqual(settings.last_play_timestamp, 9876543210)
|
|
|
|
|
|
|
|
def test_put_played_awhile_ago(self) -> None:
|
2022-10-15 20:56:30 +02:00
|
|
|
with freeze_time("2021-08-24"):
|
2021-08-25 01:18:53 +02:00
|
|
|
stats = {
|
2022-10-15 20:56:30 +02:00
|
|
|
"total_plays": 1234,
|
|
|
|
"today_plays": 420,
|
|
|
|
"total_days": 10,
|
|
|
|
"first_play_timestamp": 1234567890,
|
|
|
|
"last_play_timestamp": 1234567890,
|
|
|
|
"consecutive_days": 69,
|
|
|
|
"last_play_date": [2010, 4, 20],
|
2021-08-25 01:18:53 +02:00
|
|
|
}
|
|
|
|
data = mock_stats(stats)
|
|
|
|
base = InstantiableBase(data, Mock(), Mock())
|
|
|
|
|
|
|
|
settings = base.get_play_statistics(UserID(1337))
|
|
|
|
base.update_play_statistics(UserID(1337), settings)
|
|
|
|
new_settings = saved_stats(data)
|
|
|
|
|
2022-10-15 20:56:30 +02:00
|
|
|
self.assertEqual(new_settings.get_int("total_plays"), 1235)
|
|
|
|
self.assertEqual(new_settings.get_int("today_plays"), 1)
|
|
|
|
self.assertEqual(new_settings.get_int("total_days"), 11)
|
|
|
|
self.assertEqual(new_settings.get_int("consecutive_days"), 1)
|
|
|
|
self.assertEqual(new_settings.get_int("first_play_timestamp"), 1234567890)
|
|
|
|
self.assertEqual(new_settings.get_int("last_play_timestamp"), Time.now())
|
|
|
|
self.assertEqual(
|
|
|
|
new_settings.get_int_array("last_play_date", 3), Time.todays_date()
|
|
|
|
)
|
2021-08-25 01:18:53 +02:00
|
|
|
|
|
|
|
def test_get_extra_settings(self) -> None:
|
2022-10-15 20:56:30 +02:00
|
|
|
with freeze_time("2021-08-24"):
|
2021-08-25 01:18:53 +02:00
|
|
|
stats = {
|
2022-10-15 20:56:30 +02:00
|
|
|
"total_plays": 1234,
|
|
|
|
"key": "value",
|
|
|
|
"int": 1337,
|
2021-08-25 01:18:53 +02:00
|
|
|
}
|
|
|
|
data = mock_stats(stats)
|
|
|
|
base = InstantiableBase(data, Mock(), Mock())
|
|
|
|
|
|
|
|
settings = base.get_play_statistics(UserID(1337))
|
|
|
|
|
2022-10-15 20:56:30 +02:00
|
|
|
self.assertEqual(settings.get_int("int"), 1337)
|
|
|
|
self.assertEqual(settings.get_str("key"), "value")
|
|
|
|
self.assertEqual(settings.get_int("total_plays"), 0)
|
2021-08-25 01:18:53 +02:00
|
|
|
|
|
|
|
def test_put_extra_settings(self) -> None:
|
2022-10-15 20:56:30 +02:00
|
|
|
with freeze_time("2021-08-24"):
|
2021-08-25 01:18:53 +02:00
|
|
|
stats = {
|
2022-10-15 20:56:30 +02:00
|
|
|
"total_plays": 1234,
|
|
|
|
"key": "value",
|
|
|
|
"int": 1337,
|
2021-08-25 01:18:53 +02:00
|
|
|
}
|
|
|
|
data = mock_stats(stats)
|
|
|
|
base = InstantiableBase(data, Mock(), Mock())
|
|
|
|
|
|
|
|
settings = base.get_play_statistics(UserID(1337))
|
2022-10-15 20:56:30 +02:00
|
|
|
settings.replace_int("int", 420)
|
|
|
|
settings.replace_int("int2", 69)
|
|
|
|
settings.replace_int("total_plays", 37)
|
2021-08-25 01:18:53 +02:00
|
|
|
base.update_play_statistics(UserID(1337), settings)
|
|
|
|
|
|
|
|
new_settings = saved_stats(data)
|
|
|
|
|
2022-10-15 20:56:30 +02:00
|
|
|
self.assertEqual(new_settings.get_int("int"), 420)
|
|
|
|
self.assertEqual(new_settings.get_str("key"), "value")
|
|
|
|
self.assertEqual(new_settings.get_int("int2"), 69)
|
|
|
|
self.assertEqual(new_settings.get_int("total_plays"), 1235)
|