from pathlib import Path
from unittest.mock import patch

import pytest
from nonebug import App

from .utils import fake_admin_user, fake_private_message_event


@pytest.mark.asyncio
async def test_command(app: App):

    from nonebot.adapters.onebot.v11.bot import Bot
    from nonebot.adapters.onebot.v11.message import Message

    from nonebot_bison.admin_page import register_get_token_handler
    from nonebot_bison.admin_page.token_manager import token_manager as tm
    from nonebot_bison.plugin_config import plugin_config

    with patch.object(tm, "get_user_token", return_value="test_token"):

        register_get_token_handler()

        async with app.test_matcher() as ctx:
            bot = ctx.create_bot(base=Bot)

            event_1 = fake_private_message_event(
                message=Message("后台管理"),
                sender=fake_admin_user,
                to_me=True,
            )
            ctx.receive_event(bot, event_1)
            ctx.should_call_send(
                event_1, f"请访问: {plugin_config.bison_outer_url}auth/test_token", True
            )
            ctx.should_finished()

            event_2 = fake_private_message_event(
                message=Message("管理后台"), sender=fake_admin_user, to_me=True
            )
            ctx.receive_event(bot, event_2)
            ctx.should_call_send(
                event_2, f"请访问: {plugin_config.bison_outer_url}auth/test_token", True
            )
            ctx.should_finished()


@pytest.mark.asyncio
async def test_log(app: App, tmp_path: Path):
    import contextlib
    import io

    from nonebot.log import default_format, logger

    from nonebot_bison.admin_page import init_fastapi

    log_path = tmp_path / "temp.log"

    logger.add(log_path, level="INFO", format=default_format, rotation="1 day")
    with contextlib.redirect_stderr(io.StringIO()) as f:
        init_fastapi()

    with log_path.open("r", encoding="utf-8") as f:
        log = f.read()
        assert "Nonebot Bison frontend will be running at" in log
        assert "该页面不能被直接访问,请私聊bot 后台管理 以获取可访问地址" in log