# 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() data.local.game.get_settings = Mock( return_value=ValidatedDict(existing_value) if existing_value else None ) 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: with freeze_time("2021-08-24"): 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: with freeze_time("2021-08-24"): 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) 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() ) def test_get_played_today(self) -> None: with freeze_time("2021-08-24"): play_date = Time.todays_date() stats = { "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]], } 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: with freeze_time("2021-08-24"): play_date = Time.todays_date() stats = { "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]], } 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) 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() ) def test_get_played_yesterday(self) -> None: with freeze_time("2021-08-24"): play_date = Time.yesterdays_date() stats = { "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]], } 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: with freeze_time("2021-08-24"): play_date = Time.yesterdays_date() stats = { "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]], } 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) 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() ) def test_get_played_awhile_ago(self) -> None: with freeze_time("2021-08-24"): stats = { "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], } 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: with freeze_time("2021-08-24"): stats = { "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], } 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) 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() ) def test_get_extra_settings(self) -> None: with freeze_time("2021-08-24"): stats = { "total_plays": 1234, "key": "value", "int": 1337, } data = mock_stats(stats) base = InstantiableBase(data, Mock(), Mock()) settings = base.get_play_statistics(UserID(1337)) self.assertEqual(settings.get_int("int"), 1337) self.assertEqual(settings.get_str("key"), "value") self.assertEqual(settings.get_int("total_plays"), 0) def test_put_extra_settings(self) -> None: with freeze_time("2021-08-24"): stats = { "total_plays": 1234, "key": "value", "int": 1337, } data = mock_stats(stats) base = InstantiableBase(data, Mock(), Mock()) settings = base.get_play_statistics(UserID(1337)) settings.replace_int("int", 420) settings.replace_int("int2", 69) settings.replace_int("total_plays", 37) base.update_play_statistics(UserID(1337), settings) new_settings = saved_stats(data) 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)