"""Test untuk modul penyimpanan daftar tugas."""

import json

import storage


def test_simpan_dan_muat_bolak_balik(tmp_path):
    berkas = tmp_path / "tugas.json"
    daftar = [
        {"id": 1, "judul": "Belajar Python dasar", "selesai": False},
        {"id": 2, "judul": "Beli susu", "selesai": True},
    ]

    storage.simpan_tugas(daftar, str(berkas))
    hasil = storage.muat_tugas(str(berkas))

    assert hasil == daftar


def test_muat_berkas_hilang(tmp_path):
    berkas = tmp_path / "tidak-ada.json"

    hasil = storage.muat_tugas(str(berkas))

    assert hasil == []


def test_muat_berkas_rusak(tmp_path, capsys):
    berkas = tmp_path / "rusak.json"
    berkas.write_text("{ id: 1, judul: tanpa tanda kutip }", encoding="utf-8")

    hasil = storage.muat_tugas(str(berkas))
    tangkapan = capsys.readouterr()

    assert hasil == []
    assert not berkas.exists()
    assert (tmp_path / "rusak.json.bak").exists()
    assert "tidak berisi JSON yang valid" in tangkapan.out


def test_muat_melewati_record_tidak_sah(tmp_path):
    berkas = tmp_path / "tugas.json"
    berkas.write_text(
        json.dumps(
            [
                {"id": 1, "judul": "Belajar Python dasar", "selesai": False},
                {"id": "dua", "judul": "Id bertipe string", "selesai": False},
                {"id": True, "judul": "Id bertipe boolean", "selesai": False},
                {"id": 3, "judul": 42, "selesai": False},
                {"id": 4, "judul": "Tanpa kunci selesai"},
                "bukan dictionary",
            ]
        ),
        encoding="utf-8",
    )

    hasil = storage.muat_tugas(str(berkas))

    assert hasil == [{"id": 1, "judul": "Belajar Python dasar", "selesai": False}]


def test_simpan_daftar_kosong(tmp_path):
    berkas = tmp_path / "kosong.json"

    storage.simpan_tugas([], str(berkas))

    assert json.loads(berkas.read_text(encoding="utf-8")) == []
