diff --git a/lib/pleroma/web/admin_api/controllers/user_controller.ex b/lib/pleroma/web/admin_api/controllers/user_controller.ex index 82ac4bd9d..ab8bf73ee 100644 --- a/lib/pleroma/web/admin_api/controllers/user_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/user_controller.ex @@ -250,7 +250,10 @@ defmodule Pleroma.Web.AdminAPI.UserController do |> render("create_errors.json", changesets: changesets) {: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 diff --git a/test/pleroma/web/admin_api/controllers/user_controller_test.exs b/test/pleroma/web/admin_api/controllers/user_controller_test.exs index 7e05d67b7..764f5e01f 100644 --- a/test/pleroma/web/admin_api/controllers/user_controller_test.exs +++ b/test/pleroma/web/admin_api/controllers/user_controller_test.exs @@ -240,6 +240,21 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do end 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], create_token: fn user -> if user.nickname == "lain2" do @@ -250,23 +265,17 @@ defmodule Pleroma.Web.AdminAPI.UserControllerTest do result end end do - assert_error_sent(500, fn -> - conn - |> put_req_header("accept", "application/json") - |> 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) + conn = request.(conn) + + assert json_response(conn, 500) == %{"error" => "Something went wrong"} end assert_received {:token_created, "lain"} refute User.get_by_nickname("lain") refute User.get_by_nickname("lain2") assert Repo.aggregate(Pleroma.PasswordResetToken, :count) == 0 + + assert [_account1, _account2] = conn |> request.() |> json_response(200) end test "Password reset links are not cached by idempotency key", %{conn: conn} do