From b7f27a4f584e54b13d0b7c1b288ad3e7bffcf95a Mon Sep 17 00:00:00 2001
From: Egor Kislitsyn <egor@kislitsyn.com>
Date: Mon, 30 Sep 2019 17:04:03 +0700
Subject: [PATCH] Extract report actions from `MastodonAPIController` to
 `ReportController`

Update MastodonAPI.ReportView
---
 .../controllers/mastodon_api_controller.ex         | 15 ----
 .../mastodon_api/controllers/report_controller.ex  | 16 ++++
 lib/pleroma/web/mastodon_api/views/report_view.ex  |  2 +-
 lib/pleroma/web/router.ex                          |  2 +-
 .../controllers/report_controller_test.exs         | 88 ++++++++++++++++++++++
 .../mastodon_api/mastodon_api_controller_test.exs  | 79 -------------------
 6 files changed, 106 insertions(+), 96 deletions(-)
 create mode 100644 lib/pleroma/web/mastodon_api/controllers/report_controller.ex
 create mode 100644 test/web/mastodon_api/controllers/report_controller_test.exs

diff --git a/lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
index 0878f7ba6..1ec699b6f 100644
--- a/lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
+++ b/lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex
@@ -31,7 +31,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
   alias Pleroma.Web.MastodonAPI.ListView
   alias Pleroma.Web.MastodonAPI.MastodonAPI
   alias Pleroma.Web.MastodonAPI.MastodonView
-  alias Pleroma.Web.MastodonAPI.ReportView
   alias Pleroma.Web.MastodonAPI.StatusView
   alias Pleroma.Web.MediaProxy
   alias Pleroma.Web.OAuth.App
@@ -946,20 +945,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     end
   end
 
-  def reports(%{assigns: %{user: user}} = conn, params) do
-    case CommonAPI.report(user, params) do
-      {:ok, activity} ->
-        conn
-        |> put_view(ReportView)
-        |> try_render("report.json", %{activity: activity})
-
-      {:error, err} ->
-        conn
-        |> put_status(:bad_request)
-        |> json(%{error: err})
-    end
-  end
-
   def account_register(
         %{assigns: %{app: app}} = conn,
         %{"username" => nickname, "email" => _, "password" => _, "agreement" => true} = params
diff --git a/lib/pleroma/web/mastodon_api/controllers/report_controller.ex b/lib/pleroma/web/mastodon_api/controllers/report_controller.ex
new file mode 100644
index 000000000..1c084b740
--- /dev/null
+++ b/lib/pleroma/web/mastodon_api/controllers/report_controller.ex
@@ -0,0 +1,16 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.MastodonAPI.ReportController do
+  use Pleroma.Web, :controller
+
+  action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
+
+  @doc "POST /api/v1/reports"
+  def create(%{assigns: %{user: user}} = conn, params) do
+    with {:ok, activity} <- Pleroma.Web.CommonAPI.report(user, params) do
+      render(conn, "show.json", activity: activity)
+    end
+  end
+end
diff --git a/lib/pleroma/web/mastodon_api/views/report_view.ex b/lib/pleroma/web/mastodon_api/views/report_view.ex
index a16e7ff10..9da2dd740 100644
--- a/lib/pleroma/web/mastodon_api/views/report_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/report_view.ex
@@ -5,7 +5,7 @@
 defmodule Pleroma.Web.MastodonAPI.ReportView do
   use Pleroma.Web, :view
 
-  def render("report.json", %{activity: activity}) do
+  def render("show.json", %{activity: activity}) do
     %{
       id: to_string(activity.id),
       action_taken: false
diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex
index 805bef16f..7bdc80fcc 100644
--- a/lib/pleroma/web/router.ex
+++ b/lib/pleroma/web/router.ex
@@ -396,7 +396,7 @@ defmodule Pleroma.Web.Router do
       get("/pleroma/mascot", MastodonAPIController, :get_mascot)
       put("/pleroma/mascot", MastodonAPIController, :set_mascot)
 
-      post("/reports", MastodonAPIController, :reports)
+      post("/reports", ReportController, :create)
     end
 
     scope [] do
diff --git a/test/web/mastodon_api/controllers/report_controller_test.exs b/test/web/mastodon_api/controllers/report_controller_test.exs
new file mode 100644
index 000000000..fcece40fb
--- /dev/null
+++ b/test/web/mastodon_api/controllers/report_controller_test.exs
@@ -0,0 +1,88 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do
+  use Pleroma.Web.ConnCase
+
+  alias Pleroma.Web.CommonAPI
+
+  import Pleroma.Factory
+
+  setup do
+    reporter = insert(:user)
+    target_user = insert(:user)
+
+    {:ok, activity} = CommonAPI.post(target_user, %{"status" => "foobar"})
+
+    [reporter: reporter, target_user: target_user, activity: activity]
+  end
+
+  test "submit a basic report", %{conn: conn, reporter: reporter, target_user: target_user} do
+    assert %{"action_taken" => false, "id" => _} =
+             conn
+             |> assign(:user, reporter)
+             |> post("/api/v1/reports", %{"account_id" => target_user.id})
+             |> json_response(200)
+  end
+
+  test "submit a report with statuses and comment", %{
+    conn: conn,
+    reporter: reporter,
+    target_user: target_user,
+    activity: activity
+  } do
+    assert %{"action_taken" => false, "id" => _} =
+             conn
+             |> assign(:user, reporter)
+             |> post("/api/v1/reports", %{
+               "account_id" => target_user.id,
+               "status_ids" => [activity.id],
+               "comment" => "bad status!",
+               "forward" => "false"
+             })
+             |> json_response(200)
+  end
+
+  test "account_id is required", %{
+    conn: conn,
+    reporter: reporter,
+    activity: activity
+  } do
+    assert %{"error" => "Valid `account_id` required"} =
+             conn
+             |> assign(:user, reporter)
+             |> post("/api/v1/reports", %{"status_ids" => [activity.id]})
+             |> json_response(400)
+  end
+
+  test "comment must be up to the size specified in the config", %{
+    conn: conn,
+    reporter: reporter,
+    target_user: target_user
+  } do
+    max_size = Pleroma.Config.get([:instance, :max_report_comment_size], 1000)
+    comment = String.pad_trailing("a", max_size + 1, "a")
+
+    error = %{"error" => "Comment must be up to #{max_size} characters"}
+
+    assert ^error =
+             conn
+             |> assign(:user, reporter)
+             |> post("/api/v1/reports", %{"account_id" => target_user.id, "comment" => comment})
+             |> json_response(400)
+  end
+
+  test "returns error when account is not exist", %{
+    conn: conn,
+    reporter: reporter,
+    activity: activity
+  } do
+    conn =
+      conn
+      |> assign(:user, reporter)
+      |> post("/api/v1/reports", %{"status_ids" => [activity.id], "account_id" => "foo"})
+
+    assert json_response(conn, 400) == %{"error" => "Account not found"}
+  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 b3acb7a22..d316a61c1 100644
--- a/test/web/mastodon_api/mastodon_api_controller_test.exs
+++ b/test/web/mastodon_api/mastodon_api_controller_test.exs
@@ -1380,85 +1380,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     end
   end
 
-  describe "reports" do
-    setup do
-      reporter = insert(:user)
-      target_user = insert(:user)
-
-      {:ok, activity} = CommonAPI.post(target_user, %{"status" => "foobar"})
-
-      [reporter: reporter, target_user: target_user, activity: activity]
-    end
-
-    test "submit a basic report", %{conn: conn, reporter: reporter, target_user: target_user} do
-      assert %{"action_taken" => false, "id" => _} =
-               conn
-               |> assign(:user, reporter)
-               |> post("/api/v1/reports", %{"account_id" => target_user.id})
-               |> json_response(200)
-    end
-
-    test "submit a report with statuses and comment", %{
-      conn: conn,
-      reporter: reporter,
-      target_user: target_user,
-      activity: activity
-    } do
-      assert %{"action_taken" => false, "id" => _} =
-               conn
-               |> assign(:user, reporter)
-               |> post("/api/v1/reports", %{
-                 "account_id" => target_user.id,
-                 "status_ids" => [activity.id],
-                 "comment" => "bad status!",
-                 "forward" => "false"
-               })
-               |> json_response(200)
-    end
-
-    test "account_id is required", %{
-      conn: conn,
-      reporter: reporter,
-      activity: activity
-    } do
-      assert %{"error" => "Valid `account_id` required"} =
-               conn
-               |> assign(:user, reporter)
-               |> post("/api/v1/reports", %{"status_ids" => [activity.id]})
-               |> json_response(400)
-    end
-
-    test "comment must be up to the size specified in the config", %{
-      conn: conn,
-      reporter: reporter,
-      target_user: target_user
-    } do
-      max_size = Config.get([:instance, :max_report_comment_size], 1000)
-      comment = String.pad_trailing("a", max_size + 1, "a")
-
-      error = %{"error" => "Comment must be up to #{max_size} characters"}
-
-      assert ^error =
-               conn
-               |> assign(:user, reporter)
-               |> post("/api/v1/reports", %{"account_id" => target_user.id, "comment" => comment})
-               |> json_response(400)
-    end
-
-    test "returns error when account is not exist", %{
-      conn: conn,
-      reporter: reporter,
-      activity: activity
-    } do
-      conn =
-        conn
-        |> assign(:user, reporter)
-        |> post("/api/v1/reports", %{"status_ids" => [activity.id], "account_id" => "foo"})
-
-      assert json_response(conn, 400) == %{"error" => "Account not found"}
-    end
-  end
-
   describe "link headers" do
     test "preserves parameters in link headers", %{conn: conn} do
       user = insert(:user)