[#210] [TwitterAPI] Made actor be stored for uploads. Added ownership check
[akkoma] / test / web / twitter_api / twitter_api_controller_test.exs
index f7c6e61873be28a834fadceb1e32d5fd4034ed32..c07dc69121eb805bfaa8437be71d3bf698f35053 100644 (file)
@@ -24,6 +24,9 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
         |> assign(:user, user)
         |> post(authenticated_twitter_api__path(conn, :update_banner), %{"banner" => new_banner})
         |> json_response(200)
+
+      user = Repo.get(User, user.id)
+      assert user.info.banner["type"] == "Image"
     end
   end
 
@@ -39,6 +42,9 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
         |> assign(:user, user)
         |> post(authenticated_twitter_api__path(conn, :update_background), %{"img" => new_bg})
         |> json_response(200)
+
+      user = Repo.get(User, user.id)
+      assert user.info.background["type"] == "Image"
     end
   end
 
@@ -949,18 +955,21 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
   describe "POST /api/account/update_profile.json" do
     test "it updates a user's profile", %{conn: conn} do
       user = insert(:user)
+      user2 = insert(:user)
 
       conn =
         conn
         |> assign(:user, user)
         |> post("/api/account/update_profile.json", %{
           "name" => "new name",
-          "description" => "new description"
+          "description" => "hi @#{user2.nickname}"
         })
 
       user = Repo.get!(User, user.id)
       assert user.name == "new name"
-      assert user.bio == "new description"
+
+      assert user.bio ==
+               "hi <span><a class='mention' href='#{user2.ap_id}'>@<span>#{user2.nickname}</span></a></span>"
 
       assert json_response(conn, 200) == UserView.render("user.json", %{user: user, for: user})
     end
@@ -1163,7 +1172,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
 
   describe "GET /api/pleroma/friend_requests" do
     test "it lists friend requests" do
-      user = insert(:user, %{info: %{"locked" => true}})
+      user = insert(:user)
       other_user = insert(:user)
 
       {:ok, _activity} = ActivityPub.follow(other_user, user)
@@ -1185,7 +1194,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
 
   describe "POST /api/pleroma/friendships/approve" do
     test "it approves a friend request" do
-      user = insert(:user, %{info: %{"locked" => true}})
+      user = insert(:user)
       other_user = insert(:user)
 
       {:ok, _activity} = ActivityPub.follow(other_user, user)
@@ -1208,7 +1217,7 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
 
   describe "POST /api/pleroma/friendships/deny" do
     test "it denies a friend request" do
-      user = insert(:user, %{info: %{"locked" => true}})
+      user = insert(:user)
       other_user = insert(:user)
 
       {:ok, _activity} = ActivityPub.follow(other_user, user)
@@ -1244,4 +1253,82 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
       assert [user.id, user_two.id, user_three.id] == Enum.map(resp, fn %{"id" => id} -> id end)
     end
   end
+
+  describe "POST /api/media/upload" do
+    setup context do
+      Pleroma.DataCase.ensure_local_uploader(context)
+    end
+
+    test "it performs the upload and sets `data[actor]` with AP id of uploader user", %{
+      conn: conn
+    } do
+      user = insert(:user)
+
+      upload_filename = "test/fixtures/image_tmp.jpg"
+      File.cp!("test/fixtures/image.jpg", upload_filename)
+
+      file = %Plug.Upload{
+        content_type: "image/jpg",
+        path: Path.absname(upload_filename),
+        filename: "image.jpg"
+      }
+
+      response =
+        conn
+        |> assign(:user, user)
+        |> put_req_header("content-type", "application/octet-stream")
+        |> post("/api/media/upload", %{
+          "media" => file
+        })
+        |> json_response(:ok)
+
+      assert response["media_id"]
+      object = Repo.get(Object, response["media_id"])
+      assert object
+      assert object.data["actor"] == User.ap_id(user)
+    end
+  end
+
+  describe "POST /api/media/metadata/create" do
+    setup do
+      object = insert(:note)
+      user = User.get_by_ap_id(object.data["actor"])
+      %{object: object, user: user}
+    end
+
+    test "it returns :forbidden status on attempt to modify someone else's upload", %{
+      conn: conn,
+      object: object
+    } do
+      initial_description = object.data["name"]
+      another_user = insert(:user)
+
+      conn
+      |> assign(:user, another_user)
+      |> post("/api/media/metadata/create", %{"media_id" => object.id})
+      |> json_response(:forbidden)
+
+      object = Repo.get(Object, object.id)
+      assert object.data["name"] == initial_description
+    end
+
+    test "it updates `data[name]` of referenced Object with provided value", %{
+      conn: conn,
+      object: object,
+      user: user
+    } do
+      description = "Informative description of the image. Initial value: #{object.data["name"]}}"
+
+      conn
+      |> assign(:user, user)
+      |> post("/api/media/metadata/create", %{
+        "media_id" => object.id,
+        "alt_text" => %{"text" => description}
+      })
+      |> json_response(:no_content)
+
+      object = Repo.get(Object, object.id)
+      assert object.data["name"] == description
+    end
+  end
 end