def test_accounts_endpoints_require_api_key(client):
    for method, path in (("get", "/api/v1/accounts"), ("get", "/api/v1/accounts/1"), ("delete", "/api/v1/accounts/1")):
        r = getattr(client, method)(path)
        assert r.status_code == 401


def test_list_accounts(client, api_headers, account):
    r = client.get("/api/v1/accounts", headers=api_headers)
    assert r.status_code == 200
    data = r.get_json()["data"]
    assert len(data) == 1
    assert data[0]["open_id"] == "open_id_0001"
    assert data[0]["follower_count"] == 1000
    assert "token" not in str(data)


def test_get_account_unknown_id(client, api_headers, account):
    r = client.get("/api/v1/accounts/999", headers=api_headers)
    assert r.status_code == 404


def test_refresh_account(client, api_headers, account, monkeypatch):
    monkeypatch.setattr("app.routes.api_routes.ensure_fresh_token", lambda a: "tok")
    monkeypatch.setattr(
        "app.routes.api_routes.get_user_info",
        lambda token: {"display_name": "New Name", "follower_count": 2000, "likes_count": 9000, "video_count": 15},
    )
    r = client.post("/api/v1/accounts/%s/refresh" % account, headers=api_headers)
    assert r.status_code == 200
    data = r.get_json()["data"]
    assert data["display_name"] == "New Name"
    assert data["follower_count"] == 2000


def test_delete_account_removes_it(client, api_headers, account):
    r = client.delete("/api/v1/accounts/%s" % account, headers=api_headers)
    assert r.status_code == 200
    r = client.get("/api/v1/accounts", headers=api_headers)
    assert r.get_json()["data"] == []


def test_health(client, api_headers):
    r = client.get("/api/v1/health", headers=api_headers)
    assert r.status_code == 200
    assert r.get_json()["data"]["status"] == "ok"
