import pytest
from app import create_app
from app.extensions import db


@pytest.fixture
def app():
    app = create_app()
    app.config["TESTING"] = True
    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///:memory:"
    app.config["WTF_CSRF_ENABLED"] = False
    with app.app_context():
        db.create_all()
        yield app
        db.drop_all()


@pytest.fixture
def client(app):
    return app.test_client()


def test_landing_page(client):
    resp = client.get("/")
    assert resp.status_code == 200


def test_login_page(client):
    resp = client.get("/auth/login")
    assert resp.status_code == 200


def test_register_page(client):
    resp = client.get("/auth/register")
    assert resp.status_code == 200


def test_billing_plans(client):
    resp = client.get("/billing/plans")
    assert resp.status_code == 200


def test_sitemap(client):
    resp = client.get("/sitemap.xml")
    assert resp.status_code == 200
    assert b"urlset" in resp.data


def test_robots(client):
    resp = client.get("/robots.txt")
    assert resp.status_code == 200
    assert b"Sitemap" in resp.data


def test_404(client):
    resp = client.get("/nonexistent-page-xyz")
    assert resp.status_code == 404


def test_dashboard_requires_login(client):
    resp = client.get("/dashboard/", follow_redirects=False)
    assert resp.status_code in (302, 401)


def test_marketplace_requires_login(client):
    resp = client.get("/marketplace/", follow_redirects=False)
    assert resp.status_code in (302, 401)


def test_grants_requires_login(client):
    resp = client.get("/grants/", follow_redirects=False)
    assert resp.status_code in (302, 401)


def test_app_has_many_routes(app):
    rules = [r.rule for r in app.url_map.iter_rules()]
    assert len(rules) > 100
