refactor: move pure post-editor logic to BDS.UI.PostEditor for TUI reuse (issue #26, phase 3)

This commit is contained in:
2026-07-14 19:41:43 +02:00
parent 16f45d77b2
commit 3a8fafd2fd
9 changed files with 198 additions and 264 deletions

View File

@@ -0,0 +1,64 @@
defmodule BDS.UI.PostEditorTest do
use ExUnit.Case, async: false
alias BDS.UI.PostEditor.{Draft, Metadata, Persistence}
setup do
:ok = Ecto.Adapters.SQL.Sandbox.checkout(BDS.Repo)
temp_dir = Path.join(System.tmp_dir!(), "bds-ui-pe-#{System.unique_integer([:positive])}")
File.mkdir_p!(temp_dir)
on_exit(fn -> File.rm_rf(temp_dir) end)
{:ok, project} = BDS.Projects.create_project(%{name: "UI PostEditor", data_path: temp_dir})
{:ok, post} =
BDS.Posts.create_post(%{
project_id: project.id,
title: "First Post",
content: "hello world",
tags: ["elixir"],
language: "en"
})
%{project: project, post: post}
end
test "persisted_form builds the canonical draft", %{post: post} do
metadata = Metadata.project_metadata(post.project_id)
form = Draft.persisted_form(post, metadata, "en")
assert form["title"] == "First Post"
assert form["content"] == "hello world"
assert form["tags"] == "elixir"
assert form["language"] == "en"
end
test "persist saves an edited draft and publish publishes it", %{post: post} do
metadata = Metadata.project_metadata(post.project_id)
form = Draft.persisted_form(post, metadata, "en")
draft = %{form | "title" => "Renamed Post", "content" => "updated body"}
assert {:ok, saved} = Persistence.persist(post, draft, "en", metadata, :save)
assert saved.title == "Renamed Post"
assert saved.status == :draft
form = Draft.persisted_form(saved, metadata, "en")
assert {:ok, published} = Persistence.persist(saved, form, "en", metadata, :publish)
assert published.status == :published
assert published.file_path != ""
end
test "discard on an unpublished draft is a no-op success", %{post: post} do
metadata = Metadata.project_metadata(post.project_id)
assert {:ok, _post} = Persistence.discard(post, "en", metadata)
end
test "normalize_params keeps the active language on same-language edits" do
params = %{"title" => "T", "language" => "DE "}
assert Draft.normalize_params(params, "de", "de")["language"] == "de"
assert Draft.normalize_params(params, "de", "fr")["language"] == "fr"
end
end