diff options
Diffstat (limited to 'test')
123 files changed, 3174 insertions, 836 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/activity_expiration_test.exs b/test/activity_expiration_test.exs index 4cda5e985..e899d4509 100644 --- a/test/activity_expiration_test.exs +++ b/test/activity_expiration_test.exs @@ -7,7 +7,7 @@ defmodule Pleroma.ActivityExpirationTest do    alias Pleroma.ActivityExpiration    import Pleroma.Factory -  clear_config([ActivityExpiration, :enabled]) +  setup do: clear_config([ActivityExpiration, :enabled])    test "finds activities due to be deleted only" do      activity = insert(:note_activity) diff --git a/test/activity_test.exs b/test/activity_test.exs index 46b55beaa..0c19f481b 100644 --- a/test/activity_test.exs +++ b/test/activity_test.exs @@ -138,7 +138,7 @@ defmodule Pleroma.ActivityTest do        }      end -    clear_config([:instance, :limit_to_local_content]) +    setup do: clear_config([:instance, :limit_to_local_content])      test "finds utf8 text in statuses", %{        japanese_activity: japanese_activity, diff --git a/test/captcha_test.exs b/test/captcha_test.exs index 5e29b48b0..ac1d846e8 100644 --- a/test/captcha_test.exs +++ b/test/captcha_test.exs @@ -12,8 +12,7 @@ defmodule Pleroma.CaptchaTest do    alias Pleroma.Captcha.Native    @ets_options [:ordered_set, :private, :named_table, {:read_concurrency, true}] - -  clear_config([Pleroma.Captcha, :enabled]) +  setup do: clear_config([Pleroma.Captcha, :enabled])    describe "Kocaptcha" do      setup do 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/config/transfer_task_test.exs b/test/config/transfer_task_test.exs index 01d04761d..0265a6156 100644 --- a/test/config/transfer_task_test.exs +++ b/test/config/transfer_task_test.exs @@ -10,9 +10,7 @@ defmodule Pleroma.Config.TransferTaskTest do    alias Pleroma.Config.TransferTask    alias Pleroma.ConfigDB -  clear_config(:configurable_from_database) do -    Pleroma.Config.put(:configurable_from_database, true) -  end +  setup do: clear_config(:configurable_from_database, true)    test "transfer config values from db to env" do      refute Application.get_env(:pleroma, :test_key) diff --git a/test/conversation_test.exs b/test/conversation_test.exs index dc0027d04..056a0e920 100644 --- a/test/conversation_test.exs +++ b/test/conversation_test.exs @@ -11,9 +11,7 @@ defmodule Pleroma.ConversationTest do    import Pleroma.Factory -  clear_config_all([:instance, :federating]) do -    Pleroma.Config.put([:instance, :federating], true) -  end +  setup_all do: clear_config([:instance, :federating], true)    test "it goes through old direct conversations" do      user = insert(:user) diff --git a/test/emails/mailer_test.exs b/test/emails/mailer_test.exs index f30aa6a72..e6e34cba8 100644 --- a/test/emails/mailer_test.exs +++ b/test/emails/mailer_test.exs @@ -14,8 +14,7 @@ defmodule Pleroma.Emails.MailerTest do      subject: "Pleroma test email",      to: [{"Test User", "user1@example.com"}]    } - -  clear_config([Pleroma.Emails.Mailer, :enabled]) +  setup do: clear_config([Pleroma.Emails.Mailer, :enabled])    test "not send email when mailer is disabled" do      Pleroma.Config.put([Pleroma.Emails.Mailer, :enabled], false) diff --git a/test/fixtures/emoji/packs/blank.png.zip b/test/fixtures/emoji/packs/blank.png.zipBinary files differ new file mode 100644 index 000000000..651daf127 --- /dev/null +++ b/test/fixtures/emoji/packs/blank.png.zip diff --git a/test/fixtures/emoji/packs/default-manifest.json b/test/fixtures/emoji/packs/default-manifest.json new file mode 100644 index 000000000..c8433808d --- /dev/null +++ b/test/fixtures/emoji/packs/default-manifest.json @@ -0,0 +1,10 @@ +{ +  "finmoji": { +    "license": "CC BY-NC-ND 4.0", +    "homepage": "https://finland.fi/emoji/", +    "description": "Finland is the first country in the world to publish its own set of country themed emojis. The Finland emoji collection contains 56 tongue-in-cheek emotions, which were created to explain some hard-to-describe Finnish emotions, Finnish words and customs.", +    "src": "https://finland.fi/wp-content/uploads/2017/06/finland-emojis.zip", +    "src_sha256": "384025A1AC6314473863A11AC7AB38A12C01B851A3F82359B89B4D4211D3291D", +    "files": "finmoji.json" +  } +}
\ No newline at end of file diff --git a/test/fixtures/emoji/packs/finmoji.json b/test/fixtures/emoji/packs/finmoji.json new file mode 100644 index 000000000..279770998 --- /dev/null +++ b/test/fixtures/emoji/packs/finmoji.json @@ -0,0 +1,3 @@ +{ +  "blank": "blank.png" +}
\ No newline at end of file diff --git a/test/fixtures/emoji/packs/manifest.json b/test/fixtures/emoji/packs/manifest.json new file mode 100644 index 000000000..2d51a459b --- /dev/null +++ b/test/fixtures/emoji/packs/manifest.json @@ -0,0 +1,10 @@ +{ +  "blobs.gg": { +    "src_sha256": "3a12f3a181678d5b3584a62095411b0d60a335118135910d879920f8ade5a57f", +    "src": "https://git.pleroma.social/pleroma/emoji-index/raw/master/packs/blobs_gg.zip", +    "license": "Apache 2.0", +    "homepage": "https://blobs.gg", +    "files": "blobs_gg.json", +    "description": "Blob Emoji from blobs.gg repacked as apng" +  } +}
\ No newline at end of file diff --git a/test/fixtures/tesla_mock/funkwhale_audio.json b/test/fixtures/tesla_mock/funkwhale_audio.json new file mode 100644 index 000000000..15736b1f8 --- /dev/null +++ b/test/fixtures/tesla_mock/funkwhale_audio.json @@ -0,0 +1,44 @@ +{ +  "id": "https://channels.tests.funkwhale.audio/federation/music/uploads/42342395-0208-4fee-a38d-259a6dae0871", +  "type": "Audio", +  "name": "Compositions - Test Audio for Pleroma", +  "attributedTo": "https://channels.tests.funkwhale.audio/federation/actors/compositions", +  "published": "2020-03-11T10:01:52.714918+00:00", +  "to": "https://www.w3.org/ns/activitystreams#Public", +  "url": [ +    { +      "type": "Link", +      "mimeType": "audio/ogg", +      "href": "https://channels.tests.funkwhale.audio/api/v1/listen/3901e5d8-0445-49d5-9711-e096cf32e515/?upload=42342395-0208-4fee-a38d-259a6dae0871&download=false" +    }, +    { +      "type": "Link", +      "mimeType": "text/html", +      "href": "https://channels.tests.funkwhale.audio/library/tracks/74" +    } +  ], +  "content": "<p>This is a test Audio for Pleroma.</p>", +  "mediaType": "text/html", +  "tag": [ +    { +      "type": "Hashtag", +      "name": "#funkwhale" +    }, +    { +      "type": "Hashtag", +      "name": "#test" +    }, +    { +      "type": "Hashtag", +      "name": "#tests" +    } +  ], +  "summary": "#funkwhale #test #tests", +  "@context": [ +    "https://www.w3.org/ns/activitystreams", +    "https://w3id.org/security/v1", +    { +      "manuallyApprovesFollowers": "as:manuallyApprovesFollowers" +    } +  ] +} diff --git a/test/fixtures/tesla_mock/funkwhale_channel.json b/test/fixtures/tesla_mock/funkwhale_channel.json new file mode 100644 index 000000000..cf9ee8151 --- /dev/null +++ b/test/fixtures/tesla_mock/funkwhale_channel.json @@ -0,0 +1,44 @@ +{ +  "id": "https://channels.tests.funkwhale.audio/federation/actors/compositions", +  "outbox": "https://channels.tests.funkwhale.audio/federation/actors/compositions/outbox", +  "inbox": "https://channels.tests.funkwhale.audio/federation/actors/compositions/inbox", +  "preferredUsername": "compositions", +  "type": "Person", +  "name": "Compositions", +  "followers": "https://channels.tests.funkwhale.audio/federation/actors/compositions/followers", +  "following": "https://channels.tests.funkwhale.audio/federation/actors/compositions/following", +  "manuallyApprovesFollowers": false, +  "url": [ +    { +      "type": "Link", +      "href": "https://channels.tests.funkwhale.audio/channels/compositions", +      "mediaType": "text/html" +    }, +    { +      "type": "Link", +      "href": "https://channels.tests.funkwhale.audio/api/v1/channels/compositions/rss", +      "mediaType": "application/rss+xml" +    } +  ], +  "icon": { +    "type": "Image", +    "url": "https://channels.tests.funkwhale.audio/media/attachments/75/b4/f1/nosmile.jpeg", +    "mediaType": "image/jpeg" +  }, +  "summary": "<p>I'm testing federation with the fediverse :)</p>", +  "@context": [ +    "https://www.w3.org/ns/activitystreams", +    "https://w3id.org/security/v1", +    { +      "manuallyApprovesFollowers": "as:manuallyApprovesFollowers" +    } +  ], +  "publicKey": { +    "owner": "https://channels.tests.funkwhale.audio/federation/actors/compositions", +    "publicKeyPem": "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAv25u57oZfVLV3KltS+HcsdSx9Op4MmzIes1J8Wu8s0KbdXf2zEwS\nsVqyHgs/XCbnzsR3FqyJTo46D2BVnvZcuU5srNcR2I2HMaqQ0oVdnATE4K6KdcgV\nN+98pMWo56B8LTgE1VpvqbsrXLi9jCTzjrkebVMOP+ZVu+64v1qdgddseblYMnBZ\nct0s7ONbHnqrWlTGf5wES1uIZTVdn5r4MduZG+Uenfi1opBS0lUUxfWdW9r0oF2b\nyneZUyaUCbEroeKbqsweXCWVgnMarUOsgqC42KM4cf95lySSwTSaUtZYIbTw7s9W\n2jveU/rVg8BYZu5JK5obgBoxtlUeUoSswwIDAQAB\n-----END RSA PUBLIC KEY-----\n", +    "id": "https://channels.tests.funkwhale.audio/federation/actors/compositions#main-key" +  }, +  "endpoints": { +    "sharedInbox": "https://channels.tests.funkwhale.audio/federation/shared/inbox" +  } +} 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..2e961826e --- /dev/null +++ b/test/http/adapter_helper/gun_test.exs @@ -0,0 +1,258 @@ +# 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 +    setup do: clear_config([:http, :adapter], a: 1, b: 2) + +    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..3f7e708e0 --- /dev/null +++ b/test/http/adapter_helper/hackney_test.exs @@ -0,0 +1,47 @@ +# 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.HTTP.AdapterHelper.Hackney + +  setup_all do +    uri = URI.parse("http://domain.com") +    {:ok, uri: uri} +  end + +  describe "options/2" do +    setup do: clear_config([:http, :adapter], a: 1, b: 2) + +    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..5cc78ad5b --- /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 +    setup 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..f11528c3f 100644 --- a/test/http/request_builder_test.exs +++ b/test/http/request_builder_test.exs @@ -5,55 +5,40 @@  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 -    clear_config([:http, :send_user_agent]) -    clear_config([:http, :user_agent]) +    setup do: clear_config([:http, :send_user_agent]) +    setup 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 b22c23861..837a9dacd 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -6,12 +6,14 @@ defmodule Pleroma.NotificationTest do    use Pleroma.DataCase    import Pleroma.Factory +  import Mock    alias Pleroma.Notification    alias Pleroma.Tests.ObanHelpers    alias Pleroma.User    alias Pleroma.Web.ActivityPub.Transmogrifier    alias Pleroma.Web.CommonAPI +  alias Pleroma.Web.Push    alias Pleroma.Web.Streamer    describe "create_notifications" do @@ -80,6 +82,80 @@ defmodule Pleroma.NotificationTest do      end    end +  describe "CommonApi.post/2 notification-related functionality" do +    test_with_mock "creates but does NOT send notification to blocker user", +                   Push, +                   [:passthrough], +                   [] do +      user = insert(:user) +      blocker = insert(:user) +      {:ok, _user_relationship} = User.block(blocker, user) + +      {:ok, _activity} = CommonAPI.post(user, %{"status" => "hey @#{blocker.nickname}!"}) + +      blocker_id = blocker.id +      assert [%Notification{user_id: ^blocker_id}] = Repo.all(Notification) +      refute called(Push.send(:_)) +    end + +    test_with_mock "creates but does NOT send notification to notification-muter user", +                   Push, +                   [:passthrough], +                   [] do +      user = insert(:user) +      muter = insert(:user) +      {:ok, _user_relationships} = User.mute(muter, user) + +      {:ok, _activity} = CommonAPI.post(user, %{"status" => "hey @#{muter.nickname}!"}) + +      muter_id = muter.id +      assert [%Notification{user_id: ^muter_id}] = Repo.all(Notification) +      refute called(Push.send(:_)) +    end + +    test_with_mock "creates but does NOT send notification to thread-muter user", +                   Push, +                   [:passthrough], +                   [] do +      user = insert(:user) +      thread_muter = insert(:user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{thread_muter.nickname}!"}) + +      {:ok, _} = CommonAPI.add_mute(thread_muter, activity) + +      {:ok, _same_context_activity} = +        CommonAPI.post(user, %{ +          "status" => "hey-hey-hey @#{thread_muter.nickname}!", +          "in_reply_to_status_id" => activity.id +        }) + +      [pre_mute_notification, post_mute_notification] = +        Repo.all(from(n in Notification, where: n.user_id == ^thread_muter.id, order_by: n.id)) + +      pre_mute_notification_id = pre_mute_notification.id +      post_mute_notification_id = post_mute_notification.id + +      assert called( +               Push.send( +                 :meck.is(fn +                   %Notification{id: ^pre_mute_notification_id} -> true +                   _ -> false +                 end) +               ) +             ) + +      refute called( +               Push.send( +                 :meck.is(fn +                   %Notification{id: ^post_mute_notification_id} -> true +                   _ -> false +                 end) +               ) +             ) +    end +  end +    describe "create_notification" do      @tag needs_streamer: true      test "it creates a notification for user and send to the 'user' and the 'user:notification' stream" do @@ -382,7 +458,7 @@ defmodule Pleroma.NotificationTest do      end    end -  describe "notification target determination" do +  describe "notification target determination / get_notified_from_activity/2" do      test "it sends notifications to addressed users in new messages" do        user = insert(:user)        other_user = insert(:user) @@ -392,7 +468,9 @@ defmodule Pleroma.NotificationTest do            "status" => "hey @#{other_user.nickname}!"          }) -      assert other_user in Notification.get_notified_from_activity(activity) +      {enabled_receivers, _disabled_receivers} = Notification.get_notified_from_activity(activity) + +      assert other_user in enabled_receivers      end      test "it sends notifications to mentioned users in new messages" do @@ -420,7 +498,9 @@ defmodule Pleroma.NotificationTest do        {:ok, activity} = Transmogrifier.handle_incoming(create_activity) -      assert other_user in Notification.get_notified_from_activity(activity) +      {enabled_receivers, _disabled_receivers} = Notification.get_notified_from_activity(activity) + +      assert other_user in enabled_receivers      end      test "it does not send notifications to users who are only cc in new messages" do @@ -442,7 +522,9 @@ defmodule Pleroma.NotificationTest do        {:ok, activity} = Transmogrifier.handle_incoming(create_activity) -      assert other_user not in Notification.get_notified_from_activity(activity) +      {enabled_receivers, _disabled_receivers} = Notification.get_notified_from_activity(activity) + +      assert other_user not in enabled_receivers      end      test "it does not send notification to mentioned users in likes" do @@ -457,7 +539,10 @@ defmodule Pleroma.NotificationTest do        {:ok, activity_two} = CommonAPI.favorite(third_user, activity_one.id) -      assert other_user not in Notification.get_notified_from_activity(activity_two) +      {enabled_receivers, _disabled_receivers} = +        Notification.get_notified_from_activity(activity_two) + +      assert other_user not in enabled_receivers      end      test "it does not send notification to mentioned users in announces" do @@ -472,7 +557,57 @@ defmodule Pleroma.NotificationTest do        {:ok, activity_two, _} = CommonAPI.repeat(activity_one.id, third_user) -      assert other_user not in Notification.get_notified_from_activity(activity_two) +      {enabled_receivers, _disabled_receivers} = +        Notification.get_notified_from_activity(activity_two) + +      assert other_user not in enabled_receivers +    end + +    test "it returns blocking recipient in disabled recipients list" do +      user = insert(:user) +      other_user = insert(:user) +      {:ok, _user_relationship} = User.block(other_user, user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}!"}) + +      {enabled_receivers, disabled_receivers} = Notification.get_notified_from_activity(activity) + +      assert [] == enabled_receivers +      assert [other_user] == disabled_receivers +    end + +    test "it returns notification-muting recipient in disabled recipients list" do +      user = insert(:user) +      other_user = insert(:user) +      {:ok, _user_relationships} = User.mute(other_user, user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}!"}) + +      {enabled_receivers, disabled_receivers} = Notification.get_notified_from_activity(activity) + +      assert [] == enabled_receivers +      assert [other_user] == disabled_receivers +    end + +    test "it returns thread-muting recipient in disabled recipients list" do +      user = insert(:user) +      other_user = insert(:user) + +      {:ok, activity} = CommonAPI.post(user, %{"status" => "hey @#{other_user.nickname}!"}) + +      {:ok, _} = CommonAPI.add_mute(other_user, activity) + +      {:ok, same_context_activity} = +        CommonAPI.post(user, %{ +          "status" => "hey-hey-hey @#{other_user.nickname}!", +          "in_reply_to_status_id" => activity.id +        }) + +      {enabled_receivers, disabled_receivers} = +        Notification.get_notified_from_activity(same_context_activity) + +      assert [other_user] == disabled_receivers +      refute other_user in enabled_receivers      end    end @@ -649,12 +784,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 +807,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() @@ -716,7 +871,7 @@ defmodule Pleroma.NotificationTest do        assert Notification.for_user(user) == []      end -    test "it doesn't return notificatitons for blocked domain" do +    test "it doesn't return notifications for blocked domain" do        user = insert(:user)        blocked = insert(:user, ap_id: "http://some-domain.com")        {:ok, user} = User.block_domain(user, "some-domain.com") diff --git a/test/object/fetcher_test.exs b/test/object/fetcher_test.exs index 4775ee152..c06e91f12 100644 --- a/test/object/fetcher_test.exs +++ b/test/object/fetcher_test.exs @@ -28,8 +28,7 @@ defmodule Pleroma.Object.FetcherTest do    describe "max thread distance restriction" do      @ap_id "http://mastodon.example.org/@admin/99541947525187367" - -    clear_config([:instance, :federation_incoming_replies_max_depth]) +    setup do: clear_config([:instance, :federation_incoming_replies_max_depth])      test "it returns thread depth exceeded error if thread depth is exceeded" do        Pleroma.Config.put([:instance, :federation_incoming_replies_max_depth], 0) @@ -160,7 +159,7 @@ defmodule Pleroma.Object.FetcherTest do    end    describe "signed fetches" do -    clear_config([:activitypub, :sign_object_fetches]) +    setup do: clear_config([:activitypub, :sign_object_fetches])      test_with_mock "it signs fetches when configured to do so",                     Pleroma.Signature, diff --git a/test/object_test.exs b/test/object_test.exs index 703fd6e0f..198d3b1cf 100644 --- a/test/object_test.exs +++ b/test/object_test.exs @@ -74,8 +74,8 @@ defmodule Pleroma.ObjectTest do    end    describe "delete attachments" do -    clear_config([Pleroma.Upload]) -    clear_config([:instance, :cleanup_attachments]) +    setup do: clear_config([Pleroma.Upload]) +    setup do: clear_config([:instance, :cleanup_attachments])      test "Disabled via config" do        Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local) 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/plugs/admin_secret_authentication_plug_test.exs b/test/plugs/admin_secret_authentication_plug_test.exs index 2e300ac0c..100016c62 100644 --- a/test/plugs/admin_secret_authentication_plug_test.exs +++ b/test/plugs/admin_secret_authentication_plug_test.exs @@ -23,7 +23,7 @@ defmodule Pleroma.Plugs.AdminSecretAuthenticationPlugTest do    end    describe "when secret set it assigns an admin user" do -    clear_config([:admin_token]) +    setup do: clear_config([:admin_token])      test "with `admin_token` query parameter", %{conn: conn} do        Pleroma.Config.put(:admin_token, "password123") diff --git a/test/plugs/ensure_public_or_authenticated_plug_test.exs b/test/plugs/ensure_public_or_authenticated_plug_test.exs index 3fcb4d372..411252274 100644 --- a/test/plugs/ensure_public_or_authenticated_plug_test.exs +++ b/test/plugs/ensure_public_or_authenticated_plug_test.exs @@ -9,7 +9,7 @@ defmodule Pleroma.Plugs.EnsurePublicOrAuthenticatedPlugTest do    alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug    alias Pleroma.User -  clear_config([:instance, :public]) +  setup do: clear_config([:instance, :public])    test "it halts if not public and no user is assigned", %{conn: conn} do      Config.put([:instance, :public], false) diff --git a/test/plugs/http_security_plug_test.exs b/test/plugs/http_security_plug_test.exs index 944a9a139..84e4c274f 100644 --- a/test/plugs/http_security_plug_test.exs +++ b/test/plugs/http_security_plug_test.exs @@ -7,9 +7,9 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlugTest do    alias Pleroma.Config    alias Plug.Conn -  clear_config([:http_securiy, :enabled]) -  clear_config([:http_security, :sts]) -  clear_config([:http_security, :referrer_policy]) +  setup do: clear_config([:http_securiy, :enabled]) +  setup do: clear_config([:http_security, :sts]) +  setup do: clear_config([:http_security, :referrer_policy])    describe "http security enabled" do      setup do diff --git a/test/plugs/instance_static_test.exs b/test/plugs/instance_static_test.exs index 8cd9b5712..b8f070d6a 100644 --- a/test/plugs/instance_static_test.exs +++ b/test/plugs/instance_static_test.exs @@ -12,9 +12,7 @@ defmodule Pleroma.Web.RuntimeStaticPlugTest do      on_exit(fn -> File.rm_rf(@dir) end)    end -  clear_config([:instance, :static_dir]) do -    Pleroma.Config.put([:instance, :static_dir], @dir) -  end +  setup do: clear_config([:instance, :static_dir], @dir)    test "overrides index" do      bundled_index = get(build_conn(), "/") diff --git a/test/plugs/oauth_scopes_plug_test.exs b/test/plugs/oauth_scopes_plug_test.exs index 1b3aa85b6..e79ecf263 100644 --- a/test/plugs/oauth_scopes_plug_test.exs +++ b/test/plugs/oauth_scopes_plug_test.exs @@ -193,7 +193,7 @@ defmodule Pleroma.Plugs.OAuthScopesPlugTest do    end    describe "transform_scopes/2" do -    clear_config([:auth, :enforce_oauth_admin_scope_usage]) +    setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage])      setup do        {:ok, %{f: &OAuthScopesPlug.transform_scopes/2}} diff --git a/test/plugs/rate_limiter_test.exs b/test/plugs/rate_limiter_test.exs index c6e494c13..0ce9f3a0a 100644 --- a/test/plugs/rate_limiter_test.exs +++ b/test/plugs/rate_limiter_test.exs @@ -12,14 +12,12 @@ defmodule Pleroma.Plugs.RateLimiterTest do    import Pleroma.Tests.Helpers, only: [clear_config: 1, clear_config: 2]    # Note: each example must work with separate buckets in order to prevent concurrency issues - -  clear_config([Pleroma.Web.Endpoint, :http, :ip]) -  clear_config(:rate_limit) +  setup do: clear_config([Pleroma.Web.Endpoint, :http, :ip]) +  setup do: clear_config(:rate_limit)    describe "config" do      @limiter_name :test_init - -    clear_config([Pleroma.Plugs.RemoteIp, :enabled]) +    setup do: clear_config([Pleroma.Plugs.RemoteIp, :enabled])      test "config is required for plug to work" do        Config.put([:rate_limit, @limiter_name], {1, 1}) diff --git a/test/plugs/remote_ip_test.exs b/test/plugs/remote_ip_test.exs index 9c3737b0b..752ab32e7 100644 --- a/test/plugs/remote_ip_test.exs +++ b/test/plugs/remote_ip_test.exs @@ -9,8 +9,7 @@ defmodule Pleroma.Plugs.RemoteIpTest do    alias Pleroma.Plugs.RemoteIp    import Pleroma.Tests.Helpers, only: [clear_config: 1, clear_config: 2] - -  clear_config(RemoteIp) +  setup do: clear_config(RemoteIp)    test "disabled" do      Pleroma.Config.put(RemoteIp, enabled: false) diff --git a/test/plugs/user_enabled_plug_test.exs b/test/plugs/user_enabled_plug_test.exs index 931513d83..b219d8abf 100644 --- a/test/plugs/user_enabled_plug_test.exs +++ b/test/plugs/user_enabled_plug_test.exs @@ -8,7 +8,7 @@ defmodule Pleroma.Plugs.UserEnabledPlugTest do    alias Pleroma.Plugs.UserEnabledPlug    import Pleroma.Factory -  clear_config([:instance, :account_activation_required]) +  setup do: clear_config([:instance, :account_activation_required])    test "doesn't do anything if the user isn't set", %{conn: conn} do      ret_conn = diff --git a/test/plugs/user_is_admin_plug_test.exs b/test/plugs/user_is_admin_plug_test.exs index 015d51018..fd6a50e53 100644 --- a/test/plugs/user_is_admin_plug_test.exs +++ b/test/plugs/user_is_admin_plug_test.exs @@ -9,9 +9,7 @@ defmodule Pleroma.Plugs.UserIsAdminPlugTest do    import Pleroma.Factory    describe "unless [:auth, :enforce_oauth_admin_scope_usage]," do -    clear_config([:auth, :enforce_oauth_admin_scope_usage]) do -      Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], false) -    end +    setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false)      test "accepts a user that is an admin" do        user = insert(:user, is_admin: true) @@ -42,9 +40,7 @@ defmodule Pleroma.Plugs.UserIsAdminPlugTest do    end    describe "with [:auth, :enforce_oauth_admin_scope_usage]," do -    clear_config([:auth, :enforce_oauth_admin_scope_usage]) do -      Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], true) -    end +    setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], true)      setup do        admin_user = insert(:user, is_admin: true) 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/repo_test.exs b/test/repo_test.exs index 75e85f974..daffc6542 100644 --- a/test/repo_test.exs +++ b/test/repo_test.exs @@ -67,7 +67,7 @@ defmodule Pleroma.RepoTest do        :ok      end -    clear_config([:i_am_aware_this_may_cause_data_loss, :disable_migration_check]) +    setup do: clear_config([:i_am_aware_this_may_cause_data_loss, :disable_migration_check])      test "raises if it detects unapplied migrations" do        assert_raise Pleroma.Repo.UnappliedMigrationsError, fn -> 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/scheduled_activity_test.exs b/test/scheduled_activity_test.exs index 4369e7e8a..7faa5660d 100644 --- a/test/scheduled_activity_test.exs +++ b/test/scheduled_activity_test.exs @@ -8,7 +8,7 @@ defmodule Pleroma.ScheduledActivityTest do    alias Pleroma.ScheduledActivity    import Pleroma.Factory -  clear_config([ScheduledActivity, :enabled]) +  setup do: clear_config([ScheduledActivity, :enabled])    setup context do      DataCase.ensure_local_uploader(context) diff --git a/test/support/helpers.ex b/test/support/helpers.ex index 6bf4b019e..e68e9bfd2 100644 --- a/test/support/helpers.ex +++ b/test/support/helpers.ex @@ -17,35 +17,17 @@ defmodule Pleroma.Tests.Helpers do    defmacro clear_config(config_path, do: yield) do      quote do -      setup do -        initial_setting = Config.get(unquote(config_path)) -        unquote(yield) -        on_exit(fn -> Config.put(unquote(config_path), initial_setting) end) -        :ok -      end -    end -  end - -  @doc "Stores initial config value and restores it after *all* test examples are executed." -  defmacro clear_config_all(config_path) do -    quote do -      clear_config_all(unquote(config_path)) do -      end +      initial_setting = Config.get(unquote(config_path)) +      unquote(yield) +      on_exit(fn -> Config.put(unquote(config_path), initial_setting) end) +      :ok      end    end -  @doc """ -  Stores initial config value and restores it after *all* test examples are executed. -  Only use if *all* test examples should work with the same stubbed value -  (*no* examples set a different value). -  """ -  defmacro clear_config_all(config_path, do: yield) do +  defmacro clear_config(config_path, temp_setting) do      quote do -      setup_all do -        initial_setting = Config.get(unquote(config_path)) -        unquote(yield) -        on_exit(fn -> Config.put(unquote(config_path), initial_setting) end) -        :ok +      clear_config(unquote(config_path)) do +        Config.put(unquote(config_path), unquote(temp_setting))        end      end    end @@ -55,9 +37,7 @@ defmodule Pleroma.Tests.Helpers do        import Pleroma.Tests.Helpers,          only: [            clear_config: 1, -          clear_config: 2, -          clear_config_all: 1, -          clear_config_all: 2 +          clear_config: 2          ]        def to_datetime(naive_datetime) do diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index e72638814..20cb2b3d1 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, @@ -1273,6 +1283,21 @@ defmodule HttpRequestMock do      {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/rin.json")}}    end +  def get( +        "https://channels.tests.funkwhale.audio/federation/music/uploads/42342395-0208-4fee-a38d-259a6dae0871", +        _, +        _, +        _ +      ) do +    {:ok, +     %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/funkwhale_audio.json")}} +  end + +  def get("https://channels.tests.funkwhale.audio/federation/actors/compositions", _, _, _) do +    {:ok, +     %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/funkwhale_channel.json")}} +  end +    def get("http://example.com/rel_me/error", _, _, _) do      {:ok, %Tesla.Env{status: 404, body: ""}}    end diff --git a/test/tasks/config_test.exs b/test/tasks/config_test.exs index a6c0de351..3dee4f082 100644 --- a/test/tasks/config_test.exs +++ b/test/tasks/config_test.exs @@ -20,9 +20,7 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do      :ok    end -  clear_config_all(:configurable_from_database) do -    Pleroma.Config.put(:configurable_from_database, true) -  end +  setup_all do: clear_config(:configurable_from_database, true)    test "error if file with custom settings doesn't exist" do      Mix.Tasks.Pleroma.Config.migrate_to_db("config/not_existance_config_file.exs") diff --git a/test/tasks/emoji_test.exs b/test/tasks/emoji_test.exs new file mode 100644 index 000000000..f5de3ef0e --- /dev/null +++ b/test/tasks/emoji_test.exs @@ -0,0 +1,226 @@ +defmodule Mix.Tasks.Pleroma.EmojiTest do +  use ExUnit.Case, async: true + +  import ExUnit.CaptureIO +  import Tesla.Mock + +  alias Mix.Tasks.Pleroma.Emoji + +  describe "ls-packs" do +    test "with default manifest as url" do +      mock(fn +        %{ +          method: :get, +          url: "https://git.pleroma.social/pleroma/emoji-index/raw/master/index.json" +        } -> +          %Tesla.Env{ +            status: 200, +            body: File.read!("test/fixtures/emoji/packs/default-manifest.json") +          } +      end) + +      capture_io(fn -> Emoji.run(["ls-packs"]) end) =~ +        "https://finland.fi/wp-content/uploads/2017/06/finland-emojis.zip" +    end + +    test "with passed manifest as file" do +      capture_io(fn -> +        Emoji.run(["ls-packs", "-m", "test/fixtures/emoji/packs/manifest.json"]) +      end) =~ "https://git.pleroma.social/pleroma/emoji-index/raw/master/packs/blobs_gg.zip" +    end +  end + +  describe "get-packs" do +    test "download pack from default manifest" do +      mock(fn +        %{ +          method: :get, +          url: "https://git.pleroma.social/pleroma/emoji-index/raw/master/index.json" +        } -> +          %Tesla.Env{ +            status: 200, +            body: File.read!("test/fixtures/emoji/packs/default-manifest.json") +          } + +        %{ +          method: :get, +          url: "https://finland.fi/wp-content/uploads/2017/06/finland-emojis.zip" +        } -> +          %Tesla.Env{ +            status: 200, +            body: File.read!("test/fixtures/emoji/packs/blank.png.zip") +          } + +        %{ +          method: :get, +          url: "https://git.pleroma.social/pleroma/emoji-index/raw/master/finmoji.json" +        } -> +          %Tesla.Env{ +            status: 200, +            body: File.read!("test/fixtures/emoji/packs/finmoji.json") +          } +      end) + +      assert capture_io(fn -> Emoji.run(["get-packs", "finmoji"]) end) =~ "Writing pack.json for" + +      emoji_path = +        Path.join( +          Pleroma.Config.get!([:instance, :static_dir]), +          "emoji" +        ) + +      assert File.exists?(Path.join([emoji_path, "finmoji", "pack.json"])) +      on_exit(fn -> File.rm_rf!("test/instance_static/emoji/finmoji") end) +    end + +    test "pack not found" do +      mock(fn +        %{ +          method: :get, +          url: "https://git.pleroma.social/pleroma/emoji-index/raw/master/index.json" +        } -> +          %Tesla.Env{ +            status: 200, +            body: File.read!("test/fixtures/emoji/packs/default-manifest.json") +          } +      end) + +      assert capture_io(fn -> Emoji.run(["get-packs", "not_found"]) end) =~ +               "No pack named \"not_found\" found" +    end + +    test "raise on bad sha256" do +      mock(fn +        %{ +          method: :get, +          url: "https://git.pleroma.social/pleroma/emoji-index/raw/master/packs/blobs_gg.zip" +        } -> +          %Tesla.Env{ +            status: 200, +            body: File.read!("test/fixtures/emoji/packs/blank.png.zip") +          } +      end) + +      assert_raise RuntimeError, ~r/^Bad SHA256 for blobs.gg/, fn -> +        capture_io(fn -> +          Emoji.run(["get-packs", "blobs.gg", "-m", "test/fixtures/emoji/packs/manifest.json"]) +        end) +      end +    end +  end + +  describe "gen-pack" do +    setup do +      url = "https://finland.fi/wp-content/uploads/2017/06/finland-emojis.zip" + +      mock(fn %{ +                method: :get, +                url: ^url +              } -> +        %Tesla.Env{status: 200, body: File.read!("test/fixtures/emoji/packs/blank.png.zip")} +      end) + +      {:ok, url: url} +    end + +    test "with default extensions", %{url: url} do +      name = "pack1" +      pack_json = "#{name}.json" +      files_json = "#{name}_file.json" +      refute File.exists?(pack_json) +      refute File.exists?(files_json) + +      captured = +        capture_io(fn -> +          Emoji.run([ +            "gen-pack", +            url, +            "--name", +            name, +            "--license", +            "license", +            "--homepage", +            "homepage", +            "--description", +            "description", +            "--files", +            files_json, +            "--extensions", +            ".png .gif" +          ]) +        end) + +      assert captured =~ "#{pack_json} has been created with the pack1 pack" +      assert captured =~ "Using .png .gif extensions" + +      assert File.exists?(pack_json) +      assert File.exists?(files_json) + +      on_exit(fn -> +        File.rm!(pack_json) +        File.rm!(files_json) +      end) +    end + +    test "with custom extensions and update existing files", %{url: url} do +      name = "pack2" +      pack_json = "#{name}.json" +      files_json = "#{name}_file.json" +      refute File.exists?(pack_json) +      refute File.exists?(files_json) + +      captured = +        capture_io(fn -> +          Emoji.run([ +            "gen-pack", +            url, +            "--name", +            name, +            "--license", +            "license", +            "--homepage", +            "homepage", +            "--description", +            "description", +            "--files", +            files_json, +            "--extensions", +            " .png   .gif    .jpeg " +          ]) +        end) + +      assert captured =~ "#{pack_json} has been created with the pack2 pack" +      assert captured =~ "Using .png .gif .jpeg extensions" + +      assert File.exists?(pack_json) +      assert File.exists?(files_json) + +      captured = +        capture_io(fn -> +          Emoji.run([ +            "gen-pack", +            url, +            "--name", +            name, +            "--license", +            "license", +            "--homepage", +            "homepage", +            "--description", +            "description", +            "--files", +            files_json, +            "--extensions", +            " .png   .gif    .jpeg " +          ]) +        end) + +      assert captured =~ "#{pack_json} has been updated with the pack2 pack" + +      on_exit(fn -> +        File.rm!(pack_json) +        File.rm!(files_json) +      end) +    end +  end +end diff --git a/test/tasks/robots_txt_test.exs b/test/tasks/robots_txt_test.exs index e03c9c192..7040a0e4e 100644 --- a/test/tasks/robots_txt_test.exs +++ b/test/tasks/robots_txt_test.exs @@ -7,7 +7,7 @@ defmodule Mix.Tasks.Pleroma.RobotsTxtTest do    use Pleroma.Tests.Helpers    alias Mix.Tasks.Pleroma.RobotsTxt -  clear_config([:instance, :static_dir]) +  setup do: clear_config([:instance, :static_dir])    test "creates new dir" do      path = "test/fixtures/new_dir/" 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/upload/filter/anonymize_filename_test.exs b/test/upload/filter/anonymize_filename_test.exs index 330158580..2d5c580f1 100644 --- a/test/upload/filter/anonymize_filename_test.exs +++ b/test/upload/filter/anonymize_filename_test.exs @@ -18,7 +18,7 @@ defmodule Pleroma.Upload.Filter.AnonymizeFilenameTest do      %{upload_file: upload_file}    end -  clear_config([Pleroma.Upload.Filter.AnonymizeFilename, :text]) +  setup do: clear_config([Pleroma.Upload.Filter.AnonymizeFilename, :text])    test "it replaces filename on pre-defined text", %{upload_file: upload_file} do      Config.put([Upload.Filter.AnonymizeFilename, :text], "custom-file.png") diff --git a/test/upload/filter/mogrify_test.exs b/test/upload/filter/mogrify_test.exs index 52483d80c..b6a463e8c 100644 --- a/test/upload/filter/mogrify_test.exs +++ b/test/upload/filter/mogrify_test.exs @@ -10,7 +10,7 @@ defmodule Pleroma.Upload.Filter.MogrifyTest do    alias Pleroma.Upload    alias Pleroma.Upload.Filter -  clear_config([Filter.Mogrify, :args]) +  setup do: clear_config([Filter.Mogrify, :args])    test "apply mogrify filter" do      Config.put([Filter.Mogrify, :args], [{"tint", "40"}]) diff --git a/test/upload/filter_test.exs b/test/upload/filter_test.exs index 2ffc5247b..352b66402 100644 --- a/test/upload/filter_test.exs +++ b/test/upload/filter_test.exs @@ -8,7 +8,7 @@ defmodule Pleroma.Upload.FilterTest do    alias Pleroma.Config    alias Pleroma.Upload.Filter -  clear_config([Pleroma.Upload.Filter.AnonymizeFilename, :text]) +  setup do: clear_config([Pleroma.Upload.Filter.AnonymizeFilename, :text])    test "applies filters" do      Config.put([Pleroma.Upload.Filter.AnonymizeFilename, :text], "custom-file.png") diff --git a/test/upload_test.exs b/test/upload_test.exs index 6ce42b630..060a940bb 100644 --- a/test/upload_test.exs +++ b/test/upload_test.exs @@ -250,9 +250,7 @@ defmodule Pleroma.UploadTest do    end    describe "Setting a custom base_url for uploaded media" do -    clear_config([Pleroma.Upload, :base_url]) do -      Pleroma.Config.put([Pleroma.Upload, :base_url], "https://cache.pleroma.social") -    end +    setup do: clear_config([Pleroma.Upload, :base_url], "https://cache.pleroma.social")      test "returns a media url with configured base_url" do        base_url = Pleroma.Config.get([Pleroma.Upload, :base_url]) diff --git a/test/uploaders/s3_test.exs b/test/uploaders/s3_test.exs index fdc7eff41..6950ccb25 100644 --- a/test/uploaders/s3_test.exs +++ b/test/uploaders/s3_test.exs @@ -11,12 +11,11 @@ defmodule Pleroma.Uploaders.S3Test do    import Mock    import ExUnit.CaptureLog -  clear_config([Pleroma.Uploaders.S3]) do -    Config.put([Pleroma.Uploaders.S3], -      bucket: "test_bucket", -      public_endpoint: "https://s3.amazonaws.com" -    ) -  end +  setup do: +          clear_config(Pleroma.Uploaders.S3, +            bucket: "test_bucket", +            public_endpoint: "https://s3.amazonaws.com" +          )    describe "get_file/1" do      test "it returns path to local folder for files" do 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/user_search_test.exs b/test/user_search_test.exs index 406cc8fb2..cb847b516 100644 --- a/test/user_search_test.exs +++ b/test/user_search_test.exs @@ -15,7 +15,7 @@ defmodule Pleroma.UserSearchTest do    end    describe "User.search" do -    clear_config([:instance, :limit_to_local_content]) +    setup do: clear_config([:instance, :limit_to_local_content])      test "excluded invisible users from results" do        user = insert(:user, %{nickname: "john t1000"}) diff --git a/test/user_test.exs b/test/user_test.exs index 8dcac676d..0479f294d 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -24,7 +24,7 @@ defmodule Pleroma.UserTest do      :ok    end -  clear_config([:instance, :account_activation_required]) +  setup do: clear_config([:instance, :account_activation_required])    describe "service actors" do      test "returns updated invisible actor" do @@ -86,7 +86,7 @@ defmodule Pleroma.UserTest do        {:ok, user: insert(:user)}      end -    test "outgoing_relations_ap_ids/1", %{user: user} do +    test "outgoing_relationships_ap_ids/1", %{user: user} do        rel_types = [:block, :mute, :notification_mute, :reblog_mute, :inverse_subscription]        ap_ids_by_rel = @@ -124,10 +124,10 @@ defmodule Pleroma.UserTest do        assert ap_ids_by_rel[:inverse_subscription] ==                 Enum.sort(Enum.map(User.subscriber_users(user), & &1.ap_id)) -      outgoing_relations_ap_ids = User.outgoing_relations_ap_ids(user, rel_types) +      outgoing_relationships_ap_ids = User.outgoing_relationships_ap_ids(user, rel_types)        assert ap_ids_by_rel == -               Enum.into(outgoing_relations_ap_ids, %{}, fn {k, v} -> {k, Enum.sort(v)} end) +               Enum.into(outgoing_relationships_ap_ids, %{}, fn {k, v} -> {k, Enum.sort(v)} end)      end    end @@ -297,7 +297,7 @@ defmodule Pleroma.UserTest do    end    describe "unfollow/2" do -    clear_config([:instance, :external_user_synchronization]) +    setup do: clear_config([:instance, :external_user_synchronization])      test "unfollow with syncronizes external user" do        Pleroma.Config.put([:instance, :external_user_synchronization], true) @@ -375,10 +375,9 @@ defmodule Pleroma.UserTest do        password_confirmation: "test",        email: "email@example.com"      } - -    clear_config([:instance, :autofollowed_nicknames]) -    clear_config([:instance, :welcome_message]) -    clear_config([:instance, :welcome_user_nickname]) +    setup do: clear_config([:instance, :autofollowed_nicknames]) +    setup do: clear_config([:instance, :welcome_message]) +    setup do: clear_config([:instance, :welcome_user_nickname])      test "it autofollows accounts that are set for it" do        user = insert(:user) @@ -412,7 +411,7 @@ defmodule Pleroma.UserTest do        assert activity.actor == welcome_user.ap_id      end -    clear_config([:instance, :account_activation_required]) +    setup do: clear_config([:instance, :account_activation_required])      test "it requires an email, name, nickname and password, bio is optional when account_activation_required is enabled" do        Pleroma.Config.put([:instance, :account_activation_required], true) @@ -475,10 +474,7 @@ defmodule Pleroma.UserTest do        password_confirmation: "test",        email: "email@example.com"      } - -    clear_config([:instance, :account_activation_required]) do -      Pleroma.Config.put([:instance, :account_activation_required], true) -    end +    setup do: clear_config([:instance, :account_activation_required], true)      test "it creates unconfirmed user" do        changeset = User.register_changeset(%User{}, @full_user_data) @@ -621,9 +617,8 @@ defmodule Pleroma.UserTest do        ap_id: "http...",        avatar: %{some: "avatar"}      } - -    clear_config([:instance, :user_bio_length]) -    clear_config([:instance, :user_name_length]) +    setup do: clear_config([:instance, :user_bio_length]) +    setup do: clear_config([:instance, :user_name_length])      test "it confirms validity" do        cs = User.remote_user_creation(@valid_remote) @@ -1116,7 +1111,7 @@ defmodule Pleroma.UserTest do        [user: user]      end -    clear_config([:instance, :federating]) +    setup do: clear_config([:instance, :federating])      test ".delete_user_activities deletes all create activities", %{user: user} do        {:ok, activity} = CommonAPI.post(user, %{"status" => "2hu"}) @@ -1297,7 +1292,7 @@ defmodule Pleroma.UserTest do    end    describe "account_status/1" do -    clear_config([:instance, :account_activation_required]) +    setup do: clear_config([:instance, :account_activation_required])      test "return confirmation_pending for unconfirm user" do        Pleroma.Config.put([:instance, :account_activation_required], true) @@ -1665,7 +1660,7 @@ defmodule Pleroma.UserTest do    end    describe "following/followers synchronization" do -    clear_config([:instance, :external_user_synchronization]) +    setup do: clear_config([:instance, :external_user_synchronization])      test "updates the counters normally on following/getting a follow when disabled" do        Pleroma.Config.put([:instance, :external_user_synchronization], false) @@ -1770,7 +1765,7 @@ defmodule Pleroma.UserTest do        [local_user: local_user, remote_user: remote_user]      end -    clear_config([:instance, :limit_to_local_content]) +    setup do: clear_config([:instance, :limit_to_local_content])      test "allows getting remote users by id no matter what :limit_to_local_content is set to", %{        remote_user: remote_user diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index bd8e0b5cc..573853afa 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -26,12 +26,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do      :ok    end -  clear_config([:instance, :federating]) do -    Config.put([:instance, :federating], true) -  end +  setup do: clear_config([:instance, :federating], true)    describe "/relay" do -    clear_config([:instance, :allow_relay]) +    setup do: clear_config([:instance, :allow_relay])      test "with the relay active, it returns the relay user", %{conn: conn} do        res = @@ -1227,8 +1225,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do        |> json_response(403)      end -    clear_config([:media_proxy]) -    clear_config([Pleroma.Upload]) +    setup do: clear_config([:media_proxy]) +    setup do: clear_config([Pleroma.Upload])      test "POST /api/ap/upload_media", %{conn: conn} do        user = insert(:user) diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 2ea03bbf9..17e7b97de 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -27,7 +27,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do      :ok    end -  clear_config([:instance, :federating]) +  setup do: clear_config([:instance, :federating])    describe "streaming out participations" do      test "it streams them out" do @@ -1396,7 +1396,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    end    describe "deletion" do -    clear_config([:instance, :rewrite_policy]) +    setup do: clear_config([:instance, :rewrite_policy])      test "it reverts deletion on error" do        note = insert(:note_activity) @@ -1425,6 +1425,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do        assert Repo.get(Object, object.id).data["type"] == "Tombstone"      end +    test "it doesn't fail when an activity was already deleted" do +      {:ok, delete} = insert(:note_activity) |> Object.normalize() |> ActivityPub.delete() + +      assert {:ok, ^delete} = delete |> Object.normalize() |> ActivityPub.delete() +    end +      test "decrements user note count only for public activities" do        user = insert(:user, note_count: 10) @@ -1580,7 +1586,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    end    describe "update" do -    clear_config([:instance, :max_pinned_statuses]) +    setup do: clear_config([:instance, :max_pinned_statuses])      test "it creates an update activity with the new user data" do        user = insert(:user) 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/hellthread_policy_test.exs b/test/web/activity_pub/mrf/hellthread_policy_test.exs index 916b95692..95ef0b168 100644 --- a/test/web/activity_pub/mrf/hellthread_policy_test.exs +++ b/test/web/activity_pub/mrf/hellthread_policy_test.exs @@ -26,7 +26,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicyTest do      [user: user, message: message]    end -  clear_config(:mrf_hellthread) +  setup do: clear_config(:mrf_hellthread)    describe "reject" do      test "rejects the message if the recipient count is above reject_threshold", %{ diff --git a/test/web/activity_pub/mrf/keyword_policy_test.exs b/test/web/activity_pub/mrf/keyword_policy_test.exs index 18242a889..fd1f7aec8 100644 --- a/test/web/activity_pub/mrf/keyword_policy_test.exs +++ b/test/web/activity_pub/mrf/keyword_policy_test.exs @@ -7,7 +7,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.KeywordPolicyTest do    alias Pleroma.Web.ActivityPub.MRF.KeywordPolicy -  clear_config(:mrf_keyword) +  setup do: clear_config(:mrf_keyword)    setup do      Pleroma.Config.put([:mrf_keyword], %{reject: [], federated_timeline_removal: [], replace: []}) diff --git a/test/web/activity_pub/mrf/mention_policy_test.exs b/test/web/activity_pub/mrf/mention_policy_test.exs index 08f7be542..aa003bef5 100644 --- a/test/web/activity_pub/mrf/mention_policy_test.exs +++ b/test/web/activity_pub/mrf/mention_policy_test.exs @@ -7,7 +7,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicyTest do    alias Pleroma.Web.ActivityPub.MRF.MentionPolicy -  clear_config(:mrf_mention) +  setup do: clear_config(:mrf_mention)    test "pass filter if allow list is empty" do      Pleroma.Config.delete([:mrf_mention]) diff --git a/test/web/activity_pub/mrf/mrf_test.exs b/test/web/activity_pub/mrf/mrf_test.exs index 04709df17..c941066f2 100644 --- a/test/web/activity_pub/mrf/mrf_test.exs +++ b/test/web/activity_pub/mrf/mrf_test.exs @@ -60,7 +60,7 @@ defmodule Pleroma.Web.ActivityPub.MRFTest do    end    describe "describe/0" do -    clear_config([:instance, :rewrite_policy]) +    setup do: clear_config([:instance, :rewrite_policy])      test "it works as expected with noop policy" do        expected = %{ 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..7ee195eeb 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 @@ -9,12 +9,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.ObjectAgePolicyTest do    alias Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy    alias Pleroma.Web.ActivityPub.Visibility -  clear_config([:mrf_object_age]) do -    Config.put(:mrf_object_age, -      threshold: 172_800, -      actions: [:delist, :strip_followers] -    ) -  end +  setup do: +          clear_config(:mrf_object_age, +            threshold: 172_800, +            actions: [:delist, :strip_followers] +          )    setup_all do      Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) 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..f36299b86 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 @@ -8,7 +8,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublicTest do    alias Pleroma.Web.ActivityPub.MRF.RejectNonPublic -  clear_config([:mrf_rejectnonpublic]) +  setup do: clear_config([:mrf_rejectnonpublic])    describe "public message" do      test "it's allowed when address is public" 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..91c24c2d9 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 @@ -8,18 +8,17 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicyTest do    alias Pleroma.Config    alias Pleroma.Web.ActivityPub.MRF.SimplePolicy -  clear_config([:mrf_simple]) do -    Config.put(:mrf_simple, -      media_removal: [], -      media_nsfw: [], -      federated_timeline_removal: [], -      report_removal: [], -      reject: [], -      accept: [], -      avatar_removal: [], -      banner_removal: [] -    ) -  end +  setup do: +          clear_config(:mrf_simple, +            media_removal: [], +            media_nsfw: [], +            federated_timeline_removal: [], +            report_removal: [], +            reject: [], +            accept: [], +            avatar_removal: [], +            banner_removal: [] +          )    describe "when :media_removal" do      test "is empty" do diff --git a/test/web/activity_pub/mrf/subchain_policy_test.exs b/test/web/activity_pub/mrf/subchain_policy_test.exs index 221b8958e..fff66cb7e 100644 --- a/test/web/activity_pub/mrf/subchain_policy_test.exs +++ b/test/web/activity_pub/mrf/subchain_policy_test.exs @@ -13,8 +13,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SubchainPolicyTest do      "type" => "Create",      "object" => %{"content" => "hi"}    } - -  clear_config([:mrf_subchain, :match_actor]) +  setup do: clear_config([:mrf_subchain, :match_actor])    test "it matches and processes subchains when the actor matches a configured target" do      Pleroma.Config.put([:mrf_subchain, :match_actor], %{ diff --git a/test/web/activity_pub/mrf/user_allowlist_policy_test.exs b/test/web/activity_pub/mrf/user_allowlist_policy_test.exs index 87c9e1b29..724bae058 100644 --- a/test/web/activity_pub/mrf/user_allowlist_policy_test.exs +++ b/test/web/activity_pub/mrf/user_allowlist_policy_test.exs @@ -7,7 +7,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.UserAllowListPolicyTest do    alias Pleroma.Web.ActivityPub.MRF.UserAllowListPolicy -  clear_config([:mrf_user_allowlist, :localhost]) +  setup do: clear_config([:mrf_user_allowlist, :localhost])    test "pass filter if allow list is empty" do      actor = insert(:user) diff --git a/test/web/activity_pub/mrf/vocabulary_policy_test.exs b/test/web/activity_pub/mrf/vocabulary_policy_test.exs index d9207b095..69f22bb77 100644 --- a/test/web/activity_pub/mrf/vocabulary_policy_test.exs +++ b/test/web/activity_pub/mrf/vocabulary_policy_test.exs @@ -8,7 +8,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.VocabularyPolicyTest do    alias Pleroma.Web.ActivityPub.MRF.VocabularyPolicy    describe "accept" do -    clear_config([:mrf_vocabulary, :accept]) +    setup do: clear_config([:mrf_vocabulary, :accept])      test "it accepts based on parent activity type" do        Pleroma.Config.put([:mrf_vocabulary, :accept], ["Like"]) @@ -65,7 +65,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.VocabularyPolicyTest do    end    describe "reject" do -    clear_config([:mrf_vocabulary, :reject]) +    setup do: clear_config([:mrf_vocabulary, :reject])      test "it rejects based on parent activity type" do        Pleroma.Config.put([:mrf_vocabulary, :reject], ["Like"]) diff --git a/test/web/activity_pub/publisher_test.exs b/test/web/activity_pub/publisher_test.exs index da26b13f7..801da03c1 100644 --- a/test/web/activity_pub/publisher_test.exs +++ b/test/web/activity_pub/publisher_test.exs @@ -23,9 +23,7 @@ defmodule Pleroma.Web.ActivityPub.PublisherTest do      :ok    end -  clear_config_all([:instance, :federating]) do -    Pleroma.Config.put([:instance, :federating], true) -  end +  setup_all do: clear_config([:instance, :federating], true)    describe "gather_webfinger_links/1" do      test "it returns links" do diff --git a/test/web/activity_pub/relay_test.exs b/test/web/activity_pub/relay_test.exs index e3115dcd8..9e16e39c4 100644 --- a/test/web/activity_pub/relay_test.exs +++ b/test/web/activity_pub/relay_test.exs @@ -68,7 +68,7 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do    end    describe "publish/1" do -    clear_config([:instance, :federating]) +    setup do: clear_config([:instance, :federating])      test "returns error when activity not `Create` type" do        activity = insert(:like_activity) @@ -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/activity_pub/transmogrifier/follow_handling_test.exs b/test/web/activity_pub/transmogrifier/follow_handling_test.exs index c3d3f9830..967389fae 100644 --- a/test/web/activity_pub/transmogrifier/follow_handling_test.exs +++ b/test/web/activity_pub/transmogrifier/follow_handling_test.exs @@ -19,7 +19,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do    end    describe "handle_incoming" do -    clear_config([:user, :deny_follow_blocked]) +    setup do: clear_config([:user, :deny_follow_blocked])      test "it works for osada follow request" do        user = insert(:user) diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 83372ec7e..6dfd823f7 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -25,7 +25,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do      :ok    end -  clear_config([:instance, :max_remote_account_fields]) +  setup do: clear_config([:instance, :max_remote_account_fields])    describe "handle_incoming" do      test "it ignores an incoming notice if we already have it" do @@ -1353,11 +1353,8 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    end    describe "`handle_incoming/2`, Mastodon format `replies` handling" do -    clear_config([:activitypub, :note_replies_output_limit]) do -      Pleroma.Config.put([:activitypub, :note_replies_output_limit], 5) -    end - -    clear_config([:instance, :federation_incoming_replies_max_depth]) +    setup do: clear_config([:activitypub, :note_replies_output_limit], 5) +    setup do: clear_config([:instance, :federation_incoming_replies_max_depth])      setup do        data = @@ -1396,11 +1393,8 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    end    describe "`handle_incoming/2`, Pleroma format `replies` handling" do -    clear_config([:activitypub, :note_replies_output_limit]) do -      Pleroma.Config.put([:activitypub, :note_replies_output_limit], 5) -    end - -    clear_config([:instance, :federation_incoming_replies_max_depth]) +    setup do: clear_config([:activitypub, :note_replies_output_limit], 5) +    setup do: clear_config([:instance, :federation_incoming_replies_max_depth])      setup do        user = insert(:user) @@ -1884,7 +1878,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    end    describe "fix_in_reply_to/2" do -    clear_config([:instance, :federation_incoming_replies_max_depth]) +    setup do: clear_config([:instance, :federation_incoming_replies_max_depth])      setup do        data = Poison.decode!(File.read!("test/fixtures/mastodon-post-activity.json")) @@ -2147,9 +2141,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do    end    describe "set_replies/1" do -    clear_config([:activitypub, :note_replies_output_limit]) do -      Pleroma.Config.put([:activitypub, :note_replies_output_limit], 2) -    end +    setup do: clear_config([:activitypub, :note_replies_output_limit], 2)      test "returns unmodified object if activity doesn't have self-replies" do        data = Poison.decode!(File.read!("test/fixtures/mastodon-post-activity.json")) diff --git a/test/web/activity_pub/views/object_view_test.exs b/test/web/activity_pub/views/object_view_test.exs index f6796ad4a..6c006206b 100644 --- a/test/web/activity_pub/views/object_view_test.exs +++ b/test/web/activity_pub/views/object_view_test.exs @@ -37,9 +37,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectViewTest do    end    describe "note activity's `replies` collection rendering" do -    clear_config([:activitypub, :note_replies_output_limit]) do -      Pleroma.Config.put([:activitypub, :note_replies_output_limit], 5) -    end +    setup do: clear_config([:activitypub, :note_replies_output_limit], 5)      test "renders `replies` collection for a note activity" do        user = insert(:user) diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index e4c152fb7..fe8a086d8 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -21,7 +21,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    alias Pleroma.UserInviteToken    alias Pleroma.Web.ActivityPub.Relay    alias Pleroma.Web.CommonAPI -  alias Pleroma.Web.MastodonAPI.StatusView    alias Pleroma.Web.MediaProxy    setup_all do @@ -43,9 +42,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    end    describe "with [:auth, :enforce_oauth_admin_scope_usage]," do -    clear_config([:auth, :enforce_oauth_admin_scope_usage]) do -      Config.put([:auth, :enforce_oauth_admin_scope_usage], true) -    end +    setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], true)      test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope",           %{admin: admin} do @@ -93,9 +90,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    end    describe "unless [:auth, :enforce_oauth_admin_scope_usage]," do -    clear_config([:auth, :enforce_oauth_admin_scope_usage]) do -      Config.put([:auth, :enforce_oauth_admin_scope_usage], false) -    end +    setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false)      test "GET /api/pleroma/admin/users/:nickname requires " <>             "read:accounts or admin:read:accounts or broader scope", @@ -581,13 +576,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    end    describe "POST /api/pleroma/admin/email_invite, with valid config" do -    clear_config([:instance, :registrations_open]) do -      Config.put([:instance, :registrations_open], false) -    end - -    clear_config([:instance, :invites_enabled]) do -      Config.put([:instance, :invites_enabled], true) -    end +    setup do: clear_config([:instance, :registrations_open], false) +    setup do: clear_config([:instance, :invites_enabled], true)      test "sends invitation and returns 204", %{admin: admin, conn: conn} do        recipient_email = "foo@bar.com" @@ -638,8 +628,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    end    describe "POST /api/pleroma/admin/users/email_invite, with invalid config" do -    clear_config([:instance, :registrations_open]) -    clear_config([:instance, :invites_enabled]) +    setup do: clear_config([:instance, :registrations_open]) +    setup do: clear_config([:instance, :invites_enabled])      test "it returns 500 if `invites_enabled` is not enabled", %{conn: conn} do        Config.put([:instance, :registrations_open], false) @@ -1595,208 +1585,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end -  describe "GET /api/pleroma/admin/grouped_reports" do -    setup do -      [reporter, target_user] = insert_pair(:user) - -      date1 = (DateTime.to_unix(DateTime.utc_now()) + 1000) |> DateTime.from_unix!() -      date2 = (DateTime.to_unix(DateTime.utc_now()) + 2000) |> DateTime.from_unix!() -      date3 = (DateTime.to_unix(DateTime.utc_now()) + 3000) |> DateTime.from_unix!() - -      first_status = -        insert(:note_activity, user: target_user, data_attrs: %{"published" => date1}) - -      second_status = -        insert(:note_activity, user: target_user, data_attrs: %{"published" => date2}) - -      third_status = -        insert(:note_activity, user: target_user, data_attrs: %{"published" => date3}) - -      {:ok, first_report} = -        CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "status_ids" => [first_status.id, second_status.id, third_status.id] -        }) - -      {:ok, second_report} = -        CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "status_ids" => [first_status.id, second_status.id] -        }) - -      {:ok, third_report} = -        CommonAPI.report(reporter, %{ -          "account_id" => target_user.id, -          "status_ids" => [first_status.id] -        }) - -      %{ -        first_status: Activity.get_by_ap_id_with_object(first_status.data["id"]), -        second_status: Activity.get_by_ap_id_with_object(second_status.data["id"]), -        third_status: Activity.get_by_ap_id_with_object(third_status.data["id"]), -        first_report: first_report, -        first_status_reports: [first_report, second_report, third_report], -        second_status_reports: [first_report, second_report], -        third_status_reports: [first_report], -        target_user: target_user, -        reporter: reporter -      } -    end - -    test "returns reports grouped by status", %{ -      conn: conn, -      first_status: first_status, -      second_status: second_status, -      third_status: third_status, -      first_status_reports: first_status_reports, -      second_status_reports: second_status_reports, -      third_status_reports: third_status_reports, -      target_user: target_user, -      reporter: reporter -    } do -      response = -        conn -        |> get("/api/pleroma/admin/grouped_reports") -        |> json_response(:ok) - -      assert length(response["reports"]) == 3 - -      first_group = Enum.find(response["reports"], &(&1["status"]["id"] == first_status.id)) - -      second_group = Enum.find(response["reports"], &(&1["status"]["id"] == second_status.id)) - -      third_group = Enum.find(response["reports"], &(&1["status"]["id"] == third_status.id)) - -      assert length(first_group["reports"]) == 3 -      assert length(second_group["reports"]) == 2 -      assert length(third_group["reports"]) == 1 - -      assert first_group["date"] == -               Enum.max_by(first_status_reports, fn act -> -                 NaiveDateTime.from_iso8601!(act.data["published"]) -               end).data["published"] - -      assert first_group["status"] == -               Map.put( -                 stringify_keys(StatusView.render("show.json", %{activity: first_status})), -                 "deleted", -                 false -               ) - -      assert(first_group["account"]["id"] == target_user.id) - -      assert length(first_group["actors"]) == 1 -      assert hd(first_group["actors"])["id"] == reporter.id - -      assert Enum.map(first_group["reports"], & &1["id"]) -- -               Enum.map(first_status_reports, & &1.id) == [] - -      assert second_group["date"] == -               Enum.max_by(second_status_reports, fn act -> -                 NaiveDateTime.from_iso8601!(act.data["published"]) -               end).data["published"] - -      assert second_group["status"] == -               Map.put( -                 stringify_keys(StatusView.render("show.json", %{activity: second_status})), -                 "deleted", -                 false -               ) - -      assert second_group["account"]["id"] == target_user.id - -      assert length(second_group["actors"]) == 1 -      assert hd(second_group["actors"])["id"] == reporter.id - -      assert Enum.map(second_group["reports"], & &1["id"]) -- -               Enum.map(second_status_reports, & &1.id) == [] - -      assert third_group["date"] == -               Enum.max_by(third_status_reports, fn act -> -                 NaiveDateTime.from_iso8601!(act.data["published"]) -               end).data["published"] - -      assert third_group["status"] == -               Map.put( -                 stringify_keys(StatusView.render("show.json", %{activity: third_status})), -                 "deleted", -                 false -               ) - -      assert third_group["account"]["id"] == target_user.id - -      assert length(third_group["actors"]) == 1 -      assert hd(third_group["actors"])["id"] == reporter.id - -      assert Enum.map(third_group["reports"], & &1["id"]) -- -               Enum.map(third_status_reports, & &1.id) == [] -    end - -    test "reopened report renders status data", %{ -      conn: conn, -      first_report: first_report, -      first_status: first_status -    } do -      {:ok, _} = CommonAPI.update_report_state(first_report.id, "resolved") - -      response = -        conn -        |> get("/api/pleroma/admin/grouped_reports") -        |> json_response(:ok) - -      first_group = Enum.find(response["reports"], &(&1["status"]["id"] == first_status.id)) - -      assert first_group["status"] == -               Map.put( -                 stringify_keys(StatusView.render("show.json", %{activity: first_status})), -                 "deleted", -                 false -               ) -    end - -    test "reopened report does not render status data if status has been deleted", %{ -      conn: conn, -      first_report: first_report, -      first_status: first_status, -      target_user: target_user -    } do -      {:ok, _} = CommonAPI.update_report_state(first_report.id, "resolved") -      {:ok, _} = CommonAPI.delete(first_status.id, target_user) - -      refute Activity.get_by_ap_id(first_status.id) - -      response = -        conn -        |> get("/api/pleroma/admin/grouped_reports") -        |> json_response(:ok) - -      assert Enum.find(response["reports"], &(&1["status"]["deleted"] == true))["status"][ -               "deleted" -             ] == true - -      assert length(Enum.filter(response["reports"], &(&1["status"]["deleted"] == false))) == 2 -    end - -    test "account not empty if status was deleted", %{ -      conn: conn, -      first_report: first_report, -      first_status: first_status, -      target_user: target_user -    } do -      {:ok, _} = CommonAPI.update_report_state(first_report.id, "resolved") -      {:ok, _} = CommonAPI.delete(first_status.id, target_user) - -      refute Activity.get_by_ap_id(first_status.id) - -      response = -        conn -        |> get("/api/pleroma/admin/grouped_reports") -        |> json_response(:ok) - -      assert Enum.find(response["reports"], &(&1["status"]["deleted"] == true))["account"] -    end -  end -    describe "PUT /api/pleroma/admin/statuses/:id" do      setup do        activity = insert(:note_activity) @@ -1888,9 +1676,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    end    describe "GET /api/pleroma/admin/config" do -    clear_config(:configurable_from_database) do -      Config.put(:configurable_from_database, true) -    end +    setup do: clear_config(:configurable_from_database, true)      test "when configuration from database is off", %{conn: conn} do        Config.put(:configurable_from_database, false) @@ -2041,9 +1827,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do        end)      end -    clear_config(:configurable_from_database) do -      Config.put(:configurable_from_database, true) -    end +    setup do: clear_config(:configurable_from_database, true)      @tag capture_log: true      test "create new config setting in db", %{conn: conn} do @@ -2585,9 +2369,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 +2381,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 +2404,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 +2416,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"]                   }                 ]               } @@ -3052,9 +2818,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do    end    describe "GET /api/pleroma/admin/restart" do -    clear_config(:configurable_from_database) do -      Config.put(:configurable_from_database, true) -    end +    setup do: clear_config(:configurable_from_database, true)      test "pleroma restarts", %{conn: conn} do        capture_log(fn -> @@ -3389,6 +3153,75 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do      end    end +  describe "GET /users/:nickname/credentials" do +    test "gets the user credentials", %{conn: conn} do +      user = insert(:user) +      conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials") + +      response = assert json_response(conn, 200) +      assert response["email"] == user.email +    end + +    test "returns 403 if requested by a non-admin" do +      user = insert(:user) + +      conn = +        build_conn() +        |> assign(:user, user) +        |> get("/api/pleroma/admin/users/#{user.nickname}/credentials") + +      assert json_response(conn, :forbidden) +    end +  end + +  describe "PATCH /users/:nickname/credentials" do +    test "changes password and email", %{conn: conn, admin: admin} do +      user = insert(:user) +      assert user.password_reset_pending == false + +      conn = +        patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{ +          "password" => "new_password", +          "email" => "new_email@example.com", +          "name" => "new_name" +        }) + +      assert json_response(conn, 200) == %{"status" => "success"} + +      ObanHelpers.perform_all() + +      updated_user = User.get_by_id(user.id) + +      assert updated_user.email == "new_email@example.com" +      assert updated_user.name == "new_name" +      assert updated_user.password_hash != user.password_hash +      assert updated_user.password_reset_pending == true + +      [log_entry2, log_entry1] = ModerationLog |> Repo.all() |> Enum.sort() + +      assert ModerationLog.get_log_entry_message(log_entry1) == +               "@#{admin.nickname} updated users: @#{user.nickname}" + +      assert ModerationLog.get_log_entry_message(log_entry2) == +               "@#{admin.nickname} forced password reset for users: @#{user.nickname}" +    end + +    test "returns 403 if requested by a non-admin" do +      user = insert(:user) + +      conn = +        build_conn() +        |> assign(:user, user) +        |> patch("/api/pleroma/admin/users/#{user.nickname}/credentials", %{ +          "password" => "new_password", +          "email" => "new_email@example.com", +          "name" => "new_name" +        }) + +      assert json_response(conn, :forbidden) +    end +  end +    describe "PATCH /users/:nickname/force_password_reset" do      test "sets password_reset_pending to true", %{conn: conn} do        user = insert(:user) diff --git a/test/web/chat_channel_test.exs b/test/web/chat_channel_test.exs index 68c24a9f9..f18f3a212 100644 --- a/test/web/chat_channel_test.exs +++ b/test/web/chat_channel_test.exs @@ -21,7 +21,7 @@ defmodule Pleroma.Web.ChatChannelTest do    end    describe "message lengths" do -    clear_config([:instance, :chat_limit]) +    setup do: clear_config([:instance, :chat_limit])      test "it ignores messages of length zero", %{socket: socket} do        push(socket, "new_msg", %{"text" => ""}) diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index c2ed1c789..f46ad0272 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -17,9 +17,9 @@ defmodule Pleroma.Web.CommonAPITest do    require Pleroma.Constants -  clear_config([:instance, :safe_dm_mentions]) -  clear_config([:instance, :limit]) -  clear_config([:instance, :max_pinned_statuses]) +  setup do: clear_config([:instance, :safe_dm_mentions]) +  setup do: clear_config([:instance, :limit]) +  setup do: clear_config([:instance, :max_pinned_statuses])    test "when replying to a conversation / participation, it will set the correct context id even if no explicit reply_to is given" do      user = insert(:user) 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/federator_test.exs b/test/web/federator_test.exs index d2ee2267c..da844c24c 100644 --- a/test/web/federator_test.exs +++ b/test/web/federator_test.exs @@ -21,13 +21,10 @@ defmodule Pleroma.Web.FederatorTest do      :ok    end -  clear_config_all([:instance, :federating]) do -    Pleroma.Config.put([:instance, :federating], true) -  end - -  clear_config([:instance, :allow_relay]) -  clear_config([:instance, :rewrite_policy]) -  clear_config([:mrf_keyword]) +  setup_all do: clear_config([:instance, :federating], true) +  setup do: clear_config([:instance, :allow_relay]) +  setup do: clear_config([:instance, :rewrite_policy]) +  setup do: clear_config([:mrf_keyword])    describe "Publish an activity" do      setup do diff --git a/test/web/feed/tag_controller_test.exs b/test/web/feed/tag_controller_test.exs index 5950605e8..e863df86b 100644 --- a/test/web/feed/tag_controller_test.exs +++ b/test/web/feed/tag_controller_test.exs @@ -8,9 +8,11 @@ defmodule Pleroma.Web.Feed.TagControllerTest do    import Pleroma.Factory    import SweetXml +  alias Pleroma.Object +  alias Pleroma.Web.CommonAPI    alias Pleroma.Web.Feed.FeedView -  clear_config([:feed]) +  setup do: clear_config([:feed])    test "gets a feed (ATOM)", %{conn: conn} do      Pleroma.Config.put( @@ -19,9 +21,9 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      )      user = insert(:user) -    {:ok, activity1} = Pleroma.Web.CommonAPI.post(user, %{"status" => "yeah #PleromaArt"}) +    {:ok, activity1} = CommonAPI.post(user, %{"status" => "yeah #PleromaArt"}) -    object = Pleroma.Object.normalize(activity1) +    object = Object.normalize(activity1)      object_data =        Map.put(object.data, "attachment", [ @@ -41,14 +43,13 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      |> Ecto.Changeset.change(data: object_data)      |> Pleroma.Repo.update() -    {:ok, _activity2} = -      Pleroma.Web.CommonAPI.post(user, %{"status" => "42 This is :moominmamma #PleromaArt"}) +    {:ok, activity2} = CommonAPI.post(user, %{"status" => "42 This is :moominmamma #PleromaArt"}) -    {:ok, _activity3} = Pleroma.Web.CommonAPI.post(user, %{"status" => "This is :moominmamma"}) +    {:ok, _activity3} = CommonAPI.post(user, %{"status" => "This is :moominmamma"})      response =        conn -      |> put_req_header("content-type", "application/atom+xml") +      |> put_req_header("accept", "application/atom+xml")        |> get(tag_feed_path(conn, :feed, "pleromaart.atom"))        |> response(200) @@ -63,6 +64,21 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      assert xpath(xml, ~x"//feed/entry/author/name/text()"ls) == [user.nickname, user.nickname]      assert xpath(xml, ~x"//feed/entry/author/id/text()"ls) == [user.ap_id, user.ap_id] + +    conn = +      conn +      |> put_req_header("accept", "application/atom+xml") +      |> get("/tags/pleromaart.atom", %{"max_id" => activity2.id}) + +    assert get_resp_header(conn, "content-type") == ["application/atom+xml; charset=utf-8"] +    resp = response(conn, 200) +    xml = parse(resp) + +    assert xpath(xml, ~x"//feed/title/text()") == '#pleromaart' + +    assert xpath(xml, ~x"//feed/entry/title/text()"l) == [ +             'yeah #PleromaArt' +           ]    end    test "gets a feed (RSS)", %{conn: conn} do @@ -72,9 +88,9 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      )      user = insert(:user) -    {:ok, activity1} = Pleroma.Web.CommonAPI.post(user, %{"status" => "yeah #PleromaArt"}) +    {:ok, activity1} = CommonAPI.post(user, %{"status" => "yeah #PleromaArt"}) -    object = Pleroma.Object.normalize(activity1) +    object = Object.normalize(activity1)      object_data =        Map.put(object.data, "attachment", [ @@ -94,14 +110,13 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      |> Ecto.Changeset.change(data: object_data)      |> Pleroma.Repo.update() -    {:ok, activity2} = -      Pleroma.Web.CommonAPI.post(user, %{"status" => "42 This is :moominmamma #PleromaArt"}) +    {:ok, activity2} = CommonAPI.post(user, %{"status" => "42 This is :moominmamma #PleromaArt"}) -    {:ok, _activity3} = Pleroma.Web.CommonAPI.post(user, %{"status" => "This is :moominmamma"}) +    {:ok, _activity3} = CommonAPI.post(user, %{"status" => "This is :moominmamma"})      response =        conn -      |> put_req_header("content-type", "application/rss+xml") +      |> put_req_header("accept", "application/rss+xml")        |> get(tag_feed_path(conn, :feed, "pleromaart.rss"))        |> response(200) @@ -131,8 +146,8 @@ defmodule Pleroma.Web.Feed.TagControllerTest do               "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4"             ] -    obj1 = Pleroma.Object.normalize(activity1) -    obj2 = Pleroma.Object.normalize(activity2) +    obj1 = Object.normalize(activity1) +    obj2 = Object.normalize(activity2)      assert xpath(xml, ~x"//channel/item/description/text()"sl) == [               HtmlEntities.decode(FeedView.activity_content(obj2)), @@ -141,7 +156,7 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      response =        conn -      |> put_req_header("content-type", "application/atom+xml") +      |> put_req_header("accept", "application/rss+xml")        |> get(tag_feed_path(conn, :feed, "pleromaart"))        |> response(200) @@ -150,5 +165,20 @@ defmodule Pleroma.Web.Feed.TagControllerTest do      assert xpath(xml, ~x"//channel/description/text()"s) ==               "These are public toots tagged with #pleromaart. You can interact with them if you have an account anywhere in the fediverse." + +    conn = +      conn +      |> put_req_header("accept", "application/rss+xml") +      |> get("/tags/pleromaart.rss", %{"max_id" => activity2.id}) + +    assert get_resp_header(conn, "content-type") == ["application/rss+xml; charset=utf-8"] +    resp = response(conn, 200) +    xml = parse(resp) + +    assert xpath(xml, ~x"//channel/title/text()") == '#pleromaart' + +    assert xpath(xml, ~x"//channel/item/title/text()"l) == [ +             'yeah #PleromaArt' +           ]    end  end diff --git a/test/web/feed/user_controller_test.exs b/test/web/feed/user_controller_test.exs index 00c50f003..05ad427c2 100644 --- a/test/web/feed/user_controller_test.exs +++ b/test/web/feed/user_controller_test.exs @@ -12,12 +12,10 @@ defmodule Pleroma.Web.Feed.UserControllerTest do    alias Pleroma.Object    alias Pleroma.User -  clear_config([:instance, :federating]) do -    Config.put([:instance, :federating], true) -  end +  setup do: clear_config([:instance, :federating], true)    describe "feed" do -    clear_config([:feed]) +    setup do: clear_config([:feed])      test "gets a feed", %{conn: conn} do        Config.put( @@ -54,12 +52,12 @@ defmodule Pleroma.Web.Feed.UserControllerTest do            }          ) -      _note_activity2 = insert(:note_activity, note: note2) +      note_activity2 = insert(:note_activity, note: note2)        object = Object.normalize(note_activity)        resp =          conn -        |> put_req_header("content-type", "application/atom+xml") +        |> put_req_header("accept", "application/atom+xml")          |> get(user_feed_path(conn, :feed, user.nickname))          |> response(200) @@ -70,12 +68,91 @@ defmodule Pleroma.Web.Feed.UserControllerTest do        assert activity_titles == ['42 This...', 'This is...']        assert resp =~ object.data["content"] + +      resp = +        conn +        |> put_req_header("accept", "application/atom+xml") +        |> get("/users/#{user.nickname}/feed", %{"max_id" => note_activity2.id}) +        |> response(200) + +      activity_titles = +        resp +        |> SweetXml.parse() +        |> SweetXml.xpath(~x"//entry/title/text()"l) + +      assert activity_titles == ['This is...'] +    end + +    test "gets a rss feed", %{conn: conn} do +      Pleroma.Config.put( +        [:feed, :post_title], +        %{max_length: 10, omission: "..."} +      ) + +      activity = insert(:note_activity) + +      note = +        insert(:note, +          data: %{ +            "content" => "This is :moominmamma: note ", +            "attachment" => [ +              %{ +                "url" => [ +                  %{"mediaType" => "image/png", "href" => "https://pleroma.gov/image.png"} +                ] +              } +            ], +            "inReplyTo" => activity.data["id"] +          } +        ) + +      note_activity = insert(:note_activity, note: note) +      user = User.get_cached_by_ap_id(note_activity.data["actor"]) + +      note2 = +        insert(:note, +          user: user, +          data: %{ +            "content" => "42 This is :moominmamma: note ", +            "inReplyTo" => activity.data["id"] +          } +        ) + +      note_activity2 = insert(:note_activity, note: note2) +      object = Object.normalize(note_activity) + +      resp = +        conn +        |> put_req_header("accept", "application/rss+xml") +        |> get("/users/#{user.nickname}/feed.rss") +        |> response(200) + +      activity_titles = +        resp +        |> SweetXml.parse() +        |> SweetXml.xpath(~x"//item/title/text()"l) + +      assert activity_titles == ['42 This...', 'This is...'] +      assert resp =~ object.data["content"] + +      resp = +        conn +        |> put_req_header("accept", "application/rss+xml") +        |> get("/users/#{user.nickname}/feed.rss", %{"max_id" => note_activity2.id}) +        |> response(200) + +      activity_titles = +        resp +        |> SweetXml.parse() +        |> SweetXml.xpath(~x"//item/title/text()"l) + +      assert activity_titles == ['This is...']      end      test "returns 404 for a missing feed", %{conn: conn} do        conn =          conn -        |> put_req_header("content-type", "application/atom+xml") +        |> put_req_header("accept", "application/atom+xml")          |> get(user_feed_path(conn, :feed, "nonexisting"))        assert response(conn, 404) diff --git a/test/web/instances/instance_test.exs b/test/web/instances/instance_test.exs index a3c93b986..e463200ca 100644 --- a/test/web/instances/instance_test.exs +++ b/test/web/instances/instance_test.exs @@ -10,9 +10,7 @@ defmodule Pleroma.Instances.InstanceTest do    import Pleroma.Factory -  clear_config_all([:instance, :federation_reachability_timeout_days]) do -    Pleroma.Config.put([:instance, :federation_reachability_timeout_days], 1) -  end +  setup_all do: clear_config([:instance, :federation_reachability_timeout_days], 1)    describe "set_reachable/1" do      test "clears `unreachable_since` of existing matching Instance record having non-nil `unreachable_since`" do diff --git a/test/web/instances/instances_test.exs b/test/web/instances/instances_test.exs index c5d6abc9c..d2618025c 100644 --- a/test/web/instances/instances_test.exs +++ b/test/web/instances/instances_test.exs @@ -7,9 +7,7 @@ defmodule Pleroma.InstancesTest do    use Pleroma.DataCase -  clear_config_all([:instance, :federation_reachability_timeout_days]) do -    Pleroma.Config.put([:instance, :federation_reachability_timeout_days], 1) -  end +  setup_all do: clear_config([:instance, :federation_reachability_timeout_days], 1)    describe "reachable?/1" do      test "returns `true` for host / url with unknown reachability status" do diff --git a/test/web/masto_fe_controller_test.exs b/test/web/masto_fe_controller_test.exs index 9a2d76e0b..1d107d56c 100644 --- a/test/web/masto_fe_controller_test.exs +++ b/test/web/masto_fe_controller_test.exs @@ -10,7 +10,7 @@ defmodule Pleroma.Web.MastodonAPI.MastoFEController do    import Pleroma.Factory -  clear_config([:instance, :public]) +  setup do: clear_config([:instance, :public])    test "put settings", %{conn: conn} do      user = insert(:user) diff --git a/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs b/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs index cba68859e..b693c1a47 100644 --- a/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs +++ b/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs @@ -9,7 +9,8 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do    use Pleroma.Web.ConnCase    import Pleroma.Factory -  clear_config([:instance, :max_account_fields]) + +  setup do: clear_config([:instance, :max_account_fields])    describe "updating credentials" do      setup do: oauth_access(["write:accounts"]) @@ -75,7 +76,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        conn =          patch(conn, "/api/v1/accounts/update_credentials", %{ -          "note" => "I drink #cofe with @#{user2.nickname}" +          "note" => "I drink #cofe with @#{user2.nickname}\n\nsuya.."          })        assert user_data = json_response(conn, 200) @@ -83,7 +84,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        assert user_data["note"] ==                 ~s(I drink <a class="hashtag" data-tag="cofe" href="http://localhost:4001/tag/cofe">#cofe</a> with <span class="h-card"><a data-user="#{                   user2.id -               }" class="u-url mention" href="#{user2.ap_id}" rel="ugc">@<span>#{user2.nickname}</span></a></span>) +               }" class="u-url mention" href="#{user2.ap_id}" rel="ugc">@<span>#{user2.nickname}</span></a></span><br/><br/>suya..)      end      test "updates the user's locking status", %{conn: conn} do @@ -117,6 +118,18 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do        assert user_data["pleroma"]["hide_followers"] == true      end +    test "updates the user's discoverable status", %{conn: conn} do +      assert %{"source" => %{"pleroma" => %{"discoverable" => true}}} = +               conn +               |> patch("/api/v1/accounts/update_credentials", %{discoverable: "true"}) +               |> json_response(:ok) + +      assert %{"source" => %{"pleroma" => %{"discoverable" => false}}} = +               conn +               |> patch("/api/v1/accounts/update_credentials", %{discoverable: "false"}) +               |> json_response(:ok) +    end +      test "updates the user's hide_followers_count and hide_follows_count", %{conn: conn} do        conn =          patch(conn, "/api/v1/accounts/update_credentials", %{ diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 7efccd9c4..a9fa0ce48 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -5,6 +5,7 @@  defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do    use Pleroma.Web.ConnCase +  alias Pleroma.Config    alias Pleroma.Repo    alias Pleroma.User    alias Pleroma.Web.ActivityPub.ActivityPub @@ -15,7 +16,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do    import Pleroma.Factory    describe "account fetching" do -    clear_config([:instance, :limit_to_local_content]) +    setup do: clear_config([:instance, :limit_to_local_content])      test "works by id" do        user = insert(:user) @@ -46,7 +47,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end      test "works by nickname for remote users" do -      Pleroma.Config.put([:instance, :limit_to_local_content], false) +      Config.put([:instance, :limit_to_local_content], false)        user = insert(:user, nickname: "user@example.com", local: false)        conn = @@ -58,7 +59,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end      test "respects limit_to_local_content == :all for remote user nicknames" do -      Pleroma.Config.put([:instance, :limit_to_local_content], :all) +      Config.put([:instance, :limit_to_local_content], :all)        user = insert(:user, nickname: "user@example.com", local: false) @@ -70,7 +71,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end      test "respects limit_to_local_content == :unauthenticated for remote user nicknames" do -      Pleroma.Config.put([:instance, :limit_to_local_content], :unauthenticated) +      Config.put([:instance, :limit_to_local_content], :unauthenticated)        user = insert(:user, nickname: "user@example.com", local: false)        reading_user = insert(:user) @@ -140,6 +141,98 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end    end +  defp local_and_remote_users do +    local = insert(:user) +    remote = insert(:user, local: false) +    {:ok, local: local, remote: remote} +  end + +  describe "user fetching with restrict unauthenticated profiles for local and remote" do +    setup do: local_and_remote_users() + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :local], true) + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/accounts/#{local.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/accounts/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end +  end + +  describe "user fetching with restrict unauthenticated profiles for local" do +    setup do: local_and_remote_users() + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :local], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/accounts/#{local.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/accounts/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end +  end + +  describe "user fetching with restrict unauthenticated profiles for remote" do +    setup do: local_and_remote_users() + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/accounts/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/accounts/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end +  end +    describe "user timelines" do      setup do: oauth_access(["read:statuses"]) @@ -293,6 +386,102 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do      end    end +  defp local_and_remote_activities(%{local: local, remote: remote}) do +    insert(:note_activity, user: local) +    insert(:note_activity, user: remote, local: false) + +    :ok +  end + +  describe "statuses with restrict unauthenticated profiles for local and remote" do +    setup do: local_and_remote_users() +    setup :local_and_remote_activities + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :local], true) + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 +    end +  end + +  describe "statuses with restrict unauthenticated profiles for local" do +    setup do: local_and_remote_users() +    setup :local_and_remote_activities + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :local], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 +    end +  end + +  describe "statuses with restrict unauthenticated profiles for remote" do +    setup do: local_and_remote_users() +    setup :local_and_remote_activities + +    setup do: clear_config([:restrict_unauthenticated, :profiles, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Can't find user" +             } +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") +      assert length(json_response(res_conn, 200)) == 1 +    end +  end +    describe "followers" do      setup do: oauth_access(["read:accounts"]) @@ -601,7 +790,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        [valid_params: valid_params]      end -    clear_config([:instance, :account_activation_required]) +    setup do: clear_config([:instance, :account_activation_required])      test "Account registration via Application", %{conn: conn} do        conn = @@ -699,7 +888,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do        end)      end -    clear_config([:instance, :account_activation_required]) +    setup do: clear_config([:instance, :account_activation_required])      test "returns bad_request if missing email params when :account_activation_required is enabled",           %{conn: conn, valid_params: valid_params} do @@ -756,9 +945,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do    end    describe "create account by app / rate limit" do -    clear_config([:rate_limit, :app_account_creation]) do -      Pleroma.Config.put([:rate_limit, :app_account_creation], {10_000, 2}) -    end +    setup do: clear_config([:rate_limit, :app_account_creation], {10_000, 2})      test "respects rate limit setting", %{conn: conn} do        app_token = insert(:oauth_token, user: nil) diff --git a/test/web/mastodon_api/controllers/media_controller_test.exs b/test/web/mastodon_api/controllers/media_controller_test.exs index 203fa73b0..6ac4cf63b 100644 --- a/test/web/mastodon_api/controllers/media_controller_test.exs +++ b/test/web/mastodon_api/controllers/media_controller_test.exs @@ -22,8 +22,8 @@ defmodule Pleroma.Web.MastodonAPI.MediaControllerTest do        [image: image]      end -    clear_config([:media_proxy]) -    clear_config([Pleroma.Upload]) +    setup do: clear_config([:media_proxy]) +    setup do: clear_config([Pleroma.Upload])      test "returns uploaded image", %{conn: conn, image: image} do        desc = "Description of the image" diff --git a/test/web/mastodon_api/controllers/notification_controller_test.exs b/test/web/mastodon_api/controllers/notification_controller_test.exs index adbb78da6..344eabb4a 100644 --- a/test/web/mastodon_api/controllers/notification_controller_test.exs +++ b/test/web/mastodon_api/controllers/notification_controller_test.exs @@ -452,11 +452,24 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do      assert length(json_response(conn, 200)) == 1    end +  @tag capture_log: true    test "see move notifications" 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/controllers/scheduled_activity_controller_test.exs b/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs index 3cd08c189..f86274d57 100644 --- a/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs +++ b/test/web/mastodon_api/controllers/scheduled_activity_controller_test.exs @@ -11,7 +11,7 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityControllerTest do    import Pleroma.Factory    import Ecto.Query -  clear_config([ScheduledActivity, :enabled]) +  setup do: clear_config([ScheduledActivity, :enabled])    test "shows scheduled activities" do      %{user: user, conn: conn} = oauth_access(["read:statuses"]) diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index f36552041..cd9ca4973 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -19,9 +19,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do    import Pleroma.Factory -  clear_config([:instance, :federating]) -  clear_config([:instance, :allow_relay]) -  clear_config([:rich_media, :enabled]) +  setup do: clear_config([:instance, :federating]) +  setup do: clear_config([:instance, :allow_relay]) +  setup do: clear_config([:rich_media, :enabled])    describe "posting statuses" do      setup do: oauth_access(["write:statuses"]) @@ -476,6 +476,95 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do      assert id == to_string(activity.id)    end +  defp local_and_remote_activities do +    local = insert(:note_activity) +    remote = insert(:note_activity, local: false) +    {:ok, local: local, remote: remote} +  end + +  describe "status with restrict unauthenticated activities for local and remote" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :activities, :local], true) + +    setup do: clear_config([:restrict_unauthenticated, :activities, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/statuses/#{local.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Record not found" +             } + +      res_conn = get(conn, "/api/v1/statuses/#{remote.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Record not found" +             } +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) +      res_conn = get(conn, "/api/v1/statuses/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/statuses/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end +  end + +  describe "status with restrict unauthenticated activities for local" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :activities, :local], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/statuses/#{local.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Record not found" +             } + +      res_conn = get(conn, "/api/v1/statuses/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) +      res_conn = get(conn, "/api/v1/statuses/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/statuses/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end +  end + +  describe "status with restrict unauthenticated activities for remote" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :activities, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/statuses/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/statuses/#{remote.id}") + +      assert json_response(res_conn, :not_found) == %{ +               "error" => "Record not found" +             } +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) +      res_conn = get(conn, "/api/v1/statuses/#{local.id}") +      assert %{"id" => _} = json_response(res_conn, 200) + +      res_conn = get(conn, "/api/v1/statuses/#{remote.id}") +      assert %{"id" => _} = json_response(res_conn, 200) +    end +  end +    test "getting a status that doesn't exist returns 404" do      %{conn: conn} = oauth_access(["read:statuses"])      activity = insert(:note_activity) @@ -514,6 +603,70 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do      assert [%{"id" => ^id1}, %{"id" => ^id2}] = Enum.sort_by(json_response(conn, :ok), & &1["id"])    end +  describe "getting statuses by ids with restricted unauthenticated for local and remote" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :activities, :local], true) + +    setup do: clear_config([:restrict_unauthenticated, :activities, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + +      assert json_response(res_conn, 200) == [] +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + +      assert length(json_response(res_conn, 200)) == 2 +    end +  end + +  describe "getting statuses by ids with restricted unauthenticated for local" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :activities, :local], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + +      remote_id = remote.id +      assert [%{"id" => ^remote_id}] = json_response(res_conn, 200) +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + +      assert length(json_response(res_conn, 200)) == 2 +    end +  end + +  describe "getting statuses by ids with restricted unauthenticated for remote" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :activities, :remote], true) + +    test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do +      res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + +      local_id = local.id +      assert [%{"id" => ^local_id}] = json_response(res_conn, 200) +    end + +    test "if user is authenticated", %{local: local, remote: remote} do +      %{conn: conn} = oauth_access(["read"]) + +      res_conn = get(conn, "/api/v1/statuses", %{ids: [local.id, remote.id]}) + +      assert length(json_response(res_conn, 200)) == 2 +    end +  end +    describe "deleting a status" do      test "when you created it" do        %{user: author, conn: conn} = oauth_access(["write:statuses"]) @@ -743,9 +896,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do        %{activity: activity}      end -    clear_config([:instance, :max_pinned_statuses]) do -      Config.put([:instance, :max_pinned_statuses], 1) -    end +    setup do: clear_config([:instance, :max_pinned_statuses], 1)      test "pin status", %{conn: conn, user: user, activity: activity} do        id_str = to_string(activity.id) diff --git a/test/web/mastodon_api/controllers/timeline_controller_test.exs b/test/web/mastodon_api/controllers/timeline_controller_test.exs index 2c03b0a75..97b1c3e66 100644 --- a/test/web/mastodon_api/controllers/timeline_controller_test.exs +++ b/test/web/mastodon_api/controllers/timeline_controller_test.exs @@ -12,8 +12,6 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do    alias Pleroma.User    alias Pleroma.Web.CommonAPI -  clear_config([:instance, :public]) -    setup do      mock(fn env -> apply(HttpRequestMock, :request, [env]) end)      :ok @@ -23,9 +21,12 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do      setup do: oauth_access(["read:statuses"])      test "the home timeline", %{user: user, conn: conn} do -      following = insert(:user) +      following = insert(:user, nickname: "followed") +      third_user = insert(:user, nickname: "repeated") -      {:ok, _activity} = CommonAPI.post(following, %{"status" => "test"}) +      {:ok, _activity} = CommonAPI.post(following, %{"status" => "post"}) +      {:ok, activity} = CommonAPI.post(third_user, %{"status" => "repeated post"}) +      {:ok, _, _} = CommonAPI.repeat(activity.id, following)        ret_conn = get(conn, "/api/v1/timelines/home") @@ -33,9 +34,54 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        {:ok, _user} = User.follow(user, following) -      conn = get(conn, "/api/v1/timelines/home") +      ret_conn = get(conn, "/api/v1/timelines/home") -      assert [%{"content" => "test"}] = json_response(conn, :ok) +      assert [ +               %{ +                 "reblog" => %{ +                   "content" => "repeated post", +                   "account" => %{ +                     "pleroma" => %{ +                       "relationship" => %{"following" => false, "followed_by" => false} +                     } +                   } +                 }, +                 "account" => %{"pleroma" => %{"relationship" => %{"following" => true}}} +               }, +               %{ +                 "content" => "post", +                 "account" => %{ +                   "acct" => "followed", +                   "pleroma" => %{"relationship" => %{"following" => true}} +                 } +               } +             ] = json_response(ret_conn, :ok) + +      {:ok, _user} = User.follow(third_user, user) + +      ret_conn = get(conn, "/api/v1/timelines/home") + +      assert [ +               %{ +                 "reblog" => %{ +                   "content" => "repeated post", +                   "account" => %{ +                     "acct" => "repeated", +                     "pleroma" => %{ +                       "relationship" => %{"following" => false, "followed_by" => true} +                     } +                   } +                 }, +                 "account" => %{"pleroma" => %{"relationship" => %{"following" => true}}} +               }, +               %{ +                 "content" => "post", +                 "account" => %{ +                   "acct" => "followed", +                   "pleroma" => %{"relationship" => %{"following" => true}} +                 } +               } +             ] = json_response(ret_conn, :ok)      end      test "the home timeline when the direct messages are excluded", %{user: user, conn: conn} do @@ -80,15 +126,6 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do        assert [%{"content" => "test"}] = json_response(conn, :ok)      end -    test "the public timeline when public is set to false", %{conn: conn} do -      Config.put([:instance, :public], false) - -      assert %{"error" => "This resource requires authentication."} == -               conn -               |> get("/api/v1/timelines/public", %{"local" => "False"}) -               |> json_response(:forbidden) -    end -      test "the public timeline includes only public statuses for an authenticated user" do        %{user: user, conn: conn} = oauth_access(["read:statuses"]) @@ -102,6 +139,98 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do      end    end +  defp local_and_remote_activities do +    insert(:note_activity) +    insert(:note_activity, local: false) +    :ok +  end + +  describe "public with restrict unauthenticated timeline for local and federated timelines" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :timelines, :local], true) + +    setup do: clear_config([:restrict_unauthenticated, :timelines, :federated], true) + +    test "if user is unauthenticated", %{conn: conn} do +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) + +      assert json_response(res_conn, :unauthorized) == %{ +               "error" => "authorization required for timeline view" +             } + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) + +      assert json_response(res_conn, :unauthorized) == %{ +               "error" => "authorization required for timeline view" +             } +    end + +    test "if user is authenticated" do +      %{conn: conn} = oauth_access(["read:statuses"]) + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) +      assert length(json_response(res_conn, 200)) == 2 +    end +  end + +  describe "public with restrict unauthenticated timeline for local" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :timelines, :local], true) + +    test "if user is unauthenticated", %{conn: conn} do +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) + +      assert json_response(res_conn, :unauthorized) == %{ +               "error" => "authorization required for timeline view" +             } + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) +      assert length(json_response(res_conn, 200)) == 2 +    end + +    test "if user is authenticated", %{conn: _conn} do +      %{conn: conn} = oauth_access(["read:statuses"]) + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) +      assert length(json_response(res_conn, 200)) == 2 +    end +  end + +  describe "public with restrict unauthenticated timeline for remote" do +    setup do: local_and_remote_activities() + +    setup do: clear_config([:restrict_unauthenticated, :timelines, :federated], true) + +    test "if user is unauthenticated", %{conn: conn} do +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) + +      assert json_response(res_conn, :unauthorized) == %{ +               "error" => "authorization required for timeline view" +             } +    end + +    test "if user is authenticated", %{conn: _conn} do +      %{conn: conn} = oauth_access(["read:statuses"]) + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "true"}) +      assert length(json_response(res_conn, 200)) == 1 + +      res_conn = get(conn, "/api/v1/timelines/public", %{"local" => "false"}) +      assert length(json_response(res_conn, 200)) == 2 +    end +  end +    describe "direct" do      test "direct timeline", %{conn: conn} do        user_one = insert(:user) diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index d60ed7b64..4435f69ff 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -4,11 +4,20 @@  defmodule Pleroma.Web.MastodonAPI.AccountViewTest do    use Pleroma.DataCase -  import Pleroma.Factory +    alias Pleroma.User +  alias Pleroma.UserRelationship    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.MastodonAPI.AccountView +  import Pleroma.Factory +  import Tesla.Mock + +  setup do +    mock(fn env -> apply(HttpRequestMock, :request, [env]) end) +    :ok +  end +    test "Represent a user account" do      source_data = %{        "tag" => [ @@ -32,7 +41,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do          background: background_image,          nickname: "shp@shitposter.club",          name: ":karjalanpiirakka: shp", -        bio: "<script src=\"invalid-html\"></script><span>valid html</span>", +        bio: +          "<script src=\"invalid-html\"></script><span>valid html</span>. a<br>b<br/>c<br >d<br />f",          inserted_at: ~N[2017-08-15 15:47:06.597036]        }) @@ -46,7 +56,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        followers_count: 3,        following_count: 0,        statuses_count: 5, -      note: "<span>valid html</span>", +      note: "<span>valid html</span>. a<br/>b<br/>c<br/>d<br/>f",        url: user.ap_id,        avatar: "http://localhost:4001/images/avi.png",        avatar_static: "http://localhost:4001/images/avi.png", @@ -63,7 +73,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        fields: [],        bot: false,        source: %{ -        note: "valid html", +        note: "valid html. a\nb\nc\nd\nf",          sensitive: false,          pleroma: %{            actor_type: "Person", @@ -160,6 +170,17 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do      assert expected == AccountView.render("show.json", %{user: user})    end +  test "Represent a Funkwhale channel" do +    {:ok, user} = +      User.get_or_fetch_by_ap_id( +        "https://channels.tests.funkwhale.audio/federation/actors/compositions" +      ) + +    assert represented = AccountView.render("show.json", %{user: user}) +    assert represented.acct == "compositions@channels.tests.funkwhale.audio" +    assert represented.url == "https://channels.tests.funkwhale.audio/channels/compositions" +  end +    test "Represent a deactivated user for an admin" do      admin = insert(:user, is_admin: true)      deactivated_user = insert(:user, deactivated: true) @@ -181,6 +202,32 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do    end    describe "relationship" do +    defp test_relationship_rendering(user, other_user, expected_result) do +      opts = %{user: user, target: other_user, relationships: nil} +      assert expected_result == AccountView.render("relationship.json", opts) + +      relationships_opt = UserRelationship.view_relationships_option(user, [other_user]) +      opts = Map.put(opts, :relationships, relationships_opt) +      assert expected_result == AccountView.render("relationship.json", opts) + +      assert [expected_result] == +               AccountView.render("relationships.json", %{user: user, targets: [other_user]}) +    end + +    @blank_response %{ +      following: false, +      followed_by: false, +      blocking: false, +      blocked_by: false, +      muting: false, +      muting_notifications: false, +      subscribing: false, +      requested: false, +      domain_blocking: false, +      showing_reblogs: true, +      endorsed: false +    } +      test "represent a relationship for the following and followed user" do        user = insert(:user)        other_user = insert(:user) @@ -191,23 +238,21 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        {:ok, _user_relationships} = User.mute(user, other_user, true)        {:ok, _reblog_mute} = CommonAPI.hide_reblogs(user, other_user) -      expected = %{ -        id: to_string(other_user.id), -        following: true, -        followed_by: true, -        blocking: false, -        blocked_by: false, -        muting: true, -        muting_notifications: true, -        subscribing: true, -        requested: false, -        domain_blocking: false, -        showing_reblogs: false, -        endorsed: false -      } - -      assert expected == -               AccountView.render("relationship.json", %{user: user, target: other_user}) +      expected = +        Map.merge( +          @blank_response, +          %{ +            following: true, +            followed_by: true, +            muting: true, +            muting_notifications: true, +            subscribing: true, +            showing_reblogs: false, +            id: to_string(other_user.id) +          } +        ) + +      test_relationship_rendering(user, other_user, expected)      end      test "represent a relationship for the blocking and blocked user" do @@ -219,23 +264,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        {:ok, _user_relationship} = User.block(user, other_user)        {:ok, _user_relationship} = User.block(other_user, user) -      expected = %{ -        id: to_string(other_user.id), -        following: false, -        followed_by: false, -        blocking: true, -        blocked_by: true, -        muting: false, -        muting_notifications: false, -        subscribing: false, -        requested: false, -        domain_blocking: false, -        showing_reblogs: true, -        endorsed: false -      } +      expected = +        Map.merge( +          @blank_response, +          %{following: false, blocking: true, blocked_by: true, id: to_string(other_user.id)} +        ) -      assert expected == -               AccountView.render("relationship.json", %{user: user, target: other_user}) +      test_relationship_rendering(user, other_user, expected)      end      test "represent a relationship for the user blocking a domain" do @@ -244,8 +279,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        {:ok, user} = User.block_domain(user, "bad.site") -      assert %{domain_blocking: true, blocking: false} = -               AccountView.render("relationship.json", %{user: user, target: other_user}) +      expected = +        Map.merge( +          @blank_response, +          %{domain_blocking: true, blocking: false, id: to_string(other_user.id)} +        ) + +      test_relationship_rendering(user, other_user, expected)      end      test "represent a relationship for the user with a pending follow request" do @@ -256,23 +296,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do        user = User.get_cached_by_id(user.id)        other_user = User.get_cached_by_id(other_user.id) -      expected = %{ -        id: to_string(other_user.id), -        following: false, -        followed_by: false, -        blocking: false, -        blocked_by: false, -        muting: false, -        muting_notifications: false, -        subscribing: false, -        requested: true, -        domain_blocking: false, -        showing_reblogs: true, -        endorsed: false -      } +      expected = +        Map.merge( +          @blank_response, +          %{requested: true, following: false, id: to_string(other_user.id)} +        ) -      assert expected == -               AccountView.render("relationship.json", %{user: user, target: other_user}) +      test_relationship_rendering(user, other_user, expected)      end    end diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index 5fe37a6bf..c3ec9dfec 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -16,6 +16,21 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do    alias Pleroma.Web.MastodonAPI.StatusView    import Pleroma.Factory +  defp test_notifications_rendering(notifications, user, expected_result) do +    result = NotificationView.render("index.json", %{notifications: notifications, for: user}) + +    assert expected_result == result + +    result = +      NotificationView.render("index.json", %{ +        notifications: notifications, +        for: user, +        relationships: nil +      }) + +    assert expected_result == result +  end +    test "Mention notification" do      user = insert(:user)      mentioned_user = insert(:user) @@ -32,10 +47,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do        created_at: Utils.to_masto_date(notification.inserted_at)      } -    result = -      NotificationView.render("index.json", %{notifications: [notification], for: mentioned_user}) - -    assert [expected] == result +    test_notifications_rendering([notification], mentioned_user, [expected])    end    test "Favourite notification" do @@ -55,9 +67,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do        created_at: Utils.to_masto_date(notification.inserted_at)      } -    result = NotificationView.render("index.json", %{notifications: [notification], for: user}) - -    assert [expected] == result +    test_notifications_rendering([notification], user, [expected])    end    test "Reblog notification" do @@ -77,9 +87,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do        created_at: Utils.to_masto_date(notification.inserted_at)      } -    result = NotificationView.render("index.json", %{notifications: [notification], for: user}) - -    assert [expected] == result +    test_notifications_rendering([notification], user, [expected])    end    test "Follow notification" do @@ -96,23 +104,32 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do        created_at: Utils.to_masto_date(notification.inserted_at)      } -    result = -      NotificationView.render("index.json", %{notifications: [notification], for: followed}) - -    assert [expected] == result +    test_notifications_rendering([notification], followed, [expected])      User.perform(:delete, follower)      notification = Notification |> Repo.one() |> Repo.preload(:activity) -    assert [] == -             NotificationView.render("index.json", %{notifications: [notification], for: followed}) +    test_notifications_rendering([notification], 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() @@ -131,8 +148,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do        created_at: Utils.to_masto_date(notification.inserted_at)      } -    assert [expected] == -             NotificationView.render("index.json", %{notifications: [notification], for: follower}) +    test_notifications_rendering([notification], follower, [expected])    end    test "EmojiReact notification" do @@ -158,7 +174,6 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do        created_at: Utils.to_masto_date(notification.inserted_at)      } -    assert expected == -             NotificationView.render("show.json", %{notification: notification, for: user}) +    test_notifications_rendering([notification], user, [expected])    end  end diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs index 191895c6f..6791c2fb0 100644 --- a/test/web/mastodon_api/views/status_view_test.exs +++ b/test/web/mastodon_api/views/status_view_test.exs @@ -12,10 +12,12 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do    alias Pleroma.Object    alias Pleroma.Repo    alias Pleroma.User +  alias Pleroma.UserRelationship    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.CommonAPI.Utils    alias Pleroma.Web.MastodonAPI.AccountView    alias Pleroma.Web.MastodonAPI.StatusView +    import Pleroma.Factory    import Tesla.Mock @@ -92,6 +94,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" @@ -212,12 +231,21 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      {:ok, _user_relationships} = User.mute(user, other_user)      {:ok, activity} = CommonAPI.post(other_user, %{"status" => "test"}) -    status = StatusView.render("show.json", %{activity: activity}) +    relationships_opt = UserRelationship.view_relationships_option(user, [other_user]) + +    opts = %{activity: activity} +    status = StatusView.render("show.json", opts)      assert status.muted == false -    status = StatusView.render("show.json", %{activity: activity, for: user}) +    status = StatusView.render("show.json", Map.put(opts, :relationships, relationships_opt)) +    assert status.muted == false + +    for_opts = %{activity: activity, for: user} +    status = StatusView.render("show.json", for_opts) +    assert status.muted == true +    status = StatusView.render("show.json", Map.put(for_opts, :relationships, relationships_opt))      assert status.muted == true    end @@ -420,6 +448,22 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do      assert length(represented[:media_attachments]) == 1    end +  test "funkwhale audio" do +    user = insert(:user) + +    {:ok, object} = +      Pleroma.Object.Fetcher.fetch_object_from_id( +        "https://channels.tests.funkwhale.audio/federation/music/uploads/42342395-0208-4fee-a38d-259a6dae0871" +      ) + +    %Activity{} = activity = Activity.get_create_by_object_ap_id(object.data["id"]) + +    represented = StatusView.render("show.json", %{for: user, activity: activity}) + +    assert represented[:id] == to_string(activity.id) +    assert length(represented[:media_attachments]) == 1 +  end +    test "a Mobilizon event" do      user = insert(:user) diff --git a/test/web/media_proxy/media_proxy_controller_test.exs b/test/web/media_proxy/media_proxy_controller_test.exs index 7ac7e4af1..da79d38a5 100644 --- a/test/web/media_proxy/media_proxy_controller_test.exs +++ b/test/web/media_proxy/media_proxy_controller_test.exs @@ -7,8 +7,8 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do    import Mock    alias Pleroma.Config -  clear_config(:media_proxy) -  clear_config([Pleroma.Web.Endpoint, :secret_key_base]) +  setup do: clear_config(:media_proxy) +  setup do: clear_config([Pleroma.Web.Endpoint, :secret_key_base])    test "it returns 404 when MediaProxy disabled", %{conn: conn} do      Config.put([:media_proxy, :enabled], false) diff --git a/test/web/media_proxy/media_proxy_test.exs b/test/web/media_proxy/media_proxy_test.exs index 8f5fcf2eb..69c2d5dae 100644 --- a/test/web/media_proxy/media_proxy_test.exs +++ b/test/web/media_proxy/media_proxy_test.exs @@ -8,8 +8,8 @@ defmodule Pleroma.Web.MediaProxyTest do    import Pleroma.Web.MediaProxy    alias Pleroma.Web.MediaProxy.MediaProxyController -  clear_config([:media_proxy, :enabled]) -  clear_config(Pleroma.Upload) +  setup do: clear_config([:media_proxy, :enabled]) +  setup do: clear_config(Pleroma.Upload)    describe "when enabled" do      setup do diff --git a/test/web/metadata/metadata_test.exs b/test/web/metadata/metadata_test.exs new file mode 100644 index 000000000..3f8b29e58 --- /dev/null +++ b/test/web/metadata/metadata_test.exs @@ -0,0 +1,25 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.MetadataTest do +  use Pleroma.DataCase, async: true + +  import Pleroma.Factory + +  describe "restrict indexing remote users" do +    test "for remote user" do +      user = insert(:user, local: false) + +      assert Pleroma.Web.Metadata.build_tags(%{user: user}) =~ +               "<meta content=\"noindex, noarchive\" name=\"robots\">" +    end + +    test "for local user" do +      user = insert(:user) + +      refute Pleroma.Web.Metadata.build_tags(%{user: user}) =~ +               "<meta content=\"noindex, noarchive\" name=\"robots\">" +    end +  end +end diff --git a/test/web/metadata/opengraph_test.exs b/test/web/metadata/opengraph_test.exs index 9d7c009eb..218540e6c 100644 --- a/test/web/metadata/opengraph_test.exs +++ b/test/web/metadata/opengraph_test.exs @@ -7,7 +7,7 @@ defmodule Pleroma.Web.Metadata.Providers.OpenGraphTest do    import Pleroma.Factory    alias Pleroma.Web.Metadata.Providers.OpenGraph -  clear_config([Pleroma.Web.Metadata, :unfurl_nsfw]) +  setup do: clear_config([Pleroma.Web.Metadata, :unfurl_nsfw])    test "it renders all supported types of attachments and skips unknown types" do      user = insert(:user) diff --git a/test/web/metadata/restrict_indexing_test.exs b/test/web/metadata/restrict_indexing_test.exs new file mode 100644 index 000000000..aad0bac42 --- /dev/null +++ b/test/web/metadata/restrict_indexing_test.exs @@ -0,0 +1,21 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Metadata.Providers.RestrictIndexingTest do +  use ExUnit.Case, async: true + +  describe "build_tags/1" do +    test "for remote user" do +      assert Pleroma.Web.Metadata.Providers.RestrictIndexing.build_tags(%{ +               user: %Pleroma.User{local: false} +             }) == [{:meta, [name: "robots", content: "noindex, noarchive"], []}] +    end + +    test "for local user" do +      assert Pleroma.Web.Metadata.Providers.RestrictIndexing.build_tags(%{ +               user: %Pleroma.User{local: true} +             }) == [] +    end +  end +end diff --git a/test/web/metadata/twitter_card_test.exs b/test/web/metadata/twitter_card_test.exs index 3d75d1ed5..9e9c6853a 100644 --- a/test/web/metadata/twitter_card_test.exs +++ b/test/web/metadata/twitter_card_test.exs @@ -13,7 +13,7 @@ defmodule Pleroma.Web.Metadata.Providers.TwitterCardTest do    alias Pleroma.Web.Metadata.Utils    alias Pleroma.Web.Router -  clear_config([Pleroma.Web.Metadata, :unfurl_nsfw]) +  setup do: clear_config([Pleroma.Web.Metadata, :unfurl_nsfw])    test "it renders twitter card for user info" do      user = insert(:user, name: "Jimmy Hendriks", bio: "born 19 March 1994") diff --git a/test/web/node_info_test.exs b/test/web/node_info_test.exs index ee10ad5db..9bcc07b37 100644 --- a/test/web/node_info_test.exs +++ b/test/web/node_info_test.exs @@ -7,8 +7,10 @@ defmodule Pleroma.Web.NodeInfoTest do    import Pleroma.Factory -  clear_config([:mrf_simple]) -  clear_config(:instance) +  alias Pleroma.Config + +  setup do: clear_config([:mrf_simple]) +  setup do: clear_config(:instance)    test "GET /.well-known/nodeinfo", %{conn: conn} do      links = @@ -47,7 +49,7 @@ defmodule Pleroma.Web.NodeInfoTest do      assert result = json_response(conn, 200) -    assert Pleroma.Config.get([Pleroma.User, :restricted_nicknames]) == +    assert Config.get([Pleroma.User, :restricted_nicknames]) ==               result["metadata"]["restrictedNicknames"]    end @@ -65,10 +67,10 @@ defmodule Pleroma.Web.NodeInfoTest do    end    test "returns fieldsLimits field", %{conn: conn} do -    Pleroma.Config.put([:instance, :max_account_fields], 10) -    Pleroma.Config.put([:instance, :max_remote_account_fields], 15) -    Pleroma.Config.put([:instance, :account_field_name_length], 255) -    Pleroma.Config.put([:instance, :account_field_value_length], 2048) +    Config.put([:instance, :max_account_fields], 10) +    Config.put([:instance, :max_remote_account_fields], 15) +    Config.put([:instance, :account_field_name_length], 255) +    Config.put([:instance, :account_field_value_length], 2048)      response =        conn @@ -82,8 +84,8 @@ defmodule Pleroma.Web.NodeInfoTest do    end    test "it returns the safe_dm_mentions feature if enabled", %{conn: conn} do -    option = Pleroma.Config.get([:instance, :safe_dm_mentions]) -    Pleroma.Config.put([:instance, :safe_dm_mentions], true) +    option = Config.get([:instance, :safe_dm_mentions]) +    Config.put([:instance, :safe_dm_mentions], true)      response =        conn @@ -92,7 +94,7 @@ defmodule Pleroma.Web.NodeInfoTest do      assert "safe_dm_mentions" in response["metadata"]["features"] -    Pleroma.Config.put([:instance, :safe_dm_mentions], false) +    Config.put([:instance, :safe_dm_mentions], false)      response =        conn @@ -101,14 +103,14 @@ defmodule Pleroma.Web.NodeInfoTest do      refute "safe_dm_mentions" in response["metadata"]["features"] -    Pleroma.Config.put([:instance, :safe_dm_mentions], option) +    Config.put([:instance, :safe_dm_mentions], option)    end    describe "`metadata/federation/enabled`" do -    clear_config([:instance, :federating]) +    setup do: clear_config([:instance, :federating])      test "it shows if federation is enabled/disabled", %{conn: conn} do -      Pleroma.Config.put([:instance, :federating], true) +      Config.put([:instance, :federating], true)        response =          conn @@ -117,7 +119,7 @@ defmodule Pleroma.Web.NodeInfoTest do        assert response["metadata"]["federation"]["enabled"] == true -      Pleroma.Config.put([:instance, :federating], false) +      Config.put([:instance, :federating], false)        response =          conn @@ -128,15 +130,39 @@ defmodule Pleroma.Web.NodeInfoTest do      end    end +  test "it shows default features flags", %{conn: conn} do +    response = +      conn +      |> get("/nodeinfo/2.1.json") +      |> json_response(:ok) + +    default_features = [ +      "pleroma_api", +      "mastodon_api", +      "mastodon_api_streaming", +      "polls", +      "pleroma_explicit_addressing", +      "shareable_emoji_packs", +      "multifetch", +      "pleroma_emoji_reactions", +      "pleroma:api/v1/notifications:include_types_filter" +    ] + +    assert MapSet.subset?( +             MapSet.new(default_features), +             MapSet.new(response["metadata"]["features"]) +           ) +  end +    test "it shows MRF transparency data if enabled", %{conn: conn} do -    config = Pleroma.Config.get([:instance, :rewrite_policy]) -    Pleroma.Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) +    config = Config.get([:instance, :rewrite_policy]) +    Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) -    option = Pleroma.Config.get([:instance, :mrf_transparency]) -    Pleroma.Config.put([:instance, :mrf_transparency], true) +    option = Config.get([:instance, :mrf_transparency]) +    Config.put([:instance, :mrf_transparency], true)      simple_config = %{"reject" => ["example.com"]} -    Pleroma.Config.put(:mrf_simple, simple_config) +    Config.put(:mrf_simple, simple_config)      response =        conn @@ -145,25 +171,25 @@ defmodule Pleroma.Web.NodeInfoTest do      assert response["metadata"]["federation"]["mrf_simple"] == simple_config -    Pleroma.Config.put([:instance, :rewrite_policy], config) -    Pleroma.Config.put([:instance, :mrf_transparency], option) -    Pleroma.Config.put(:mrf_simple, %{}) +    Config.put([:instance, :rewrite_policy], config) +    Config.put([:instance, :mrf_transparency], option) +    Config.put(:mrf_simple, %{})    end    test "it performs exclusions from MRF transparency data if configured", %{conn: conn} do -    config = Pleroma.Config.get([:instance, :rewrite_policy]) -    Pleroma.Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) +    config = Config.get([:instance, :rewrite_policy]) +    Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) -    option = Pleroma.Config.get([:instance, :mrf_transparency]) -    Pleroma.Config.put([:instance, :mrf_transparency], true) +    option = Config.get([:instance, :mrf_transparency]) +    Config.put([:instance, :mrf_transparency], true) -    exclusions = Pleroma.Config.get([:instance, :mrf_transparency_exclusions]) -    Pleroma.Config.put([:instance, :mrf_transparency_exclusions], ["other.site"]) +    exclusions = Config.get([:instance, :mrf_transparency_exclusions]) +    Config.put([:instance, :mrf_transparency_exclusions], ["other.site"])      simple_config = %{"reject" => ["example.com", "other.site"]}      expected_config = %{"reject" => ["example.com"]} -    Pleroma.Config.put(:mrf_simple, simple_config) +    Config.put(:mrf_simple, simple_config)      response =        conn @@ -173,9 +199,9 @@ defmodule Pleroma.Web.NodeInfoTest do      assert response["metadata"]["federation"]["mrf_simple"] == expected_config      assert response["metadata"]["federation"]["exclusions"] == true -    Pleroma.Config.put([:instance, :rewrite_policy], config) -    Pleroma.Config.put([:instance, :mrf_transparency], option) -    Pleroma.Config.put([:instance, :mrf_transparency_exclusions], exclusions) -    Pleroma.Config.put(:mrf_simple, %{}) +    Config.put([:instance, :rewrite_policy], config) +    Config.put([:instance, :mrf_transparency], option) +    Config.put([:instance, :mrf_transparency_exclusions], exclusions) +    Config.put(:mrf_simple, %{})    end  end diff --git a/test/web/oauth/ldap_authorization_test.exs b/test/web/oauth/ldap_authorization_test.exs index c55b0ffc5..a8fe8a841 100644 --- a/test/web/oauth/ldap_authorization_test.exs +++ b/test/web/oauth/ldap_authorization_test.exs @@ -12,13 +12,9 @@ defmodule Pleroma.Web.OAuth.LDAPAuthorizationTest do    @skip if !Code.ensure_loaded?(:eldap), do: :skip -  clear_config_all([:ldap, :enabled]) do -    Pleroma.Config.put([:ldap, :enabled], true) -  end +  setup_all do: clear_config([:ldap, :enabled], true) -  clear_config_all(Pleroma.Web.Auth.Authenticator) do -    Pleroma.Config.put(Pleroma.Web.Auth.Authenticator, Pleroma.Web.Auth.LDAPAuthenticator) -  end +  setup_all do: clear_config(Pleroma.Web.Auth.Authenticator, Pleroma.Web.Auth.LDAPAuthenticator)    @tag @skip    test "authorizes the existing user using LDAP credentials" do diff --git a/test/web/oauth/oauth_controller_test.exs b/test/web/oauth/oauth_controller_test.exs index cff469c28..f2f98d768 100644 --- a/test/web/oauth/oauth_controller_test.exs +++ b/test/web/oauth/oauth_controller_test.exs @@ -17,8 +17,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do      key: "_test",      signing_salt: "cooldude"    ] - -  clear_config([:instance, :account_activation_required]) +  setup do: clear_config([:instance, :account_activation_required])    describe "in OAuth consumer mode, " do      setup do @@ -31,12 +30,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do        ]      end -    clear_config([:auth, :oauth_consumer_strategies]) do -      Pleroma.Config.put( -        [:auth, :oauth_consumer_strategies], -        ~w(twitter facebook) -      ) -    end +    setup do: clear_config([:auth, :oauth_consumer_strategies], ~w(twitter facebook))      test "GET /oauth/authorize renders auth forms, including OAuth consumer form", %{        app: app, @@ -581,7 +575,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do        # In case scope param is missing, expecting _all_ app-supported scopes to be granted        for user <- [non_admin, admin],            {requested_scopes, expected_scopes} <- -            %{scopes_subset => scopes_subset, nil => app_scopes} do +            %{scopes_subset => scopes_subset, nil: app_scopes} do          conn =            post(              build_conn(), @@ -944,7 +938,7 @@ defmodule Pleroma.Web.OAuth.OAuthControllerTest do    end    describe "POST /oauth/token - refresh token" do -    clear_config([:oauth2, :issue_new_refresh_token]) +    setup do: clear_config([:oauth2, :issue_new_refresh_token])      test "issues a new access token with keep fresh token" do        Pleroma.Config.put([:oauth2, :issue_new_refresh_token], true) diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs index ae99e37fe..bb349cb19 100644 --- a/test/web/ostatus/ostatus_controller_test.exs +++ b/test/web/ostatus/ostatus_controller_test.exs @@ -17,9 +17,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do      :ok    end -  clear_config([:instance, :federating]) do -    Config.put([:instance, :federating], true) -  end +  setup do: clear_config([:instance, :federating], true)    # Note: see ActivityPubControllerTest for JSON format tests    describe "GET /objects/:uuid (text/html)" do diff --git a/test/web/pleroma_api/controllers/account_controller_test.exs b/test/web/pleroma_api/controllers/account_controller_test.exs index 3853a9bbb..ae5334015 100644 --- a/test/web/pleroma_api/controllers/account_controller_test.exs +++ b/test/web/pleroma_api/controllers/account_controller_test.exs @@ -27,9 +27,7 @@ defmodule Pleroma.Web.PleromaAPI.AccountControllerTest do        [user: user]      end -    clear_config([:instance, :account_activation_required]) do -      Config.put([:instance, :account_activation_required], true) -    end +    setup do: clear_config([:instance, :account_activation_required], true)      test "resend account confirmation email", %{conn: conn, user: user} do        conn diff --git a/test/web/pleroma_api/controllers/emoji_api_controller_test.exs b/test/web/pleroma_api/controllers/emoji_api_controller_test.exs index 4b9f5cf9a..435fb6592 100644 --- a/test/web/pleroma_api/controllers/emoji_api_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_api_controller_test.exs @@ -12,10 +12,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiAPIControllerTest do                      Pleroma.Config.get!([:instance, :static_dir]),                      "emoji"                    ) - -  clear_config([:auth, :enforce_oauth_admin_scope_usage]) do -    Pleroma.Config.put([:auth, :enforce_oauth_admin_scope_usage], false) -  end +  setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false)    test "shared & non-shared pack information in list_packs is ok" do      conn = build_conn() diff --git a/test/web/plugs/federating_plug_test.exs b/test/web/plugs/federating_plug_test.exs index 13edc4359..2f8aadadc 100644 --- a/test/web/plugs/federating_plug_test.exs +++ b/test/web/plugs/federating_plug_test.exs @@ -5,7 +5,7 @@  defmodule Pleroma.Web.FederatingPlugTest do    use Pleroma.Web.ConnCase -  clear_config([:instance, :federating]) +  setup do: clear_config([:instance, :federating])    test "returns and halt the conn when federating is disabled" do      Pleroma.Config.put([:instance, :federating], false) diff --git a/test/web/push/impl_test.exs b/test/web/push/impl_test.exs index b90e31f94..9121d90e7 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/rich_media/helpers_test.exs b/test/web/rich_media/helpers_test.exs index 8237802a7..aa0c5c830 100644 --- a/test/web/rich_media/helpers_test.exs +++ b/test/web/rich_media/helpers_test.exs @@ -19,7 +19,7 @@ defmodule Pleroma.Web.RichMedia.HelpersTest do      :ok    end -  clear_config([:rich_media, :enabled]) +  setup do: clear_config([:rich_media, :enabled])    test "refuses to crawl incomplete URLs" do      user = insert(:user) diff --git a/test/web/static_fe/static_fe_controller_test.exs b/test/web/static_fe/static_fe_controller_test.exs index c3d2ae3b4..430683ea0 100644 --- a/test/web/static_fe/static_fe_controller_test.exs +++ b/test/web/static_fe/static_fe_controller_test.exs @@ -8,13 +8,8 @@ defmodule Pleroma.Web.StaticFE.StaticFEControllerTest do    import Pleroma.Factory -  clear_config_all([:static_fe, :enabled]) do -    Config.put([:static_fe, :enabled], true) -  end - -  clear_config([:instance, :federating]) do -    Config.put([:instance, :federating], true) -  end +  setup_all do: clear_config([:static_fe, :enabled], true) +  setup do: clear_config([:instance, :federating], true)    setup %{conn: conn} do      conn = put_req_header(conn, "accept", "text/html") diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index f0bafc093..b3fe22920 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -19,8 +19,7 @@ defmodule Pleroma.Web.StreamerTest do    @streamer_timeout 150    @streamer_start_wait 10 - -  clear_config([:instance, :skip_thread_containment]) +  setup do: clear_config([:instance, :skip_thread_containment])    describe "user streams" do      setup do @@ -122,6 +121,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) diff --git a/test/web/twitter_api/remote_follow_controller_test.exs b/test/web/twitter_api/remote_follow_controller_test.exs index 73062f18f..5ff8694a8 100644 --- a/test/web/twitter_api/remote_follow_controller_test.exs +++ b/test/web/twitter_api/remote_follow_controller_test.exs @@ -17,13 +17,10 @@ defmodule Pleroma.Web.TwitterAPI.RemoteFollowControllerTest do      :ok    end -  clear_config_all([:instance, :federating]) do -    Config.put([:instance, :federating], true) -  end - -  clear_config([:instance]) -  clear_config([:frontend_configurations, :pleroma_fe]) -  clear_config([:user, :deny_follow_blocked]) +  setup_all do: clear_config([:instance, :federating], true) +  setup do: clear_config([:instance]) +  setup do: clear_config([:frontend_configurations, :pleroma_fe]) +  setup do: clear_config([:user, :deny_follow_blocked])    describe "GET /ostatus_subscribe - remote_follow/2" do      test "adds status to pleroma instance if the `acct` is a status", %{conn: conn} do diff --git a/test/web/twitter_api/twitter_api_test.exs b/test/web/twitter_api/twitter_api_test.exs index 14eed5f27..92f9aa0f5 100644 --- a/test/web/twitter_api/twitter_api_test.exs +++ b/test/web/twitter_api/twitter_api_test.exs @@ -117,9 +117,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "register with one time token" do -    clear_config([:instance, :registrations_open]) do -      Pleroma.Config.put([:instance, :registrations_open], false) -    end +    setup do: clear_config([:instance, :registrations_open], false)      test "returns user on success" do        {:ok, invite} = UserInviteToken.create_invite() @@ -184,9 +182,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "registers with date limited token" do -    clear_config([:instance, :registrations_open]) do -      Pleroma.Config.put([:instance, :registrations_open], false) -    end +    setup do: clear_config([:instance, :registrations_open], false)      setup do        data = %{ @@ -246,9 +242,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "registers with reusable token" do -    clear_config([:instance, :registrations_open]) do -      Pleroma.Config.put([:instance, :registrations_open], false) -    end +    setup do: clear_config([:instance, :registrations_open], false)      test "returns user on success, after him registration fails" do        {:ok, invite} = UserInviteToken.create_invite(%{max_use: 100}) @@ -292,9 +286,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPITest do    end    describe "registers with reusable date limited token" do -    clear_config([:instance, :registrations_open]) do -      Pleroma.Config.put([:instance, :registrations_open], false) -    end +    setup do: clear_config([:instance, :registrations_open], false)      test "returns user on success" do        {:ok, invite} = UserInviteToken.create_invite(%{expires_at: Date.utc_today(), max_use: 100}) diff --git a/test/web/twitter_api/util_controller_test.exs b/test/web/twitter_api/util_controller_test.exs index 9d757b5ef..30e54bebd 100644 --- a/test/web/twitter_api/util_controller_test.exs +++ b/test/web/twitter_api/util_controller_test.exs @@ -18,8 +18,8 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do      :ok    end -  clear_config([:instance]) -  clear_config([:frontend_configurations, :pleroma_fe]) +  setup do: clear_config([:instance]) +  setup do: clear_config([:frontend_configurations, :pleroma_fe])    describe "POST /api/pleroma/follow_import" do      setup do: oauth_access(["follow"]) @@ -318,7 +318,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    end    describe "GET /api/pleroma/healthcheck" do -    clear_config([:instance, :healthcheck]) +    setup do: clear_config([:instance, :healthcheck])      test "returns 503 when healthcheck disabled", %{conn: conn} do        Config.put([:instance, :healthcheck], false) @@ -427,9 +427,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilControllerTest do    end    describe "POST /main/ostatus - remote_subscribe/2" do -    clear_config([:instance, :federating]) do -      Config.put([:instance, :federating], true) -    end +    setup do: clear_config([:instance, :federating], true)      test "renders subscribe form", %{conn: conn} do        user = insert(:user) diff --git a/test/web/web_finger/web_finger_controller_test.exs b/test/web/web_finger/web_finger_controller_test.exs index b65bf5904..0023f1e81 100644 --- a/test/web/web_finger/web_finger_controller_test.exs +++ b/test/web/web_finger/web_finger_controller_test.exs @@ -14,9 +14,7 @@ defmodule Pleroma.Web.WebFinger.WebFingerControllerTest do      :ok    end -  clear_config_all([:instance, :federating]) do -    Pleroma.Config.put([:instance, :federating], true) -  end +  setup_all do: clear_config([:instance, :federating], true)    test "GET host-meta" do      response = diff --git a/test/workers/cron/clear_oauth_token_worker_test.exs b/test/workers/cron/clear_oauth_token_worker_test.exs index f056b1a3e..df82dc75d 100644 --- a/test/workers/cron/clear_oauth_token_worker_test.exs +++ b/test/workers/cron/clear_oauth_token_worker_test.exs @@ -8,7 +8,7 @@ defmodule Pleroma.Workers.Cron.ClearOauthTokenWorkerTest do    import Pleroma.Factory    alias Pleroma.Workers.Cron.ClearOauthTokenWorker -  clear_config([:oauth2, :clean_expired_tokens]) +  setup do: clear_config([:oauth2, :clean_expired_tokens])    test "deletes expired tokens" do      insert(:oauth_token, diff --git a/test/workers/cron/digest_emails_worker_test.exs b/test/workers/cron/digest_emails_worker_test.exs index 5d65b9fef..0a63bf4e0 100644 --- a/test/workers/cron/digest_emails_worker_test.exs +++ b/test/workers/cron/digest_emails_worker_test.exs @@ -11,7 +11,7 @@ defmodule Pleroma.Workers.Cron.DigestEmailsWorkerTest do    alias Pleroma.User    alias Pleroma.Web.CommonAPI -  clear_config([:email_notifications, :digest]) +  setup do: clear_config([:email_notifications, :digest])    setup do      Pleroma.Config.put([:email_notifications, :digest], %{ diff --git a/test/workers/cron/purge_expired_activities_worker_test.exs b/test/workers/cron/purge_expired_activities_worker_test.exs index 56c5aa409..5864f9e5f 100644 --- a/test/workers/cron/purge_expired_activities_worker_test.exs +++ b/test/workers/cron/purge_expired_activities_worker_test.exs @@ -11,7 +11,7 @@ defmodule Pleroma.Workers.Cron.PurgeExpiredActivitiesWorkerTest do    import Pleroma.Factory    import ExUnit.CaptureLog -  clear_config([ActivityExpiration, :enabled]) +  setup do: clear_config([ActivityExpiration, :enabled])    test "deletes an expiration activity" do      Pleroma.Config.put([ActivityExpiration, :enabled], true) diff --git a/test/workers/scheduled_activity_worker_test.exs b/test/workers/scheduled_activity_worker_test.exs index ab9f9c125..b312d975b 100644 --- a/test/workers/scheduled_activity_worker_test.exs +++ b/test/workers/scheduled_activity_worker_test.exs @@ -11,7 +11,7 @@ defmodule Pleroma.Workers.ScheduledActivityWorkerTest do    import Pleroma.Factory    import ExUnit.CaptureLog -  clear_config([ScheduledActivity, :enabled]) +  setup do: clear_config([ScheduledActivity, :enabled])    test "creates a status from the scheduled activity" do      Pleroma.Config.put([ScheduledActivity, :enabled], true) | 
