mud/tests/test_stats_login.py
Jared Miller a398227814
Add player stats model and persistence
kills, deaths, mob_kills dict, play_time_seconds, unlocked_moves set
on Player. New player_stats SQLite table with save/load functions.
2026-02-14 11:40:45 -05:00

86 lines
2.7 KiB
Python

"""Tests for stats loading on login and session_start initialization."""
import time
import pytest
from mudlib.player import Player, accumulate_play_time
from mudlib.store import init_db, load_player_stats, save_player
@pytest.fixture
def db(tmp_path):
"""Create a temporary test database."""
db_path = tmp_path / "test.db"
init_db(db_path)
return db_path
def test_stats_load_and_apply_round_trip(db, mock_reader, mock_writer, test_zone):
"""Stats can be saved, loaded, and applied to a new player instance."""
# Create player with known stats
p1 = Player(name="Ken", x=0, y=0, reader=mock_reader, writer=mock_writer)
p1.location = test_zone
p1.kills = 5
p1.deaths = 2
p1.mob_kills = {"goblin": 3}
p1.play_time_seconds = 1000.0
p1.unlocked_moves = {"roundhouse"}
# Save the player (which saves stats internally)
save_player(p1)
# Load stats from database
stats = load_player_stats("Ken", db)
# Create a new player instance and apply loaded stats
p2 = Player(name="Ken", x=0, y=0, reader=mock_reader, writer=mock_writer)
p2.location = test_zone
p2.kills = stats["kills"]
p2.deaths = stats["deaths"]
p2.mob_kills = stats["mob_kills"]
p2.play_time_seconds = stats["play_time_seconds"]
p2.unlocked_moves = stats["unlocked_moves"]
# Verify all stats match
assert p2.kills == 5
assert p2.deaths == 2
assert p2.mob_kills == {"goblin": 3}
assert p2.play_time_seconds == 1000.0
assert p2.unlocked_moves == {"roundhouse"}
def test_session_start_set_after_login_setup(mock_reader, mock_writer, test_zone):
"""session_start is set to non-zero after login setup."""
# Simulate login setup
p = Player(name="Ryu", x=0, y=0, reader=mock_reader, writer=mock_writer)
p.location = test_zone
# Set session_start (this is what server.py does)
p.session_start = time.monotonic()
# Verify it's non-zero
assert p.session_start > 0
def test_accumulate_play_time_with_real_session_start(
mock_reader, mock_writer, test_zone
):
"""accumulate_play_time works correctly with real session_start."""
p = Player(name="Chun", x=0, y=0, reader=mock_reader, writer=mock_writer)
p.location = test_zone
p.play_time_seconds = 100.0
# Set session_start to 60 seconds ago (simulating 60 seconds of play)
p.session_start = time.monotonic() - 60.0
# Accumulate play time
accumulate_play_time(p)
# Play time should have increased by approximately 60 seconds
assert p.play_time_seconds >= 159.0
assert p.play_time_seconds <= 161.0
# session_start should be reset to current time
assert p.session_start > 0
assert time.monotonic() - p.session_start < 1.0