diff --git a/tests/data/sites/draft_content/config.yml b/tests/data/sites/draft_content/config.yml new file mode 100644 index 0000000..4052e1d --- /dev/null +++ b/tests/data/sites/draft_content/config.yml @@ -0,0 +1,2 @@ +name: Draft Content Test +template: plain diff --git a/tests/data/sites/draft_content/content/draft.md b/tests/data/sites/draft_content/content/draft.md new file mode 100644 index 0000000..c4bc098 --- /dev/null +++ b/tests/data/sites/draft_content/content/draft.md @@ -0,0 +1,9 @@ +--- +type: article +section: posts +slug: draft-post +title: Draft +date: 2026-08-28 +draft: true +--- +Draft. diff --git a/tests/data/sites/draft_content/content/published.md b/tests/data/sites/draft_content/content/published.md new file mode 100644 index 0000000..d670809 --- /dev/null +++ b/tests/data/sites/draft_content/content/published.md @@ -0,0 +1,8 @@ +--- +type: article +section: posts +slug: published +title: Published +date: 2026-08-28 +--- +Published. diff --git a/tests/data/sites/duplicate_slug/config.yml b/tests/data/sites/duplicate_slug/config.yml new file mode 100644 index 0000000..281dd28 --- /dev/null +++ b/tests/data/sites/duplicate_slug/config.yml @@ -0,0 +1,2 @@ +name: Duplicate Slug Test +template: plain diff --git a/tests/data/sites/duplicate_slug/content/first.md b/tests/data/sites/duplicate_slug/content/first.md new file mode 100644 index 0000000..69a3a78 --- /dev/null +++ b/tests/data/sites/duplicate_slug/content/first.md @@ -0,0 +1,8 @@ +--- +type: article +section: posts +slug: hello +title: First +date: 2026-08-28 +--- +First. diff --git a/tests/data/sites/duplicate_slug/content/second.md b/tests/data/sites/duplicate_slug/content/second.md new file mode 100644 index 0000000..9c40e6c --- /dev/null +++ b/tests/data/sites/duplicate_slug/content/second.md @@ -0,0 +1,8 @@ +--- +type: article +section: posts +slug: hello +title: Second +date: 2026-08-28 +--- +Second. diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index 79c04cd..33a7418 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -7,14 +7,22 @@ DATA_SITES = Path(__file__).parent.parent / "data" / "sites" @pytest.fixture -def make_site(tmp_path): - def _make(name, **kwargs): - site_dir = tmp_path / name +def site_dir(tmp_path): + def _make(name): + path = tmp_path / name shutil.copytree( DATA_SITES / name, - site_dir, + path, ignore=shutil.ignore_patterns("output", "build.log"), ) - return Site(site_dir, **kwargs) + return path + + return _make + + +@pytest.fixture +def make_site(site_dir): + def _make(name, **kwargs): + return Site(site_dir(name), **kwargs) return _make diff --git a/tests/unit/test_site.py b/tests/unit/test_site.py index 431ed96..bfcd305 100644 --- a/tests/unit/test_site.py +++ b/tests/unit/test_site.py @@ -1,6 +1,7 @@ from pathlib import Path import pytest -from omicron.ssg.site import Site +from omicron.ssg.output import ContentError, Directory +from omicron.ssg.site import ConfigError, Site @pytest.mark.parametrize( @@ -17,3 +18,83 @@ def test_parse_base_url(value, expected_origin, expected_path): origin, path = Site.parse_base_url(value) assert origin == expected_origin assert path == expected_path + + +def test_discover_raises_on_duplicate_destination(make_site): + site = make_site("duplicate_slug") + with pytest.raises(ContentError): + site.discover() + + +def test_discover_creates_content_directories(make_site): + site = make_site("main") + site.discover() + + assert isinstance(site.by_path[Path("posts")], Directory) + assert isinstance(site.by_path[Path("posts/first-post")], Directory) + + +def test_read_config_errors(site_dir): + path = site_dir("thin_site") + config_path = path / "config.yml" + + config_path.unlink() + with pytest.raises(ConfigError, match="config file missing"): + Site(path) + + config_path.write_text("- a\n- b\n") + with pytest.raises(ConfigError, match="YAML mapping with string keys"): + Site(path) + + config_path.write_text("123: value\n") + with pytest.raises(ConfigError, match="YAML mapping with string keys"): + Site(path) + + config_path.write_text("template: plain\n") + with pytest.raises(ConfigError, match="name value missing"): + Site(path) + + config_path.write_text("name: test\n") + with pytest.raises(ConfigError, match="template value missing"): + Site(path) + + +def test_build_raises_for_relative_base_url(site_dir): + path = site_dir("thin_site") + (path / "config.yml").write_text("name: test\ntemplate: plain\nbase_url: blog\n") + + site = Site(path) + with pytest.raises(ConfigError, match="absolute path"): + site.build() + + +def test_discover_skips_drafts_by_default(make_site): + site = make_site("draft_content") + site.discover() + + assert len(site.content) == 1 + assert site.content[0].title == "Published" + + +def test_discover_includes_drafts_when_enabled(make_site): + site = make_site("draft_content", drafts=True) + site.discover() + + assert len(site.content) == 2 + + +def test_clean_removes_output_directory(make_site): + site = make_site("main") + site.build() + assert site.output_path.exists() + + site.clean() + assert not site.output_path.exists() + + site.clean() + assert not site.output_path.exists() + + +def test_resolve_template_path_raises_for_missing_template(): + with pytest.raises(ConfigError, match="not found"): + Site.resolve_template_path("does-not-exist")