fix: working on rebuild from filesystem and analysis warnings

This commit is contained in:
2026-04-25 11:18:30 +02:00
parent 59be6c213e
commit 5ecd90ae65
18 changed files with 307 additions and 55 deletions

View File

@@ -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