diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/integration/mastodon_websocket_test.exs | 100 | ||||
| -rw-r--r-- | test/support/websocket_client.ex | 58 | ||||
| -rw-r--r-- | test/web/mastodon_api/mastodon_api_controller_test.exs | 14 | ||||
| -rw-r--r-- | test/web/mastodon_api/mastodon_socket_test.exs | 31 | ||||
| -rw-r--r-- | test/web/web_finger/web_finger_controller_test.exs | 15 | 
5 files changed, 182 insertions, 36 deletions
| diff --git a/test/integration/mastodon_websocket_test.exs b/test/integration/mastodon_websocket_test.exs new file mode 100644 index 000000000..b5f3d3a47 --- /dev/null +++ b/test/integration/mastodon_websocket_test.exs @@ -0,0 +1,100 @@ +defmodule Pleroma.Integration.MastodonWebsocketTest do +  use Pleroma.DataCase + +  import Pleroma.Factory + +  alias Pleroma.Web.CommonAPI +  alias Pleroma.Web.OAuth +  alias Pleroma.Integration.WebsocketClient +  alias Pleroma.Web.Streamer + +  @path Pleroma.Web.Endpoint.url() +        |> URI.parse() +        |> Map.put(:scheme, "ws") +        |> Map.put(:path, "/api/v1/streaming") +        |> URI.to_string() + +  setup do +    GenServer.start(Streamer, %{}, name: Streamer) + +    on_exit(fn -> +      if pid = Process.whereis(Streamer) do +        Process.exit(pid, :kill) +      end +    end) +  end + +  def start_socket(qs \\ nil, headers \\ []) do +    path = +      case qs do +        nil -> @path +        qs -> @path <> qs +      end + +    WebsocketClient.start_link(self(), path, headers) +  end + +  test "refuses invalid requests" do +    assert {:error, {400, _}} = start_socket() +    assert {:error, {404, _}} = start_socket("?stream=ncjdk") +  end + +  test "requires authentication and a valid token for protected streams" do +    assert {:error, {403, _}} = start_socket("?stream=user&access_token=aaaaaaaaaaaa") +    assert {:error, {403, _}} = start_socket("?stream=user") +  end + +  test "allows public streams without authentication" do +    assert {:ok, _} = start_socket("?stream=public") +    assert {:ok, _} = start_socket("?stream=public:local") +    assert {:ok, _} = start_socket("?stream=hashtag&tag=lain") +  end + +  test "receives well formatted events" do +    user = insert(:user) +    {:ok, _} = start_socket("?stream=public") +    {:ok, activity} = CommonAPI.post(user, %{"status" => "nice echo chamber"}) + +    assert_receive {:text, raw_json}, 1_000 +    assert {:ok, json} = Jason.decode(raw_json) + +    assert "update" == json["event"] +    assert json["payload"] +    assert {:ok, json} = Jason.decode(json["payload"]) + +    # Note: we remove the "statuses_count" from this result as it changes in the meantime + +    view_json = +      Pleroma.Web.MastodonAPI.StatusView.render("status.json", activity: activity, for: nil) +      |> Jason.encode!() +      |> Jason.decode!() +      |> put_in(["account", "statuses_count"], 0) + +    assert json == view_json +  end + +  describe "with a valid user token" do +    setup do +      {:ok, app} = +        Pleroma.Repo.insert( +          OAuth.App.register_changeset(%OAuth.App{}, %{ +            client_name: "client", +            scopes: "scope", +            redirect_uris: "url" +          }) +        ) + +      user = insert(:user) + +      {:ok, auth} = OAuth.Authorization.create_authorization(app, user) + +      {:ok, token} = OAuth.Token.exchange_token(app, auth) + +      %{user: user, token: token} +    end + +    test "accepts valid tokens", state do +      assert {:ok, _} = start_socket("?stream=user&access_token=#{state.token.token}") +    end +  end +end diff --git a/test/support/websocket_client.ex b/test/support/websocket_client.ex new file mode 100644 index 000000000..57e9bb17f --- /dev/null +++ b/test/support/websocket_client.ex @@ -0,0 +1,58 @@ +defmodule Pleroma.Integration.WebsocketClient do +  # https://github.com/phoenixframework/phoenix/blob/master/test/support/websocket_client.exs + +  @doc """ +  Starts the WebSocket server for given ws URL. Received Socket.Message's +  are forwarded to the sender pid +  """ +  def start_link(sender, url, headers \\ []) do +    :crypto.start() +    :ssl.start() + +    :websocket_client.start_link( +      String.to_charlist(url), +      __MODULE__, +      [sender], +      extra_headers: headers +    ) +  end + +  @doc """ +  Closes the socket +  """ +  def close(socket) do +    send(socket, :close) +  end + +  @doc """ +  Sends a low-level text message to the client. +  """ +  def send_text(server_pid, msg) do +    send(server_pid, {:text, msg}) +  end + +  @doc false +  def init([sender], _conn_state) do +    {:ok, %{sender: sender}} +  end + +  @doc false +  def websocket_handle(frame, _conn_state, state) do +    send(state.sender, frame) +    {:ok, state} +  end + +  @doc false +  def websocket_info({:text, msg}, _conn_state, state) do +    {:reply, {:text, msg}, state} +  end + +  def websocket_info(:close, _conn_state, _state) do +    {:close, <<>>, "done"} +  end + +  @doc false +  def websocket_terminate(_reason, _conn_state, _state) do +    :ok +  end +end diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs index e8275d4ab..aec0f851c 100644 --- a/test/web/mastodon_api/mastodon_api_controller_test.exs +++ b/test/web/mastodon_api/mastodon_api_controller_test.exs @@ -1415,4 +1415,18 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do      assert result["stats"]["user_count"] == 2      assert result["stats"]["status_count"] == 1    end + +  test "put settings", %{conn: conn} do +    user = insert(:user) + +    conn = +      conn +      |> assign(:user, user) +      |> put("/api/web/settings", %{"data" => %{"programming" => "socks"}}) + +    assert result = json_response(conn, 200) + +    user = User.get_cached_by_ap_id(user.ap_id) +    assert user.info.settings == %{"programming" => "socks"} +  end  end diff --git a/test/web/mastodon_api/mastodon_socket_test.exs b/test/web/mastodon_api/mastodon_socket_test.exs deleted file mode 100644 index 5d9b96861..000000000 --- a/test/web/mastodon_api/mastodon_socket_test.exs +++ /dev/null @@ -1,31 +0,0 @@ -defmodule Pleroma.Web.MastodonApi.MastodonSocketTest do -  use Pleroma.DataCase - -  alias Pleroma.Web.{Streamer, CommonAPI} - -  import Pleroma.Factory - -  test "public is working when non-authenticated" do -    user = insert(:user) - -    task = -      Task.async(fn -> -        assert_receive {:text, _}, 4_000 -      end) - -    fake_socket = %{ -      transport_pid: task.pid, -      assigns: %{} -    } - -    topics = %{ -      "public" => [fake_socket] -    } - -    {:ok, activity} = CommonAPI.post(user, %{"status" => "Test"}) - -    Streamer.push_to_socket(topics, "public", activity) - -    Task.await(task) -  end -end diff --git a/test/web/web_finger/web_finger_controller_test.exs b/test/web/web_finger/web_finger_controller_test.exs index cac003e76..844ff51d2 100644 --- a/test/web/web_finger/web_finger_controller_test.exs +++ b/test/web/web_finger/web_finger_controller_test.exs @@ -1,11 +1,7 @@  defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do    use Pleroma.Web.ConnCase -  alias Pleroma.User -  alias Pleroma.Web.WebFinger.WebFingerController -    import Pleroma.Factory -  import ExUnit.CaptureLog    import Tesla.Mock    setup do @@ -29,9 +25,18 @@ defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do      response =        build_conn() -      |> put_req_header("accept", "application/jrd+json") +      |> put_req_header("accept", "application/xrd+xml")        |> get("/.well-known/webfinger?resource=acct:#{user.nickname}@localhost")      assert response(response, 200)    end + +  test "Sends a 400 when resource param is missing" do +    response = +      build_conn() +      |> put_req_header("accept", "application/xrd+xml,application/jrd+json") +      |> get("/.well-known/webfinger") + +    assert response(response, 400) +  end  end | 
