"""
Integration tests for the Posts REST API (/api/posts).
"""

import pytest


@pytest.mark.django_db
class TestPostsAPI:
    BASE = "/api/posts"

    def test_list_empty(self, api_client):
        r = api_client.get(f"{self.BASE}")
        assert r.status_code == 200
        assert r.json()["count"] == 0

    def test_create_post(self, api_client):
        r = api_client.post(
            f"{self.BASE}",
            {"title": "Hello World", "content": "# Hello\n\nThis is a test post."},
            format="json",
        )
        assert r.status_code == 201
        data = r.json()
        assert data["title"] == "Hello World"
        assert "id" in data

    def test_list_after_create(self, api_client):
        for i in range(3):
            api_client.post(
                f"{self.BASE}",
                {"title": f"Post {i}", "content": f"Content {i}"},
                format="json",
            )
        r = api_client.get(f"{self.BASE}")
        assert r.json()["count"] == 3

    def test_get_post_detail(self, api_client):
        created = api_client.post(
            f"{self.BASE}",
            {"title": "Detail Test", "content": "Some content"},
            format="json",
        ).json()
        r = api_client.get(f"{self.BASE}/{created['id']}")
        assert r.status_code == 200
        assert r.json()["title"] == "Detail Test"

    def test_update_post(self, api_client):
        created = api_client.post(
            f"{self.BASE}",
            {"title": "Original", "content": "Original content"},
            format="json",
        ).json()
        r = api_client.patch(
            f"{self.BASE}/{created['id']}",
            {"title": "Updated"},
            format="json",
        )
        assert r.status_code == 200
        assert r.json()["title"] == "Updated"

    def test_delete_post(self, api_client):
        created = api_client.post(
            f"{self.BASE}",
            {"title": "Delete Me", "content": "Content"},
            format="json",
        ).json()
        r = api_client.delete(f"{self.BASE}/{created['id']}")
        assert r.status_code == 204
        assert api_client.get(f"{self.BASE}/{created['id']}").status_code == 404

    def test_create_post_missing_required_fields(self, api_client):
        r = api_client.post(f"{self.BASE}", {"title": "No content"}, format="json")
        assert r.status_code == 400

    def test_create_post_with_summary(self, api_client):
        r = api_client.post(
            f"{self.BASE}",
            {"title": "With Summary", "content": "Body", "summary": "Short summary"},
            format="json",
        )
        assert r.status_code == 201
        assert r.json()["summary"] == "Short summary"
