import pytest

from aurweb import cache, db
from aurweb.models.account_type import USER_ID
from aurweb.models.user import User


@pytest.fixture(autouse=True)
def setup(db_test):
    return


class StubRedis:
    """A class which acts as a RedisConnection without using Redis."""

    cache = dict()
    expires = dict()

    def get(self, key, *args):
        if "key" not in self.cache:
            self.cache[key] = None
        return self.cache[key]

    def set(self, key, *args):
        self.cache[key] = list(args)[0]

    def expire(self, key, *args):
        self.expires[key] = list(args)[0]

    async def execute(self, command, key, *args):
        f = getattr(self, command)
        return f(key, *args)


@pytest.fixture
def redis():
    yield StubRedis()


@pytest.mark.asyncio
async def test_db_count_cache(redis):
    db.create(
        User,
        Username="user1",
        Email="user1@example.org",
        Passwd="testPassword",
        AccountTypeID=USER_ID,
    )

    query = db.query(User)

    # Now, perform several checks that db_count_cache matches query.count().

    # We have no cached value yet.
    assert await cache.db_count_cache(redis, "key1", query) == query.count()

    # It's cached now.
    assert await cache.db_count_cache(redis, "key1", query) == query.count()


@pytest.mark.asyncio
async def test_db_count_cache_expires(redis):
    db.create(
        User,
        Username="user1",
        Email="user1@example.org",
        Passwd="testPassword",
        AccountTypeID=USER_ID,
    )

    query = db.query(User)

    # Cache a query with an expire.
    value = await cache.db_count_cache(redis, "key1", query, 100)
    assert value == query.count()

    assert redis.expires["key1"] == 100
