from datetime import date from io import BytesIO from PIL import Image from starlette.datastructures import Headers, UploadFile from app.schemas.journal import JournalCategoryCreate, JournalEntryCreate from app.services import journal_service def _make_category(db_session, user_id, name="일상", content_template=None): return journal_service.create_category( db_session, user_id, JournalCategoryCreate(name=name, content_template=content_template) ) def _make_entry(db_session, user_id, category_id, entry_date=None, content="기록"): data = JournalEntryCreate(category_id=category_id, entry_date=entry_date or date.today(), content=content) return journal_service.create_entry(db_session, user_id, data) def _png_file(): buf = BytesIO() Image.new("RGB", (400, 300), "green").save(buf, format="PNG") buf.seek(0) return buf def test_journal_page_requires_login(client): response = client.get("/journal", follow_redirects=False) assert response.status_code == 303 assert response.headers["location"] == "/login" def test_journal_page_creates_default_category_and_renders(auth_client): response = auth_client.get("/journal") assert response.status_code == 200 assert journal_service.DEFAULT_CATEGORY_NAME in response.text def test_journal_page_embeds_category_content_template(auth_client): response = auth_client.get("/journal") assert response.status_code == 200 assert "Story" in response.text assert "메타인지" in response.text def test_journal_page_template_with_double_quotes_does_not_break_x_data_attribute( auth_client, db_session, test_user ): baseline_form_count = auth_client.get("/journal").text.count("굵은 글씨" in response.text def test_journal_day_detail_strips_script_tags_from_content(auth_client, db_session, test_user): category = _make_category(db_session, test_user.id) today = date.today() _make_entry( db_session, test_user.id, category.id, entry_date=today, content='본문' ) response = auth_client.get(f"/journal/day/{today.isoformat()}") assert response.status_code == 200 assert "굵게" in response.text def test_preview_strips_script_tags(auth_client): response = auth_client.post("/journal/preview", data={"content": '본문'}) assert response.status_code == 200 assert "