"""Tests for src/cmos/parser.py — extract the bibliography section from a draft. v1 scope: locate a ``## Bibliography`` heading (case-insensitive) and return the prose before it, the list of entries inside it, and the prose after it. The section ends at the next ``##`` (level-2) heading or end of file. Blank lines and bullet markers (``- `` or ``* ``) are stripped from entries. """ import pytest from cmos.parser import NoBibliographyError, split_bibliography def test_three_entries_under_bibliography_heading(): draft = """\ Some prose here. More prose. ## Bibliography yu, charles. interior chinatown. New York: Pantheon Books, 2020. Kwon, Hyeyoung. "inclusion work." American Journal of Sociology 127, no. 6 (2022): 1818-1859. google, "privacy policy," privacy & terms, nov 15 2023, policies.google.com/privacy """ result = split_bibliography(draft) assert len(result.entries) == 3 assert result.entries[0].startswith("yu, charles") assert result.entries[1].startswith("Kwon, Hyeyoung") assert result.entries[2].startswith("google") assert "Some prose here." in result.before assert result.after == "" def test_section_ends_at_next_level_two_heading(): draft = """\ ## Bibliography First entry. Second entry. ## Appendix Appendix content here. """ result = split_bibliography(draft) assert result.entries == ["First entry.", "Second entry."] assert "## Appendix" in result.after assert "Appendix content here." in result.after def test_bullet_prefixes_stripped(): draft = """\ ## Bibliography - First entry. - Second entry. * Third entry. """ result = split_bibliography(draft) assert result.entries == ["First entry.", "Second entry.", "Third entry."] def test_heading_match_is_case_insensitive(): draft = """\ ## bibliography Only entry. """ result = split_bibliography(draft) assert result.entries == ["Only entry."] def test_no_bibliography_raises(): with pytest.raises(NoBibliographyError): split_bibliography("## Introduction\n\nJust prose.\n")