119 lines
3.9 KiB
Elixir
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
|