defmodule Rsh26poolWeb.RoomControllerTest do use Rsh26poolWeb.ConnCase, async: true alias Rsh26pool.Voting defp valid_room_params(overrides \\ %{}) do Map.merge( %{ "name" => "テストルーム", "votes_per_user" => "3", "grouping_mode" => "false", "leader_threshold" => "2", "closes_at_local" => "" }, overrides ) end describe "POST /create" do test "valid params redirect to the manage page and log in the owner", %{conn: conn} do conn = post(conn, ~p"/create", room: valid_room_params(%{"name" => "作成テスト"})) path = redirected_to(conn) assert "/manage/" <> number = path assert number =~ ~r/^\d{6}$/ token = get_session(conn, "participant_token") assert token owner = Voting.get_participant_by_token(token) assert owner.role == "owner" assert owner.room.room_number == number assert owner.room.name == "作成テスト" end test "invalid params re-render the form with a Japanese error and no login", %{conn: conn} do conn = post(conn, ~p"/create", room: valid_room_params(%{"name" => ""})) assert html_response(conn, 200) assert Phoenix.Flash.get(conn.assigns.flash, :error) =~ "ルームを作成できませんでした" assert get_session(conn, "participant_token") == nil end end describe "POST /enter" do test "a valid room number and name redirect to the vote page and log in", %{conn: conn} do {:ok, %{room: room}} = Voting.create_room(valid_room_params(%{"name" => "参加先"})) conn = post(conn, ~p"/enter", enter: %{"room_number" => room.room_number, "name" => "花子"}) assert redirected_to(conn) == ~p"/vote/#{room.room_number}" token = get_session(conn, "participant_token") assert token participant = Voting.get_participant_by_token(token) assert participant.name == "花子" assert participant.role == "member" assert participant.room.id == room.id end test "an unknown room number stays on the page with a not-found flash", %{conn: conn} do conn = post(conn, ~p"/enter", enter: %{"room_number" => "000000", "name" => "花子"}) assert html_response(conn, 200) assert Phoenix.Flash.get(conn.assigns.flash, :error) =~ "見つかりません" assert get_session(conn, "participant_token") == nil end test "blank fields stay on the page with a validation flash", %{conn: conn} do conn = post(conn, ~p"/enter", enter: %{"room_number" => "", "name" => ""}) assert html_response(conn, 200) assert Phoenix.Flash.get(conn.assigns.flash, :error) =~ "ルーム番号と名前を入力してください" assert get_session(conn, "participant_token") == nil end end describe "DELETE /logout" do test "clears the session token and redirects home", %{conn: conn} do {:ok, %{owner: owner}} = Voting.create_room(valid_room_params()) conn = conn |> Plug.Test.init_test_session(%{"participant_token" => owner.token}) |> delete(~p"/logout") assert redirected_to(conn) == ~p"/" assert get_session(conn, "participant_token") == nil end end end