Extract conversation actions from `MastodonAPIController` to ConversationController
[akkoma] / test / web / mastodon_api / mastodon_api_controller_test.exs
index 6435ad7a95100c65f4cfc3f7fc04f824665d1ae3..8080d39412ff4791f95e0fce43be3f6227b31a3f 100644 (file)
@@ -6,17 +6,14 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
   use Pleroma.Web.ConnCase
 
   alias Ecto.Changeset
-  alias Pleroma.Activity
   alias Pleroma.Config
   alias Pleroma.Notification
   alias Pleroma.Object
   alias Pleroma.Repo
-  alias Pleroma.ScheduledActivity
   alias Pleroma.Tests.ObanHelpers
   alias Pleroma.User
   alias Pleroma.Web.ActivityPub.ActivityPub
   alias Pleroma.Web.CommonAPI
-  alias Pleroma.Web.MastodonAPI.FilterView
   alias Pleroma.Web.OAuth.App
   alias Pleroma.Web.OAuth.Token
   alias Pleroma.Web.Push
@@ -36,69 +33,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
   clear_config([:instance, :public])
   clear_config([:rich_media, :enabled])
 
-  test "Conversations", %{conn: conn} do
-    user_one = insert(:user)
-    user_two = insert(:user)
-    user_three = insert(:user)
-
-    {:ok, user_two} = User.follow(user_two, user_one)
-
-    {:ok, direct} =
-      CommonAPI.post(user_one, %{
-        "status" => "Hi @#{user_two.nickname}, @#{user_three.nickname}!",
-        "visibility" => "direct"
-      })
-
-    {:ok, _follower_only} =
-      CommonAPI.post(user_one, %{
-        "status" => "Hi @#{user_two.nickname}!",
-        "visibility" => "private"
-      })
-
-    res_conn =
-      conn
-      |> assign(:user, user_one)
-      |> get("/api/v1/conversations")
-
-    assert response = json_response(res_conn, 200)
-
-    assert [
-             %{
-               "id" => res_id,
-               "accounts" => res_accounts,
-               "last_status" => res_last_status,
-               "unread" => unread
-             }
-           ] = response
-
-    account_ids = Enum.map(res_accounts, & &1["id"])
-    assert length(res_accounts) == 2
-    assert user_two.id in account_ids
-    assert user_three.id in account_ids
-    assert is_binary(res_id)
-    assert unread == true
-    assert res_last_status["id"] == direct.id
-
-    # Apparently undocumented API endpoint
-    res_conn =
-      conn
-      |> assign(:user, user_one)
-      |> post("/api/v1/conversations/#{res_id}/read")
-
-    assert response = json_response(res_conn, 200)
-    assert length(response["accounts"]) == 2
-    assert response["last_status"]["id"] == direct.id
-    assert response["unread"] == false
-
-    # (vanilla) Mastodon frontend behaviour
-    res_conn =
-      conn
-      |> assign(:user, user_one)
-      |> get("/api/v1/statuses/#{res_last_status["id"]}/context")
-
-    assert %{"ancestors" => [], "descendants" => []} == json_response(res_conn, 200)
-  end
-
   test "verify_credentials", %{conn: conn} do
     user = insert(:user)
 
@@ -268,134 +202,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     assert expected == json_response(conn, 200)
   end
 
-  describe "filters" do
-    test "creating a filter", %{conn: conn} do
-      user = insert(:user)
-
-      filter = %Pleroma.Filter{
-        phrase: "knights",
-        context: ["home"]
-      }
-
-      conn =
-        conn
-        |> assign(:user, user)
-        |> post("/api/v1/filters", %{"phrase" => filter.phrase, context: filter.context})
-
-      assert response = json_response(conn, 200)
-      assert response["phrase"] == filter.phrase
-      assert response["context"] == filter.context
-      assert response["irreversible"] == false
-      assert response["id"] != nil
-      assert response["id"] != ""
-    end
-
-    test "fetching a list of filters", %{conn: conn} do
-      user = insert(:user)
-
-      query_one = %Pleroma.Filter{
-        user_id: user.id,
-        filter_id: 1,
-        phrase: "knights",
-        context: ["home"]
-      }
-
-      query_two = %Pleroma.Filter{
-        user_id: user.id,
-        filter_id: 2,
-        phrase: "who",
-        context: ["home"]
-      }
-
-      {:ok, filter_one} = Pleroma.Filter.create(query_one)
-      {:ok, filter_two} = Pleroma.Filter.create(query_two)
-
-      response =
-        conn
-        |> assign(:user, user)
-        |> get("/api/v1/filters")
-        |> json_response(200)
-
-      assert response ==
-               render_json(
-                 FilterView,
-                 "filters.json",
-                 filters: [filter_two, filter_one]
-               )
-    end
-
-    test "get a filter", %{conn: conn} do
-      user = insert(:user)
-
-      query = %Pleroma.Filter{
-        user_id: user.id,
-        filter_id: 2,
-        phrase: "knight",
-        context: ["home"]
-      }
-
-      {:ok, filter} = Pleroma.Filter.create(query)
-
-      conn =
-        conn
-        |> assign(:user, user)
-        |> get("/api/v1/filters/#{filter.filter_id}")
-
-      assert _response = json_response(conn, 200)
-    end
-
-    test "update a filter", %{conn: conn} do
-      user = insert(:user)
-
-      query = %Pleroma.Filter{
-        user_id: user.id,
-        filter_id: 2,
-        phrase: "knight",
-        context: ["home"]
-      }
-
-      {:ok, _filter} = Pleroma.Filter.create(query)
-
-      new = %Pleroma.Filter{
-        phrase: "nii",
-        context: ["home"]
-      }
-
-      conn =
-        conn
-        |> assign(:user, user)
-        |> put("/api/v1/filters/#{query.filter_id}", %{
-          phrase: new.phrase,
-          context: new.context
-        })
-
-      assert response = json_response(conn, 200)
-      assert response["phrase"] == new.phrase
-      assert response["context"] == new.context
-    end
-
-    test "delete a filter", %{conn: conn} do
-      user = insert(:user)
-
-      query = %Pleroma.Filter{
-        user_id: user.id,
-        filter_id: 2,
-        phrase: "knight",
-        context: ["home"]
-      }
-
-      {:ok, filter} = Pleroma.Filter.create(query)
-
-      conn =
-        conn
-        |> assign(:user, user)
-        |> delete("/api/v1/filters/#{filter.filter_id}")
-
-      assert response = json_response(conn, 200)
-      assert response == %{}
-    end
-  end
-
   describe "user timelines" do
     test "gets a users statuses", %{conn: conn} do
       user_one = insert(:user)
@@ -530,6 +336,17 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
 
       assert to_string(other_user.id) == relationship["id"]
     end
+
+    test "returns an empty list on a bad request", %{conn: conn} do
+      user = insert(:user)
+
+      conn =
+        conn
+        |> assign(:user, user)
+        |> get("/api/v1/accounts/relationships", %{})
+
+      assert [] = json_response(conn, 200)
+    end
   end
 
   describe "media upload" do
@@ -570,51 +387,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
   end
 
   describe "locked accounts" do
-    test "/api/v1/follow_requests works" do
-      user = insert(:user, %{info: %User.Info{locked: true}})
-      other_user = insert(:user)
-
-      {:ok, _activity} = ActivityPub.follow(other_user, user)
-
-      user = User.get_cached_by_id(user.id)
-      other_user = User.get_cached_by_id(other_user.id)
-
-      assert User.following?(other_user, user) == false
-
-      conn =
-        build_conn()
-        |> assign(:user, user)
-        |> get("/api/v1/follow_requests")
-
-      assert [relationship] = json_response(conn, 200)
-      assert to_string(other_user.id) == relationship["id"]
-    end
-
-    test "/api/v1/follow_requests/:id/authorize works" do
-      user = insert(:user, %{info: %User.Info{locked: true}})
-      other_user = insert(:user)
-
-      {:ok, _activity} = ActivityPub.follow(other_user, user)
-
-      user = User.get_cached_by_id(user.id)
-      other_user = User.get_cached_by_id(other_user.id)
-
-      assert User.following?(other_user, user) == false
-
-      conn =
-        build_conn()
-        |> assign(:user, user)
-        |> post("/api/v1/follow_requests/#{other_user.id}/authorize")
-
-      assert relationship = json_response(conn, 200)
-      assert to_string(other_user.id) == relationship["id"]
-
-      user = User.get_cached_by_id(user.id)
-      other_user = User.get_cached_by_id(other_user.id)
-
-      assert User.following?(other_user, user) == true
-    end
-
     test "verify_credentials", %{conn: conn} do
       user = insert(:user, %{info: %User.Info{default_scope: "private"}})
 
@@ -626,28 +398,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
       assert %{"id" => id, "source" => %{"privacy" => "private"}} = json_response(conn, 200)
       assert id == to_string(user.id)
     end
-
-    test "/api/v1/follow_requests/:id/reject works" do
-      user = insert(:user, %{info: %User.Info{locked: true}})
-      other_user = insert(:user)
-
-      {:ok, _activity} = ActivityPub.follow(other_user, user)
-
-      user = User.get_cached_by_id(user.id)
-
-      conn =
-        build_conn()
-        |> assign(:user, user)
-        |> post("/api/v1/follow_requests/#{other_user.id}/reject")
-
-      assert relationship = json_response(conn, 200)
-      assert to_string(other_user.id) == relationship["id"]
-
-      user = User.get_cached_by_id(user.id)
-      other_user = User.get_cached_by_id(other_user.id)
-
-      assert User.following?(other_user, user) == false
-    end
   end
 
   describe "account fetching" do
@@ -731,70 +481,72 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     end
   end
 
-  test "mascot upload", %{conn: conn} do
-    user = insert(:user)
+  describe "/api/v1/pleroma/mascot" do
+    test "mascot upload", %{conn: conn} do
+      user = insert(:user)
 
-    non_image_file = %Plug.Upload{
-      content_type: "audio/mpeg",
-      path: Path.absname("test/fixtures/sound.mp3"),
-      filename: "sound.mp3"
-    }
+      non_image_file = %Plug.Upload{
+        content_type: "audio/mpeg",
+        path: Path.absname("test/fixtures/sound.mp3"),
+        filename: "sound.mp3"
+      }
 
-    conn =
-      conn
-      |> assign(:user, user)
-      |> put("/api/v1/pleroma/mascot", %{"file" => non_image_file})
+      conn =
+        conn
+        |> assign(:user, user)
+        |> put("/api/v1/pleroma/mascot", %{"file" => non_image_file})
 
-    assert json_response(conn, 415)
+      assert json_response(conn, 415)
 
-    file = %Plug.Upload{
-      content_type: "image/jpg",
-      path: Path.absname("test/fixtures/image.jpg"),
-      filename: "an_image.jpg"
-    }
+      file = %Plug.Upload{
+        content_type: "image/jpg",
+        path: Path.absname("test/fixtures/image.jpg"),
+        filename: "an_image.jpg"
+      }
 
-    conn =
-      build_conn()
-      |> assign(:user, user)
-      |> put("/api/v1/pleroma/mascot", %{"file" => file})
+      conn =
+        build_conn()
+        |> assign(:user, user)
+        |> put("/api/v1/pleroma/mascot", %{"file" => file})
 
-    assert %{"id" => _, "type" => image} = json_response(conn, 200)
-  end
+      assert %{"id" => _, "type" => image} = json_response(conn, 200)
+    end
 
-  test "mascot retrieving", %{conn: conn} do
-    user = insert(:user)
-    # When user hasn't set a mascot, we should just get pleroma tan back
-    conn =
-      conn
-      |> assign(:user, user)
-      |> get("/api/v1/pleroma/mascot")
+    test "mascot retrieving", %{conn: conn} do
+      user = insert(:user)
+      # When user hasn't set a mascot, we should just get pleroma tan back
+      conn =
+        conn
+        |> assign(:user, user)
+        |> get("/api/v1/pleroma/mascot")
 
-    assert %{"url" => url} = json_response(conn, 200)
-    assert url =~ "pleroma-fox-tan-smol"
+      assert %{"url" => url} = json_response(conn, 200)
+      assert url =~ "pleroma-fox-tan-smol"
 
-    # When a user sets their mascot, we should get that back
-    file = %Plug.Upload{
-      content_type: "image/jpg",
-      path: Path.absname("test/fixtures/image.jpg"),
-      filename: "an_image.jpg"
-    }
+      # When a user sets their mascot, we should get that back
+      file = %Plug.Upload{
+        content_type: "image/jpg",
+        path: Path.absname("test/fixtures/image.jpg"),
+        filename: "an_image.jpg"
+      }
 
-    conn =
-      build_conn()
-      |> assign(:user, user)
-      |> put("/api/v1/pleroma/mascot", %{"file" => file})
+      conn =
+        build_conn()
+        |> assign(:user, user)
+        |> put("/api/v1/pleroma/mascot", %{"file" => file})
 
-    assert json_response(conn, 200)
+      assert json_response(conn, 200)
 
-    user = User.get_cached_by_id(user.id)
+      user = User.get_cached_by_id(user.id)
 
-    conn =
-      build_conn()
-      |> assign(:user, user)
-      |> get("/api/v1/pleroma/mascot")
+      conn =
+        build_conn()
+        |> assign(:user, user)
+        |> get("/api/v1/pleroma/mascot")
 
-    assert %{"url" => url, "type" => "image"} = json_response(conn, 200)
-    assert url =~ "an_image"
+      assert %{"url" => url, "type" => "image"} = json_response(conn, 200)
+      assert url =~ "an_image"
+    end
   end
 
   test "getting followers", %{conn: conn} do
@@ -1106,23 +858,51 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     end
   end
 
-  test "subscribing / unsubscribing to a user", %{conn: conn} do
-    user = insert(:user)
-    subscription_target = insert(:user)
+  describe "subscribing / unsubscribing" do
+    test "subscribing / unsubscribing to a user", %{conn: conn} do
+      user = insert(:user)
+      subscription_target = insert(:user)
 
-    conn =
-      conn
-      |> assign(:user, user)
-      |> post("/api/v1/pleroma/accounts/#{subscription_target.id}/subscribe")
+      conn =
+        conn
+        |> assign(:user, user)
+        |> post("/api/v1/pleroma/accounts/#{subscription_target.id}/subscribe")
 
-    assert %{"id" => _id, "subscribing" => true} = json_response(conn, 200)
+      assert %{"id" => _id, "subscribing" => true} = json_response(conn, 200)
 
-    conn =
-      build_conn()
-      |> assign(:user, user)
-      |> post("/api/v1/pleroma/accounts/#{subscription_target.id}/unsubscribe")
+      conn =
+        build_conn()
+        |> assign(:user, user)
+        |> post("/api/v1/pleroma/accounts/#{subscription_target.id}/unsubscribe")
+
+      assert %{"id" => _id, "subscribing" => false} = json_response(conn, 200)
+    end
+  end
+
+  describe "subscribing" do
+    test "returns 404 when subscription_target not found", %{conn: conn} do
+      user = insert(:user)
+
+      conn =
+        conn
+        |> assign(:user, user)
+        |> post("/api/v1/pleroma/accounts/target_id/subscribe")
+
+      assert %{"error" => "Record not found"} = json_response(conn, 404)
+    end
+  end
 
-    assert %{"id" => _id, "subscribing" => false} = json_response(conn, 200)
+  describe "unsubscribing" do
+    test "returns 404 when subscription_target not found", %{conn: conn} do
+      user = insert(:user)
+
+      conn =
+        conn
+        |> assign(:user, user)
+        |> post("/api/v1/pleroma/accounts/target_id/unsubscribe")
+
+      assert %{"error" => "Record not found"} = json_response(conn, 404)
+    end
   end
 
   test "getting a list of mutes", %{conn: conn} do
@@ -1176,46 +956,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     assert [%{"id" => ^other_user_id}] = json_response(conn, 200)
   end
 
-  test "blocking / unblocking a domain", %{conn: conn} do
-    user = insert(:user)
-    other_user = insert(:user, %{ap_id: "https://dogwhistle.zone/@pundit"})
-
-    conn =
-      conn
-      |> assign(:user, user)
-      |> post("/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"})
-
-    assert %{} = json_response(conn, 200)
-    user = User.get_cached_by_ap_id(user.ap_id)
-    assert User.blocks?(user, other_user)
-
-    conn =
-      build_conn()
-      |> assign(:user, user)
-      |> delete("/api/v1/domain_blocks", %{"domain" => "dogwhistle.zone"})
-
-    assert %{} = json_response(conn, 200)
-    user = User.get_cached_by_ap_id(user.ap_id)
-    refute User.blocks?(user, other_user)
-  end
-
-  test "getting a list of domain blocks", %{conn: conn} do
-    user = insert(:user)
-
-    {:ok, user} = User.block_domain(user, "bad.site")
-    {:ok, user} = User.block_domain(user, "even.worse.site")
-
-    conn =
-      conn
-      |> assign(:user, user)
-      |> get("/api/v1/domain_blocks")
-
-    domain_blocks = json_response(conn, 200)
-
-    assert "bad.site" in domain_blocks
-    assert "even.worse.site" in domain_blocks
-  end
-
   test "unimplemented follow_requests, blocks, domain blocks" do
     user = insert(:user)
 
@@ -1810,217 +1550,18 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
     end
   end
 
-  describe "scheduled activities" do
-    test "creates a scheduled activity", %{conn: conn} do
-      user = insert(:user)
-      scheduled_at = NaiveDateTime.add(NaiveDateTime.utc_now(), :timer.minutes(120), :millisecond)
-
-      conn =
-        conn
-        |> assign(:user, user)
-        |> post("/api/v1/statuses", %{
-          "status" => "scheduled",
-          "scheduled_at" => scheduled_at
-        })
-
-      assert %{"scheduled_at" => expected_scheduled_at} = json_response(conn, 200)
-      assert expected_scheduled_at == Pleroma.Web.CommonAPI.Utils.to_masto_date(scheduled_at)
-      assert [] == Repo.all(Activity)
-    end
-
-    test "creates a scheduled activity with a media attachment", %{conn: conn} do
-      user = insert(:user)
-      scheduled_at = NaiveDateTime.add(NaiveDateTime.utc_now(), :timer.minutes(120), :millisecond)
-
-      file = %Plug.Upload{
-        content_type: "image/jpg",
-        path: Path.absname("test/fixtures/image.jpg"),
-        filename: "an_image.jpg"
+  describe "create account by app" do
+    setup do
+      valid_params = %{
+        username: "lain",
+        email: "lain@example.org",
+        password: "PlzDontHackLain",
+        agreement: true
       }
 
-      {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id)
-
-      conn =
-        conn
-        |> assign(:user, user)
-        |> post("/api/v1/statuses", %{
-          "media_ids" => [to_string(upload.id)],
-          "status" => "scheduled",
-          "scheduled_at" => scheduled_at
-        })
-
-      assert %{"media_attachments" => [media_attachment]} = json_response(conn, 200)
-      assert %{"type" => "image"} = media_attachment
-    end
-
-    test "skips the scheduling and creates the activity if scheduled_at is earlier than 5 minutes from now",
-         %{conn: conn} do
-      user = insert(:user)
-
-      scheduled_at =
-        NaiveDateTime.add(NaiveDateTime.utc_now(), :timer.minutes(5) - 1, :millisecond)
-
-      conn =
-        conn
-        |> assign(:user, user)
-        |> post("/api/v1/statuses", %{
-          "status" => "not scheduled",
-          "scheduled_at" => scheduled_at
-        })
-
-      assert %{"content" => "not scheduled"} = json_response(conn, 200)
-      assert [] == Repo.all(ScheduledActivity)
+      [valid_params: valid_params]
     end
 
-    test "returns error when daily user limit is exceeded", %{conn: conn} do
-      user = insert(:user)
-
-      today =
-        NaiveDateTime.utc_now()
-        |> NaiveDateTime.add(:timer.minutes(6), :millisecond)
-        |> NaiveDateTime.to_iso8601()
-
-      attrs = %{params: %{}, scheduled_at: today}
-      {:ok, _} = ScheduledActivity.create(user, attrs)
-      {:ok, _} = ScheduledActivity.create(user, attrs)
-
-      conn =
-        conn
-        |> assign(:user, user)
-        |> post("/api/v1/statuses", %{"status" => "scheduled", "scheduled_at" => today})
-
-      assert %{"error" => "daily limit exceeded"} == json_response(conn, 422)
-    end
-
-    test "returns error when total user limit is exceeded", %{conn: conn} do
-      user = insert(:user)
-
-      today =
-        NaiveDateTime.utc_now()
-        |> NaiveDateTime.add(:timer.minutes(6), :millisecond)
-        |> NaiveDateTime.to_iso8601()
-
-      tomorrow =
-        NaiveDateTime.utc_now()
-        |> NaiveDateTime.add(:timer.hours(36), :millisecond)
-        |> NaiveDateTime.to_iso8601()
-
-      attrs = %{params: %{}, scheduled_at: today}
-      {:ok, _} = ScheduledActivity.create(user, attrs)
-      {:ok, _} = ScheduledActivity.create(user, attrs)
-      {:ok, _} = ScheduledActivity.create(user, %{params: %{}, scheduled_at: tomorrow})
-
-      conn =
-        conn
-        |> assign(:user, user)
-        |> post("/api/v1/statuses", %{"status" => "scheduled", "scheduled_at" => tomorrow})
-
-      assert %{"error" => "total limit exceeded"} == json_response(conn, 422)
-    end
-
-    test "shows scheduled activities", %{conn: conn} do
-      user = insert(:user)
-      scheduled_activity_id1 = insert(:scheduled_activity, user: user).id |> to_string()
-      scheduled_activity_id2 = insert(:scheduled_activity, user: user).id |> to_string()
-      scheduled_activity_id3 = insert(:scheduled_activity, user: user).id |> to_string()
-      scheduled_activity_id4 = insert(:scheduled_activity, user: user).id |> to_string()
-
-      conn =
-        conn
-        |> assign(:user, user)
-
-      # min_id
-      conn_res =
-        conn
-        |> get("/api/v1/scheduled_statuses?limit=2&min_id=#{scheduled_activity_id1}")
-
-      result = json_response(conn_res, 200)
-      assert [%{"id" => ^scheduled_activity_id3}, %{"id" => ^scheduled_activity_id2}] = result
-
-      # since_id
-      conn_res =
-        conn
-        |> get("/api/v1/scheduled_statuses?limit=2&since_id=#{scheduled_activity_id1}")
-
-      result = json_response(conn_res, 200)
-      assert [%{"id" => ^scheduled_activity_id4}, %{"id" => ^scheduled_activity_id3}] = result
-
-      # max_id
-      conn_res =
-        conn
-        |> get("/api/v1/scheduled_statuses?limit=2&max_id=#{scheduled_activity_id4}")
-
-      result = json_response(conn_res, 200)
-      assert [%{"id" => ^scheduled_activity_id3}, %{"id" => ^scheduled_activity_id2}] = result
-    end
-
-    test "shows a scheduled activity", %{conn: conn} do
-      user = insert(:user)
-      scheduled_activity = insert(:scheduled_activity, user: user)
-
-      res_conn =
-        conn
-        |> assign(:user, user)
-        |> get("/api/v1/scheduled_statuses/#{scheduled_activity.id}")
-
-      assert %{"id" => scheduled_activity_id} = json_response(res_conn, 200)
-      assert scheduled_activity_id == scheduled_activity.id |> to_string()
-
-      res_conn =
-        conn
-        |> assign(:user, user)
-        |> get("/api/v1/scheduled_statuses/404")
-
-      assert %{"error" => "Record not found"} = json_response(res_conn, 404)
-    end
-
-    test "updates a scheduled activity", %{conn: conn} do
-      user = insert(:user)
-      scheduled_activity = insert(:scheduled_activity, user: user)
-
-      new_scheduled_at =
-        NaiveDateTime.add(NaiveDateTime.utc_now(), :timer.minutes(120), :millisecond)
-
-      res_conn =
-        conn
-        |> assign(:user, user)
-        |> put("/api/v1/scheduled_statuses/#{scheduled_activity.id}", %{
-          scheduled_at: new_scheduled_at
-        })
-
-      assert %{"scheduled_at" => expected_scheduled_at} = json_response(res_conn, 200)
-      assert expected_scheduled_at == Pleroma.Web.CommonAPI.Utils.to_masto_date(new_scheduled_at)
-
-      res_conn =
-        conn
-        |> assign(:user, user)
-        |> put("/api/v1/scheduled_statuses/404", %{scheduled_at: new_scheduled_at})
-
-      assert %{"error" => "Record not found"} = json_response(res_conn, 404)
-    end
-
-    test "deletes a scheduled activity", %{conn: conn} do
-      user = insert(:user)
-      scheduled_activity = insert(:scheduled_activity, user: user)
-
-      res_conn =
-        conn
-        |> assign(:user, user)
-        |> delete("/api/v1/scheduled_statuses/#{scheduled_activity.id}")
-
-      assert %{} = json_response(res_conn, 200)
-      assert nil == Repo.get(ScheduledActivity, scheduled_activity.id)
-
-      res_conn =
-        conn
-        |> assign(:user, user)
-        |> delete("/api/v1/scheduled_statuses/#{scheduled_activity.id}")
-
-      assert %{"error" => "Record not found"} = json_response(res_conn, 404)
-    end
-  end
-
-  describe "create account by app" do
     test "Account registration via Application", %{conn: conn} do
       conn =
         conn
@@ -2064,6 +1605,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
           username: "lain",
           email: "lain@example.org",
           password: "PlzDontHackLain",
+          bio: "Test Bio",
           agreement: true
         })
 
@@ -2082,6 +1624,18 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
       assert token_from_db.user.info.confirmation_pending
     end
 
+    test "returns error when user already registred", %{conn: conn, valid_params: valid_params} do
+      _user = insert(:user, email: "lain@example.org")
+      app_token = insert(:oauth_token, user: nil)
+
+      conn =
+        conn
+        |> put_req_header("authorization", "Bearer " <> app_token.token)
+
+      res = post(conn, "/api/v1/accounts", valid_params)
+      assert json_response(res, 400) == %{"error" => "{\"email\":[\"has already been taken\"]}"}
+    end
+
     test "rate limit", %{conn: conn} do
       app_token = insert(:oauth_token, user: nil)
 
@@ -2125,6 +1679,41 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
 
       assert json_response(conn, :too_many_requests) == %{"error" => "Throttled"}
     end
+
+    test "returns bad_request if missing required params", %{
+      conn: conn,
+      valid_params: valid_params
+    } do
+      app_token = insert(:oauth_token, user: nil)
+
+      conn =
+        conn
+        |> put_req_header("authorization", "Bearer " <> app_token.token)
+
+      res = post(conn, "/api/v1/accounts", valid_params)
+      assert json_response(res, 200)
+
+      [{127, 0, 0, 1}, {127, 0, 0, 2}, {127, 0, 0, 3}, {127, 0, 0, 4}]
+      |> Stream.zip(valid_params)
+      |> Enum.each(fn {ip, {attr, _}} ->
+        res =
+          conn
+          |> Map.put(:remote_ip, ip)
+          |> post("/api/v1/accounts", Map.delete(valid_params, attr))
+          |> json_response(400)
+
+        assert res == %{"error" => "Missing parameters"}
+      end)
+    end
+
+    test "returns forbidden if token is invalid", %{conn: conn, valid_params: valid_params} do
+      conn =
+        conn
+        |> put_req_header("authorization", "Bearer " <> "invalid-token")
+
+      res = post(conn, "/api/v1/accounts", valid_params)
+      assert json_response(res, 403) == %{"error" => "Invalid credentials"}
+    end
   end
 
   describe "GET /api/v1/polls/:id" do
@@ -2467,4 +2056,115 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
              ]
     end
   end
+
+  describe "PUT /api/v1/media/:id" do
+    setup do
+      actor = insert(:user)
+
+      file = %Plug.Upload{
+        content_type: "image/jpg",
+        path: Path.absname("test/fixtures/image.jpg"),
+        filename: "an_image.jpg"
+      }
+
+      {:ok, %Object{} = object} =
+        ActivityPub.upload(
+          file,
+          actor: User.ap_id(actor),
+          description: "test-m"
+        )
+
+      [actor: actor, object: object]
+    end
+
+    test "updates name of media", %{conn: conn, actor: actor, object: object} do
+      media =
+        conn
+        |> assign(:user, actor)
+        |> put("/api/v1/media/#{object.id}", %{"description" => "test-media"})
+        |> json_response(:ok)
+
+      assert media["description"] == "test-media"
+      assert refresh_record(object).data["name"] == "test-media"
+    end
+
+    test "returns error wheb request is bad", %{conn: conn, actor: actor, object: object} do
+      media =
+        conn
+        |> assign(:user, actor)
+        |> put("/api/v1/media/#{object.id}", %{})
+        |> json_response(400)
+
+      assert media == %{"error" => "bad_request"}
+    end
+  end
+
+  describe "DELETE /auth/sign_out" do
+    test "redirect to root page", %{conn: conn} do
+      user = insert(:user)
+
+      conn =
+        conn
+        |> assign(:user, user)
+        |> delete("/auth/sign_out")
+
+      assert conn.status == 302
+      assert redirected_to(conn) == "/"
+    end
+  end
+
+  describe "GET /api/v1/accounts/:id/lists - account_lists" do
+    test "returns lists to which the account belongs", %{conn: conn} do
+      user = insert(:user)
+      other_user = insert(:user)
+      assert {:ok, %Pleroma.List{} = list} = Pleroma.List.create("Test List", user)
+      {:ok, %{following: _following}} = Pleroma.List.follow(list, other_user)
+
+      res =
+        conn
+        |> assign(:user, user)
+        |> get("/api/v1/accounts/#{other_user.id}/lists")
+        |> json_response(200)
+
+      assert res == [%{"id" => to_string(list.id), "title" => "Test List"}]
+    end
+  end
+
+  describe "empty_array, stubs for mastodon api" do
+    test "GET /api/v1/accounts/:id/identity_proofs", %{conn: conn} do
+      user = insert(:user)
+
+      res =
+        conn
+        |> assign(:user, user)
+        |> get("/api/v1/accounts/#{user.id}/identity_proofs")
+        |> json_response(200)
+
+      assert res == []
+    end
+
+    test "GET /api/v1/endorsements", %{conn: conn} do
+      user = insert(:user)
+
+      res =
+        conn
+        |> assign(:user, user)
+        |> get("/api/v1/endorsements")
+        |> json_response(200)
+
+      assert res == []
+    end
+
+    test "GET /api/v1/trends", %{conn: conn} do
+      user = insert(:user)
+
+      res =
+        conn
+        |> assign(:user, user)
+        |> get("/api/v1/trends")
+        |> json_response(200)
+
+      assert res == []
+    end
+  end
 end