import datetime import pytest import yaml from omicron.ssg.output.article import ArticleMeta from omicron.ssg.output.content import ContentError @pytest.fixture def valid_data(): return yaml.safe_load(""" section: posts slug: hello title: Hello date: 2024-01-01 """) @pytest.fixture def full_data(): return yaml.safe_load(""" section: posts slug: hello title: Hello date: 2024-01-01 updated: 2024-02-01 tags: [python, testing] summary: A short summary. draft: true """) @pytest.mark.parametrize("key", ["section", "slug", "title", "date"]) def test_from_dict_missing_required_key(valid_data, key): del valid_data[key] with pytest.raises(ContentError, match=f"must contain a {key} property"): ArticleMeta.from_dict(valid_data) @pytest.mark.parametrize( "key, value, expected_type", [ ("section", 1, "string"), ("slug", 1, "string"), ("title", 1, "string"), ("date", "2024-01-01", "date"), ("updated", "2024-01-01", "date"), ("tags", "python", "list of strings"), ("tags", [1, "python"], "list of strings"), ("summary", 1, "string"), ("draft", "yes", "boolean"), ], ) def test_from_dict_wrong_type(valid_data, key, value, expected_type): valid_data[key] = value with pytest.raises( ContentError, match=f"{key} frontmatter property must be a {expected_type}" ): ArticleMeta.from_dict(valid_data) def test_from_dict_unexpected_field(valid_data): valid_data["bogus"] = "value" with pytest.raises(ContentError, match="unexpected frontmatter field.*bogus"): ArticleMeta.from_dict(valid_data) def test_from_dict_minimal(valid_data): meta = ArticleMeta.from_dict(valid_data) assert meta.section == "posts" assert meta.slug == "hello" assert meta.title == "Hello" assert meta.date == datetime.date(2024, 1, 1) assert meta.updated is None assert meta.tags == set() assert meta.summary is None assert meta.draft is False def test_from_dict_full(full_data): meta = ArticleMeta.from_dict(full_data) assert meta.section == "posts" assert meta.slug == "hello" assert meta.title == "Hello" assert meta.date == datetime.date(2024, 1, 1) assert meta.updated == datetime.date(2024, 2, 1) assert meta.tags == {"python", "testing"} assert meta.summary == "A short summary." assert meta.draft is True