D2-1: add RemoveCategory tests covering state/files/DB cleanup and no-op for non-existent

This commit is contained in:
2026-05-30 14:44:20 +02:00
parent 08eb9e4ea1
commit 544ff65e3b
2 changed files with 66 additions and 1 deletions

View File

@@ -138,7 +138,7 @@ All reconciled to follow code. Specs must be self-consistent and match code.
| ID | Claim | Spec | Path |
|---|---|---|---|
| D2-1 | RemoveCategory rule | metadata.allium:100 | Write test: remove category, verify list+settings+JSON updated |
| ~~D2-1~~ | ~~RemoveCategory rule~~ | ~~metadata.allium:100~~ | **Resolved:** 2 tests added in metadata_test.exs — remove_category removes category+settings from state/files/DB (6 assertions); remove_category is a no-op for non-existent category |
| D2-2 | CreateAndPublishTemplate rule | template.allium:105 | Write test: create+publish in one step |
| D2-3 | CreateAndPublishScript rule | script.allium:160 | Write test: create+publish in one step |
| D2-4 | UniqueScriptSlug dedup | script.allium:115 | Write test: two scripts same title → dedup slug |

View File

@@ -242,6 +242,71 @@ defmodule BDS.MetadataTest do
assert File.exists?(BDS.Embeddings.index_path(project.id))
end
test "remove_category removes the category and its settings from state, files, and DB", %{
project: project,
temp_dir: temp_dir
} do
# Add a category + settings first
assert {:ok, metadata} = BDS.Metadata.add_category(project.id, "news")
assert "news" in metadata.categories
assert {:ok, _metadata} =
BDS.Metadata.update_category_settings(project.id, "news", %{
render_in_lists: false,
show_title: true,
post_template_slug: "article"
})
# Remove the category
assert {:ok, updated} = BDS.Metadata.remove_category(project.id, "news")
# 1. Category removed from in-memory list
refute "news" in updated.categories
assert "article" in updated.categories
assert "aside" in updated.categories
assert "page" in updated.categories
assert "picture" in updated.categories
# 2. Category settings removed from in-memory map
refute Map.has_key?(updated.category_settings, "news")
# 3. Verify via get_project_metadata
assert {:ok, loaded} = BDS.Metadata.get_project_metadata(project.id)
refute "news" in loaded.categories
refute Map.has_key?(loaded.category_settings, "news")
# 4. meta/categories.json rewritten without the removed category
categories_path = Path.join([temp_dir, "meta", "categories.json"])
assert ["article", "aside", "page", "picture"] =
Jason.decode!(File.read!(categories_path))
# 5. meta/category-meta.json rewritten without the removed category's settings
category_meta_path = Path.join([temp_dir, "meta", "category-meta.json"])
category_meta = Jason.decode!(File.read!(category_meta_path))
refute Map.has_key?(category_meta, "news")
# 6. DB settings updated
cat_setting =
BDS.Repo.get(BDS.Settings.Setting, "project:#{project.id}:categories")
assert cat_setting != nil
refute "news" in (cat_setting.value |> Jason.decode!() |> Map.get("categories", []))
meta_setting =
BDS.Repo.get(BDS.Settings.Setting, "project:#{project.id}:category_meta")
assert meta_setting != nil
meta_categories = meta_setting.value |> Jason.decode!() |> Map.get("categories", %{})
refute Map.has_key?(meta_categories, "news")
end
test "remove_category is a no-op for non-existent category", %{
project: project
} do
{:ok, metadata_before} = BDS.Metadata.get_project_metadata(project.id)
assert {:ok, metadata} = BDS.Metadata.remove_category(project.id, "nonexistent")
assert metadata.categories == metadata_before.categories
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")