diff --git a/lib/philomena/users.ex b/lib/philomena/users.ex index 2bc52e5e..172b265c 100644 --- a/lib/philomena/users.ex +++ b/lib/philomena/users.ex @@ -796,7 +796,7 @@ defmodule Philomena.Users do end @doc """ - Reactivates a previously deactivated user account. + Reactivates a previously deactivated user account. Removes all "reactivate" user tokens for that user if they exist. ## Examples @@ -805,6 +805,8 @@ defmodule Philomena.Users do """ def reactivate_user(%User{} = user) do + UserToken.user_and_contexts_query(user, ["reactivate"]) |> Repo.delete_all() + user |> User.reactivate_changeset() |> Repo.update() diff --git a/test/philomena_web/controllers/reactivation_controller_test.exs b/test/philomena_web/controllers/reactivation_controller_test.exs index 3c211902..7717d476 100644 --- a/test/philomena_web/controllers/reactivation_controller_test.exs +++ b/test/philomena_web/controllers/reactivation_controller_test.exs @@ -1,16 +1,20 @@ defmodule PhilomenaWeb.ReactivationControllerTest do use PhilomenaWeb.ConnCase, async: true + alias Philomena.Repo + alias Philomena.Users.UserToken alias Philomena.Users + import Philomena.UsersFixtures - setup :register_and_log_in_user + setup do + %{user: deactivated_user_fixture()} + end @host PhilomenaWeb.Endpoint.config(:url)[:host] @port PhilomenaWeb.Endpoint.config(:http)[:port] describe "GET /reactivations/:id" do test "renders the reactivate account page", %{conn: conn} do - conn = delete(conn, ~p"/deactivations") conn = get(conn, ~p"/reactivations/pinkie-pie-is-best-pony") response = html_response(conn, 200) assert response =~ "

Reactivate Your Account

" @@ -19,11 +23,11 @@ defmodule PhilomenaWeb.ReactivationControllerTest do describe "POST /reactivations/" do test "reactivate account page works", %{conn: conn, user: user} do - conn = delete(conn, ~p"/deactivations") - {:ok, email} = Users.deliver_user_reactivation_instructions(user, &url(~p"/reactivations/#{&1}")) + assert UserToken.user_and_contexts_query(user, ["reactivate"]) |> Repo.exists?() + {token, url} = extract_reactivation_link_from_email(email) assert token != nil @@ -34,6 +38,8 @@ defmodule PhilomenaWeb.ReactivationControllerTest do user = Users.get_user!(user.id) assert user.deleted_by_user_id == nil + + assert not(UserToken.user_and_contexts_query(user, ["reactivate"]) |> Repo.exists?()) end end diff --git a/test/support/fixtures/users_fixtures.ex b/test/support/fixtures/users_fixtures.ex index 76a2ff91..801e5faf 100644 --- a/test/support/fixtures/users_fixtures.ex +++ b/test/support/fixtures/users_fixtures.ex @@ -37,6 +37,19 @@ defmodule Philomena.UsersFixtures do |> Repo.update!() end + @doc """ + Fixture for a deactivated user. + + If `deactivated_by_user` is `nil` the user will be deactivated by themselves. + """ + def deactivated_user_fixture(deactived_by_user \\ nil, attrs \\ %{}) do + user = user_fixture(attrs) + + user + |> Users.User.deactivate_changeset(deactived_by_user || user) + |> Repo.update!() + end + def extract_user_token(fun) do {:ok, captured} = fun.(&"[TOKEN]#{&1}[TOKEN]") [_, token, _] = String.split(captured.text_body, "[TOKEN]")