defmodule BirdyChatWeb.Api.MessagesTest do use BirdyChatWeb.ConnCase, async: true import Phoenix.ChannelTest setup %{conn: conn} do url = ~p"/api/messages" path = Application.app_dir(:birdy_chat, ["priv", "messages", "test1-user.txt"]) on_exit(fn -> File.rm(path) end) conn = conn |> put_req_header("content-type", "application/json") %{conn: conn, url: url} end describe "POST /api/messages to other server" do setup do server_id = "test2" token = Phoenix.Token.sign(BirdyChatWeb.Endpoint, "serverAuth", server_id) {:ok, _, socket} = BirdyChatWeb.ServerSocket |> socket("server_socket", %{server_id: server_id}) |> subscribe_and_join(BirdyChatWeb.ServerChannel, "server:#{server_id}", %{token: token}) %{socket: socket} end test "returns error when a peer is unknown", %{conn: conn, url: url} do message = %{from: "test1-user", to: "fake-user", message: "123"} payload = Jason.encode!(message) conn = post(conn, url, payload) assert result = json_response(conn, :unprocessable_entity) expected_result = %{"errors" => %{"to" => ["Unknown 'to' server"]}} assert result == expected_result end test "broadcasts message to websocket", %{conn: conn, url: url} do message = %{from: "test1-user", to: "test2-user", message: "123"} string_message = %{"from" => "test1-user", "message" => "123", "to" => "test2-user"} payload = Jason.encode!(message) conn = post(conn, url, payload) assert result = json_response(conn, :created) assert result == string_message assert_broadcast "new_message", {:binary, encoded_message} assert :erlang.binary_to_term(encoded_message, [:safe]) == message end end describe "POST /api/messages" do test "returns errors for invalid message", %{conn: conn, url: url} do payload = Jason.encode!(%{}) conn = post(conn, url, payload) assert result = json_response(conn, :unprocessable_entity) expected_result = %{ "errors" => %{ "from" => ["can't be blank"], "message" => ["can't be blank"], "to" => ["can't be blank"] } } assert result == expected_result end test "returns message and 201 when successful", %{conn: conn, url: url} do message = %{"from" => "test2-user", "to" => "test1-user", "message" => "123"} payload = Jason.encode!(message) conn = post(conn, url, payload) assert result = json_response(conn, :created) assert result == message end test "writes message to file", %{conn: conn, url: url} do message = %{"from" => "test2-user", "to" => "test1-user", "message" => "123"} payload = Jason.encode!(message) conn = post(conn, url, payload) assert result = json_response(conn, :created) assert result == message path = Application.app_dir(:birdy_chat, ["priv", "messages", "test1-user.txt"]) contents = File.read!(path) assert contents == "test2-user: 123\n" end test "appends message to file", %{conn: conn, url: url} do message = %{"from" => "test2-user", "to" => "test1-user", "message" => "123"} payload = Jason.encode!(message) post(conn, url, payload) message = %{"from" => "test2-user", "to" => "test1-user", "message" => "456"} payload = Jason.encode!(message) conn = post(conn, url, payload) assert json_response(conn, :created) path = Application.app_dir(:birdy_chat, ["priv", "messages", "test1-user.txt"]) contents = File.read!(path) assert contents == "test2-user: 123\ntest2-user: 456\n" end end end