diff options
Diffstat (limited to 'test')
36 files changed, 1559 insertions, 170 deletions
diff --git a/test/activity/ir/topics_test.exs b/test/activity/ir/topics_test.exs index 44aec1e19..14a6e6b71 100644 --- a/test/activity/ir/topics_test.exs +++ b/test/activity/ir/topics_test.exs @@ -83,7 +83,7 @@ defmodule Pleroma.Activity.Ir.TopicsTest do        assert Enum.member?(topics, "hashtag:bar")      end -    test "only converts strinngs to hash tags", %{ +    test "only converts strings to hash tags", %{        activity: %{object: %{data: data} = object} = activity      } do        tagged_data = Map.put(data, "tag", [2]) diff --git a/test/config/config_db_test.exs b/test/config/config_db_test.exs index ac3dde681..6b0e7b4b6 100644 --- a/test/config/config_db_test.exs +++ b/test/config/config_db_test.exs @@ -478,14 +478,6 @@ defmodule Pleroma.ConfigDBTest do        assert ConfigDB.from_binary(binary) == [key: "value"]      end -    test "keyword with partial_chain key" do -      binary = -        ConfigDB.transform([%{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}]) - -      assert binary == :erlang.term_to_binary(partial_chain: &:hackney_connect.partial_chain/1) -      assert ConfigDB.from_binary(binary) == [partial_chain: &:hackney_connect.partial_chain/1] -    end -      test "keyword" do        binary =          ConfigDB.transform([ diff --git a/test/fixtures/users_mock/localhost.json b/test/fixtures/users_mock/localhost.json new file mode 100644 index 000000000..a49935db1 --- /dev/null +++ b/test/fixtures/users_mock/localhost.json @@ -0,0 +1,41 @@ +{ +  "@context": [ +    "https://www.w3.org/ns/activitystreams", +    "http://localhost:4001/schemas/litepub-0.1.jsonld", +    { +      "@language": "und" +    } +  ], +  "attachment": [], +  "endpoints": { +    "oauthAuthorizationEndpoint": "http://localhost:4001/oauth/authorize", +    "oauthRegistrationEndpoint": "http://localhost:4001/api/v1/apps", +    "oauthTokenEndpoint": "http://localhost:4001/oauth/token", +    "sharedInbox": "http://localhost:4001/inbox" +  }, +  "followers": "http://localhost:4001/users/{{nickname}}/followers", +  "following": "http://localhost:4001/users/{{nickname}}/following", +  "icon": { +    "type": "Image", +    "url": "http://localhost:4001/media/4e914f5b84e4a259a3f6c2d2edc9ab642f2ab05f3e3d9c52c81fc2d984b3d51e.jpg" +  }, +  "id": "http://localhost:4001/users/{{nickname}}", +  "image": { +    "type": "Image", +    "url": "http://localhost:4001/media/f739efddefeee49c6e67e947c4811fdc911785c16ae43da4c3684051fbf8da6a.jpg?name=f739efddefeee49c6e67e947c4811fdc911785c16ae43da4c3684051fbf8da6a.jpg" +  }, +  "inbox": "http://localhost:4001/users/{{nickname}}/inbox", +  "manuallyApprovesFollowers": false, +  "name": "{{nickname}}", +  "outbox": "http://localhost:4001/users/{{nickname}}/outbox", +  "preferredUsername": "{{nickname}}", +  "publicKey": { +    "id": "http://localhost:4001/users/{{nickname}}#main-key", +    "owner": "http://localhost:4001/users/{{nickname}}", +    "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5DLtwGXNZElJyxFGfcVc\nXANhaMadj/iYYQwZjOJTV9QsbtiNBeIK54PJrYuU0/0YIdrvS1iqheX5IwXRhcwa\nhm3ZyLz7XeN9st7FBni4BmZMBtMpxAuYuu5p/jbWy13qAiYOhPreCx0wrWgm/lBD\n9mkgaxIxPooBE0S4ZWEJIDIV1Vft3AWcRUyWW1vIBK0uZzs6GYshbQZB952S0yo4\nFzI1hABGHncH8UvuFauh4EZ8tY7/X5I0pGRnDOcRN1dAht5w5yTA+6r5kebiFQjP\nIzN/eCO/a9Flrj9YGW7HDNtjSOH0A31PLRGlJtJO3yK57dnf5ppyCZGfL4emShQo\ncQIDAQAB\n-----END PUBLIC KEY-----\n\n" +  }, +  "summary": "your friendly neighborhood pleroma developer<br>I like cute things and distributed systems, and really hate delete and redrafts", +  "tag": [], +  "type": "Person", +  "url": "http://localhost:4001/users/{{nickname}}" +}
\ No newline at end of file diff --git a/test/fixtures/warnings/otp_version/21.1 b/test/fixtures/warnings/otp_version/21.1 new file mode 100644 index 000000000..90cd64c4f --- /dev/null +++ b/test/fixtures/warnings/otp_version/21.1 @@ -0,0 +1 @@ +21.1
\ No newline at end of file diff --git a/test/fixtures/warnings/otp_version/22.1 b/test/fixtures/warnings/otp_version/22.1 new file mode 100644 index 000000000..d9b314368 --- /dev/null +++ b/test/fixtures/warnings/otp_version/22.1 @@ -0,0 +1 @@ +22.1
\ No newline at end of file diff --git a/test/fixtures/warnings/otp_version/22.4 b/test/fixtures/warnings/otp_version/22.4 new file mode 100644 index 000000000..1da8ccd28 --- /dev/null +++ b/test/fixtures/warnings/otp_version/22.4 @@ -0,0 +1 @@ +22.4
\ No newline at end of file diff --git a/test/fixtures/warnings/otp_version/23.0 b/test/fixtures/warnings/otp_version/23.0 new file mode 100644 index 000000000..4266d8634 --- /dev/null +++ b/test/fixtures/warnings/otp_version/23.0 @@ -0,0 +1 @@ +23.0
\ No newline at end of file diff --git a/test/http/adapter_helper/gun_test.exs b/test/http/adapter_helper/gun_test.exs new file mode 100644 index 000000000..18025b986 --- /dev/null +++ b/test/http/adapter_helper/gun_test.exs @@ -0,0 +1,260 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.AdapterHelper.GunTest do +  use ExUnit.Case, async: true +  use Pleroma.Tests.Helpers + +  import Mox + +  alias Pleroma.Config +  alias Pleroma.Gun.Conn +  alias Pleroma.HTTP.AdapterHelper.Gun +  alias Pleroma.Pool.Connections + +  setup :verify_on_exit! + +  defp gun_mock(_) do +    gun_mock() +    :ok +  end + +  defp gun_mock do +    Pleroma.GunMock +    |> stub(:open, fn _, _, _ -> Task.start_link(fn -> Process.sleep(1000) end) end) +    |> stub(:await_up, fn _, _ -> {:ok, :http} end) +    |> stub(:set_owner, fn _, _ -> :ok end) +  end + +  describe "options/1" do +    clear_config([:http, :adapter]) do +      Config.put([:http, :adapter], a: 1, b: 2) +    end + +    test "https url with default port" do +      uri = URI.parse("https://example.com") + +      opts = Gun.options([receive_conn: false], uri) +      assert opts[:certificates_verification] +      assert opts[:tls_opts][:log_level] == :warning +    end + +    test "https ipv4 with default port" do +      uri = URI.parse("https://127.0.0.1") + +      opts = Gun.options([receive_conn: false], uri) +      assert opts[:certificates_verification] +      assert opts[:tls_opts][:log_level] == :warning +    end + +    test "https ipv6 with default port" do +      uri = URI.parse("https://[2a03:2880:f10c:83:face:b00c:0:25de]") + +      opts = Gun.options([receive_conn: false], uri) +      assert opts[:certificates_verification] +      assert opts[:tls_opts][:log_level] == :warning +    end + +    test "https url with non standart port" do +      uri = URI.parse("https://example.com:115") + +      opts = Gun.options([receive_conn: false], uri) + +      assert opts[:certificates_verification] +    end + +    test "get conn on next request" do +      gun_mock() +      level = Application.get_env(:logger, :level) +      Logger.configure(level: :debug) +      on_exit(fn -> Logger.configure(level: level) end) +      uri = URI.parse("http://some-domain2.com") + +      opts = Gun.options(uri) + +      assert opts[:conn] == nil +      assert opts[:close_conn] == nil + +      Process.sleep(50) +      opts = Gun.options(uri) + +      assert is_pid(opts[:conn]) +      assert opts[:close_conn] == false +    end + +    test "merges with defaul http adapter config" do +      defaults = Gun.options([receive_conn: false], URI.parse("https://example.com")) +      assert Keyword.has_key?(defaults, :a) +      assert Keyword.has_key?(defaults, :b) +    end + +    test "default ssl adapter opts with connection" do +      gun_mock() +      uri = URI.parse("https://some-domain.com") + +      :ok = Conn.open(uri, :gun_connections) + +      opts = Gun.options(uri) + +      assert opts[:certificates_verification] +      refute opts[:tls_opts] == [] + +      assert opts[:close_conn] == false +      assert is_pid(opts[:conn]) +    end + +    test "parses string proxy host & port" do +      proxy = Config.get([:http, :proxy_url]) +      Config.put([:http, :proxy_url], "localhost:8123") +      on_exit(fn -> Config.put([:http, :proxy_url], proxy) end) + +      uri = URI.parse("https://some-domain.com") +      opts = Gun.options([receive_conn: false], uri) +      assert opts[:proxy] == {'localhost', 8123} +    end + +    test "parses tuple proxy scheme host and port" do +      proxy = Config.get([:http, :proxy_url]) +      Config.put([:http, :proxy_url], {:socks, 'localhost', 1234}) +      on_exit(fn -> Config.put([:http, :proxy_url], proxy) end) + +      uri = URI.parse("https://some-domain.com") +      opts = Gun.options([receive_conn: false], uri) +      assert opts[:proxy] == {:socks, 'localhost', 1234} +    end + +    test "passed opts have more weight than defaults" do +      proxy = Config.get([:http, :proxy_url]) +      Config.put([:http, :proxy_url], {:socks5, 'localhost', 1234}) +      on_exit(fn -> Config.put([:http, :proxy_url], proxy) end) +      uri = URI.parse("https://some-domain.com") +      opts = Gun.options([receive_conn: false, proxy: {'example.com', 4321}], uri) + +      assert opts[:proxy] == {'example.com', 4321} +    end +  end + +  describe "options/1 with receive_conn parameter" do +    setup :gun_mock + +    test "receive conn by default" do +      uri = URI.parse("http://another-domain.com") +      :ok = Conn.open(uri, :gun_connections) + +      received_opts = Gun.options(uri) +      assert received_opts[:close_conn] == false +      assert is_pid(received_opts[:conn]) +    end + +    test "don't receive conn if receive_conn is false" do +      uri = URI.parse("http://another-domain.com") +      :ok = Conn.open(uri, :gun_connections) + +      opts = [receive_conn: false] +      received_opts = Gun.options(opts, uri) +      assert received_opts[:close_conn] == nil +      assert received_opts[:conn] == nil +    end +  end + +  describe "after_request/1" do +    setup :gun_mock + +    test "body_as not chunks" do +      uri = URI.parse("http://some-domain.com") +      :ok = Conn.open(uri, :gun_connections) +      opts = Gun.options(uri) +      :ok = Gun.after_request(opts) +      conn = opts[:conn] + +      assert %Connections{ +               conns: %{ +                 "http:some-domain.com:80" => %Pleroma.Gun.Conn{ +                   conn: ^conn, +                   conn_state: :idle, +                   used_by: [] +                 } +               } +             } = Connections.get_state(:gun_connections) +    end + +    test "body_as chunks" do +      uri = URI.parse("http://some-domain.com") +      :ok = Conn.open(uri, :gun_connections) +      opts = Gun.options([body_as: :chunks], uri) +      :ok = Gun.after_request(opts) +      conn = opts[:conn] +      self = self() + +      assert %Connections{ +               conns: %{ +                 "http:some-domain.com:80" => %Pleroma.Gun.Conn{ +                   conn: ^conn, +                   conn_state: :active, +                   used_by: [{^self, _}] +                 } +               } +             } = Connections.get_state(:gun_connections) +    end + +    test "with no connection" do +      uri = URI.parse("http://uniq-domain.com") + +      :ok = Conn.open(uri, :gun_connections) + +      opts = Gun.options([body_as: :chunks], uri) +      conn = opts[:conn] +      opts = Keyword.delete(opts, :conn) +      self = self() + +      :ok = Gun.after_request(opts) + +      assert %Connections{ +               conns: %{ +                 "http:uniq-domain.com:80" => %Pleroma.Gun.Conn{ +                   conn: ^conn, +                   conn_state: :active, +                   used_by: [{^self, _}] +                 } +               } +             } = Connections.get_state(:gun_connections) +    end + +    test "with ipv4" do +      uri = URI.parse("http://127.0.0.1") +      :ok = Conn.open(uri, :gun_connections) +      opts = Gun.options(uri) +      :ok = Gun.after_request(opts) +      conn = opts[:conn] + +      assert %Connections{ +               conns: %{ +                 "http:127.0.0.1:80" => %Pleroma.Gun.Conn{ +                   conn: ^conn, +                   conn_state: :idle, +                   used_by: [] +                 } +               } +             } = Connections.get_state(:gun_connections) +    end + +    test "with ipv6" do +      uri = URI.parse("http://[2a03:2880:f10c:83:face:b00c:0:25de]") +      :ok = Conn.open(uri, :gun_connections) +      opts = Gun.options(uri) +      :ok = Gun.after_request(opts) +      conn = opts[:conn] + +      assert %Connections{ +               conns: %{ +                 "http:2a03:2880:f10c:83:face:b00c:0:25de:80" => %Pleroma.Gun.Conn{ +                   conn: ^conn, +                   conn_state: :idle, +                   used_by: [] +                 } +               } +             } = Connections.get_state(:gun_connections) +    end +  end +end diff --git a/test/http/adapter_helper/hackney_test.exs b/test/http/adapter_helper/hackney_test.exs new file mode 100644 index 000000000..5fda075f6 --- /dev/null +++ b/test/http/adapter_helper/hackney_test.exs @@ -0,0 +1,50 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.AdapterHelper.HackneyTest do +  use ExUnit.Case, async: true +  use Pleroma.Tests.Helpers + +  alias Pleroma.Config +  alias Pleroma.HTTP.AdapterHelper.Hackney + +  setup_all do +    uri = URI.parse("http://domain.com") +    {:ok, uri: uri} +  end + +  describe "options/2" do +    clear_config([:http, :adapter]) do +      Config.put([:http, :adapter], a: 1, b: 2) +    end + +    test "add proxy and opts from config", %{uri: uri} do +      opts = Hackney.options([proxy: "localhost:8123"], uri) + +      assert opts[:a] == 1 +      assert opts[:b] == 2 +      assert opts[:proxy] == "localhost:8123" +    end + +    test "respect connection opts and no proxy", %{uri: uri} do +      opts = Hackney.options([a: 2, b: 1], uri) + +      assert opts[:a] == 2 +      assert opts[:b] == 1 +      refute Keyword.has_key?(opts, :proxy) +    end + +    test "add opts for https" do +      uri = URI.parse("https://domain.com") + +      opts = Hackney.options(uri) + +      assert opts[:ssl_options] == [ +               partial_chain: &:hackney_connect.partial_chain/1, +               versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"], +               server_name_indication: 'domain.com' +             ] +    end +  end +end diff --git a/test/http/adapter_helper_test.exs b/test/http/adapter_helper_test.exs new file mode 100644 index 000000000..24d501ad5 --- /dev/null +++ b/test/http/adapter_helper_test.exs @@ -0,0 +1,28 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.AdapterHelperTest do +  use ExUnit.Case, async: true + +  alias Pleroma.HTTP.AdapterHelper + +  describe "format_proxy/1" do +    test "with nil" do +      assert AdapterHelper.format_proxy(nil) == nil +    end + +    test "with string" do +      assert AdapterHelper.format_proxy("127.0.0.1:8123") == {{127, 0, 0, 1}, 8123} +    end + +    test "localhost with port" do +      assert AdapterHelper.format_proxy("localhost:8123") == {'localhost', 8123} +    end + +    test "tuple" do +      assert AdapterHelper.format_proxy({:socks4, :localhost, 9050}) == +               {:socks4, 'localhost', 9050} +    end +  end +end diff --git a/test/http/connection_test.exs b/test/http/connection_test.exs new file mode 100644 index 000000000..0f62eddd2 --- /dev/null +++ b/test/http/connection_test.exs @@ -0,0 +1,135 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.ConnectionTest do +  use ExUnit.Case, async: true +  use Pleroma.Tests.Helpers + +  import ExUnit.CaptureLog + +  alias Pleroma.Config +  alias Pleroma.HTTP.Connection + +  describe "parse_host/1" do +    test "as atom to charlist" do +      assert Connection.parse_host(:localhost) == 'localhost' +    end + +    test "as string to charlist" do +      assert Connection.parse_host("localhost.com") == 'localhost.com' +    end + +    test "as string ip to tuple" do +      assert Connection.parse_host("127.0.0.1") == {127, 0, 0, 1} +    end +  end + +  describe "parse_proxy/1" do +    test "ip with port" do +      assert Connection.parse_proxy("127.0.0.1:8123") == {:ok, {127, 0, 0, 1}, 8123} +    end + +    test "host with port" do +      assert Connection.parse_proxy("localhost:8123") == {:ok, 'localhost', 8123} +    end + +    test "as tuple" do +      assert Connection.parse_proxy({:socks4, :localhost, 9050}) == +               {:ok, :socks4, 'localhost', 9050} +    end + +    test "as tuple with string host" do +      assert Connection.parse_proxy({:socks5, "localhost", 9050}) == +               {:ok, :socks5, 'localhost', 9050} +    end +  end + +  describe "parse_proxy/1 errors" do +    test "ip without port" do +      capture_log(fn -> +        assert Connection.parse_proxy("127.0.0.1") == {:error, :invalid_proxy} +      end) =~ "parsing proxy fail \"127.0.0.1\"" +    end + +    test "host without port" do +      capture_log(fn -> +        assert Connection.parse_proxy("localhost") == {:error, :invalid_proxy} +      end) =~ "parsing proxy fail \"localhost\"" +    end + +    test "host with bad port" do +      capture_log(fn -> +        assert Connection.parse_proxy("localhost:port") == {:error, :invalid_proxy_port} +      end) =~ "parsing port in proxy fail \"localhost:port\"" +    end + +    test "ip with bad port" do +      capture_log(fn -> +        assert Connection.parse_proxy("127.0.0.1:15.9") == {:error, :invalid_proxy_port} +      end) =~ "parsing port in proxy fail \"127.0.0.1:15.9\"" +    end + +    test "as tuple without port" do +      capture_log(fn -> +        assert Connection.parse_proxy({:socks5, :localhost}) == {:error, :invalid_proxy} +      end) =~ "parsing proxy fail {:socks5, :localhost}" +    end + +    test "with nil" do +      assert Connection.parse_proxy(nil) == nil +    end +  end + +  describe "options/3" do +    clear_config([:http, :proxy_url]) + +    test "without proxy_url in config" do +      Config.delete([:http, :proxy_url]) + +      opts = Connection.options(%URI{}) +      refute Keyword.has_key?(opts, :proxy) +    end + +    test "parses string proxy host & port" do +      Config.put([:http, :proxy_url], "localhost:8123") + +      opts = Connection.options(%URI{}) +      assert opts[:proxy] == {'localhost', 8123} +    end + +    test "parses tuple proxy scheme host and port" do +      Config.put([:http, :proxy_url], {:socks, 'localhost', 1234}) + +      opts = Connection.options(%URI{}) +      assert opts[:proxy] == {:socks, 'localhost', 1234} +    end + +    test "passed opts have more weight than defaults" do +      Config.put([:http, :proxy_url], {:socks5, 'localhost', 1234}) + +      opts = Connection.options(%URI{}, proxy: {'example.com', 4321}) + +      assert opts[:proxy] == {'example.com', 4321} +    end +  end + +  describe "format_host/1" do +    test "with domain" do +      assert Connection.format_host("example.com") == 'example.com' +    end + +    test "with idna domain" do +      assert Connection.format_host("ですexample.com") == 'xn--example-183fne.com' +    end + +    test "with ipv4" do +      assert Connection.format_host("127.0.0.1") == '127.0.0.1' +    end + +    test "with ipv6" do +      assert Connection.format_host("2a03:2880:f10c:83:face:b00c:0:25de") == +               '2a03:2880:f10c:83:face:b00c:0:25de' +    end +  end +end diff --git a/test/http/request_builder_test.exs b/test/http/request_builder_test.exs index 11a9314ae..f6eeac6c0 100644 --- a/test/http/request_builder_test.exs +++ b/test/http/request_builder_test.exs @@ -5,6 +5,8 @@  defmodule Pleroma.HTTP.RequestBuilderTest do    use ExUnit.Case, async: true    use Pleroma.Tests.Helpers +  alias Pleroma.Config +  alias Pleroma.HTTP.Request    alias Pleroma.HTTP.RequestBuilder    describe "headers/2" do @@ -12,48 +14,31 @@ defmodule Pleroma.HTTP.RequestBuilderTest do      clear_config([:http, :user_agent])      test "don't send pleroma user agent" do -      assert RequestBuilder.headers(%{}, []) == %{headers: []} +      assert RequestBuilder.headers(%Request{}, []) == %Request{headers: []}      end      test "send pleroma user agent" do -      Pleroma.Config.put([:http, :send_user_agent], true) -      Pleroma.Config.put([:http, :user_agent], :default) +      Config.put([:http, :send_user_agent], true) +      Config.put([:http, :user_agent], :default) -      assert RequestBuilder.headers(%{}, []) == %{ -               headers: [{"User-Agent", Pleroma.Application.user_agent()}] +      assert RequestBuilder.headers(%Request{}, []) == %Request{ +               headers: [{"user-agent", Pleroma.Application.user_agent()}]               }      end      test "send custom user agent" do -      Pleroma.Config.put([:http, :send_user_agent], true) -      Pleroma.Config.put([:http, :user_agent], "totally-not-pleroma") +      Config.put([:http, :send_user_agent], true) +      Config.put([:http, :user_agent], "totally-not-pleroma") -      assert RequestBuilder.headers(%{}, []) == %{ -               headers: [{"User-Agent", "totally-not-pleroma"}] +      assert RequestBuilder.headers(%Request{}, []) == %Request{ +               headers: [{"user-agent", "totally-not-pleroma"}]               }      end    end -  describe "add_optional_params/3" do -    test "don't add if keyword is empty" do -      assert RequestBuilder.add_optional_params(%{}, %{}, []) == %{} -    end - -    test "add query parameter" do -      assert RequestBuilder.add_optional_params( -               %{}, -               %{query: :query, body: :body, another: :val}, -               [ -                 {:query, "param1=val1¶m2=val2"}, -                 {:body, "some body"} -               ] -             ) == %{query: "param1=val1¶m2=val2", body: "some body"} -    end -  end -    describe "add_param/4" do      test "add file parameter" do -      %{ +      %Request{          body: %Tesla.Multipart{            boundary: _,            content_type_params: [], @@ -70,7 +55,7 @@ defmodule Pleroma.HTTP.RequestBuilderTest do              }            ]          } -      } = RequestBuilder.add_param(%{}, :file, "filename.png", "some-path/filename.png") +      } = RequestBuilder.add_param(%Request{}, :file, "filename.png", "some-path/filename.png")      end      test "add key to body" do @@ -82,7 +67,7 @@ defmodule Pleroma.HTTP.RequestBuilderTest do              %Tesla.Multipart.Part{                body: "\"someval\"",                dispositions: [name: "somekey"], -              headers: ["Content-Type": "application/json"] +              headers: [{"content-type", "application/json"}]              }            ]          } diff --git a/test/http_test.exs b/test/http_test.exs index 3edb0de36..618485b55 100644 --- a/test/http_test.exs +++ b/test/http_test.exs @@ -3,8 +3,10 @@  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.HTTPTest do -  use Pleroma.DataCase +  use ExUnit.Case, async: true +  use Pleroma.Tests.Helpers    import Tesla.Mock +  alias Pleroma.HTTP    setup do      mock(fn @@ -27,7 +29,7 @@ defmodule Pleroma.HTTPTest do    describe "get/1" do      test "returns successfully result" do -      assert Pleroma.HTTP.get("http://example.com/hello") == { +      assert HTTP.get("http://example.com/hello") == {                 :ok,                 %Tesla.Env{status: 200, body: "hello"}               } @@ -36,7 +38,7 @@ defmodule Pleroma.HTTPTest do    describe "get/2 (with headers)" do      test "returns successfully result for json content-type" do -      assert Pleroma.HTTP.get("http://example.com/hello", [{"content-type", "application/json"}]) == +      assert HTTP.get("http://example.com/hello", [{"content-type", "application/json"}]) ==                 {                   :ok,                   %Tesla.Env{ @@ -50,7 +52,7 @@ defmodule Pleroma.HTTPTest do    describe "post/2" do      test "returns successfully result" do -      assert Pleroma.HTTP.post("http://example.com/world", "") == { +      assert HTTP.post("http://example.com/world", "") == {                 :ok,                 %Tesla.Env{status: 200, body: "world"}               } diff --git a/test/notification_test.exs b/test/notification_test.exs index 56a581810..c71df4e07 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -649,12 +649,20 @@ defmodule Pleroma.NotificationTest do          "object" => remote_user.ap_id        } +      remote_user_url = remote_user.ap_id + +      Tesla.Mock.mock(fn +        %{method: :get, url: ^remote_user_url} -> +          %Tesla.Env{status: 404, body: ""} +      end) +        {:ok, _delete_activity} = Transmogrifier.handle_incoming(delete_user_message)        ObanHelpers.perform_all()        assert Enum.empty?(Notification.for_user(local_user))      end +    @tag capture_log: true      test "move activity generates a notification" do        %{ap_id: old_ap_id} = old_user = insert(:user)        %{ap_id: new_ap_id} = new_user = insert(:user, also_known_as: [old_ap_id]) @@ -664,6 +672,18 @@ defmodule Pleroma.NotificationTest do        User.follow(follower, old_user)        User.follow(other_follower, old_user) +      old_user_url = old_user.ap_id + +      body = +        File.read!("test/fixtures/users_mock/localhost.json") +        |> String.replace("{{nickname}}", old_user.nickname) +        |> Jason.encode!() + +      Tesla.Mock.mock(fn +        %{method: :get, url: ^old_user_url} -> +          %Tesla.Env{status: 200, body: body} +      end) +        Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)        ObanHelpers.perform_all() diff --git a/test/otp_version_test.exs b/test/otp_version_test.exs new file mode 100644 index 000000000..7d2538ec8 --- /dev/null +++ b/test/otp_version_test.exs @@ -0,0 +1,42 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.OTPVersionTest do +  use ExUnit.Case, async: true + +  alias Pleroma.OTPVersion + +  describe "check/1" do +    test "22.4" do +      assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/22.4"]) == +               "22.4" +    end + +    test "22.1" do +      assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/22.1"]) == +               "22.1" +    end + +    test "21.1" do +      assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/21.1"]) == +               "21.1" +    end + +    test "23.0" do +      assert OTPVersion.get_version_from_files(["test/fixtures/warnings/otp_version/23.0"]) == +               "23.0" +    end + +    test "with non existance file" do +      assert OTPVersion.get_version_from_files([ +               "test/fixtures/warnings/otp_version/non-exising", +               "test/fixtures/warnings/otp_version/22.4" +             ]) == "22.4" +    end + +    test "empty paths" do +      assert OTPVersion.get_version_from_files([]) == nil +    end +  end +end diff --git a/test/pool/connections_test.exs b/test/pool/connections_test.exs new file mode 100644 index 000000000..aeda54875 --- /dev/null +++ b/test/pool/connections_test.exs @@ -0,0 +1,760 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Pool.ConnectionsTest do +  use ExUnit.Case, async: true +  use Pleroma.Tests.Helpers + +  import ExUnit.CaptureLog +  import Mox + +  alias Pleroma.Gun.Conn +  alias Pleroma.GunMock +  alias Pleroma.Pool.Connections + +  setup :verify_on_exit! + +  setup_all do +    name = :test_connections +    {:ok, pid} = Connections.start_link({name, [checkin_timeout: 150]}) +    {:ok, _} = Registry.start_link(keys: :unique, name: Pleroma.GunMock) + +    on_exit(fn -> +      if Process.alive?(pid), do: GenServer.stop(name) +    end) + +    {:ok, name: name} +  end + +  defp open_mock(num \\ 1) do +    GunMock +    |> expect(:open, num, &start_and_register(&1, &2, &3)) +    |> expect(:await_up, num, fn _, _ -> {:ok, :http} end) +    |> expect(:set_owner, num, fn _, _ -> :ok end) +  end + +  defp connect_mock(mock) do +    mock +    |> expect(:connect, &connect(&1, &2)) +    |> expect(:await, &await(&1, &2)) +  end + +  defp info_mock(mock), do: expect(mock, :info, &info(&1)) + +  defp start_and_register('gun-not-up.com', _, _), do: {:error, :timeout} + +  defp start_and_register(host, port, _) do +    {:ok, pid} = Task.start_link(fn -> Process.sleep(1000) end) + +    scheme = +      case port do +        443 -> "https" +        _ -> "http" +      end + +    Registry.register(GunMock, pid, %{ +      origin_scheme: scheme, +      origin_host: host, +      origin_port: port +    }) + +    {:ok, pid} +  end + +  defp info(pid) do +    [{_, info}] = Registry.lookup(GunMock, pid) +    info +  end + +  defp connect(pid, _) do +    ref = make_ref() +    Registry.register(GunMock, ref, pid) +    ref +  end + +  defp await(pid, ref) do +    [{_, ^pid}] = Registry.lookup(GunMock, ref) +    {:response, :fin, 200, []} +  end + +  defp now, do: :os.system_time(:second) + +  describe "alive?/2" do +    test "is alive", %{name: name} do +      assert Connections.alive?(name) +    end + +    test "returns false if not started" do +      refute Connections.alive?(:some_random_name) +    end +  end + +  test "opens connection and reuse it on next request", %{name: name} do +    open_mock() +    url = "http://some-domain.com" +    key = "http:some-domain.com:80" +    refute Connections.checkin(url, name) +    :ok = Conn.open(url, name) + +    conn = Connections.checkin(url, name) +    assert is_pid(conn) +    assert Process.alive?(conn) + +    self = self() + +    %Connections{ +      conns: %{ +        ^key => %Conn{ +          conn: ^conn, +          gun_state: :up, +          used_by: [{^self, _}], +          conn_state: :active +        } +      } +    } = Connections.get_state(name) + +    reused_conn = Connections.checkin(url, name) + +    assert conn == reused_conn + +    %Connections{ +      conns: %{ +        ^key => %Conn{ +          conn: ^conn, +          gun_state: :up, +          used_by: [{^self, _}, {^self, _}], +          conn_state: :active +        } +      } +    } = Connections.get_state(name) + +    :ok = Connections.checkout(conn, self, name) + +    %Connections{ +      conns: %{ +        ^key => %Conn{ +          conn: ^conn, +          gun_state: :up, +          used_by: [{^self, _}], +          conn_state: :active +        } +      } +    } = Connections.get_state(name) + +    :ok = Connections.checkout(conn, self, name) + +    %Connections{ +      conns: %{ +        ^key => %Conn{ +          conn: ^conn, +          gun_state: :up, +          used_by: [], +          conn_state: :idle +        } +      } +    } = Connections.get_state(name) +  end + +  test "reuse connection for idna domains", %{name: name} do +    open_mock() +    url = "http://ですsome-domain.com" +    refute Connections.checkin(url, name) + +    :ok = Conn.open(url, name) + +    conn = Connections.checkin(url, name) +    assert is_pid(conn) +    assert Process.alive?(conn) + +    self = self() + +    %Connections{ +      conns: %{ +        "http:ですsome-domain.com:80" => %Conn{ +          conn: ^conn, +          gun_state: :up, +          used_by: [{^self, _}], +          conn_state: :active +        } +      } +    } = Connections.get_state(name) + +    reused_conn = Connections.checkin(url, name) + +    assert conn == reused_conn +  end + +  test "reuse for ipv4", %{name: name} do +    open_mock() +    url = "http://127.0.0.1" + +    refute Connections.checkin(url, name) + +    :ok = Conn.open(url, name) + +    conn = Connections.checkin(url, name) +    assert is_pid(conn) +    assert Process.alive?(conn) + +    self = self() + +    %Connections{ +      conns: %{ +        "http:127.0.0.1:80" => %Conn{ +          conn: ^conn, +          gun_state: :up, +          used_by: [{^self, _}], +          conn_state: :active +        } +      } +    } = Connections.get_state(name) + +    reused_conn = Connections.checkin(url, name) + +    assert conn == reused_conn + +    :ok = Connections.checkout(conn, self, name) +    :ok = Connections.checkout(reused_conn, self, name) + +    %Connections{ +      conns: %{ +        "http:127.0.0.1:80" => %Conn{ +          conn: ^conn, +          gun_state: :up, +          used_by: [], +          conn_state: :idle +        } +      } +    } = Connections.get_state(name) +  end + +  test "reuse for ipv6", %{name: name} do +    open_mock() +    url = "http://[2a03:2880:f10c:83:face:b00c:0:25de]" + +    refute Connections.checkin(url, name) + +    :ok = Conn.open(url, name) + +    conn = Connections.checkin(url, name) +    assert is_pid(conn) +    assert Process.alive?(conn) + +    self = self() + +    %Connections{ +      conns: %{ +        "http:2a03:2880:f10c:83:face:b00c:0:25de:80" => %Conn{ +          conn: ^conn, +          gun_state: :up, +          used_by: [{^self, _}], +          conn_state: :active +        } +      } +    } = Connections.get_state(name) + +    reused_conn = Connections.checkin(url, name) + +    assert conn == reused_conn +  end + +  test "up and down ipv4", %{name: name} do +    open_mock() +    |> info_mock() +    |> allow(self(), name) + +    self = self() +    url = "http://127.0.0.1" +    :ok = Conn.open(url, name) +    conn = Connections.checkin(url, name) +    send(name, {:gun_down, conn, nil, nil, nil}) +    send(name, {:gun_up, conn, nil}) + +    %Connections{ +      conns: %{ +        "http:127.0.0.1:80" => %Conn{ +          conn: ^conn, +          gun_state: :up, +          used_by: [{^self, _}], +          conn_state: :active +        } +      } +    } = Connections.get_state(name) +  end + +  test "up and down ipv6", %{name: name} do +    self = self() + +    open_mock() +    |> info_mock() +    |> allow(self, name) + +    url = "http://[2a03:2880:f10c:83:face:b00c:0:25de]" +    :ok = Conn.open(url, name) +    conn = Connections.checkin(url, name) +    send(name, {:gun_down, conn, nil, nil, nil}) +    send(name, {:gun_up, conn, nil}) + +    %Connections{ +      conns: %{ +        "http:2a03:2880:f10c:83:face:b00c:0:25de:80" => %Conn{ +          conn: ^conn, +          gun_state: :up, +          used_by: [{^self, _}], +          conn_state: :active +        } +      } +    } = Connections.get_state(name) +  end + +  test "reuses connection based on protocol", %{name: name} do +    open_mock(2) +    http_url = "http://some-domain.com" +    http_key = "http:some-domain.com:80" +    https_url = "https://some-domain.com" +    https_key = "https:some-domain.com:443" + +    refute Connections.checkin(http_url, name) +    :ok = Conn.open(http_url, name) +    conn = Connections.checkin(http_url, name) +    assert is_pid(conn) +    assert Process.alive?(conn) + +    refute Connections.checkin(https_url, name) +    :ok = Conn.open(https_url, name) +    https_conn = Connections.checkin(https_url, name) + +    refute conn == https_conn + +    reused_https = Connections.checkin(https_url, name) + +    refute conn == reused_https + +    assert reused_https == https_conn + +    %Connections{ +      conns: %{ +        ^http_key => %Conn{ +          conn: ^conn, +          gun_state: :up +        }, +        ^https_key => %Conn{ +          conn: ^https_conn, +          gun_state: :up +        } +      } +    } = Connections.get_state(name) +  end + +  test "connection can't get up", %{name: name} do +    expect(GunMock, :open, &start_and_register(&1, &2, &3)) +    url = "http://gun-not-up.com" + +    assert capture_log(fn -> +             refute Conn.open(url, name) +             refute Connections.checkin(url, name) +           end) =~ +             "Opening connection to http://gun-not-up.com failed with error {:error, :timeout}" +  end + +  test "process gun_down message and then gun_up", %{name: name} do +    self = self() + +    open_mock() +    |> info_mock() +    |> allow(self, name) + +    url = "http://gun-down-and-up.com" +    key = "http:gun-down-and-up.com:80" +    :ok = Conn.open(url, name) +    conn = Connections.checkin(url, name) + +    assert is_pid(conn) +    assert Process.alive?(conn) + +    %Connections{ +      conns: %{ +        ^key => %Conn{ +          conn: ^conn, +          gun_state: :up, +          used_by: [{^self, _}] +        } +      } +    } = Connections.get_state(name) + +    send(name, {:gun_down, conn, :http, nil, nil}) + +    %Connections{ +      conns: %{ +        ^key => %Conn{ +          conn: ^conn, +          gun_state: :down, +          used_by: [{^self, _}] +        } +      } +    } = Connections.get_state(name) + +    send(name, {:gun_up, conn, :http}) + +    conn2 = Connections.checkin(url, name) +    assert conn == conn2 + +    assert is_pid(conn2) +    assert Process.alive?(conn2) + +    %Connections{ +      conns: %{ +        ^key => %Conn{ +          conn: _, +          gun_state: :up, +          used_by: [{^self, _}, {^self, _}] +        } +      } +    } = Connections.get_state(name) +  end + +  test "async processes get same conn for same domain", %{name: name} do +    open_mock() +    url = "http://some-domain.com" +    :ok = Conn.open(url, name) + +    tasks = +      for _ <- 1..5 do +        Task.async(fn -> +          Connections.checkin(url, name) +        end) +      end + +    tasks_with_results = Task.yield_many(tasks) + +    results = +      Enum.map(tasks_with_results, fn {task, res} -> +        res || Task.shutdown(task, :brutal_kill) +      end) + +    conns = for {:ok, value} <- results, do: value + +    %Connections{ +      conns: %{ +        "http:some-domain.com:80" => %Conn{ +          conn: conn, +          gun_state: :up +        } +      } +    } = Connections.get_state(name) + +    assert Enum.all?(conns, fn res -> res == conn end) +  end + +  test "remove frequently used and idle", %{name: name} do +    open_mock(3) +    self = self() +    http_url = "http://some-domain.com" +    https_url = "https://some-domain.com" +    :ok = Conn.open(https_url, name) +    :ok = Conn.open(http_url, name) + +    conn1 = Connections.checkin(https_url, name) + +    [conn2 | _conns] = +      for _ <- 1..4 do +        Connections.checkin(http_url, name) +      end + +    http_key = "http:some-domain.com:80" + +    %Connections{ +      conns: %{ +        ^http_key => %Conn{ +          conn: ^conn2, +          gun_state: :up, +          conn_state: :active, +          used_by: [{^self, _}, {^self, _}, {^self, _}, {^self, _}] +        }, +        "https:some-domain.com:443" => %Conn{ +          conn: ^conn1, +          gun_state: :up, +          conn_state: :active, +          used_by: [{^self, _}] +        } +      } +    } = Connections.get_state(name) + +    :ok = Connections.checkout(conn1, self, name) + +    another_url = "http://another-domain.com" +    :ok = Conn.open(another_url, name) +    conn = Connections.checkin(another_url, name) + +    %Connections{ +      conns: %{ +        "http:another-domain.com:80" => %Conn{ +          conn: ^conn, +          gun_state: :up +        }, +        ^http_key => %Conn{ +          conn: _, +          gun_state: :up +        } +      } +    } = Connections.get_state(name) +  end + +  describe "with proxy" do +    test "as ip", %{name: name} do +      open_mock() +      |> connect_mock() + +      url = "http://proxy-string.com" +      key = "http:proxy-string.com:80" +      :ok = Conn.open(url, name, proxy: {{127, 0, 0, 1}, 8123}) + +      conn = Connections.checkin(url, name) + +      %Connections{ +        conns: %{ +          ^key => %Conn{ +            conn: ^conn, +            gun_state: :up +          } +        } +      } = Connections.get_state(name) + +      reused_conn = Connections.checkin(url, name) + +      assert reused_conn == conn +    end + +    test "as host", %{name: name} do +      open_mock() +      |> connect_mock() + +      url = "http://proxy-tuple-atom.com" +      :ok = Conn.open(url, name, proxy: {'localhost', 9050}) +      conn = Connections.checkin(url, name) + +      %Connections{ +        conns: %{ +          "http:proxy-tuple-atom.com:80" => %Conn{ +            conn: ^conn, +            gun_state: :up +          } +        } +      } = Connections.get_state(name) + +      reused_conn = Connections.checkin(url, name) + +      assert reused_conn == conn +    end + +    test "as ip and ssl", %{name: name} do +      open_mock() +      |> connect_mock() + +      url = "https://proxy-string.com" + +      :ok = Conn.open(url, name, proxy: {{127, 0, 0, 1}, 8123}) +      conn = Connections.checkin(url, name) + +      %Connections{ +        conns: %{ +          "https:proxy-string.com:443" => %Conn{ +            conn: ^conn, +            gun_state: :up +          } +        } +      } = Connections.get_state(name) + +      reused_conn = Connections.checkin(url, name) + +      assert reused_conn == conn +    end + +    test "as host and ssl", %{name: name} do +      open_mock() +      |> connect_mock() + +      url = "https://proxy-tuple-atom.com" +      :ok = Conn.open(url, name, proxy: {'localhost', 9050}) +      conn = Connections.checkin(url, name) + +      %Connections{ +        conns: %{ +          "https:proxy-tuple-atom.com:443" => %Conn{ +            conn: ^conn, +            gun_state: :up +          } +        } +      } = Connections.get_state(name) + +      reused_conn = Connections.checkin(url, name) + +      assert reused_conn == conn +    end + +    test "with socks type", %{name: name} do +      open_mock() + +      url = "http://proxy-socks.com" + +      :ok = Conn.open(url, name, proxy: {:socks5, 'localhost', 1234}) + +      conn = Connections.checkin(url, name) + +      %Connections{ +        conns: %{ +          "http:proxy-socks.com:80" => %Conn{ +            conn: ^conn, +            gun_state: :up +          } +        } +      } = Connections.get_state(name) + +      reused_conn = Connections.checkin(url, name) + +      assert reused_conn == conn +    end + +    test "with socks4 type and ssl", %{name: name} do +      open_mock() +      url = "https://proxy-socks.com" + +      :ok = Conn.open(url, name, proxy: {:socks4, 'localhost', 1234}) + +      conn = Connections.checkin(url, name) + +      %Connections{ +        conns: %{ +          "https:proxy-socks.com:443" => %Conn{ +            conn: ^conn, +            gun_state: :up +          } +        } +      } = Connections.get_state(name) + +      reused_conn = Connections.checkin(url, name) + +      assert reused_conn == conn +    end +  end + +  describe "crf/3" do +    setup do +      crf = Connections.crf(1, 10, 1) +      {:ok, crf: crf} +    end + +    test "more used will have crf higher", %{crf: crf} do +      # used 3 times +      crf1 = Connections.crf(1, 10, crf) +      crf1 = Connections.crf(1, 10, crf1) + +      # used 2 times +      crf2 = Connections.crf(1, 10, crf) + +      assert crf1 > crf2 +    end + +    test "recently used will have crf higher on equal references", %{crf: crf} do +      # used 3 sec ago +      crf1 = Connections.crf(3, 10, crf) + +      # used 4 sec ago +      crf2 = Connections.crf(4, 10, crf) + +      assert crf1 > crf2 +    end + +    test "equal crf on equal reference and time", %{crf: crf} do +      # used 2 times +      crf1 = Connections.crf(1, 10, crf) + +      # used 2 times +      crf2 = Connections.crf(1, 10, crf) + +      assert crf1 == crf2 +    end + +    test "recently used will have higher crf", %{crf: crf} do +      crf1 = Connections.crf(2, 10, crf) +      crf1 = Connections.crf(1, 10, crf1) + +      crf2 = Connections.crf(3, 10, crf) +      crf2 = Connections.crf(4, 10, crf2) +      assert crf1 > crf2 +    end +  end + +  describe "get_unused_conns/1" do +    test "crf is equalent, sorting by reference", %{name: name} do +      Connections.add_conn(name, "1", %Conn{ +        conn_state: :idle, +        last_reference: now() - 1 +      }) + +      Connections.add_conn(name, "2", %Conn{ +        conn_state: :idle, +        last_reference: now() +      }) + +      assert [{"1", _unused_conn} | _others] = Connections.get_unused_conns(name) +    end + +    test "reference is equalent, sorting by crf", %{name: name} do +      Connections.add_conn(name, "1", %Conn{ +        conn_state: :idle, +        crf: 1.999 +      }) + +      Connections.add_conn(name, "2", %Conn{ +        conn_state: :idle, +        crf: 2 +      }) + +      assert [{"1", _unused_conn} | _others] = Connections.get_unused_conns(name) +    end + +    test "higher crf and lower reference", %{name: name} do +      Connections.add_conn(name, "1", %Conn{ +        conn_state: :idle, +        crf: 3, +        last_reference: now() - 1 +      }) + +      Connections.add_conn(name, "2", %Conn{ +        conn_state: :idle, +        crf: 2, +        last_reference: now() +      }) + +      assert [{"2", _unused_conn} | _others] = Connections.get_unused_conns(name) +    end + +    test "lower crf and lower reference", %{name: name} do +      Connections.add_conn(name, "1", %Conn{ +        conn_state: :idle, +        crf: 1.99, +        last_reference: now() - 1 +      }) + +      Connections.add_conn(name, "2", %Conn{ +        conn_state: :idle, +        crf: 2, +        last_reference: now() +      }) + +      assert [{"1", _unused_conn} | _others] = Connections.get_unused_conns(name) +    end +  end + +  test "count/1" do +    name = :test_count +    {:ok, _} = Connections.start_link({name, [checkin_timeout: 150]}) +    assert Connections.count(name) == 0 +    Connections.add_conn(name, "1", %Conn{conn: self()}) +    assert Connections.count(name) == 1 +    Connections.remove_conn(name, "1") +    assert Connections.count(name) == 0 +  end +end diff --git a/test/reverse_proxy_test.exs b/test/reverse_proxy/reverse_proxy_test.exs index 87c6aca4e..c677066b3 100644 --- a/test/reverse_proxy_test.exs +++ b/test/reverse_proxy/reverse_proxy_test.exs @@ -4,13 +4,16 @@  defmodule Pleroma.ReverseProxyTest do    use Pleroma.Web.ConnCase, async: true +    import ExUnit.CaptureLog    import Mox +    alias Pleroma.ReverseProxy    alias Pleroma.ReverseProxy.ClientMock +  alias Plug.Conn    setup_all do -    {:ok, _} = Registry.start_link(keys: :unique, name: Pleroma.ReverseProxy.ClientMock) +    {:ok, _} = Registry.start_link(keys: :unique, name: ClientMock)      :ok    end @@ -21,7 +24,7 @@ defmodule Pleroma.ReverseProxyTest do      ClientMock      |> expect(:request, fn :get, url, _, _, _ -> -      Registry.register(Pleroma.ReverseProxy.ClientMock, url, 0) +      Registry.register(ClientMock, url, 0)        {:ok, 200,         [ @@ -29,14 +32,14 @@ defmodule Pleroma.ReverseProxyTest do           {"content-length", byte_size(json) |> to_string()}         ], %{url: url}}      end) -    |> expect(:stream_body, invokes, fn %{url: url} -> -      case Registry.lookup(Pleroma.ReverseProxy.ClientMock, url) do +    |> expect(:stream_body, invokes, fn %{url: url} = client -> +      case Registry.lookup(ClientMock, url) do          [{_, 0}] -> -          Registry.update_value(Pleroma.ReverseProxy.ClientMock, url, &(&1 + 1)) -          {:ok, json} +          Registry.update_value(ClientMock, url, &(&1 + 1)) +          {:ok, json, client}          [{_, 1}] -> -          Registry.unregister(Pleroma.ReverseProxy.ClientMock, url) +          Registry.unregister(ClientMock, url)            :done        end      end) @@ -78,7 +81,39 @@ defmodule Pleroma.ReverseProxyTest do      assert conn.halted    end -  describe "max_body " do +  defp stream_mock(invokes, with_close? \\ false) do +    ClientMock +    |> expect(:request, fn :get, "/stream-bytes/" <> length, _, _, _ -> +      Registry.register(ClientMock, "/stream-bytes/" <> length, 0) + +      {:ok, 200, [{"content-type", "application/octet-stream"}], +       %{url: "/stream-bytes/" <> length}} +    end) +    |> expect(:stream_body, invokes, fn %{url: "/stream-bytes/" <> length} = client -> +      max = String.to_integer(length) + +      case Registry.lookup(ClientMock, "/stream-bytes/" <> length) do +        [{_, current}] when current < max -> +          Registry.update_value( +            ClientMock, +            "/stream-bytes/" <> length, +            &(&1 + 10) +          ) + +          {:ok, "0123456789", client} + +        [{_, ^max}] -> +          Registry.unregister(ClientMock, "/stream-bytes/" <> length) +          :done +      end +    end) + +    if with_close? do +      expect(ClientMock, :close, fn _ -> :ok end) +    end +  end + +  describe "max_body" do      test "length returns error if content-length more than option", %{conn: conn} do        user_agent_mock("hackney/1.15.1", 0) @@ -94,38 +129,6 @@ defmodule Pleroma.ReverseProxyTest do               end) == ""      end -    defp stream_mock(invokes, with_close? \\ false) do -      ClientMock -      |> expect(:request, fn :get, "/stream-bytes/" <> length, _, _, _ -> -        Registry.register(Pleroma.ReverseProxy.ClientMock, "/stream-bytes/" <> length, 0) - -        {:ok, 200, [{"content-type", "application/octet-stream"}], -         %{url: "/stream-bytes/" <> length}} -      end) -      |> expect(:stream_body, invokes, fn %{url: "/stream-bytes/" <> length} -> -        max = String.to_integer(length) - -        case Registry.lookup(Pleroma.ReverseProxy.ClientMock, "/stream-bytes/" <> length) do -          [{_, current}] when current < max -> -            Registry.update_value( -              Pleroma.ReverseProxy.ClientMock, -              "/stream-bytes/" <> length, -              &(&1 + 10) -            ) - -            {:ok, "0123456789"} - -          [{_, ^max}] -> -            Registry.unregister(Pleroma.ReverseProxy.ClientMock, "/stream-bytes/" <> length) -            :done -        end -      end) - -      if with_close? do -        expect(ClientMock, :close, fn _ -> :ok end) -      end -    end -      test "max_body_length returns error if streaming body more than that option", %{conn: conn} do        stream_mock(3, true) @@ -214,24 +217,24 @@ defmodule Pleroma.ReverseProxyTest do      conn = ReverseProxy.call(conn, "/stream-bytes/200")      assert conn.state == :chunked      assert byte_size(conn.resp_body) == 200 -    assert Plug.Conn.get_resp_header(conn, "content-type") == ["application/octet-stream"] +    assert Conn.get_resp_header(conn, "content-type") == ["application/octet-stream"]    end    defp headers_mock(_) do      ClientMock      |> expect(:request, fn :get, "/headers", headers, _, _ -> -      Registry.register(Pleroma.ReverseProxy.ClientMock, "/headers", 0) +      Registry.register(ClientMock, "/headers", 0)        {:ok, 200, [{"content-type", "application/json"}], %{url: "/headers", headers: headers}}      end) -    |> expect(:stream_body, 2, fn %{url: url, headers: headers} -> -      case Registry.lookup(Pleroma.ReverseProxy.ClientMock, url) do +    |> expect(:stream_body, 2, fn %{url: url, headers: headers} = client -> +      case Registry.lookup(ClientMock, url) do          [{_, 0}] -> -          Registry.update_value(Pleroma.ReverseProxy.ClientMock, url, &(&1 + 1)) +          Registry.update_value(ClientMock, url, &(&1 + 1))            headers = for {k, v} <- headers, into: %{}, do: {String.capitalize(k), v} -          {:ok, Jason.encode!(%{headers: headers})} +          {:ok, Jason.encode!(%{headers: headers}), client}          [{_, 1}] -> -          Registry.unregister(Pleroma.ReverseProxy.ClientMock, url) +          Registry.unregister(ClientMock, url)            :done        end      end) @@ -244,7 +247,7 @@ defmodule Pleroma.ReverseProxyTest do      test "header passes", %{conn: conn} do        conn = -        Plug.Conn.put_req_header( +        Conn.put_req_header(            conn,            "accept",            "text/html" @@ -257,7 +260,7 @@ defmodule Pleroma.ReverseProxyTest do      test "header is filtered", %{conn: conn} do        conn = -        Plug.Conn.put_req_header( +        Conn.put_req_header(            conn,            "accept-language",            "en-US" @@ -290,18 +293,18 @@ defmodule Pleroma.ReverseProxyTest do    defp disposition_headers_mock(headers) do      ClientMock      |> expect(:request, fn :get, "/disposition", _, _, _ -> -      Registry.register(Pleroma.ReverseProxy.ClientMock, "/disposition", 0) +      Registry.register(ClientMock, "/disposition", 0)        {:ok, 200, headers, %{url: "/disposition"}}      end) -    |> expect(:stream_body, 2, fn %{url: "/disposition"} -> -      case Registry.lookup(Pleroma.ReverseProxy.ClientMock, "/disposition") do +    |> expect(:stream_body, 2, fn %{url: "/disposition"} = client -> +      case Registry.lookup(ClientMock, "/disposition") do          [{_, 0}] -> -          Registry.update_value(Pleroma.ReverseProxy.ClientMock, "/disposition", &(&1 + 1)) -          {:ok, ""} +          Registry.update_value(ClientMock, "/disposition", &(&1 + 1)) +          {:ok, "", client}          [{_, 1}] -> -          Registry.unregister(Pleroma.ReverseProxy.ClientMock, "/disposition") +          Registry.unregister(ClientMock, "/disposition")            :done        end      end) diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index e72638814..8a09e089b 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -107,7 +107,7 @@ defmodule HttpRequestMock do          "https://osada.macgirvin.com/.well-known/webfinger?resource=acct:mike@osada.macgirvin.com",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -120,7 +120,7 @@ defmodule HttpRequestMock do          "https://social.heldscal.la/.well-known/webfinger?resource=https://social.heldscal.la/user/29191",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -141,7 +141,7 @@ defmodule HttpRequestMock do          "https://pawoo.net/.well-known/webfinger?resource=acct:https://pawoo.net/users/pekorino",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -167,7 +167,7 @@ defmodule HttpRequestMock do          "https://social.stopwatchingus-heidelberg.de/.well-known/webfinger?resource=acct:https://social.stopwatchingus-heidelberg.de/user/18330",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -188,7 +188,7 @@ defmodule HttpRequestMock do          "https://mamot.fr/.well-known/webfinger?resource=acct:https://mamot.fr/users/Skruyb",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -201,7 +201,7 @@ defmodule HttpRequestMock do          "https://social.heldscal.la/.well-known/webfinger?resource=nonexistant@social.heldscal.la",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -214,7 +214,7 @@ defmodule HttpRequestMock do          "https://squeet.me/xrd/?uri=lain@squeet.me",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -227,7 +227,7 @@ defmodule HttpRequestMock do          "https://mst3k.interlinked.me/users/luciferMysticus",          _,          _, -        Accept: "application/activity+json" +        [{"accept", "application/activity+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -248,7 +248,7 @@ defmodule HttpRequestMock do          "https://hubzilla.example.org/channel/kaniini",          _,          _, -        Accept: "application/activity+json" +        [{"accept", "application/activity+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -257,7 +257,7 @@ defmodule HttpRequestMock do       }}    end -  def get("https://niu.moe/users/rye", _, _, Accept: "application/activity+json") do +  def get("https://niu.moe/users/rye", _, _, [{"accept", "application/activity+json"}]) do      {:ok,       %Tesla.Env{         status: 200, @@ -265,7 +265,7 @@ defmodule HttpRequestMock do       }}    end -  def get("https://n1u.moe/users/rye", _, _, Accept: "application/activity+json") do +  def get("https://n1u.moe/users/rye", _, _, [{"accept", "application/activity+json"}]) do      {:ok,       %Tesla.Env{         status: 200, @@ -284,7 +284,7 @@ defmodule HttpRequestMock do       }}    end -  def get("https://puckipedia.com/", _, _, Accept: "application/activity+json") do +  def get("https://puckipedia.com/", _, _, [{"accept", "application/activity+json"}]) do      {:ok,       %Tesla.Env{         status: 200, @@ -308,9 +308,9 @@ defmodule HttpRequestMock do       }}    end -  def get("https://mobilizon.org/events/252d5816-00a3-4a89-a66f-15bf65c33e39", _, _, -        Accept: "application/activity+json" -      ) do +  def get("https://mobilizon.org/events/252d5816-00a3-4a89-a66f-15bf65c33e39", _, _, [ +        {"accept", "application/activity+json"} +      ]) do      {:ok,       %Tesla.Env{         status: 200, @@ -318,7 +318,7 @@ defmodule HttpRequestMock do       }}    end -  def get("https://mobilizon.org/@tcit", _, _, Accept: "application/activity+json") do +  def get("https://mobilizon.org/@tcit", _, _, [{"accept", "application/activity+json"}]) do      {:ok,       %Tesla.Env{         status: 200, @@ -358,7 +358,7 @@ defmodule HttpRequestMock do       }}    end -  def get("http://mastodon.example.org/users/admin", _, _, Accept: "application/activity+json") do +  def get("http://mastodon.example.org/users/admin", _, _, _) do      {:ok,       %Tesla.Env{         status: 200, @@ -366,7 +366,9 @@ defmodule HttpRequestMock do       }}    end -  def get("http://mastodon.example.org/users/relay", _, _, Accept: "application/activity+json") do +  def get("http://mastodon.example.org/users/relay", _, _, [ +        {"accept", "application/activity+json"} +      ]) do      {:ok,       %Tesla.Env{         status: 200, @@ -374,7 +376,9 @@ defmodule HttpRequestMock do       }}    end -  def get("http://mastodon.example.org/users/gargron", _, _, Accept: "application/activity+json") do +  def get("http://mastodon.example.org/users/gargron", _, _, [ +        {"accept", "application/activity+json"} +      ]) do      {:error, :nxdomain}    end @@ -557,7 +561,7 @@ defmodule HttpRequestMock do          "http://mastodon.example.org/@admin/99541947525187367",          _,          _, -        Accept: "application/activity+json" +        _        ) do      {:ok,       %Tesla.Env{ @@ -582,7 +586,7 @@ defmodule HttpRequestMock do       }}    end -  def get("https://mstdn.io/users/mayuutann", _, _, Accept: "application/activity+json") do +  def get("https://mstdn.io/users/mayuutann", _, _, [{"accept", "application/activity+json"}]) do      {:ok,       %Tesla.Env{         status: 200, @@ -594,7 +598,7 @@ defmodule HttpRequestMock do          "https://mstdn.io/users/mayuutann/statuses/99568293732299394",          _,          _, -        Accept: "application/activity+json" +        [{"accept", "application/activity+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -614,7 +618,7 @@ defmodule HttpRequestMock do       }}    end -  def get(url, _, _, Accept: "application/xrd+xml,application/jrd+json") +  def get(url, _, _, [{"accept", "application/xrd+xml,application/jrd+json"}])        when url in [               "https://pleroma.soykaf.com/.well-known/webfinger?resource=acct:https://pleroma.soykaf.com/users/lain",               "https://pleroma.soykaf.com/.well-known/webfinger?resource=https://pleroma.soykaf.com/users/lain" @@ -641,7 +645,7 @@ defmodule HttpRequestMock do          "https://shitposter.club/.well-known/webfinger?resource=https://shitposter.club/user/1",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -685,7 +689,7 @@ defmodule HttpRequestMock do          "https://shitposter.club/.well-known/webfinger?resource=https://shitposter.club/user/5381",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -738,7 +742,7 @@ defmodule HttpRequestMock do          "https://social.sakamoto.gq/.well-known/webfinger?resource=https://social.sakamoto.gq/users/eal",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -751,7 +755,7 @@ defmodule HttpRequestMock do          "https://social.sakamoto.gq/objects/0ccc1a2c-66b0-4305-b23a-7f7f2b040056",          _,          _, -        Accept: "application/atom+xml" +        [{"accept", "application/atom+xml"}]        ) do      {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/sakamoto.atom")}}    end @@ -768,7 +772,7 @@ defmodule HttpRequestMock do          "https://mastodon.social/.well-known/webfinger?resource=https://mastodon.social/users/lambadalambda",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -790,7 +794,7 @@ defmodule HttpRequestMock do          "http://gs.example.org/.well-known/webfinger?resource=http://gs.example.org:4040/index.php/user/1",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -804,7 +808,7 @@ defmodule HttpRequestMock do          "http://gs.example.org:4040/index.php/user/1",          _,          _, -        Accept: "application/activity+json" +        [{"accept", "application/activity+json"}]        ) do      {:ok, %Tesla.Env{status: 406, body: ""}}    end @@ -840,7 +844,7 @@ defmodule HttpRequestMock do          "https://squeet.me/xrd?uri=lain@squeet.me",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -853,7 +857,7 @@ defmodule HttpRequestMock do          "https://social.heldscal.la/.well-known/webfinger?resource=shp@social.heldscal.la",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -866,7 +870,7 @@ defmodule HttpRequestMock do          "https://social.heldscal.la/.well-known/webfinger?resource=invalid_content@social.heldscal.la",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok, %Tesla.Env{status: 200, body: ""}}    end @@ -883,7 +887,7 @@ defmodule HttpRequestMock do          "http://framatube.org/main/xrd?uri=framasoft@framatube.org",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -905,7 +909,7 @@ defmodule HttpRequestMock do          "http://gnusocial.de/main/xrd?uri=winterdienst@gnusocial.de",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -942,7 +946,7 @@ defmodule HttpRequestMock do          "https://gerzilla.de/xrd/?uri=kaniini@gerzilla.de",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -1005,7 +1009,7 @@ defmodule HttpRequestMock do       %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/osada-user-indio.json")}}    end -  def get("https://social.heldscal.la/user/23211", _, _, Accept: "application/activity+json") do +  def get("https://social.heldscal.la/user/23211", _, _, [{"accept", "application/activity+json"}]) do      {:ok, Tesla.Mock.json(%{"id" => "https://social.heldscal.la/user/23211"}, status: 200)}    end @@ -1138,7 +1142,7 @@ defmodule HttpRequestMock do          "https://zetsubou.xn--q9jyb4c/.well-known/webfinger?resource=lain@zetsubou.xn--q9jyb4c",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -1151,7 +1155,7 @@ defmodule HttpRequestMock do          "https://zetsubou.xn--q9jyb4c/.well-known/webfinger?resource=https://zetsubou.xn--q9jyb4c/users/lain",          _,          _, -        Accept: "application/xrd+xml,application/jrd+json" +        [{"accept", "application/xrd+xml,application/jrd+json"}]        ) do      {:ok,       %Tesla.Env{ @@ -1173,7 +1177,9 @@ defmodule HttpRequestMock do       }}    end -  def get("https://info.pleroma.site/activity.json", _, _, Accept: "application/activity+json") do +  def get("https://info.pleroma.site/activity.json", _, _, [ +        {"accept", "application/activity+json"} +      ]) do      {:ok,       %Tesla.Env{         status: 200, @@ -1185,7 +1191,9 @@ defmodule HttpRequestMock do      {:ok, %Tesla.Env{status: 404, body: ""}}    end -  def get("https://info.pleroma.site/activity2.json", _, _, Accept: "application/activity+json") do +  def get("https://info.pleroma.site/activity2.json", _, _, [ +        {"accept", "application/activity+json"} +      ]) do      {:ok,       %Tesla.Env{         status: 200, @@ -1197,7 +1205,9 @@ defmodule HttpRequestMock do      {:ok, %Tesla.Env{status: 404, body: ""}}    end -  def get("https://info.pleroma.site/activity3.json", _, _, Accept: "application/activity+json") do +  def get("https://info.pleroma.site/activity3.json", _, _, [ +        {"accept", "application/activity+json"} +      ]) do      {:ok,       %Tesla.Env{         status: 200, diff --git a/test/test_helper.exs b/test/test_helper.exs index 6b91d2b46..ee880e226 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -6,7 +6,10 @@ os_exclude = if :os.type() == {:unix, :darwin}, do: [skip_on_mac: true], else: [  ExUnit.start(exclude: [:federated | os_exclude])  Ecto.Adapters.SQL.Sandbox.mode(Pleroma.Repo, :manual) +  Mox.defmock(Pleroma.ReverseProxy.ClientMock, for: Pleroma.ReverseProxy.Client) +Mox.defmock(Pleroma.GunMock, for: Pleroma.Gun) +  {:ok, _} = Application.ensure_all_started(:ex_machina)  ExUnit.after_suite(fn _results -> diff --git a/test/user_invite_token_test.exs b/test/user_invite_token_test.exs index 4f70ef337..63f18f13c 100644 --- a/test/user_invite_token_test.exs +++ b/test/user_invite_token_test.exs @@ -4,7 +4,6 @@  defmodule Pleroma.UserInviteTokenTest do    use ExUnit.Case, async: true -  use Pleroma.DataCase    alias Pleroma.UserInviteToken    describe "valid_invite?/1 one time invites" do @@ -64,7 +63,6 @@ defmodule Pleroma.UserInviteTokenTest do      test "expires yesterday returns false", %{invite: invite} do        invite = %{invite | expires_at: Date.add(Date.utc_today(), -1)} -      invite = Repo.insert!(invite)        refute UserInviteToken.valid_invite?(invite)      end    end @@ -82,7 +80,6 @@ defmodule Pleroma.UserInviteTokenTest do      test "overdue date and less uses returns false", %{invite: invite} do        invite = %{invite | expires_at: Date.add(Date.utc_today(), -1)} -      invite = Repo.insert!(invite)        refute UserInviteToken.valid_invite?(invite)      end @@ -93,7 +90,6 @@ defmodule Pleroma.UserInviteTokenTest do      test "overdue date with more uses returns false", %{invite: invite} do        invite = %{invite | expires_at: Date.add(Date.utc_today(), -1), uses: 5} -      invite = Repo.insert!(invite)        refute UserInviteToken.valid_invite?(invite)      end    end diff --git a/test/web/activity_pub/mrf/anti_followbot_policy_test.exs b/test/web/activity_pub/mrf/anti_followbot_policy_test.exs index 37a7bfcf7..fca0de7c6 100644 --- a/test/web/activity_pub/mrf/anti_followbot_policy_test.exs +++ b/test/web/activity_pub/mrf/anti_followbot_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.AntiFollowbotPolicyTest do diff --git a/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs b/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs index b524fdd23..1a13699be 100644 --- a/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs +++ b/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do @@ -110,6 +110,15 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do    end    describe "with unknown actors" do +    setup do +      Tesla.Mock.mock(fn +        %{method: :get, url: "http://invalid.actor"} -> +          %Tesla.Env{status: 500, body: ""} +      end) + +      :ok +    end +      test "it rejects posts without links" do        message =          @linkless_message diff --git a/test/web/activity_pub/mrf/ensure_re_prepended_test.exs b/test/web/activity_pub/mrf/ensure_re_prepended_test.exs index dbc8b9e80..38ddec5bb 100644 --- a/test/web/activity_pub/mrf/ensure_re_prepended_test.exs +++ b/test/web/activity_pub/mrf/ensure_re_prepended_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.EnsureRePrependedTest do diff --git a/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs b/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs index 63ed71129..64ea61dd4 100644 --- a/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs +++ b/test/web/activity_pub/mrf/no_placeholder_text_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.NoPlaceholderTextPolicyTest do diff --git a/test/web/activity_pub/mrf/normalize_markup_test.exs b/test/web/activity_pub/mrf/normalize_markup_test.exs index 0207be56b..9b39c45bd 100644 --- a/test/web/activity_pub/mrf/normalize_markup_test.exs +++ b/test/web/activity_pub/mrf/normalize_markup_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.NormalizeMarkupTest do diff --git a/test/web/activity_pub/mrf/object_age_policy_test.exs b/test/web/activity_pub/mrf/object_age_policy_test.exs index 643609da4..e521fae44 100644 --- a/test/web/activity_pub/mrf/object_age_policy_test.exs +++ b/test/web/activity_pub/mrf/object_age_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicyTest do diff --git a/test/web/activity_pub/mrf/reject_non_public_test.exs b/test/web/activity_pub/mrf/reject_non_public_test.exs index fc1d190bb..5cc68bca8 100644 --- a/test/web/activity_pub/mrf/reject_non_public_test.exs +++ b/test/web/activity_pub/mrf/reject_non_public_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublicTest do diff --git a/test/web/activity_pub/mrf/simple_policy_test.exs b/test/web/activity_pub/mrf/simple_policy_test.exs index df0f223f8..e825a1514 100644 --- a/test/web/activity_pub/mrf/simple_policy_test.exs +++ b/test/web/activity_pub/mrf/simple_policy_test.exs @@ -1,5 +1,5 @@  # Pleroma: A lightweight social networking server -# Copyright © 2019 Pleroma Authors <https://pleroma.social/> +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>  # SPDX-License-Identifier: AGPL-3.0-only  defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do diff --git a/test/web/activity_pub/relay_test.exs b/test/web/activity_pub/relay_test.exs index e3115dcd8..12bf90d90 100644 --- a/test/web/activity_pub/relay_test.exs +++ b/test/web/activity_pub/relay_test.exs @@ -89,6 +89,11 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do            }          ) +      Tesla.Mock.mock(fn +        %{method: :get, url: "http://mastodon.example.org/eee/99541947525187367"} -> +          %Tesla.Env{status: 500, body: ""} +      end) +        assert capture_log(fn ->                 assert Relay.publish(activity) == {:error, nil}               end) =~ "[error] error: nil" diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index e4c152fb7..eb29deaed 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -2585,9 +2585,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end      test "common config example", %{conn: conn} do -      adapter = Application.get_env(:tesla, :adapter) -      on_exit(fn -> Application.put_env(:tesla, :adapter, adapter) end) -        conn =          post(conn, "/api/pleroma/admin/config", %{            configs: [ @@ -2600,23 +2597,16 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                  %{"tuple" => [":seconds_valid", 60]},                  %{"tuple" => [":path", ""]},                  %{"tuple" => [":key1", nil]}, -                %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]},                  %{"tuple" => [":regex1", "~r/https:\/\/example.com/"]},                  %{"tuple" => [":regex2", "~r/https:\/\/example.com/u"]},                  %{"tuple" => [":regex3", "~r/https:\/\/example.com/i"]},                  %{"tuple" => [":regex4", "~r/https:\/\/example.com/s"]},                  %{"tuple" => [":name", "Pleroma"]}                ] -            }, -            %{ -              "group" => ":tesla", -              "key" => ":adapter", -              "value" => "Tesla.Adapter.Httpc"              }            ]          }) -      assert Application.get_env(:tesla, :adapter) == Tesla.Adapter.Httpc        assert Config.get([Pleroma.Captcha.NotReal, :name]) == "Pleroma"        assert json_response(conn, 200) == %{ @@ -2630,7 +2620,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                       %{"tuple" => [":seconds_valid", 60]},                       %{"tuple" => [":path", ""]},                       %{"tuple" => [":key1", nil]}, -                     %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]},                       %{"tuple" => [":regex1", "~r/https:\\/\\/example.com/"]},                       %{"tuple" => [":regex2", "~r/https:\\/\\/example.com/u"]},                       %{"tuple" => [":regex3", "~r/https:\\/\\/example.com/i"]}, @@ -2643,19 +2632,12 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do                       ":seconds_valid",                       ":path",                       ":key1", -                     ":partial_chain",                       ":regex1",                       ":regex2",                       ":regex3",                       ":regex4",                       ":name"                     ] -                 }, -                 %{ -                   "group" => ":tesla", -                   "key" => ":adapter", -                   "value" => "Tesla.Adapter.Httpc", -                   "db" => [":adapter"]                   }                 ]               } diff --git a/test/web/common_api/common_api_utils_test.exs b/test/web/common_api/common_api_utils_test.exs index 45fc94522..d383d1714 100644 --- a/test/web/common_api/common_api_utils_test.exs +++ b/test/web/common_api/common_api_utils_test.exs @@ -472,6 +472,13 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do        activity = insert(:note_activity, user: user, note: object)        Pleroma.Repo.delete(object) +      obj_url = activity.data["object"] + +      Tesla.Mock.mock(fn +        %{method: :get, url: ^obj_url} -> +          %Tesla.Env{status: 404, body: ""} +      end) +        assert Utils.maybe_notify_mentioned_recipients(["test-test"], activity) == [                 "test-test"               ] diff --git a/test/web/mastodon_api/controllers/notification_controller_test.exs b/test/web/mastodon_api/controllers/notification_controller_test.exs index d452ddbdd..0f0a060d2 100644 --- a/test/web/mastodon_api/controllers/notification_controller_test.exs +++ b/test/web/mastodon_api/controllers/notification_controller_test.exs @@ -407,11 +407,24 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      assert length(json_response(conn, 200)) == 1    end +  @tag capture_log: true    test "see move notifications with `with_move` parameter" do      old_user = insert(:user)      new_user = insert(:user, also_known_as: [old_user.ap_id])      %{user: follower, conn: conn} = oauth_access(["read:notifications"]) +    old_user_url = old_user.ap_id + +    body = +      File.read!("test/fixtures/users_mock/localhost.json") +      |> String.replace("{{nickname}}", old_user.nickname) +      |> Jason.encode!() + +    Tesla.Mock.mock(fn +      %{method: :get, url: ^old_user_url} -> +        %Tesla.Env{status: 200, body: body} +    end) +      User.follow(follower, old_user)      Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)      Pleroma.Tests.ObanHelpers.perform_all() diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index 4df9c3c03..57e4c8f1e 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -108,11 +108,24 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do               NotificationView.render("index.json", %{notifications: [notification], for: followed})    end +  @tag capture_log: true    test "Move notification" do      old_user = insert(:user)      new_user = insert(:user, also_known_as: [old_user.ap_id])      follower = insert(:user) +    old_user_url = old_user.ap_id + +    body = +      File.read!("test/fixtures/users_mock/localhost.json") +      |> String.replace("{{nickname}}", old_user.nickname) +      |> Jason.encode!() + +    Tesla.Mock.mock(fn +      %{method: :get, url: ^old_user_url} -> +        %Tesla.Env{status: 200, body: body} +    end) +      User.follow(follower, old_user)      Pleroma.Web.ActivityPub.ActivityPub.move(old_user, new_user)      Pleroma.Tests.ObanHelpers.perform_all() diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs index 191895c6f..7df72decb 100644 --- a/test/web/mastodon_api/views/status_view_test.exs +++ b/test/web/mastodon_api/views/status_view_test.exs @@ -92,6 +92,23 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      Repo.delete(user)      Cachex.clear(:user_cache) +    finger_url = +      "https://localhost/.well-known/webfinger?resource=acct:#{user.nickname}@localhost" + +    Tesla.Mock.mock_global(fn +      %{method: :get, url: "http://localhost/.well-known/host-meta"} -> +        %Tesla.Env{status: 404, body: ""} + +      %{method: :get, url: "https://localhost/.well-known/host-meta"} -> +        %Tesla.Env{status: 404, body: ""} + +      %{ +        method: :get, +        url: ^finger_url +      } -> +        %Tesla.Env{status: 404, body: ""} +    end) +      %{account: ms_user} = StatusView.render("show.json", activity: activity)      assert ms_user.acct == "erroruser@example.com" diff --git a/test/web/push/impl_test.exs b/test/web/push/impl_test.exs index 089d55577..9f931c941 100644 --- a/test/web/push/impl_test.exs +++ b/test/web/push/impl_test.exs @@ -134,7 +134,7 @@ defmodule Pleroma.Web.Push.ImplTest do      user = insert(:user, nickname: "Bob")      other_user = insert(:user)      {:ok, _, _, activity} = CommonAPI.follow(user, other_user) -    object = Object.normalize(activity) +    object = Object.normalize(activity, false)      assert Impl.format_body(%{activity: activity}, user, object) == "@Bob has followed you" diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index 339f99bbf..a04d70f21 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -122,6 +122,18 @@ defmodule Pleroma.Web.StreamerTest do      test "it sends follow activities to the 'user:notification' stream", %{        user: user      } do +      user_url = user.ap_id + +      body = +        File.read!("test/fixtures/users_mock/localhost.json") +        |> String.replace("{{nickname}}", user.nickname) +        |> Jason.encode!() + +      Tesla.Mock.mock_global(fn +        %{method: :get, url: ^user_url} -> +          %Tesla.Env{status: 200, body: body} +      end) +        user2 = insert(:user)        task = Task.async(fn -> assert_receive {:text, _}, @streamer_timeout end)  | 
