import pytest
from fastapi.testclient import TestClient

from app import database
from app.main import app


@pytest.fixture()
def client(tmp_path, monkeypatch):
    monkeypatch.setattr(database, "DB_PATH", str(tmp_path / "uji.db"))
    return TestClient(app)


def test_buat_lalu_ambil(client):
    respons = client.post("/tugas", json={"judul": "Belajar Python"})
    assert respons.status_code == 201
    hasil = respons.json()
    assert hasil == {"id": 1, "judul": "Belajar Python", "selesai": False}

    respons = client.get(f"/tugas/{hasil['id']}")
    assert respons.status_code == 200
    assert respons.json() == hasil


def test_ambil_tugas_tidak_ada(client):
    respons = client.get("/tugas/99")
    assert respons.status_code == 404
    assert "tidak ditemukan" in respons.json()["detail"]


def test_judul_kosong_ditolak(client):
    respons = client.post("/tugas", json={"judul": ""})
    assert respons.status_code == 422
    assert respons.json()["detail"][0]["loc"] == ["body", "judul"]


def test_perbarui_sebagian_field(client):
    client.post("/tugas", json={"judul": "Belajar Docker"})

    respons = client.patch("/tugas/1", json={"selesai": True})
    assert respons.status_code == 200
    hasil = respons.json()
    assert hasil["judul"] == "Belajar Docker"
    assert hasil["selesai"] is True


def test_hapus_lalu_404(client):
    client.post("/tugas", json={"judul": "Tugas sementara"})

    respons = client.delete("/tugas/1")
    assert respons.status_code == 204

    respons = client.get("/tugas/1")
    assert respons.status_code == 404


def test_daftar_tugas(client):
    assert client.get("/tugas").json() == []

    client.post("/tugas", json={"judul": "Tugas pertama"})
    client.post("/tugas", json={"judul": "Tugas kedua"})

    hasil = client.get("/tugas").json()
    assert len(hasil) == 2
    assert [tugas["judul"] for tugas in hasil] == ["Tugas pertama", "Tugas kedua"]


def test_alur_lengkap(client):
    respons = client.post("/tugas", json={"judul": "Belajar testing"})
    assert respons.status_code == 201
    id_tugas = respons.json()["id"]

    respons = client.patch(f"/tugas/{id_tugas}", json={"selesai": True})
    assert respons.status_code == 200
    assert respons.json()["selesai"] is True

    respons = client.delete(f"/tugas/{id_tugas}")
    assert respons.status_code == 204

    respons = client.get(f"/tugas/{id_tugas}")
    assert respons.status_code == 404
