fix(admin-api): structure reset token failures

This commit is contained in:
Lain Soykaf 2026-07-24 23:24:52 +04:00
commit bb4826d8ae
No known key found for this signature in database
2 changed files with 24 additions and 12 deletions

View file

@ -250,7 +250,10 @@ defmodule Pleroma.Web.AdminAPI.UserController do
|> render("create_errors.json", changesets: changesets) |> render("create_errors.json", changesets: changesets)
{:error, {:password_reset_token, _}, _reason, _} -> {:error, {:password_reset_token, _}, _reason, _} ->
raise "Failed to create password reset token" Pleroma.Web.AdminAPI.FallbackController.call(
conn,
{:password_reset_token_error, :creation_failed}
)
end end
end end

View file

@ -240,6 +240,21 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do
end end
test "Password reset token failures roll back the user batch", %{conn: conn} do test "Password reset token failures roll back the user batch", %{conn: conn} do
idempotency_key = Ecto.UUID.generate()
request = fn conn ->
conn
|> put_req_header("accept", "application/json")
|> put_req_header("content-type", "application/json")
|> put_req_header("idempotency-key", idempotency_key)
|> post("/api/pleroma/admin/users", %{
"users" => [
%{"nickname" => "lain", "email" => "lain@example.org"},
%{"nickname" => "lain2", "email" => "lain2@example.org"}
]
})
end
with_mock Pleroma.PasswordResetToken, [:passthrough], with_mock Pleroma.PasswordResetToken, [:passthrough],
create_token: fn user -> create_token: fn user ->
if user.nickname == "lain2" do if user.nickname == "lain2" do
@ -250,23 +265,17 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do
result result
end end
end do end do
assert_error_sent(500, fn -> conn = request.(conn)
conn
|> put_req_header("accept", "application/json") assert json_response(conn, 500) == %{"error" => "Something went wrong"}
|> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/users", %{
"users" => [
%{"nickname" => "lain", "email" => "lain@example.org"},
%{"nickname" => "lain2", "email" => "lain2@example.org"}
]
})
end)
end end
assert_received {:token_created, "lain"} assert_received {:token_created, "lain"}
refute User.get_by_nickname("lain") refute User.get_by_nickname("lain")
refute User.get_by_nickname("lain2") refute User.get_by_nickname("lain2")
assert Repo.aggregate(Pleroma.PasswordResetToken, :count) == 0 assert Repo.aggregate(Pleroma.PasswordResetToken, :count) == 0
assert [_account1, _account2] = conn |> request.() |> json_response(200)
end end
test "Password reset links are not cached by idempotency key", %{conn: conn} do test "Password reset links are not cached by idempotency key", %{conn: conn} do