diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/flake_id_test.exs | 5 | ||||
| -rw-r--r-- | test/support/http_request_mock.ex | 4 | ||||
| -rw-r--r-- | test/web/admin_api/admin_api_controller_test.exs | 40 | ||||
| -rw-r--r-- | test/web/common_api/common_api_utils_test.exs | 20 | ||||
| -rw-r--r-- | test/web/ostatus/ostatus_test.exs | 56 | ||||
| -rw-r--r-- | test/web/twitter_api/util_controller_test.exs | 404 | 
6 files changed, 524 insertions, 5 deletions
diff --git a/test/flake_id_test.exs b/test/flake_id_test.exs index ca2338041..85ed5bbdf 100644 --- a/test/flake_id_test.exs +++ b/test/flake_id_test.exs @@ -39,4 +39,9 @@ defmodule Pleroma.FlakeIdTest do      assert dump(flake_s) == {:ok, flake}      assert dump(flake) == {:ok, flake}    end + +  test "is_flake_id?/1" do +    assert is_flake_id?("9eoozpwTul5mjSEDRI") +    refute is_flake_id?("http://example.com/activities/3ebbadd1-eb14-4e20-8118-b6f79c0c7b0b") +  end  end diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index bdfe43b28..3adb5ba3b 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -51,6 +51,10 @@ defmodule HttpRequestMock do       }}    end +  def get("https://mastodon.social/users/not_found", _, _, _) do +    {:ok, %Tesla.Env{status: 404}} +  end +    def get("https://mastodon.sdf.org/users/rinpatch", _, _, _) do      {:ok,       %Tesla.Env{ diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index 6dda4ae51..f61499a22 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -1916,6 +1916,46 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end +  describe "config mix tasks run" do +    setup %{conn: conn} do +      admin = insert(:user, info: %{is_admin: true}) + +      temp_file = "config/test.exported_from_db.secret.exs" + +      Mix.shell(Mix.Shell.Quiet) + +      on_exit(fn -> +        Mix.shell(Mix.Shell.IO) +        :ok = File.rm(temp_file) +      end) + +      dynamic = Pleroma.Config.get([:instance, :dynamic_configuration]) + +      Pleroma.Config.put([:instance, :dynamic_configuration], true) + +      on_exit(fn -> +        Pleroma.Config.put([:instance, :dynamic_configuration], dynamic) +      end) + +      %{conn: assign(conn, :user, admin), admin: admin} +    end + +    test "transfer settings to DB and to file", %{conn: conn, admin: admin} do +      assert Pleroma.Repo.all(Pleroma.Web.AdminAPI.Config) == [] +      conn = get(conn, "/api/pleroma/admin/config/migrate_to_db") +      assert json_response(conn, 200) == %{} +      assert Pleroma.Repo.all(Pleroma.Web.AdminAPI.Config) > 0 + +      conn = +        build_conn() +        |> assign(:user, admin) +        |> get("/api/pleroma/admin/config/migrate_from_db") + +      assert json_response(conn, 200) == %{} +      assert Pleroma.Repo.all(Pleroma.Web.AdminAPI.Config) == [] +    end +  end +    describe "GET /api/pleroma/admin/users/:nickname/statuses" do      setup do        admin = insert(:user, info: %{is_admin: true}) diff --git a/test/web/common_api/common_api_utils_test.exs b/test/web/common_api/common_api_utils_test.exs index af320f31f..4b5666c29 100644 --- a/test/web/common_api/common_api_utils_test.exs +++ b/test/web/common_api/common_api_utils_test.exs @@ -360,4 +360,24 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do        assert third_user.ap_id in to      end    end + +  describe "get_by_id_or_ap_id/1" do +    test "get activity by id" do +      activity = insert(:note_activity) +      %Pleroma.Activity{} = note = Utils.get_by_id_or_ap_id(activity.id) +      assert note.id == activity.id +    end + +    test "get activity by ap_id" do +      activity = insert(:note_activity) +      %Pleroma.Activity{} = note = Utils.get_by_id_or_ap_id(activity.data["object"]) +      assert note.id == activity.id +    end + +    test "get activity by object when type isn't `Create` " do +      activity = insert(:like_activity) +      %Pleroma.Activity{} = like = Utils.get_by_id_or_ap_id(activity.id) +      assert like.data["object"] == activity.data["object"] +    end +  end  end diff --git a/test/web/ostatus/ostatus_test.exs b/test/web/ostatus/ostatus_test.exs index 4e8f3a0fc..f8d389020 100644 --- a/test/web/ostatus/ostatus_test.exs +++ b/test/web/ostatus/ostatus_test.exs @@ -326,6 +326,14 @@ defmodule Pleroma.Web.OStatusTest do      assert User.following?(follower, followed)    end +  test "refuse following over OStatus if the followed's account is locked" do +    incoming = File.read!("test/fixtures/follow.xml") +    _user = insert(:user, info: %{locked: true}, ap_id: "https://pawoo.net/users/pekorino") + +    {:ok, [{:error, "It's not possible to follow locked accounts over OStatus"}]} = +      OStatus.handle_incoming(incoming) +  end +    test "handle incoming unfollows with existing follow" do      incoming_follow = File.read!("test/fixtures/follow.xml")      {:ok, [_activity]} = OStatus.handle_incoming(incoming_follow) @@ -426,7 +434,7 @@ defmodule Pleroma.Web.OStatusTest do                 }      end -    test "find_make_or_update_user takes an author element and returns an updated user" do +    test "find_make_or_update_actor takes an author element and returns an updated user" do        uri = "https://social.heldscal.la/user/23211"        {:ok, user} = OStatus.find_or_make_user(uri) @@ -439,14 +447,56 @@ defmodule Pleroma.Web.OStatusTest do        doc = XML.parse_document(File.read!("test/fixtures/23211.atom"))        [author] = :xmerl_xpath.string('//author[1]', doc) -      {:ok, user} = OStatus.find_make_or_update_user(author) +      {:ok, user} = OStatus.find_make_or_update_actor(author)        assert user.avatar["type"] == "Image"        assert user.name == old_name        assert user.bio == old_bio -      {:ok, user_again} = OStatus.find_make_or_update_user(author) +      {:ok, user_again} = OStatus.find_make_or_update_actor(author)        assert user_again == user      end + +    test "find_or_make_user disallows protocol downgrade" do +      user = insert(:user, %{local: true}) +      {:ok, user} = OStatus.find_or_make_user(user.ap_id) + +      assert User.ap_enabled?(user) + +      user = +        insert(:user, %{ +          ap_id: "https://social.heldscal.la/user/23211", +          info: %{ap_enabled: true}, +          local: false +        }) + +      assert User.ap_enabled?(user) + +      {:ok, user} = OStatus.find_or_make_user(user.ap_id) +      assert User.ap_enabled?(user) +    end + +    test "find_make_or_update_actor disallows protocol downgrade" do +      user = insert(:user, %{local: true}) +      {:ok, user} = OStatus.find_or_make_user(user.ap_id) + +      assert User.ap_enabled?(user) + +      user = +        insert(:user, %{ +          ap_id: "https://social.heldscal.la/user/23211", +          info: %{ap_enabled: true}, +          local: false +        }) + +      assert User.ap_enabled?(user) + +      {:ok, user} = OStatus.find_or_make_user(user.ap_id) +      assert User.ap_enabled?(user) + +      doc = XML.parse_document(File.read!("test/fixtures/23211.atom")) +      [author] = :xmerl_xpath.string('//author[1]', doc) +      {:error, :invalid_protocol} = OStatus.find_make_or_update_actor(author) +    end    end    describe "gathering user info from a user id" do diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index 3d699e1df..640579c09 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -14,6 +14,17 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    setup do      Tesla.Mock.mock(fn env -> apply(HttpRequestMock, :request, [env]) end) + +    instance_config = Pleroma.Config.get([:instance]) +    pleroma_fe = Pleroma.Config.get([:frontend_configurations, :pleroma_fe]) +    deny_follow_blocked = Pleroma.Config.get([:user, :deny_follow_blocked]) + +    on_exit(fn -> +      Pleroma.Config.put([:instance], instance_config) +      Pleroma.Config.put([:frontend_configurations, :pleroma_fe], pleroma_fe) +      Pleroma.Config.put([:user, :deny_follow_blocked], deny_follow_blocked) +    end) +      :ok    end @@ -31,6 +42,35 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert response == "job started"      end +    test "it imports follow lists from file", %{conn: conn} do +      user1 = insert(:user) +      user2 = insert(:user) + +      with_mocks([ +        {File, [], +         read!: fn "follow_list.txt" -> +           "Account address,Show boosts\n#{user2.ap_id},true" +         end}, +        {PleromaJobQueue, [:passthrough], []} +      ]) do +        response = +          conn +          |> assign(:user, user1) +          |> post("/api/pleroma/follow_import", %{"list" => %Plug.Upload{path: "follow_list.txt"}}) +          |> json_response(:ok) + +        assert called( +                 PleromaJobQueue.enqueue( +                   :background, +                   User, +                   [:follow_import, user1, [user2.ap_id]] +                 ) +               ) + +        assert response == "job started" +      end +    end +      test "it imports new-style mastodon follow lists", %{conn: conn} do        user1 = insert(:user)        user2 = insert(:user) @@ -79,6 +119,33 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert response == "job started"      end + +    test "it imports blocks users from file", %{conn: conn} do +      user1 = insert(:user) +      user2 = insert(:user) +      user3 = insert(:user) + +      with_mocks([ +        {File, [], read!: fn "blocks_list.txt" -> "#{user2.ap_id} #{user3.ap_id}" end}, +        {PleromaJobQueue, [:passthrough], []} +      ]) do +        response = +          conn +          |> assign(:user, user1) +          |> post("/api/pleroma/blocks_import", %{"list" => %Plug.Upload{path: "blocks_list.txt"}}) +          |> json_response(:ok) + +        assert called( +                 PleromaJobQueue.enqueue( +                   :background, +                   User, +                   [:blocks_import, user1, [user2.ap_id, user3.ap_id]] +                 ) +               ) + +        assert response == "job started" +      end +    end    end    describe "POST /api/pleroma/notifications/read" do @@ -98,6 +165,18 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert Repo.get(Notification, notification1.id).seen        refute Repo.get(Notification, notification2.id).seen      end + +    test "it returns error when notification not found", %{conn: conn} do +      user1 = insert(:user) + +      response = +        conn +        |> assign(:user, user1) +        |> post("/api/pleroma/notifications/read", %{"id" => "22222222222222"}) +        |> json_response(403) + +      assert response == %{"error" => "Cannot get notification"} +    end    end    describe "PUT /api/pleroma/notification_settings" do @@ -123,7 +202,63 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end    end -  describe "GET /api/statusnet/config.json" do +  describe "GET /api/statusnet/config" do +    test "it returns config in xml format", %{conn: conn} do +      instance = Pleroma.Config.get(:instance) + +      response = +        conn +        |> put_req_header("accept", "application/xml") +        |> get("/api/statusnet/config") +        |> response(:ok) + +      assert response == +               "<config>\n<site>\n<name>#{Keyword.get(instance, :name)}</name>\n<site>#{ +                 Pleroma.Web.base_url() +               }</site>\n<textlimit>#{Keyword.get(instance, :limit)}</textlimit>\n<closed>#{ +                 !Keyword.get(instance, :registrations_open) +               }</closed>\n</site>\n</config>\n" +    end + +    test "it returns config in json format", %{conn: conn} do +      instance = Pleroma.Config.get(:instance) +      Pleroma.Config.put([:instance, :managed_config], true) +      Pleroma.Config.put([:instance, :registrations_open], false) +      Pleroma.Config.put([:instance, :invites_enabled], true) +      Pleroma.Config.put([:instance, :public], false) +      Pleroma.Config.put([:frontend_configurations, :pleroma_fe], %{theme: "asuka-hospital"}) + +      response = +        conn +        |> put_req_header("accept", "application/json") +        |> get("/api/statusnet/config") +        |> json_response(:ok) + +      expected_data = %{ +        "site" => %{ +          "accountActivationRequired" => "0", +          "closed" => "1", +          "description" => Keyword.get(instance, :description), +          "invitesEnabled" => "1", +          "name" => Keyword.get(instance, :name), +          "pleromafe" => %{"theme" => "asuka-hospital"}, +          "private" => "1", +          "safeDMMentionsEnabled" => "0", +          "server" => Pleroma.Web.base_url(), +          "textlimit" => to_string(Keyword.get(instance, :limit)), +          "uploadlimit" => %{ +            "avatarlimit" => to_string(Keyword.get(instance, :avatar_upload_limit)), +            "backgroundlimit" => to_string(Keyword.get(instance, :background_upload_limit)), +            "bannerlimit" => to_string(Keyword.get(instance, :banner_upload_limit)), +            "uploadlimit" => to_string(Keyword.get(instance, :upload_limit)) +          }, +          "vapidPublicKey" => Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key) +        } +      } + +      assert response == expected_data +    end +      test "returns the state of safe_dm_mentions flag", %{conn: conn} do        option = Pleroma.Config.get([:instance, :safe_dm_mentions])        Pleroma.Config.put([:instance, :safe_dm_mentions], true) @@ -210,7 +345,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      end    end -  describe "GET /ostatus_subscribe?acct=...." do +  describe "GET /ostatus_subscribe - remote_follow/2" do      test "adds status to pleroma instance if the `acct` is a status", %{conn: conn} do        conn =          get( @@ -230,6 +365,172 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert html_response(response, 200) =~ "Log in to follow"      end + +    test "show follow page if the `acct` is a account link", %{conn: conn} do +      user = insert(:user) + +      response = +        conn +        |> assign(:user, user) +        |> get("/ostatus_subscribe?acct=https://mastodon.social/users/emelie") + +      assert html_response(response, 200) =~ "Remote follow" +    end + +    test "show follow page with error when user cannot fecth by `acct` link", %{conn: conn} do +      user = insert(:user) + +      response = +        conn +        |> assign(:user, user) +        |> get("/ostatus_subscribe?acct=https://mastodon.social/users/not_found") + +      assert html_response(response, 200) =~ "Error fetching user" +    end +  end + +  describe "POST /ostatus_subscribe - do_remote_follow/2 with assigned user " do +    test "follows user", %{conn: conn} do +      user = insert(:user) +      user2 = insert(:user) + +      response = +        conn +        |> assign(:user, user) +        |> post("/ostatus_subscribe", %{"user" => %{"id" => user2.id}}) +        |> response(200) + +      assert response =~ "Account followed!" +      assert user2.follower_address in refresh_record(user).following +    end + +    test "returns error when user is deactivated", %{conn: conn} do +      user = insert(:user, info: %{deactivated: true}) +      user2 = insert(:user) + +      response = +        conn +        |> assign(:user, user) +        |> post("/ostatus_subscribe", %{"user" => %{"id" => user2.id}}) +        |> response(200) + +      assert response =~ "Error following account" +    end + +    test "returns error when user is blocked", %{conn: conn} do +      Pleroma.Config.put([:user, :deny_follow_blocked], true) +      user = insert(:user) +      user2 = insert(:user) + +      {:ok, _user} = Pleroma.User.block(user2, user) + +      response = +        conn +        |> assign(:user, user) +        |> post("/ostatus_subscribe", %{"user" => %{"id" => user2.id}}) +        |> response(200) + +      assert response =~ "Error following account" +    end + +    test "returns error when followee not found", %{conn: conn} do +      user = insert(:user) + +      response = +        conn +        |> assign(:user, user) +        |> post("/ostatus_subscribe", %{"user" => %{"id" => "jimm"}}) +        |> response(200) + +      assert response =~ "Error following account" +    end + +    test "returns success result when user already in followers", %{conn: conn} do +      user = insert(:user) +      user2 = insert(:user) +      {:ok, _, _, _} = CommonAPI.follow(user, user2) + +      response = +        conn +        |> assign(:user, refresh_record(user)) +        |> post("/ostatus_subscribe", %{"user" => %{"id" => user2.id}}) +        |> response(200) + +      assert response =~ "Account followed!" +    end +  end + +  describe "POST /ostatus_subscribe - do_remote_follow/2 without assigned user " do +    test "follows", %{conn: conn} do +      user = insert(:user) +      user2 = insert(:user) + +      response = +        conn +        |> post("/ostatus_subscribe", %{ +          "authorization" => %{"name" => user.nickname, "password" => "test", "id" => user2.id} +        }) +        |> response(200) + +      assert response =~ "Account followed!" +      assert user2.follower_address in refresh_record(user).following +    end + +    test "returns error when followee not found", %{conn: conn} do +      user = insert(:user) + +      response = +        conn +        |> post("/ostatus_subscribe", %{ +          "authorization" => %{"name" => user.nickname, "password" => "test", "id" => "jimm"} +        }) +        |> response(200) + +      assert response =~ "Error following account" +    end + +    test "returns error when login invalid", %{conn: conn} do +      user = insert(:user) + +      response = +        conn +        |> post("/ostatus_subscribe", %{ +          "authorization" => %{"name" => "jimm", "password" => "test", "id" => user.id} +        }) +        |> response(200) + +      assert response =~ "Wrong username or password" +    end + +    test "returns error when password invalid", %{conn: conn} do +      user = insert(:user) +      user2 = insert(:user) + +      response = +        conn +        |> post("/ostatus_subscribe", %{ +          "authorization" => %{"name" => user.nickname, "password" => "42", "id" => user2.id} +        }) +        |> response(200) + +      assert response =~ "Wrong username or password" +    end + +    test "returns error when user is blocked", %{conn: conn} do +      Pleroma.Config.put([:user, :deny_follow_blocked], true) +      user = insert(:user) +      user2 = insert(:user) +      {:ok, _user} = Pleroma.User.block(user2, user) + +      response = +        conn +        |> post("/ostatus_subscribe", %{ +          "authorization" => %{"name" => user.nickname, "password" => "test", "id" => user2.id} +        }) +        |> response(200) + +      assert response =~ "Error following account" +    end    end    describe "GET /api/pleroma/healthcheck" do @@ -311,5 +612,104 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do        assert user.info.deactivated == true      end + +    test "it returns returns when password invalid", %{conn: conn} do +      user = insert(:user) + +      response = +        conn +        |> assign(:user, user) +        |> post("/api/pleroma/disable_account", %{"password" => "test1"}) +        |> json_response(:ok) + +      assert response == %{"error" => "Invalid password."} +      user = User.get_cached_by_id(user.id) + +      refute user.info.deactivated +    end +  end + +  describe "GET /api/statusnet/version" do +    test "it returns version in xml format", %{conn: conn} do +      response = +        conn +        |> put_req_header("accept", "application/xml") +        |> get("/api/statusnet/version") +        |> response(:ok) + +      assert response == "<version>#{Pleroma.Application.named_version()}</version>" +    end + +    test "it returns version in json format", %{conn: conn} do +      response = +        conn +        |> put_req_header("accept", "application/json") +        |> get("/api/statusnet/version") +        |> json_response(:ok) + +      assert response == "#{Pleroma.Application.named_version()}" +    end +  end + +  describe "POST /main/ostatus - remote_subscribe/2" do +    test "renders subscribe form", %{conn: conn} do +      user = insert(:user) + +      response = +        conn +        |> post("/main/ostatus", %{"nickname" => user.nickname, "profile" => ""}) +        |> response(:ok) + +      refute response =~ "Could not find user" +      assert response =~ "Remotely follow #{user.nickname}" +    end + +    test "renders subscribe form with error when user not found", %{conn: conn} do +      response = +        conn +        |> post("/main/ostatus", %{"nickname" => "nickname", "profile" => ""}) +        |> response(:ok) + +      assert response =~ "Could not find user" +      refute response =~ "Remotely follow" +    end + +    test "it redirect to webfinger url", %{conn: conn} do +      user = insert(:user) +      user2 = insert(:user, ap_id: "shp@social.heldscal.la") + +      conn = +        conn +        |> post("/main/ostatus", %{ +          "user" => %{"nickname" => user.nickname, "profile" => user2.ap_id} +        }) + +      assert redirected_to(conn) == +               "https://social.heldscal.la/main/ostatussub?profile=#{user.ap_id}" +    end + +    test "it renders form with error when use not found", %{conn: conn} do +      user2 = insert(:user, ap_id: "shp@social.heldscal.la") + +      response = +        conn +        |> post("/main/ostatus", %{"user" => %{"nickname" => "jimm", "profile" => user2.ap_id}}) +        |> response(:ok) + +      assert response =~ "Something went wrong." +    end +  end + +  test "it returns new captcha", %{conn: conn} do +    with_mock Pleroma.Captcha, +      new: fn -> "test_captcha" end do +      resp = +        conn +        |> get("/api/pleroma/captcha") +        |> response(200) + +      assert resp == "\"test_captcha\"" +      assert called(Pleroma.Captcha.new()) +    end    end  end  | 
