who_need_help/test/who_need_help/release_test.exs

119 lines
3.9 KiB
Elixir

defmodule WhoNeedHelp.ReleaseTest do
use WhoNeedHelp.DataCase, async: false
import Ecto.Query
import WhoNeedHelp.AccountsFixtures
alias WhoNeedHelp.Accounts
alias WhoNeedHelp.Activities.{Activity, Participant}
alias WhoNeedHelp.Catalog
alias WhoNeedHelp.Help.{Assignment, HelpRequest}
alias WhoNeedHelp.Release
alias WhoNeedHelp.Repo
setup do
Catalog.seed_defaults()
reviewer = user_fixture(display_name: "Play reviewer") |> set_password()
counterpart = user_fixture(display_name: "Play counterpart") |> set_password()
%{reviewer: reviewer, counterpart: counterpart}
end
test "checks reviewer readiness without creating review records", %{
reviewer: reviewer,
counterpart: counterpart
} do
before_counts = review_record_counts()
assert {:ok, readiness} =
Release.play_review_readiness(reviewer.email, counterpart.email)
assert readiness.reviewer.id == reviewer.id
assert readiness.counterpart.id == counterpart.id
assert readiness.medicine_category.slug == "medicine-pickup"
assert readiness.cinema_category.slug == "cinema-meetup"
assert review_record_counts() == before_counts
end
test "prepares stable non-staff reviewer records idempotently", %{
reviewer: reviewer,
counterpart: counterpart
} do
assert {:ok, first} = Release.prepare_play_review(reviewer.email, counterpart.email)
assert {:ok, second} = Release.prepare_play_review(reviewer.email, counterpart.email)
assert first == second
assert first.request_path == "/requests/#{first.request_id}"
assert first.activity_path == "/activities/#{first.activity_id}"
assert Accounts.staff_roles(reviewer) == []
assert Accounts.staff_roles(counterpart) == []
assert %HelpRequest{status: :matched, requester_id: reviewer_id} =
Repo.get!(HelpRequest, first.request_id)
assert reviewer_id == reviewer.id
assert %Assignment{helper_id: counterpart_id, active: true} =
Repo.get_by!(Assignment, request_id: first.request_id)
assert counterpart_id == counterpart.id
assert %Activity{status: :open, creator_id: ^reviewer_id} =
Repo.get!(Activity, first.activity_id)
assert %Participant{status: :approved, user_id: ^counterpart_id} =
Repo.get_by!(Participant,
activity_id: first.activity_id,
user_id: counterpart.id
)
assert Repo.aggregate(
from(request in HelpRequest,
where:
request.requester_id == ^reviewer.id and
request.title == "Play review — medicine pickup"
),
:count
) == 1
assert Repo.aggregate(
from(activity in Activity,
where:
activity.creator_id == ^reviewer.id and
activity.title == "Play review — public cinema meetup"
),
:count
) == 1
end
test "rejects an account without a reusable password", %{
reviewer: reviewer,
counterpart: counterpart
} do
passwordless = user_fixture(display_name: "Passwordless reviewer")
assert {:error, {:reviewer, :password_not_set}} =
Release.prepare_play_review(passwordless.email, counterpart.email)
assert {:error, :accounts_must_be_distinct} =
Release.prepare_play_review(reviewer.email, reviewer.email)
end
test "rejects staff accounts", %{counterpart: counterpart} do
staff = staff_user_fixture([:support], display_name: "Staff reviewer") |> set_password()
assert {:error, {:reviewer, :staff_account_forbidden}} =
Release.prepare_play_review(staff.email, counterpart.email)
end
defp review_record_counts do
%{
requests: Repo.aggregate(HelpRequest, :count),
assignments: Repo.aggregate(Assignment, :count),
activities: Repo.aggregate(Activity, :count),
participants: Repo.aggregate(Participant, :count)
}
end
end