import aiofiles
from pytest import MonkeyPatch
from uniserde import JsonDoc

import rio.testing


class FakeFile:
    def __init__(self, content: str):
        self._content = content

    async def __aenter__(self):
        return self

    async def __aexit__(self, *args):
        pass

    async def read(self) -> str:
        return self._content


class RootSettings(rio.UserSettings):
    foo: str = "foo"


class FooSettings(rio.UserSettings):
    section_name = "foo"

    bar: str = "bar"


async def test_load_settings():
    user_settings: JsonDoc = {
        ":foo": "bar",
        "foo:bar": "baz",
    }

    async with rio.testing.TestClient(
        running_in_window=False,
        default_attachments=(RootSettings(), FooSettings()),
        user_settings=user_settings,
    ) as test_client:
        root_settings = test_client.session[RootSettings]
        foo_settings = test_client.session[FooSettings]

        assert root_settings.foo == "bar"
        assert foo_settings.bar == "baz"


async def test_load_settings_file(monkeypatch: MonkeyPatch):
    monkeypatch.setattr(
        aiofiles,
        "open",
        lambda _: FakeFile('{"foo": "bar", "section:foo": {"bar": "baz"} }'),
    )

    async with rio.testing.TestClient(
        running_in_window=True,
        default_attachments=(RootSettings(), FooSettings()),
    ) as test_client:
        root_settings = test_client.session[RootSettings]
        foo_settings = test_client.session[FooSettings]

        assert root_settings.foo == "bar"
        assert foo_settings.bar == "baz"
