from app.extensions import db
from app.models import User, Role, News
from app.services.content import unique_slug

def login(client, identity="root", password="Strong-test-password-2026"):
    return client.post("/admin/login", data={"identity":identity,"password":password}, follow_redirects=True)

def test_home_loads(client):
    response=client.get("/")
    assert response.status_code == 200
    assert b"Membangun Pendidik" in response.data

def test_login_success_and_failure(client, admin):
    bad=login(client,password="wrong-password")
    assert b"Login gagal" in bad.data
    good=login(client)
    assert b"Selamat datang" in good.data

def test_admin_requires_login(client):
    response=client.get("/admin/dashboard")
    assert response.status_code in (302, 401)

def test_super_admin_can_create_news(client, app, admin):
    login(client)
    response=client.post("/admin/berita/tambah",data={
        "title":"Seminar Teknologi Pendidikan","slug":"","summary":"Ringkasan seminar",
        "body":"Isi berita seminar","category_id":"1","status":"published"
    },follow_redirects=True)
    assert response.status_code == 200
    with app.app_context():
        item=News.query.filter_by(title="Seminar Teknologi Pendidikan").first()
        assert item is not None and item.status == "published"

def test_draft_not_public(client, app, admin):
    with app.app_context():
        item=News(title="Berita Draft",slug="berita-draft",summary="Draft",body="Konten",status="draft",author_id=admin.id)
        db.session.add(item); db.session.commit()
    response=client.get("/berita/berita-draft")
    assert response.status_code == 404

def test_csrf_rejects_post_without_token():
    from config import Config
    class CSRFTestingConfig(Config):
        TESTING=True
        SQLALCHEMY_DATABASE_URI="sqlite://"
        WTF_CSRF_ENABLED=True
    from app import create_app
    app=create_app(CSRFTestingConfig)
    client=app.test_client()
    response=client.post("/kontak",data={"name":"A","email":"a@example.com","subject":"Tes","message":"Pesan cukup panjang"})
    assert response.status_code == 400
