2022-07-30 17:50:09 +02:00
|
|
|
import pytest
|
2022-07-30 18:27:58 +02:00
|
|
|
from freezegun import freeze_time
|
2022-07-30 17:50:09 +02:00
|
|
|
|
2022-07-30 18:27:58 +02:00
|
|
|
from database.crud import game_stats as crud
|
2022-07-30 17:50:09 +02:00
|
|
|
from database.mongo_types import MongoDatabase
|
2022-07-30 18:27:58 +02:00
|
|
|
from database.schemas.mongo.game_stats import GameStats
|
|
|
|
from database.utils.datetime import today_only_date
|
|
|
|
|
|
|
|
|
|
|
|
async def insert_game_stats(mongodb: MongoDatabase, stats: GameStats):
|
|
|
|
"""Helper function to insert some stats"""
|
|
|
|
collection = mongodb[GameStats.collection()]
|
|
|
|
await collection.insert_one(stats.dict(by_alias=True))
|
2022-07-30 17:50:09 +02:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.mongo
|
2022-07-30 18:27:58 +02:00
|
|
|
async def test_get_stats_non_existent_creates(mongodb: MongoDatabase, test_user_id: int):
|
2022-07-30 17:50:09 +02:00
|
|
|
"""Test getting a user's stats when the db is empty"""
|
2022-07-30 18:27:58 +02:00
|
|
|
collection = mongodb[GameStats.collection()]
|
|
|
|
assert await collection.find_one({"user_id": test_user_id}) is None
|
|
|
|
await crud.get_game_stats(mongodb, test_user_id)
|
|
|
|
assert await collection.find_one({"user_id": test_user_id}) is not None
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.mongo
|
|
|
|
async def test_get_stats_existing_returns(mongodb: MongoDatabase, test_user_id: int):
|
|
|
|
"""Test getting a user's stats when there's already an entry present"""
|
|
|
|
stats = GameStats(user_id=test_user_id)
|
|
|
|
stats.wordle.games = 20
|
|
|
|
await insert_game_stats(mongodb, stats)
|
|
|
|
found_stats = await crud.get_game_stats(mongodb, test_user_id)
|
|
|
|
assert found_stats.wordle.games == 20
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.mongo
|
|
|
|
@freeze_time("2022-07-30")
|
|
|
|
async def test_complete_wordle_game_won(mongodb: MongoDatabase, test_user_id: int):
|
|
|
|
"""Test completing a wordle game when you win"""
|
|
|
|
await crud.complete_wordle_game(mongodb, test_user_id, win=True, guesses=2)
|
|
|
|
stats = await crud.get_game_stats(mongodb, test_user_id)
|
|
|
|
assert stats.wordle.guess_distribution == [0, 1, 0, 0, 0, 0]
|
|
|
|
assert stats.wordle.games == 1
|
|
|
|
assert stats.wordle.wins == 1
|
|
|
|
assert stats.wordle.current_streak == 1
|
|
|
|
assert stats.wordle.max_streak == 1
|
|
|
|
assert stats.wordle.last_win == today_only_date()
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.mongo
|
|
|
|
@freeze_time("2022-07-30")
|
|
|
|
async def test_complete_wordle_game_lost(mongodb: MongoDatabase, test_user_id: int):
|
|
|
|
"""Test completing a wordle game when you lose"""
|
|
|
|
stats = GameStats(user_id=test_user_id)
|
|
|
|
stats.wordle.current_streak = 10
|
|
|
|
await insert_game_stats(mongodb, stats)
|
|
|
|
|
|
|
|
await crud.complete_wordle_game(mongodb, test_user_id, win=False)
|
|
|
|
stats = await crud.get_game_stats(mongodb, test_user_id)
|
|
|
|
|
|
|
|
# Check that streak was broken
|
|
|
|
assert stats.wordle.current_streak == 0
|
|
|
|
assert stats.wordle.games == 1
|
|
|
|
assert stats.wordle.guess_distribution == [0, 0, 0, 0, 0, 0]
|