fix: working on rebuild from filesystem and analysis warnings
This commit is contained in:
@@ -121,6 +121,8 @@ defmodule BDS.DesktopTest do
|
||||
end
|
||||
|
||||
test "desktop router exposes live task status for shell polling" do
|
||||
:ok = BDS.Tasks.clear_finished()
|
||||
|
||||
assert {:ok, task} =
|
||||
BDS.Tasks.register_external_task("preview build", %{
|
||||
group_id: "generation",
|
||||
@@ -129,6 +131,7 @@ defmodule BDS.DesktopTest do
|
||||
|
||||
on_exit(fn ->
|
||||
_ = BDS.Tasks.complete_task(task.id)
|
||||
_ = BDS.Tasks.clear_finished()
|
||||
end)
|
||||
|
||||
assert :ok = BDS.Tasks.report_progress(task.id, 0.5, "halfway")
|
||||
@@ -149,6 +152,39 @@ defmodule BDS.DesktopTest do
|
||||
end)
|
||||
end
|
||||
|
||||
test "desktop router encodes failed task snapshots even when the task error is a tuple" do
|
||||
:ok = BDS.Tasks.clear_finished()
|
||||
|
||||
assert {:ok, task} =
|
||||
BDS.Tasks.submit_task(
|
||||
"broken rebuild",
|
||||
fn _report ->
|
||||
{:error, {{:badkey, "slug"}, [{BDS.Posts, :upsert_post_from_file, 3, [line: 644]}]}}
|
||||
end,
|
||||
%{group_id: "maintenance", group_name: "Maintenance"}
|
||||
)
|
||||
|
||||
on_exit(fn ->
|
||||
_ = BDS.Tasks.clear_finished()
|
||||
end)
|
||||
|
||||
failed = wait_for_task(task.id, &(&1.status == :failed and &1.error != nil))
|
||||
|
||||
conn = conn(:get, "/api/tasks?k=#{Desktop.Auth.login_key()}")
|
||||
conn = BDS.Desktop.Router.call(conn, BDS.Desktop.Router.init([]))
|
||||
|
||||
assert conn.status == 200
|
||||
payload = Jason.decode!(conn.resp_body)
|
||||
|
||||
assert Enum.any?(payload["tasks"], fn item ->
|
||||
item["id"] == failed.id and item["status"] == "failed" and is_binary(item["error"])
|
||||
end)
|
||||
|
||||
assert Enum.any?(payload["tasks"], fn item ->
|
||||
item["id"] == failed.id and String.contains?(item["error"], "badkey")
|
||||
end)
|
||||
end
|
||||
|
||||
test "desktop router exposes projects for shell project selection and creation" do
|
||||
:ok = Ecto.Adapters.SQL.Sandbox.checkout(BDS.Repo)
|
||||
BDS.Repo.delete_all(BDS.Projects.Project)
|
||||
@@ -281,4 +317,21 @@ defmodule BDS.DesktopTest do
|
||||
|> Enum.flat_map(& &1.items)
|
||||
|> Enum.find(&Map.get(&1, :id) == id)
|
||||
end
|
||||
|
||||
defp wait_for_task(task_id, matcher, timeout \\ 2_000)
|
||||
|
||||
defp wait_for_task(task_id, _matcher, timeout) when timeout <= 0 do
|
||||
BDS.Tasks.get_task(task_id)
|
||||
end
|
||||
|
||||
defp wait_for_task(task_id, matcher, timeout) do
|
||||
task = BDS.Tasks.get_task(task_id)
|
||||
|
||||
if task && matcher.(task) do
|
||||
task
|
||||
else
|
||||
Process.sleep(50)
|
||||
wait_for_task(task_id, matcher, timeout - 50)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -313,6 +313,77 @@ defmodule BDS.PostsTest do
|
||||
assert post.content == nil
|
||||
end
|
||||
|
||||
test "rebuild_posts_from_files imports legacy old-app translation files alongside canonical posts" do
|
||||
temp_dir =
|
||||
Path.join(System.tmp_dir!(), "bds-post-rebuild-legacy-#{System.unique_integer([:positive])}")
|
||||
|
||||
File.mkdir_p!(temp_dir)
|
||||
on_exit(fn -> File.rm_rf(temp_dir) end)
|
||||
|
||||
assert {:ok, project} =
|
||||
BDS.Projects.create_project(%{name: "Legacy Rebuild", data_path: temp_dir})
|
||||
|
||||
posts_dir = Path.join([BDS.Projects.project_data_dir(project), "posts", "2026", "04"])
|
||||
File.mkdir_p!(posts_dir)
|
||||
|
||||
File.write!(
|
||||
Path.join(posts_dir, "chimera.md"),
|
||||
[
|
||||
"---",
|
||||
"id: post-from-old-app",
|
||||
"title: Chimera Source",
|
||||
"slug: chimera",
|
||||
"status: published",
|
||||
"language: de",
|
||||
"createdAt: 2024-03-30T21:20:00.000Z",
|
||||
"updatedAt: 2024-03-31T21:20:00.000Z",
|
||||
"publishedAt: 2024-04-01T21:20:00.000Z",
|
||||
"---",
|
||||
"Quelle",
|
||||
""
|
||||
]
|
||||
|> Enum.join("\n")
|
||||
)
|
||||
|
||||
File.write!(
|
||||
Path.join(posts_dir, "chimera.en.md"),
|
||||
[
|
||||
"---",
|
||||
"id: translation-from-old-app",
|
||||
"translationFor: post-from-old-app",
|
||||
"language: en",
|
||||
"title: Chimera",
|
||||
"excerpt: Imported translation",
|
||||
"---",
|
||||
"Translated body",
|
||||
""
|
||||
]
|
||||
|> Enum.join("\n")
|
||||
)
|
||||
|
||||
assert {:ok, posts} = BDS.Posts.rebuild_posts_from_files(project.id)
|
||||
assert length(posts) == 1
|
||||
|
||||
[post] = posts
|
||||
assert post.id == "post-from-old-app"
|
||||
assert post.slug == "chimera"
|
||||
assert post.language == "de"
|
||||
|
||||
assert {:ok, translations} = BDS.Posts.list_post_translations(post.id)
|
||||
assert length(translations) == 1
|
||||
|
||||
[translation] = translations
|
||||
assert translation.id == "translation-from-old-app"
|
||||
assert translation.translation_for == post.id
|
||||
assert translation.project_id == project.id
|
||||
assert translation.language == "en"
|
||||
assert translation.title == "Chimera"
|
||||
assert translation.excerpt == "Imported translation"
|
||||
assert translation.status == :published
|
||||
assert translation.file_path == "posts/2026/04/chimera.en.md"
|
||||
assert translation.content == nil
|
||||
end
|
||||
|
||||
defp errors_on(changeset) do
|
||||
Ecto.Changeset.traverse_errors(changeset, fn {message, opts} ->
|
||||
Regex.replace(~r"%{(\w+)}", message, fn _, key ->
|
||||
|
||||
Reference in New Issue
Block a user