diff --git a/SPECGAPS.md b/SPECGAPS.md index a5fa92d..b0a1cbe 100644 --- a/SPECGAPS.md +++ b/SPECGAPS.md @@ -146,7 +146,7 @@ All reconciled to follow code. Specs must be self-consistent and match code. | ~~D2-6~~ | ~~SidecarRoundtrip invariant~~ | ~~media.allium:198~~ | **Resolved:** 2 tests added — full roundtrip (write sidecar, parse via `Sidecar.parse_document/1`, assert all fields match DB) + nil conditional fields absent from parsed sidecar | | ~~D2-7~~ | ~~ConditionalPostFields: nil fields absent from frontmatter~~ | frontmatter.allium:398 | **Resolved:** test added — post with nil excerpt/author/language → those fields absent from published file, 3 refute assertions | | ~~D2-8~~ | ~~ConditionalMediaFields: nil fields absent from sidecar~~ | frontmatter.allium:417 | **Resolved:** added width/height assertions to nil-fields-absent test | -| D2-9 | max_posts_per_page 1..500 constraint | metadata.allium:75-77 | Write test: values outside range rejected | +| D2-9 | ~~max_posts_per_page 1..500 constraint~~ | metadata.allium:75-77 | **Resolved:** 5 tests added (0→1, -5→1, 1000→500, nil→50, non-numeric→50) | | D2-10 | SandboxedExecution: restricted capabilities blocked | script.allium:84-88 | Write test: filesystem/process/package loading blocked | | D2-11 | TransformToastBudget enforcement | script.allium:251-258 | Write test: per-script and total toast limits enforced | | D2-12 | ProgressThrottled: 250ms throttle | task.allium:110-113 | Write test: rapid progress reports throttled | diff --git a/test/bds/metadata_test.exs b/test/bds/metadata_test.exs index d7019ae..4dbcadf 100644 --- a/test/bds/metadata_test.exs +++ b/test/bds/metadata_test.exs @@ -307,6 +307,41 @@ defmodule BDS.MetadataTest do assert metadata.categories == metadata_before.categories end + test "max_posts_per_page 0 is clamped to 1", %{project: project} do + assert {:ok, metadata} = + BDS.Metadata.update_project_metadata(project.id, %{max_posts_per_page: 0}) + + assert metadata.max_posts_per_page == 1 + end + + test "max_posts_per_page negative is clamped to 1", %{project: project} do + assert {:ok, metadata} = + BDS.Metadata.update_project_metadata(project.id, %{max_posts_per_page: -5}) + + assert metadata.max_posts_per_page == 1 + end + + test "max_posts_per_page above 500 is clamped to 500", %{project: project} do + assert {:ok, metadata} = + BDS.Metadata.update_project_metadata(project.id, %{max_posts_per_page: 1000}) + + assert metadata.max_posts_per_page == 500 + end + + test "max_posts_per_page nil defaults to 50", %{project: project} do + assert {:ok, metadata} = + BDS.Metadata.update_project_metadata(project.id, %{max_posts_per_page: nil}) + + assert metadata.max_posts_per_page == 50 + end + + test "max_posts_per_page non-numeric string defaults to 50", %{project: project} do + assert {:ok, metadata} = + BDS.Metadata.update_project_metadata(project.id, %{max_posts_per_page: "abc"}) + + assert metadata.max_posts_per_page == 50 + end + test "sync_project_metadata_from_filesystem materializes the canonical metadata files when missing", %{project: project, temp_dir: temp_dir} do meta_dir = Path.join(temp_dir, "meta")