From 3ce16e5a56be01686a03f40931f666ac164df6e8 Mon Sep 17 00:00:00 2001
From: Maksim Pechnikov <parallel588@gmail.com>
Date: Sat, 1 Dec 2018 08:26:59 +0300
Subject: [PATCH 01/13] init tesla and updated the http requests in
 Pleroma.Web.Websub

---
 config/config.exs                   |   1 +
 config/test.exs                     |   1 +
 lib/pleroma/http/connection.ex      |  22 +++++
 lib/pleroma/http/http.ex            |  16 +++-
 lib/pleroma/http/request_builder.ex | 126 ++++++++++++++++++++++++++++
 lib/pleroma/web/websub/websub.ex    |  14 ++--
 mix.exs                             |   1 +
 mix.lock                            |   3 +
 8 files changed, 175 insertions(+), 9 deletions(-)
 create mode 100644 lib/pleroma/http/connection.ex
 create mode 100644 lib/pleroma/http/request_builder.ex

diff --git a/config/config.exs b/config/config.exs
index 12f47389c..8d2fdd40d 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -72,6 +72,7 @@
 config :pleroma, :websub, Pleroma.Web.Websub
 config :pleroma, :ostatus, Pleroma.Web.OStatus
 config :pleroma, :httpoison, Pleroma.HTTP
+config :tesla, adapter: Tesla.Adapter.Hackney
 
 # Configures http settings, upstream proxy etc.
 config :pleroma, :http, proxy_url: nil
diff --git a/config/test.exs b/config/test.exs
index 3aaed1b2c..e259a9c65 100644
--- a/config/test.exs
+++ b/config/test.exs
@@ -26,6 +26,7 @@
 config :pleroma, :websub, Pleroma.Web.WebsubMock
 config :pleroma, :ostatus, Pleroma.Web.OStatusMock
 config :pleroma, :httpoison, HTTPoisonMock
+config :tesla, adapter: Tesla.Mock
 
 try do
   import_config "test.secret.exs"
diff --git a/lib/pleroma/http/connection.ex b/lib/pleroma/http/connection.ex
new file mode 100644
index 000000000..12667b663
--- /dev/null
+++ b/lib/pleroma/http/connection.ex
@@ -0,0 +1,22 @@
+defmodule Pleroma.HTTP.Connection do
+  @hackney_options [pool: :default]
+
+  @doc """
+  Configure a client connection
+
+  # Returns
+
+  Tesla.Env.client
+  """
+  @spec new(Keyword.t()) :: Tesla.Env.client()
+  def new(opts \\ []) do
+    Tesla.client([], {Tesla.Adapter.Hackney, hackney_options(opts)})
+  end
+
+  # fetch Hackney options
+  #
+  defp hackney_options(opts \\ []) do
+    options = Keyword.get(opts, :adapter, [])
+    @hackney_options ++ options
+  end
+end
diff --git a/lib/pleroma/http/http.ex b/lib/pleroma/http/http.ex
index e64266ae7..93ac9d62b 100644
--- a/lib/pleroma/http/http.ex
+++ b/lib/pleroma/http/http.ex
@@ -1,12 +1,21 @@
 defmodule Pleroma.HTTP do
   require HTTPoison
+  alias Pleroma.HTTP.Connection
+  alias Pleroma.HTTP.RequestBuilder, as: Builder
 
   def request(method, url, body \\ "", headers \\ [], options \\ []) do
     options =
       process_request_options(options)
       |> process_sni_options(url)
 
-    HTTPoison.request(method, url, body, headers, options)
+    %{}
+    |> Builder.method(method)
+    |> Builder.headers(headers)
+    |> Builder.opts(options)
+    |> Builder.url(url)
+    |> Builder.add_param(:body, :body, body)
+    |> Enum.into([])
+    |> (&Tesla.request(Connection.new(), &1)).()
   end
 
   defp process_sni_options(options, url) do
@@ -22,7 +31,7 @@ defp process_sni_options(options, url) do
   def process_request_options(options) do
     config = Application.get_env(:pleroma, :http, [])
     proxy = Keyword.get(config, :proxy_url, nil)
-    options = options ++ [hackney: [pool: :default]]
+    options = options ++ [adapter: [pool: :default]]
 
     case proxy do
       nil -> options
@@ -30,7 +39,8 @@ def process_request_options(options) do
     end
   end
 
-  def get(url, headers \\ [], options \\ []), do: request(:get, url, "", headers, options)
+  def get(url, headers \\ [], options \\ []),
+    do: request(:get, url, "", headers, options)
 
   def post(url, body, headers \\ [], options \\ []),
     do: request(:post, url, body, headers, options)
diff --git a/lib/pleroma/http/request_builder.ex b/lib/pleroma/http/request_builder.ex
new file mode 100644
index 000000000..5aee2b8ae
--- /dev/null
+++ b/lib/pleroma/http/request_builder.ex
@@ -0,0 +1,126 @@
+defmodule Pleroma.HTTP.RequestBuilder do
+  @moduledoc """
+  Helper functions for building Tesla requests
+  """
+
+  @doc """
+  Specify the request method when building a request
+
+  ## Parameters
+
+  - request (Map) - Collected request options
+  - m (atom) - Request method
+
+  ## Returns
+
+  Map
+  """
+  @spec method(map(), atom) :: map()
+  def method(request, m) do
+    Map.put_new(request, :method, m)
+  end
+
+  @doc """
+  Specify the request method when building a request
+
+  ## Parameters
+
+  - request (Map) - Collected request options
+  - u (String) - Request URL
+
+  ## Returns
+
+  Map
+  """
+  @spec url(map(), String.t()) :: map()
+  def url(request, u) do
+    Map.put_new(request, :url, u)
+  end
+
+  @doc """
+  Add headers to the request
+  """
+  @spec headers(map(), list(tuple)) :: map()
+  def headers(request, h) do
+    Map.put_new(request, :headers, h)
+  end
+
+  @doc """
+  Add custom, per-request middleware or adapter options to the request
+  """
+  @spec opts(map(), Keyword.t()) :: map()
+  def opts(request, options) do
+    Map.put_new(request, :opts, options)
+  end
+
+  @doc """
+  Add optional parameters to the request
+
+  ## Parameters
+
+  - request (Map) - Collected request options
+  - definitions (Map) - Map of parameter name to parameter location.
+  - options (KeywordList) - The provided optional parameters
+
+  ## Returns
+
+  Map
+  """
+  @spec add_optional_params(map(), %{optional(atom) => atom}, keyword()) :: map()
+  def add_optional_params(request, _, []), do: request
+
+  def add_optional_params(request, definitions, [{key, value} | tail]) do
+    case definitions do
+      %{^key => location} ->
+        request
+        |> add_param(location, key, value)
+        |> add_optional_params(definitions, tail)
+
+      _ ->
+        add_optional_params(request, definitions, tail)
+    end
+  end
+
+  @doc """
+  Add optional parameters to the request
+
+  ## Parameters
+
+  - request (Map) - Collected request options
+  - location (atom) - Where to put the parameter
+  - key (atom) - The name of the parameter
+  - value (any) - The value of the parameter
+
+  ## Returns
+
+  Map
+  """
+  @spec add_param(map(), atom, atom, any()) :: map()
+  def add_param(request, :body, :body, value), do: Map.put(request, :body, value)
+
+  def add_param(request, :body, key, value) do
+    request
+    |> Map.put_new_lazy(:body, &Tesla.Multipart.new/0)
+    |> Map.update!(
+      :body,
+      &Tesla.Multipart.add_field(&1, key, Poison.encode!(value),
+        headers: [{:"Content-Type", "application/json"}]
+      )
+    )
+  end
+
+  def add_param(request, :file, name, path) do
+    request
+    |> Map.put_new_lazy(:body, &Tesla.Multipart.new/0)
+    |> Map.update!(:body, &Tesla.Multipart.add_file(&1, path, name: name))
+  end
+
+  def add_param(request, :form, name, value) do
+    request
+    |> Map.update(:body, %{name => value}, &Map.put(&1, name, value))
+  end
+
+  def add_param(request, location, key, value) do
+    Map.update(request, location, [{key, value}], &(&1 ++ [{key, value}]))
+  end
+end
diff --git a/lib/pleroma/web/websub/websub.ex b/lib/pleroma/web/websub/websub.ex
index 905d8d658..ed1a99d8d 100644
--- a/lib/pleroma/web/websub/websub.ex
+++ b/lib/pleroma/web/websub/websub.ex
@@ -173,7 +173,7 @@ def subscribe(subscriber, subscribed, requester \\ &request_subscription/1) do
 
   def gather_feed_data(topic, getter \\ &@httpoison.get/1) do
     with {:ok, response} <- getter.(topic),
-         status_code when status_code in 200..299 <- response.status_code,
+         status_code when status_code in 200..299 <- response.status,
          body <- response.body,
          doc <- XML.parse_document(body),
          uri when not is_nil(uri) <- XML.string_from_xpath("/feed/author[1]/uri", doc),
@@ -221,7 +221,7 @@ def request_subscription(websub, poster \\ &@httpoison.post/3, timeout \\ 10_000
 
     task = Task.async(websub_checker)
 
-    with {:ok, %{status_code: 202}} <-
+    with {:ok, %{status: 202}} <-
            poster.(websub.hub, {:form, data}, "Content-type": "application/x-www-form-urlencoded"),
          {:ok, websub} <- Task.yield(task, timeout) do
       {:ok, websub}
@@ -257,7 +257,7 @@ def publish_one(%{xml: xml, topic: topic, callback: callback, secret: secret}) d
     signature = sign(secret || "", xml)
     Logger.info(fn -> "Pushing #{topic} to #{callback}" end)
 
-    with {:ok, %{status_code: code}} <-
+    with {:ok, %{status: code}} <-
            @httpoison.post(
              callback,
              xml,
@@ -265,9 +265,11 @@ def publish_one(%{xml: xml, topic: topic, callback: callback, secret: secret}) d
                {"Content-Type", "application/atom+xml"},
                {"X-Hub-Signature", "sha1=#{signature}"}
              ],
-             timeout: 10000,
-             recv_timeout: 20000,
-             hackney: [pool: :default]
+             adapter: [
+               timeout: 10000,
+               recv_timeout: 20000,
+               pool: :default
+             ]
            ) do
       Logger.info(fn -> "Pushed to #{callback}, code #{code}" end)
       {:ok, code}
diff --git a/mix.exs b/mix.exs
index 9ffcf5928..1a28b6710 100644
--- a/mix.exs
+++ b/mix.exs
@@ -56,6 +56,7 @@ defp deps do
       {:calendar, "~> 0.17.4"},
       {:cachex, "~> 3.0.2"},
       {:httpoison, "~> 1.2.0"},
+      {:tesla, "~> 1.2"},
       {:jason, "~> 1.0"},
       {:mogrify, "~> 0.6.1"},
       {:ex_aws, "~> 2.0"},
diff --git a/mix.lock b/mix.lock
index c0fa892a5..4c70061d3 100644
--- a/mix.lock
+++ b/mix.lock
@@ -17,6 +17,7 @@
   "eternal": {:hex, :eternal, "1.2.0", "e2a6b6ce3b8c248f7dc31451aefca57e3bdf0e48d73ae5043229380a67614c41", [:mix], [], "hexpm"},
   "ex_aws": {:hex, :ex_aws, "2.1.0", "b92651527d6c09c479f9013caa9c7331f19cba38a650590d82ebf2c6c16a1d8a", [:mix], [{:configparser_ex, "~> 2.0", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "1.6.3 or 1.6.5 or 1.7.1 or 1.8.6 or ~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jsx, "~> 2.8", [hex: :jsx, repo: "hexpm", optional: true]}, {:poison, ">= 1.2.0", [hex: :poison, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.6", [hex: :sweet_xml, repo: "hexpm", optional: true]}, {:xml_builder, "~> 0.1.0", [hex: :xml_builder, repo: "hexpm", optional: true]}], "hexpm"},
   "ex_aws_s3": {:hex, :ex_aws_s3, "2.0.1", "9e09366e77f25d3d88c5393824e613344631be8db0d1839faca49686e99b6704", [:mix], [{:ex_aws, "~> 2.0", [hex: :ex_aws, repo: "hexpm", optional: false]}, {:sweet_xml, ">= 0.0.0", [hex: :sweet_xml, repo: "hexpm", optional: true]}], "hexpm"},
+  "ex_doc": {:hex, :ex_doc, "0.19.1", "519bb9c19526ca51d326c060cb1778d4a9056b190086a8c6c115828eaccea6cf", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.7", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm"},
   "ex_machina": {:hex, :ex_machina, "2.2.0", "fec496331e04fc2db2a1a24fe317c12c0c4a50d2beb8ebb3531ed1f0d84be0ed", [:mix], [{:ecto, "~> 2.1", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm"},
   "gettext": {:hex, :gettext, "0.15.0", "40a2b8ce33a80ced7727e36768499fc9286881c43ebafccae6bab731e2b2b8ce", [:mix], [], "hexpm"},
   "hackney": {:hex, :hackney, "1.13.0", "24edc8cd2b28e1c652593833862435c80661834f6c9344e84b6a2255e7aeef03", [:rebar3], [{:certifi, "2.3.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "5.1.2", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"},
@@ -25,6 +26,7 @@
   "idna": {:hex, :idna, "5.1.2", "e21cb58a09f0228a9e0b95eaa1217f1bcfc31a1aaa6e1fdf2f53a33f7dbd9494", [:rebar3], [{:unicode_util_compat, "0.3.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"},
   "jason": {:hex, :jason, "1.0.0", "0f7cfa9bdb23fed721ec05419bcee2b2c21a77e926bce0deda029b5adc716fe2", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"},
   "makeup": {:hex, :makeup, "0.5.5", "9e08dfc45280c5684d771ad58159f718a7b5788596099bdfb0284597d368a882", [:mix], [{:nimble_parsec, "~> 0.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm"},
+  "makeup_elixir": {:hex, :makeup_elixir, "0.10.0", "0f09c2ddf352887a956d84f8f7e702111122ca32fbbc84c2f0569b8b65cbf7fa", [:mix], [{:makeup, "~> 0.5.5", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm"},
   "meck": {:hex, :meck, "0.8.9", "64c5c0bd8bcca3a180b44196265c8ed7594e16bcc845d0698ec6b4e577f48188", [:rebar3], [], "hexpm"},
   "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"},
   "mime": {:hex, :mime, "1.3.0", "5e8d45a39e95c650900d03f897fbf99ae04f60ab1daa4a34c7a20a5151b7a5fe", [:mix], [], "hexpm"},
@@ -45,6 +47,7 @@
   "postgrex": {:hex, :postgrex, "0.13.5", "3d931aba29363e1443da167a4b12f06dcd171103c424de15e5f3fc2ba3e6d9c5", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm"},
   "ranch": {:hex, :ranch, "1.3.2", "e4965a144dc9fbe70e5c077c65e73c57165416a901bd02ea899cfd95aa890986", [:rebar3], [], "hexpm"},
   "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:make, :rebar], [], "hexpm"},
+  "tesla": {:hex, :tesla, "1.2.1", "864783cc27f71dd8c8969163704752476cec0f3a51eb3b06393b3971dc9733ff", [:mix], [{:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm"},
   "trailing_format_plug": {:hex, :trailing_format_plug, "0.0.7", "64b877f912cf7273bed03379936df39894149e35137ac9509117e59866e10e45", [:mix], [{:plug, "> 0.12.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
   "tzdata": {:hex, :tzdata, "0.5.17", "50793e3d85af49736701da1a040c415c97dc1caf6464112fd9bd18f425d3053b", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"},
   "unicode_util_compat": {:hex, :unicode_util_compat, "0.3.1", "a1f612a7b512638634a603c8f401892afbf99b8ce93a45041f8aaca99cadb85e", [:rebar3], [], "hexpm"},

From ec34de0c1fd58942c8ecefddef92696750b70420 Mon Sep 17 00:00:00 2001
From: Maksim Pechnikov <parallel588@gmail.com>
Date: Sun, 2 Dec 2018 16:58:38 +0300
Subject: [PATCH 02/13] WebSub fix test

---
 config/test.exs                 |  1 -
 lib/pleroma/http/connection.ex  |  3 ++-
 test/web/websub/websub_test.exs | 31 ++++++++++++++++++++-----------
 3 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/config/test.exs b/config/test.exs
index e259a9c65..6f6227c20 100644
--- a/config/test.exs
+++ b/config/test.exs
@@ -25,7 +25,6 @@
 
 config :pleroma, :websub, Pleroma.Web.WebsubMock
 config :pleroma, :ostatus, Pleroma.Web.OStatusMock
-config :pleroma, :httpoison, HTTPoisonMock
 config :tesla, adapter: Tesla.Mock
 
 try do
diff --git a/lib/pleroma/http/connection.ex b/lib/pleroma/http/connection.ex
index 12667b663..f64d4e18e 100644
--- a/lib/pleroma/http/connection.ex
+++ b/lib/pleroma/http/connection.ex
@@ -1,5 +1,6 @@
 defmodule Pleroma.HTTP.Connection do
   @hackney_options [pool: :default]
+  @adapter Application.get_env(:tesla, :adapter)
 
   @doc """
   Configure a client connection
@@ -10,7 +11,7 @@ defmodule Pleroma.HTTP.Connection do
   """
   @spec new(Keyword.t()) :: Tesla.Env.client()
   def new(opts \\ []) do
-    Tesla.client([], {Tesla.Adapter.Hackney, hackney_options(opts)})
+    Tesla.client([], {@adapter, hackney_options(opts)})
   end
 
   # fetch Hackney options
diff --git a/test/web/websub/websub_test.exs b/test/web/websub/websub_test.exs
index da7bc9112..0b8bfda2d 100644
--- a/test/web/websub/websub_test.exs
+++ b/test/web/websub/websub_test.exs
@@ -10,6 +10,18 @@ defmodule Pleroma.Web.WebsubTest do
   alias Pleroma.Web.Websub.{WebsubServerSubscription, WebsubClientSubscription}
   import Pleroma.Factory
   alias Pleroma.Web.Router.Helpers
+  import Tesla.Mock
+
+  setup do
+     mock fn
+      %{method: :get, url: "https://mastodon.social/users/lambadalambda.atom"} ->
+        %Tesla.Env{status: 200, body: File.read!("test/fixtures/lambadalambda.atom")}
+      %{method: :post, url: "http://example.org/needs_refresh"} ->
+        %Tesla.Env{status: 200, body: ""}
+     end
+
+    :ok
+  end
 
   test "a verification of a request that is accepted" do
     sub = insert(:websub_subscription)
@@ -26,8 +38,8 @@ test "a verification of a request that is accepted" do
       assert String.to_integer(seconds) > 0
 
       {:ok,
-       %HTTPoison.Response{
-         status_code: 200,
+       %Tesla.Env{
+         status: 200,
          body: challenge
        }}
     end
@@ -41,8 +53,8 @@ test "a verification of a request that doesn't return 200" do
 
     getter = fn _path, _headers, _options ->
       {:ok,
-       %HTTPoison.Response{
-         status_code: 500,
+       %Tesla.Env{
+         status: 500,
          body: ""
        }}
     end
@@ -113,12 +125,7 @@ test "initiate a subscription for a given user and topic" do
   test "discovers the hub and canonical url" do
     topic = "https://mastodon.social/users/lambadalambda.atom"
 
-    getter = fn ^topic ->
-      doc = File.read!("test/fixtures/lambadalambda.atom")
-      {:ok, %{status_code: 200, body: doc}}
-    end
-
-    {:ok, discovered} = Websub.gather_feed_data(topic, getter)
+    {:ok, discovered} = Websub.gather_feed_data(topic)
 
     expected = %{
       "hub" => "https://mastodon.social/api/push",
@@ -158,7 +165,7 @@ test "calls the hub, requests topic" do
                  websub.id
                )
 
-      {:ok, %{status_code: 202}}
+      {:ok, %{status: 202}}
     end
 
     task = Task.async(fn -> Websub.request_subscription(websub, poster) end)
@@ -209,6 +216,7 @@ test "it renews subscriptions that have less than a day of time left" do
         insert(:websub_client_subscription, %{
           valid_until: NaiveDateTime.add(now, 2 * day),
           topic: "http://example.org/still_good",
+          hub: "http://example.org/still_good",
           state: "accepted"
         })
 
@@ -216,6 +224,7 @@ test "it renews subscriptions that have less than a day of time left" do
         insert(:websub_client_subscription, %{
           valid_until: NaiveDateTime.add(now, day - 100),
           topic: "http://example.org/needs_refresh",
+          hub: "http://example.org/needs_refresh",
           state: "accepted"
         })
 

From 97252a27d9bdde3483cc6d676c0c61150d2174ad Mon Sep 17 00:00:00 2001
From: Maksim Pechnikov <parallel588@gmail.com>
Date: Sun, 2 Dec 2018 17:00:33 +0300
Subject: [PATCH 03/13] fix http request in Salmon

---
 lib/pleroma/web/salmon/salmon.ex | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/lib/pleroma/web/salmon/salmon.ex b/lib/pleroma/web/salmon/salmon.ex
index b98ece6c9..97251c05e 100644
--- a/lib/pleroma/web/salmon/salmon.ex
+++ b/lib/pleroma/web/salmon/salmon.ex
@@ -158,14 +158,16 @@ def remote_users(%{data: %{"to" => to} = data}) do
   end
 
   defp send_to_user(%{info: %{salmon: salmon}}, feed, poster) do
-    with {:ok, %{status_code: code}} <-
+    with {:ok, %{status: code}} <-
            poster.(
              salmon,
              feed,
              [{"Content-Type", "application/magic-envelope+xml"}],
-             timeout: 10000,
-             recv_timeout: 20000,
-             hackney: [pool: :default]
+             adapter: [
+               timeout: 10000,
+               recv_timeout: 20000,
+               pool: :default
+             ]
            ) do
       Logger.debug(fn -> "Pushed to #{salmon}, code #{code}" end)
     else

From 87109482f336422186981c80eb3c3023637f09e8 Mon Sep 17 00:00:00 2001
From: Maksim Pechnikov <parallel588@gmail.com>
Date: Sun, 2 Dec 2018 17:08:36 +0300
Subject: [PATCH 04/13] status_code -> status

---
 lib/pleroma/uploaders/mdii.ex                           | 2 +-
 lib/pleroma/uploaders/swift/keystone.ex                 | 4 ++--
 lib/pleroma/uploaders/swift/swift.ex                    | 4 ++--
 lib/pleroma/web/activity_pub/activity_pub.ex            | 2 +-
 lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 2 +-
 lib/pleroma/web/ostatus/ostatus.ex                      | 8 +++++---
 lib/pleroma/web/web_finger/web_finger.ex                | 4 ++--
 lib/pleroma/web/websub/websub.ex                        | 2 +-
 test/web/websub/websub_test.exs                         | 4 ++--
 9 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/lib/pleroma/uploaders/mdii.ex b/lib/pleroma/uploaders/mdii.ex
index 35d36d3e4..820cf88f5 100644
--- a/lib/pleroma/uploaders/mdii.ex
+++ b/lib/pleroma/uploaders/mdii.ex
@@ -20,7 +20,7 @@ def put_file(upload) do
     extension = String.split(upload.name, ".") |> List.last()
     query = "#{cgi}?#{extension}"
 
-    with {:ok, %{status_code: 200, body: body}} <- @httpoison.post(query, file_data) do
+    with {:ok, %{status: 200, body: body}} <- @httpoison.post(query, file_data) do
       remote_file_name = String.split(body) |> List.first()
       public_url = "#{files}/#{remote_file_name}.#{extension}"
       {:ok, {:url, public_url}}
diff --git a/lib/pleroma/uploaders/swift/keystone.ex b/lib/pleroma/uploaders/swift/keystone.ex
index e578b3c61..4aed977b1 100644
--- a/lib/pleroma/uploaders/swift/keystone.ex
+++ b/lib/pleroma/uploaders/swift/keystone.ex
@@ -25,10 +25,10 @@ def get_token() do
            ["Content-Type": "application/json"],
            hackney: [:insecure]
          ) do
-      {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
+      {:ok, %Tesla.Env{status: 200, body: body}} ->
         body["access"]["token"]["id"]
 
-      {:ok, %HTTPoison.Response{status_code: _}} ->
+      {:ok, %Tesla.Env{status: _}} ->
         ""
     end
   end
diff --git a/lib/pleroma/uploaders/swift/swift.ex b/lib/pleroma/uploaders/swift/swift.ex
index 1e865f101..a5b3d2852 100644
--- a/lib/pleroma/uploaders/swift/swift.ex
+++ b/lib/pleroma/uploaders/swift/swift.ex
@@ -13,10 +13,10 @@ def upload_file(filename, body, content_type) do
     token = Pleroma.Uploaders.Swift.Keystone.get_token()
 
     case put("#{filename}", body, "X-Auth-Token": token, "Content-Type": content_type) do
-      {:ok, %HTTPoison.Response{status_code: 201}} ->
+      {:ok, %Tesla.Env{status: 201}} ->
         {:ok, {:file, filename}}
 
-      {:ok, %HTTPoison.Response{status_code: 401}} ->
+      {:ok, %Tesla.Env{status: 401}} ->
         {:error, "Unauthorized, Bad Token"}
 
       {:error, _} ->
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index 7e207c620..60253a715 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -762,7 +762,7 @@ def fetch_and_contain_remote_object_from_id(id) do
     Logger.info("Fetching #{id} via AP")
 
     with true <- String.starts_with?(id, "http"),
-         {:ok, %{body: body, status_code: code}} when code in 200..299 <-
+         {:ok, %{body: body, status: code}} when code in 200..299 <-
            @httpoison.get(
              id,
              [Accept: "application/activity+json"],
diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
index 543fdf416..ea64f163d 100644
--- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
+++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
@@ -1168,7 +1168,7 @@ def suggestions(%{assigns: %{user: user}} = conn, _) do
       user = user.nickname
       url = String.replace(api, "{{host}}", host) |> String.replace("{{user}}", user)
 
-      with {:ok, %{status_code: 200, body: body}} <-
+      with {:ok, %{status: 200, body: body}} <-
              @httpoison.get(url, [], timeout: timeout, recv_timeout: timeout),
            {:ok, data} <- Jason.decode(body) do
         data2 =
diff --git a/lib/pleroma/web/ostatus/ostatus.ex b/lib/pleroma/web/ostatus/ostatus.ex
index 6a27f1730..67df354db 100644
--- a/lib/pleroma/web/ostatus/ostatus.ex
+++ b/lib/pleroma/web/ostatus/ostatus.ex
@@ -346,13 +346,15 @@ def get_atom_url(body) do
 
   def fetch_activity_from_atom_url(url) do
     with true <- String.starts_with?(url, "http"),
-         {:ok, %{body: body, status_code: code}} when code in 200..299 <-
+         {:ok, %{body: body, status: code}} when code in 200..299 <-
            @httpoison.get(
              url,
              [Accept: "application/atom+xml"],
              follow_redirect: true,
-             timeout: 10000,
-             recv_timeout: 20000
+             adapter: [
+               timeout: 10000,
+               recv_timeout: 20000
+             ]
            ) do
       Logger.debug("Got document from #{url}, handling...")
       handle_incoming(body)
diff --git a/lib/pleroma/web/web_finger/web_finger.ex b/lib/pleroma/web/web_finger/web_finger.ex
index eaee3a8c6..99c65a6bf 100644
--- a/lib/pleroma/web/web_finger/web_finger.ex
+++ b/lib/pleroma/web/web_finger/web_finger.ex
@@ -220,7 +220,7 @@ def get_template_from_xml(body) do
   end
 
   def find_lrdd_template(domain) do
-    with {:ok, %{status_code: status_code, body: body}} when status_code in 200..299 <-
+    with {:ok, %{status: status, body: body}} when status in 200..299 <-
            @httpoison.get("http://#{domain}/.well-known/host-meta", [], follow_redirect: true) do
       get_template_from_xml(body)
     else
@@ -259,7 +259,7 @@ def finger(account) do
              [Accept: "application/xrd+xml,application/jrd+json"],
              follow_redirect: true
            ),
-         {:ok, %{status_code: status_code, body: body}} when status_code in 200..299 <- response do
+         {:ok, %{status: status, body: body}} when status in 200..299 <- response do
       doc = XML.parse_document(body)
 
       if doc != :error do
diff --git a/lib/pleroma/web/websub/websub.ex b/lib/pleroma/web/websub/websub.ex
index ed1a99d8d..0761b5475 100644
--- a/lib/pleroma/web/websub/websub.ex
+++ b/lib/pleroma/web/websub/websub.ex
@@ -173,7 +173,7 @@ def subscribe(subscriber, subscribed, requester \\ &request_subscription/1) do
 
   def gather_feed_data(topic, getter \\ &@httpoison.get/1) do
     with {:ok, response} <- getter.(topic),
-         status_code when status_code in 200..299 <- response.status,
+         status when status in 200..299 <- response.status,
          body <- response.body,
          doc <- XML.parse_document(body),
          uri when not is_nil(uri) <- XML.string_from_xpath("/feed/author[1]/uri", doc),
diff --git a/test/web/websub/websub_test.exs b/test/web/websub/websub_test.exs
index 0b8bfda2d..f3d2da81a 100644
--- a/test/web/websub/websub_test.exs
+++ b/test/web/websub/websub_test.exs
@@ -184,7 +184,7 @@ test "rejects the subscription if it can't be accepted" do
     websub = insert(:websub_client_subscription, %{hub: hub, topic: topic})
 
     poster = fn ^hub, {:form, _data}, _headers ->
-      {:ok, %{status_code: 202}}
+      {:ok, %{status: 202}}
     end
 
     {:error, websub} = Websub.request_subscription(websub, poster, 1000)
@@ -193,7 +193,7 @@ test "rejects the subscription if it can't be accepted" do
     websub = insert(:websub_client_subscription, %{hub: hub, topic: topic})
 
     poster = fn ^hub, {:form, _data}, _headers ->
-      {:ok, %{status_code: 400}}
+      {:ok, %{status: 400}}
     end
 
     {:error, websub} = Websub.request_subscription(websub, poster, 1000)

From c508d41c349c3034211f41281cfe60c70a020575 Mon Sep 17 00:00:00 2001
From: Maksim Pechnikov <parallel588@gmail.com>
Date: Sun, 2 Dec 2018 18:17:26 +0300
Subject: [PATCH 05/13] add http requests mock

---
 test/support/http_request_mock.ex | 80 +++++++++++++++++++++++++++++++
 test/web/salmon/salmon_test.exs   |  5 ++
 test/web/websub/websub_test.exs   |  8 +---
 3 files changed, 86 insertions(+), 7 deletions(-)
 create mode 100644 test/support/http_request_mock.ex

diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
new file mode 100644
index 000000000..c3501c6cf
--- /dev/null
+++ b/test/support/http_request_mock.ex
@@ -0,0 +1,80 @@
+defmodule HttpRequestMock do
+  def request(
+        %Tesla.Env{
+          url: url,
+          method: method,
+          headers: headers,
+          query: query,
+          body: body
+        } = _env
+      ) do
+    with {:ok, res} <- apply(__MODULE__, method, [url, query, body, headers]) do
+      res
+    else
+      {_, r} = error ->
+        IO.warn(r)
+        error
+    end
+  end
+
+  # GET Requests
+  #
+  def get(url, query \\ [], body \\ [], headers \\ [])
+
+  def get("https://social.heldscal.la/api/statuses/user_timeline/23211.atom", _, _, _) do
+    {:ok, %Tesla.Env{
+        status: 200,
+        body: File.read!(
+          "test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml"
+        )}}
+  end
+
+  def get("https://social.heldscal.la/.well-known/webfinger?resource=https://social.heldscal.la/user/23211", _, _, _) do
+    {:ok, %Tesla.Env{
+        status: 200,
+        body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_user_23211.xml")}}
+  end
+
+  def get("http://social.heldscal.la/.well-known/host-meta", _, _, _) do
+    {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/httpoison_mock/social.heldscal.la_host_meta")}}
+  end
+
+  def get("https://social.heldscal.la/.well-known/host-meta", _, _, _) do
+    {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/httpoison_mock/social.heldscal.la_host_meta")}}
+  end
+
+  def get("https://mastodon.social/users/lambadalambda.atom", _, _, _) do
+    {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/lambadalambda.atom")}}
+  end
+
+  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
+
+  def get(url, query, body, headers) do
+    {:error,
+     "Not implemented the mock response for get #{inspect(url)}, #{query}, #{inspect(body)}, #{
+     inspect(headers)
+     }"}
+  end
+
+
+  # POST Requests
+  #
+
+  def post(url, query \\ [], body \\ [], headers \\ [])
+
+  def post("http://example.org/needs_refresh", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: ""
+     }}
+  end
+
+  def post(url, _query, _body, _headers) do
+    {:error, "Not implemented the mock response for post #{inspect(url)}"}
+  end
+end
diff --git a/test/web/salmon/salmon_test.exs b/test/web/salmon/salmon_test.exs
index 1b39b4b2d..3285c11f0 100644
--- a/test/web/salmon/salmon_test.exs
+++ b/test/web/salmon/salmon_test.exs
@@ -3,6 +3,7 @@ defmodule Pleroma.Web.Salmon.SalmonTest do
   alias Pleroma.Web.Salmon
   alias Pleroma.{Repo, Activity, User}
   import Pleroma.Factory
+  import Tesla.Mock
 
   @magickey "RSA.pu0s-halox4tu7wmES1FVSx6u-4wc0YrUFXcqWXZG4-27UmbCOpMQftRCldNRfyA-qLbz-eqiwQhh-1EwUvjsD4cYbAHNGHwTvDOyx5AKthQUP44ykPv7kjKGh3DWKySJvcs9tlUG87hlo7AvnMo9pwRS_Zz2CacQ-MKaXyDepk=.AQAB"
 
@@ -10,6 +11,10 @@ defmodule Pleroma.Web.Salmon.SalmonTest do
 
   @magickey_friendica "RSA.AMwa8FUs2fWEjX0xN7yRQgegQffhBpuKNC6fa5VNSVorFjGZhRrlPMn7TQOeihlc9lBz2OsHlIedbYn2uJ7yCs0.AQAB"
 
+  setup do
+    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
   test "decodes a salmon" do
     {:ok, salmon} = File.read("test/fixtures/salmon.xml")
     {:ok, doc} = Salmon.decode_and_validate(@magickey, salmon)
diff --git a/test/web/websub/websub_test.exs b/test/web/websub/websub_test.exs
index f3d2da81a..47d1a88e1 100644
--- a/test/web/websub/websub_test.exs
+++ b/test/web/websub/websub_test.exs
@@ -13,13 +13,7 @@ defmodule Pleroma.Web.WebsubTest do
   import Tesla.Mock
 
   setup do
-     mock fn
-      %{method: :get, url: "https://mastodon.social/users/lambadalambda.atom"} ->
-        %Tesla.Env{status: 200, body: File.read!("test/fixtures/lambadalambda.atom")}
-      %{method: :post, url: "http://example.org/needs_refresh"} ->
-        %Tesla.Env{status: 200, body: ""}
-     end
-
+    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
     :ok
   end
 

From 6cfdc11e32faf84263e4c5d7b15f193ba1b832ae Mon Sep 17 00:00:00 2001
From: Maksim Pechnikov <parallel588@gmail.com>
Date: Sun, 2 Dec 2018 22:05:28 +0300
Subject: [PATCH 06/13] update test

---
 .../httpoison_mock/framatube.org_host_meta    |   2 +
 .../httpoison_mock/gerzilla.de_host_meta      |  10 +
 .../httpoison_mock/gnusocial.de_host_meta     |   2 +
 test/support/http_request_mock.ex             | 376 +++++++++++++++++-
 test/web/ostatus/ostatus_test.exs             |   6 +
 test/web/salmon/salmon_test.exs               |   1 +
 test/web/web_finger/web_finger_test.exs       |   6 +
 7 files changed, 384 insertions(+), 19 deletions(-)
 create mode 100644 test/fixtures/httpoison_mock/framatube.org_host_meta
 create mode 100644 test/fixtures/httpoison_mock/gerzilla.de_host_meta
 create mode 100644 test/fixtures/httpoison_mock/gnusocial.de_host_meta

diff --git a/test/fixtures/httpoison_mock/framatube.org_host_meta b/test/fixtures/httpoison_mock/framatube.org_host_meta
new file mode 100644
index 000000000..91516ff6d
--- /dev/null
+++ b/test/fixtures/httpoison_mock/framatube.org_host_meta
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"><hm:Host xmlns:hm="http://host-meta.net/xrd/1.0">framatube.org</hm:Host><Link rel="lrdd" template="http://framatube.org/main/xrd?uri={uri}"><Title>Resource Descriptor</Title></Link></XRD>
diff --git a/test/fixtures/httpoison_mock/gerzilla.de_host_meta b/test/fixtures/httpoison_mock/gerzilla.de_host_meta
new file mode 100644
index 000000000..fae8f37eb
--- /dev/null
+++ b/test/fixtures/httpoison_mock/gerzilla.de_host_meta
@@ -0,0 +1,10 @@
+<?xml version='1.0' encoding='UTF-8'?><XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'
+     xmlns:hm='http://host-meta.net/xrd/1.0'>
+ 
+    <hm:Host>gerzilla.de</hm:Host>
+ 
+    <Link rel='lrdd' type="application/xrd+xml" template='https://gerzilla.de/xrd/?uri={uri}' />
+	<Link rel="http://oexchange.org/spec/0.8/rel/resident-target" type="application/xrd+xml" 
+        href="https://gerzilla.de/oexchange/xrd" />
+
+</XRD>
diff --git a/test/fixtures/httpoison_mock/gnusocial.de_host_meta b/test/fixtures/httpoison_mock/gnusocial.de_host_meta
new file mode 100644
index 000000000..a4affb102
--- /dev/null
+++ b/test/fixtures/httpoison_mock/gnusocial.de_host_meta
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"><hm:Host xmlns:hm="http://host-meta.net/xrd/1.0">gnusocial.de</hm:Host><Link rel="lrdd" template="http://gnusocial.de/main/xrd?uri={uri}"><Title>Resource Descriptor</Title></Link></XRD>
diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
index c3501c6cf..64c3d11b3 100644
--- a/test/support/http_request_mock.ex
+++ b/test/support/http_request_mock.ex
@@ -1,4 +1,6 @@
 defmodule HttpRequestMock do
+  require Logger
+
   def request(
         %Tesla.Env{
           url: url,
@@ -12,7 +14,7 @@ def request(
       res
     else
       {_, r} = error ->
-        IO.warn(r)
+        Logger.warn(r)
         error
     end
   end
@@ -21,46 +23,382 @@ def request(
   #
   def get(url, query \\ [], body \\ [], headers \\ [])
 
-  def get("https://social.heldscal.la/api/statuses/user_timeline/23211.atom", _, _, _) do
-    {:ok, %Tesla.Env{
-        status: 200,
-        body: File.read!(
-          "test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml"
-        )}}
+  def get("https://pleroma.soykaf.com/users/lain/feed.atom", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body:
+         File.read!(
+           "test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml"
+         )
+     }}
   end
 
-  def get("https://social.heldscal.la/.well-known/webfinger?resource=https://social.heldscal.la/user/23211", _, _, _) do
-    {:ok, %Tesla.Env{
-        status: 200,
-        body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_user_23211.xml")}}
+  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"
+           ] do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain.xml")
+     }}
+  end
+
+  def get("https://shitposter.club/api/statuses/user_timeline/1.atom", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body:
+         File.read!(
+           "test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml"
+         )
+     }}
+  end
+
+  def get(
+        "https://shitposter.club/.well-known/webfinger?resource=https://shitposter.club/user/1",
+        _,
+        _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/https___shitposter.club_user_1.xml")
+     }}
+  end
+
+  def get("https://shitposter.club/notice/2827873", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body:
+         File.read!("test/fixtures/httpoison_mock/https___shitposter.club_notice_2827873.html")
+     }}
+  end
+
+  def get("https://shitposter.club/api/statuses/show/2827873.atom", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body:
+         File.read!(
+           "test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml"
+         )
+     }}
+  end
+
+  def get("https://testing.pleroma.lol/objects/b319022a-4946-44c5-9de9-34801f95507b", _, _, _) do
+    {:ok, %Tesla.Env{status: 200}}
+  end
+
+  def get("https://shitposter.club/api/statuses/user_timeline/5381.atom", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/spc_5381.atom")
+     }}
+  end
+
+  def get(
+        "https://shitposter.club/.well-known/webfinger?resource=https://shitposter.club/user/5381",
+        _,
+        _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/spc_5381_xrd.xml")
+     }}
+  end
+
+  def get("http://shitposter.club/.well-known/host-meta", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/shitposter.club_host_meta")
+     }}
+  end
+
+  def get("https://shitposter.club/api/statuses/show/7369654.atom", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/7369654.atom")
+     }}
+  end
+
+  def get("https://shitposter.club/notice/4027863", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/7369654.html")
+     }}
+  end
+
+  def get("https://social.sakamoto.gq/users/eal/feed.atom", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/sakamoto_eal_feed.atom")
+     }}
+  end
+
+  def get("http://social.sakamoto.gq/.well-known/host-meta", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/social.sakamoto.gq_host_meta")
+     }}
+  end
+
+  def get(
+        "https://social.sakamoto.gq/.well-known/webfinger?resource=https://social.sakamoto.gq/users/eal",
+        _,
+        _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/eal_sakamoto.xml")
+     }}
+  end
+
+  def get("https://social.sakamoto.gq/objects/0ccc1a2c-66b0-4305-b23a-7f7f2b040056", _, _,
+        Accept: "application/atom+xml"
+      ) do
+    {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/httpoison_mock/sakamoto.atom")}}
+  end
+
+  def get("http://mastodon.social/.well-known/host-meta", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/mastodon.social_host_meta")
+     }}
+  end
+
+  def get(
+        "https://mastodon.social/.well-known/webfinger?resource=https://mastodon.social/users/lambadalambda",
+        _,
+        _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body:
+         File.read!(
+           "test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.xml"
+         )
+     }}
+  end
+
+  def get("http://gs.example.org/.well-known/host-meta", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/gs.example.org_host_meta")
+     }}
+  end
+
+  def get(
+        "http://gs.example.org/.well-known/webfinger?resource=http://gs.example.org:4040/index.php/user/1",
+        _,
+        _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body:
+         File.read!(
+           "test/fixtures/httpoison_mock/http___gs.example.org_4040_index.php_user_1.xml"
+         )
+     }}
+  end
+
+  def get("http://gs.example.org/index.php/api/statuses/user_timeline/1.atom", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body:
+         File.read!(
+           "test/fixtures/httpoison_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml"
+         )
+     }}
+  end
+
+  def get("https://social.heldscal.la/api/statuses/user_timeline/29191.atom", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body:
+         File.read!(
+           "test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml"
+         )
+     }}
+  end
+
+  def get("http://squeet.me/.well-known/host-meta", _, _, _) do
+    {:ok,
+     %Tesla.Env{status: 200, body: File.read!("test/fixtures/httpoison_mock/squeet.me_host_meta")}}
+  end
+
+  def get("https://squeet.me/xrd?uri=lain@squeet.me", _, _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/lain_squeet.me_webfinger.xml")
+     }}
+  end
+
+  def get(
+        "https://social.heldscal.la/.well-known/webfinger?resource=shp@social.heldscal.la",
+        _,
+        _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/shp@social.heldscal.la.xml")
+     }}
+  end
+
+  def get("http://framatube.org/.well-known/host-meta", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/framatube.org_host_meta")
+     }}
+  end
+
+  def get("http://framatube.org/main/xrd?uri=framasoft@framatube.org", _, _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       headers: [{"content-type", "application/json"}],
+       body: File.read!("test/fixtures/httpoison_mock/framasoft@framatube.org.json")
+     }}
+  end
+
+  def get("http://gnusocial.de/.well-known/host-meta", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/gnusocial.de_host_meta")
+     }}
+  end
+
+  def get("http://gnusocial.de/main/xrd?uri=winterdienst@gnusocial.de", _, _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/winterdienst_webfinger.json")
+     }}
+  end
+
+  def get("http://status.alpicola.com/.well-known/host-meta", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/status.alpicola.com_host_meta")
+     }}
+  end
+
+  def get("http://macgirvin.com/.well-known/host-meta", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/macgirvin.com_host_meta")
+     }}
+  end
+
+  def get("http://gerzilla.de/.well-known/host-meta", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/gerzilla.de_host_meta")
+     }}
+  end
+
+  def get("https://gerzilla.de/xrd/?uri=kaniini@gerzilla.de", _, _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       headers: [{"content-type", "application/json"}],
+       body: File.read!("test/fixtures/httpoison_mock/kaniini@gerzilla.de.json")
+     }}
+  end
+
+  def get("https://social.heldscal.la/api/statuses/user_timeline/23211.atom", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body:
+         File.read!(
+           "test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml"
+         )
+     }}
+  end
+
+  def get(
+        "https://social.heldscal.la/.well-known/webfinger?resource=https://social.heldscal.la/user/23211",
+        _,
+        _,
+        _
+      ) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_user_23211.xml")
+     }}
   end
 
   def get("http://social.heldscal.la/.well-known/host-meta", _, _, _) do
-    {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/httpoison_mock/social.heldscal.la_host_meta")}}
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/social.heldscal.la_host_meta")
+     }}
   end
 
   def get("https://social.heldscal.la/.well-known/host-meta", _, _, _) do
-    {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/httpoison_mock/social.heldscal.la_host_meta")}}
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/social.heldscal.la_host_meta")
+     }}
   end
 
   def get("https://mastodon.social/users/lambadalambda.atom", _, _, _) do
     {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/lambadalambda.atom")}}
   end
 
-  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)
-    }
+  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
 
   def get(url, query, body, headers) do
     {:error,
      "Not implemented the mock response for get #{inspect(url)}, #{query}, #{inspect(body)}, #{
-     inspect(headers)
+       inspect(headers)
      }"}
   end
 
-
   # POST Requests
   #
 
diff --git a/test/web/ostatus/ostatus_test.exs b/test/web/ostatus/ostatus_test.exs
index 32bf6691b..83525456b 100644
--- a/test/web/ostatus/ostatus_test.exs
+++ b/test/web/ostatus/ostatus_test.exs
@@ -5,6 +5,12 @@ defmodule Pleroma.Web.OStatusTest do
   alias Pleroma.{Object, Repo, User, Activity}
   import Pleroma.Factory
   import ExUnit.CaptureLog
+  import Tesla.Mock
+
+  setup do
+    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
 
   test "don't insert create notes twice" do
     incoming = File.read!("test/fixtures/incoming_note_activity.xml")
diff --git a/test/web/salmon/salmon_test.exs b/test/web/salmon/salmon_test.exs
index 3285c11f0..23ccc038e 100644
--- a/test/web/salmon/salmon_test.exs
+++ b/test/web/salmon/salmon_test.exs
@@ -15,6 +15,7 @@ defmodule Pleroma.Web.Salmon.SalmonTest do
     mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
     :ok
   end
+
   test "decodes a salmon" do
     {:ok, salmon} = File.read("test/fixtures/salmon.xml")
     {:ok, doc} = Salmon.decode_and_validate(@magickey, salmon)
diff --git a/test/web/web_finger/web_finger_test.exs b/test/web/web_finger/web_finger_test.exs
index 28d429565..32eff9b7c 100644
--- a/test/web/web_finger/web_finger_test.exs
+++ b/test/web/web_finger/web_finger_test.exs
@@ -2,6 +2,12 @@ defmodule Pleroma.Web.WebFingerTest do
   use Pleroma.DataCase
   alias Pleroma.Web.WebFinger
   import Pleroma.Factory
+  import Tesla.Mock
+
+  setup do
+    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
 
   describe "host meta" do
     test "returns a link to the xml lrdd" do

From 80bfdb4e7d3e339a1e47330c0de0fe7af9c00ab1 Mon Sep 17 00:00:00 2001
From: Maksim Pechnikov <parallel588@gmail.com>
Date: Mon, 3 Dec 2018 18:53:22 +0300
Subject: [PATCH 07/13] update test

---
 test/support/http_request_mock.ex             | 120 ++++++++++++++++++
 test/web/activity_pub/activity_pub_test.exs   |   6 +
 test/web/activity_pub/transmogrifier_test.exs |   7 +
 3 files changed, 133 insertions(+)

diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
index 64c3d11b3..4a4566e84 100644
--- a/test/support/http_request_mock.ex
+++ b/test/support/http_request_mock.ex
@@ -23,6 +23,126 @@ def request(
   #
   def get(url, query \\ [], body \\ [], headers \\ [])
 
+  def get("https://prismo.news/@mxb", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/https___prismo.news__mxb.json")
+     }}
+  end
+
+  def get("https://hubzilla.example.org/channel/kaniini",
+    _, _, [Accept: "application/activity+json"]) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/kaniini@hubzilla.example.org.json")
+     }}
+  end
+
+  def get("https://niu.moe/users/rye", _, _, [Accept: "application/activity+json"]) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/rye.json")
+     }}
+  end
+
+  def get("http://mastodon.example.org/users/admin/statuses/100787282858396771", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!(
+         "test/fixtures/httpoison_mock/http___mastodon.example.org_users_admin_status_1234.json"
+       )
+     }}
+  end
+
+  def get("https://puckipedia.com/", _, _, [Accept: "application/activity+json"]) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/puckipedia.com.json")
+     }}
+  end
+
+
+  def get("https://peertube.moe/accounts/7even", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/7even.json")
+     }}
+  end
+
+  def get("https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/peertube.moe-vid.json")
+     }}
+  end
+
+  def get("https://baptiste.gelez.xyz/@/BaptisteGelez", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/baptiste.gelex.xyz-user.json")
+     }}
+  end
+
+  def get("https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/baptiste.gelex.xyz-article.json")
+     }}
+  end
+
+
+  def get("http://mastodon.example.org/users/admin", _, _, [Accept: "application/activity+json"]) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/admin@mastdon.example.org.json")
+     }}
+  end
+
+  def get("http://mastodon.example.org/@admin/99541947525187367",
+    _, _, [Accept: "application/activity+json"]) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/mastodon-note-object.json")
+     }}
+  end
+
+  def get("https://shitposter.club/notice/7369654", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/7369654.html")
+     }}
+  end
+
+  def get("https://mstdn.io/users/mayuutann", _, _, [Accept: "application/activity+json"]) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/mayumayu.json")
+     }}
+  end
+
+  def get("https://mstdn.io/users/mayuutann/statuses/99568293732299394",
+    _, _, [Accept: "application/activity+json"]) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/mayumayupost.json")
+     }}
+  end
+
+
   def get("https://pleroma.soykaf.com/users/lain/feed.atom", _, _, _) do
     {:ok,
      %Tesla.Env{
diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs
index 1d561d38d..90f11ecd4 100644
--- a/test/web/activity_pub/activity_pub_test.exs
+++ b/test/web/activity_pub/activity_pub_test.exs
@@ -7,6 +7,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
   alias Pleroma.Builders.ActivityBuilder
 
   import Pleroma.Factory
+  import Tesla.Mock
+
+  setup do
+    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
 
   describe "building a user from his ap id" do
     test "it returns a user" do
diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs
index e74b8f9a1..faba80354 100644
--- a/test/web/activity_pub/transmogrifier_test.exs
+++ b/test/web/activity_pub/transmogrifier_test.exs
@@ -12,6 +12,13 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
   import Pleroma.Factory
   alias Pleroma.Web.CommonAPI
 
+  import Tesla.Mock
+
+  setup do
+    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
+
   describe "handle_incoming" do
     test "it ignores an incoming notice if we already have it" do
       activity = insert(:note_activity)

From 7ec64ac33f52d2f5072b56f2f8eb5e9ce498e00f Mon Sep 17 00:00:00 2001
From: Maksim Pechnikov <parallel588@gmail.com>
Date: Mon, 3 Dec 2018 21:37:55 +0300
Subject: [PATCH 08/13] update test

---
 test/support/http_request_mock.ex             | 61 ++++++++++++++-----
 test/web/http_sigs/http_sig_test.exs          |  6 ++
 .../mastodon_api_controller_test.exs          |  6 ++
 test/web/mastodon_api/status_view_test.exs    |  6 ++
 .../web/ostatus/activity_representer_test.exs |  6 ++
 test/web/ostatus/ostatus_controller_test.exs  |  6 ++
 6 files changed, 75 insertions(+), 16 deletions(-)

diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
index 4a4566e84..f44e9a1c6 100644
--- a/test/support/http_request_mock.ex
+++ b/test/support/http_request_mock.ex
@@ -23,6 +23,34 @@ def request(
   #
   def get(url, query \\ [], body \\ [], headers \\ [])
 
+  def get("http://gs.example.org:4040/index.php/user/1", _, _, Accept: "application/activity+json") do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: "{\"id\": 1}"
+     }}
+  end
+
+  def get("https://squeet.me/xrd/?uri=lain@squeet.me", _, _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/lain_squeet.me_webfinger.xml")
+     }}
+  end
+
+  def get("https://mst3k.interlinked.me/users/luciferMysticus", _, _,
+        Accept: "application/activity+json"
+      ) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/lucifermysticus.json")
+     }}
+  end
+
   def get("https://prismo.news/@mxb", _, _, _) do
     {:ok,
      %Tesla.Env{
@@ -31,8 +59,9 @@ def get("https://prismo.news/@mxb", _, _, _) do
      }}
   end
 
-  def get("https://hubzilla.example.org/channel/kaniini",
-    _, _, [Accept: "application/activity+json"]) do
+  def get("https://hubzilla.example.org/channel/kaniini", _, _,
+        Accept: "application/activity+json"
+      ) do
     {:ok,
      %Tesla.Env{
        status: 200,
@@ -40,7 +69,7 @@ def get("https://hubzilla.example.org/channel/kaniini",
      }}
   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,
@@ -52,13 +81,14 @@ def get("http://mastodon.example.org/users/admin/statuses/100787282858396771", _
     {:ok,
      %Tesla.Env{
        status: 200,
-       body: File.read!(
-         "test/fixtures/httpoison_mock/http___mastodon.example.org_users_admin_status_1234.json"
-       )
+       body:
+         File.read!(
+           "test/fixtures/httpoison_mock/http___mastodon.example.org_users_admin_status_1234.json"
+         )
      }}
   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,
@@ -66,7 +96,6 @@ def get("https://puckipedia.com/", _, _, [Accept: "application/activity+json"])
      }}
   end
 
-
   def get("https://peertube.moe/accounts/7even", _, _, _) do
     {:ok,
      %Tesla.Env{
@@ -99,8 +128,7 @@ def get("https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-
      }}
   end
 
-
-  def get("http://mastodon.example.org/users/admin", _, _, [Accept: "application/activity+json"]) do
+  def get("http://mastodon.example.org/users/admin", _, _, Accept: "application/activity+json") do
     {:ok,
      %Tesla.Env{
        status: 200,
@@ -108,8 +136,9 @@ def get("http://mastodon.example.org/users/admin", _, _, [Accept: "application/a
      }}
   end
 
-  def get("http://mastodon.example.org/@admin/99541947525187367",
-    _, _, [Accept: "application/activity+json"]) do
+  def get("http://mastodon.example.org/@admin/99541947525187367", _, _,
+        Accept: "application/activity+json"
+      ) do
     {:ok,
      %Tesla.Env{
        status: 200,
@@ -125,7 +154,7 @@ def get("https://shitposter.club/notice/7369654", _, _, _) 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,
@@ -133,8 +162,9 @@ def get("https://mstdn.io/users/mayuutann", _, _, [Accept: "application/activity
      }}
   end
 
-  def get("https://mstdn.io/users/mayuutann/statuses/99568293732299394",
-    _, _, [Accept: "application/activity+json"]) do
+  def get("https://mstdn.io/users/mayuutann/statuses/99568293732299394", _, _,
+        Accept: "application/activity+json"
+      ) do
     {:ok,
      %Tesla.Env{
        status: 200,
@@ -142,7 +172,6 @@ def get("https://mstdn.io/users/mayuutann/statuses/99568293732299394",
      }}
   end
 
-
   def get("https://pleroma.soykaf.com/users/lain/feed.atom", _, _, _) do
     {:ok,
      %Tesla.Env{
diff --git a/test/web/http_sigs/http_sig_test.exs b/test/web/http_sigs/http_sig_test.exs
index b2bf8d61b..2e189d583 100644
--- a/test/web/http_sigs/http_sig_test.exs
+++ b/test/web/http_sigs/http_sig_test.exs
@@ -4,6 +4,12 @@ defmodule Pleroma.Web.HTTPSignaturesTest do
   use Pleroma.DataCase
   alias Pleroma.Web.HTTPSignatures
   import Pleroma.Factory
+  import Tesla.Mock
+
+  setup do
+    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
 
   @private_key hd(:public_key.pem_decode(File.read!("test/web/http_sigs/priv.key")))
                |> :public_key.pem_entry_decode()
diff --git a/test/web/mastodon_api/mastodon_api_controller_test.exs b/test/web/mastodon_api/mastodon_api_controller_test.exs
index 098acb59f..7cd98cde8 100644
--- a/test/web/mastodon_api/mastodon_api_controller_test.exs
+++ b/test/web/mastodon_api/mastodon_api_controller_test.exs
@@ -8,6 +8,12 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIControllerTest do
 
   import Pleroma.Factory
   import ExUnit.CaptureLog
+  import Tesla.Mock
+
+  setup do
+    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
 
   test "the home timeline", %{conn: conn} do
     user = insert(:user)
diff --git a/test/web/mastodon_api/status_view_test.exs b/test/web/mastodon_api/status_view_test.exs
index 31554a07d..9e69b3189 100644
--- a/test/web/mastodon_api/status_view_test.exs
+++ b/test/web/mastodon_api/status_view_test.exs
@@ -6,6 +6,12 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do
   alias Pleroma.Web.OStatus
   alias Pleroma.Web.CommonAPI
   import Pleroma.Factory
+  import Tesla.Mock
+
+  setup do
+    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
 
   test "a note with null content" do
     note = insert(:note_activity)
diff --git a/test/web/ostatus/activity_representer_test.exs b/test/web/ostatus/activity_representer_test.exs
index 8bf3bc775..a351510d8 100644
--- a/test/web/ostatus/activity_representer_test.exs
+++ b/test/web/ostatus/activity_representer_test.exs
@@ -7,6 +7,12 @@ defmodule Pleroma.Web.OStatus.ActivityRepresenterTest do
   alias Pleroma.Web.OStatus
 
   import Pleroma.Factory
+  import Tesla.Mock
+
+  setup do
+    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
 
   test "an external note activity" do
     incoming = File.read!("test/fixtures/mastodon-note-cw.xml")
diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs
index e81adde68..6327a524e 100644
--- a/test/web/ostatus/ostatus_controller_test.exs
+++ b/test/web/ostatus/ostatus_controller_test.exs
@@ -4,6 +4,12 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
   alias Pleroma.{User, Repo}
   alias Pleroma.Web.CommonAPI
   alias Pleroma.Web.OStatus.ActivityRepresenter
+  import Tesla.Mock
+
+  setup do
+    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
 
   test "decodes a salmon", %{conn: conn} do
     user = insert(:user)

From a9e4a975866c33553c477667c431187590329447 Mon Sep 17 00:00:00 2001
From: Maksim Pechnikov <parallel588@gmail.com>
Date: Tue, 4 Dec 2018 14:01:39 +0300
Subject: [PATCH 09/13] update test

---
 lib/pleroma/http/http.ex                      |  1 +
 test/formatter_test.exs                       |  4 ++
 test/support/http_request_mock.ex             | 67 +++++++++++++++++++
 test/user_test.exs                            |  5 ++
 test/web/activity_pub/transmogrifier_test.exs |  7 +-
 test/web/ostatus/ostatus_controller_test.exs  |  5 +-
 test/web/ostatus/ostatus_test.exs             |  5 +-
 7 files changed, 83 insertions(+), 11 deletions(-)

diff --git a/lib/pleroma/http/http.ex b/lib/pleroma/http/http.ex
index 93ac9d62b..59afacf4c 100644
--- a/lib/pleroma/http/http.ex
+++ b/lib/pleroma/http/http.ex
@@ -18,6 +18,7 @@ def request(method, url, body \\ "", headers \\ [], options \\ []) do
     |> (&Tesla.request(Connection.new(), &1)).()
   end
 
+  defp process_sni_options(options, nil), do: options
   defp process_sni_options(options, url) do
     uri = URI.parse(url)
     host = uri.host |> to_charlist()
diff --git a/test/formatter_test.exs b/test/formatter_test.exs
index e4da84c10..d5c74a321 100644
--- a/test/formatter_test.exs
+++ b/test/formatter_test.exs
@@ -4,6 +4,10 @@ defmodule Pleroma.FormatterTest do
   use Pleroma.DataCase
 
   import Pleroma.Factory
+  setup_all do
+    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
 
   describe ".add_hashtag_links" do
     test "turns hashtags into links" do
diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
index f44e9a1c6..80b84d591 100644
--- a/test/support/http_request_mock.ex
+++ b/test/support/http_request_mock.ex
@@ -22,6 +22,73 @@ def request(
   # GET Requests
   #
   def get(url, query \\ [], body \\ [], headers \\ [])
+  def get("https://social.heldscal.la/.well-known/webfinger?resource=https://social.heldscal.la/user/29191",
+    _, _, [Accept: "application/xrd+xml,application/jrd+json"]) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_user_29191.xml")
+     }}
+  end
+
+  def get("https://pawoo.net/users/pekorino.atom", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/https___pawoo.net_users_pekorino.atom")
+     }}
+  end
+
+  def get("https://pawoo.net/.well-known/webfinger?resource=acct:https://pawoo.net/users/pekorino",
+    _, _, [Accept: "application/xrd+xml,application/jrd+json"]) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/https___pawoo.net_users_pekorino.xml")
+     }}
+  end
+
+  def get("https://social.stopwatchingus-heidelberg.de/api/statuses/user_timeline/18330.atom", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/atarifrosch_feed.xml")
+     }}
+  end
+
+  def get("https://social.stopwatchingus-heidelberg.de/.well-known/webfinger?resource=acct:https://social.stopwatchingus-heidelberg.de/user/18330",
+    _, _, [Accept: "application/xrd+xml,application/jrd+json"]) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/atarifrosch_webfinger.xml")
+     }}
+  end
+
+  def get("https://mamot.fr/users/Skruyb.atom", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/https___mamot.fr_users_Skruyb.atom")
+     }}
+  end
+
+  def get("https://mamot.fr/.well-known/webfinger?resource=acct:https://mamot.fr/users/Skruyb",
+    _, _, [Accept: "application/xrd+xml,application/jrd+json"]) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/skruyb@mamot.fr.atom")
+     }}
+  end
+
+  def get("https://social.heldscal.la/.well-known/webfinger?resource=nonexistant@social.heldscal.la", _, _, [Accept: "application/xrd+xml,application/jrd+json"]) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/nonexistant@social.heldscal.la.xml")
+     }}
+  end
 
   def get("http://gs.example.org:4040/index.php/user/1", _, _, Accept: "application/activity+json") do
     {:ok,
diff --git a/test/user_test.exs b/test/user_test.exs
index 62104df90..d097eb171 100644
--- a/test/user_test.exs
+++ b/test/user_test.exs
@@ -9,6 +9,11 @@ defmodule Pleroma.UserTest do
   import Pleroma.Factory
   import Ecto.Query
 
+  setup_all do
+    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
+
   test "ap_id returns the activity pub id for the user" do
     user = UserBuilder.build()
 
diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs
index faba80354..eeb0cb5cf 100644
--- a/test/web/activity_pub/transmogrifier_test.exs
+++ b/test/web/activity_pub/transmogrifier_test.exs
@@ -11,11 +11,8 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
 
   import Pleroma.Factory
   alias Pleroma.Web.CommonAPI
-
-  import Tesla.Mock
-
-  setup do
-    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+  setup_all do
+    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
     :ok
   end
 
diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs
index 6327a524e..411e89e94 100644
--- a/test/web/ostatus/ostatus_controller_test.exs
+++ b/test/web/ostatus/ostatus_controller_test.exs
@@ -4,10 +4,9 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do
   alias Pleroma.{User, Repo}
   alias Pleroma.Web.CommonAPI
   alias Pleroma.Web.OStatus.ActivityRepresenter
-  import Tesla.Mock
 
-  setup do
-    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+  setup_all do
+    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
     :ok
   end
 
diff --git a/test/web/ostatus/ostatus_test.exs b/test/web/ostatus/ostatus_test.exs
index 83525456b..f3268e83d 100644
--- a/test/web/ostatus/ostatus_test.exs
+++ b/test/web/ostatus/ostatus_test.exs
@@ -5,10 +5,9 @@ defmodule Pleroma.Web.OStatusTest do
   alias Pleroma.{Object, Repo, User, Activity}
   import Pleroma.Factory
   import ExUnit.CaptureLog
-  import Tesla.Mock
 
-  setup do
-    mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
+  setup_all do
+    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
     :ok
   end
 

From 5c6d47614dfd72566a91ac58223902e71ebdf1d3 Mon Sep 17 00:00:00 2001
From: Maksim Pechnikov <parallel588@gmail.com>
Date: Tue, 4 Dec 2018 16:39:08 +0300
Subject: [PATCH 10/13] all tests passed

---
 test/support/http_request_mock.ex             | 29 +++++++++++++------
 .../activity_pub_controller_test.exs          |  5 +++-
 test/web/federator_test.exs                   |  5 ++++
 3 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
index 80b84d591..c1b1c8589 100644
--- a/test/support/http_request_mock.ex
+++ b/test/support/http_request_mock.ex
@@ -14,7 +14,7 @@ def request(
       res
     else
       {_, r} = error ->
-        Logger.warn(r)
+        #Logger.warn(r)
         error
     end
   end
@@ -22,6 +22,25 @@ def request(
   # GET Requests
   #
   def get(url, query \\ [], body \\ [], headers \\ [])
+
+  def get("https://osada.macgirvin.com/channel/mike", _, _, _) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!(
+         "test/fixtures/httpoison_mock/https___osada.macgirvin.com_channel_mike.json"
+       )
+     }}
+  end
+
+  def get("https://osada.macgirvin.com/.well-known/webfinger?resource=acct:mike@osada.macgirvin.com", _, _, [Accept: "application/xrd+xml,application/jrd+json"]) do
+    {:ok,
+     %Tesla.Env{
+       status: 200,
+       body: File.read!("test/fixtures/httpoison_mock/mike@osada.macgirvin.com.json")
+     }}
+  end
+
   def get("https://social.heldscal.la/.well-known/webfinger?resource=https://social.heldscal.la/user/29191",
     _, _, [Accept: "application/xrd+xml,application/jrd+json"]) do
     {:ok,
@@ -90,14 +109,6 @@ def get("https://social.heldscal.la/.well-known/webfinger?resource=nonexistant@s
      }}
   end
 
-  def get("http://gs.example.org:4040/index.php/user/1", _, _, Accept: "application/activity+json") do
-    {:ok,
-     %Tesla.Env{
-       status: 200,
-       body: "{\"id\": 1}"
-     }}
-  end
-
   def get("https://squeet.me/xrd/?uri=lain@squeet.me", _, _,
         Accept: "application/xrd+xml,application/jrd+json"
       ) do
diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs
index 1c24b348c..414759110 100644
--- a/test/web/activity_pub/activity_pub_controller_test.exs
+++ b/test/web/activity_pub/activity_pub_controller_test.exs
@@ -4,7 +4,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
   alias Pleroma.Web.ActivityPub.{UserView, ObjectView}
   alias Pleroma.{Repo, User}
   alias Pleroma.Activity
-
+  setup_all do
+    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
   describe "/relay" do
     test "with the relay active, it returns the relay user", %{conn: conn} do
       res =
diff --git a/test/web/federator_test.exs b/test/web/federator_test.exs
index 02e1ca76e..87bf73dbd 100644
--- a/test/web/federator_test.exs
+++ b/test/web/federator_test.exs
@@ -5,6 +5,11 @@ defmodule Pleroma.Web.FederatorTest do
   import Pleroma.Factory
   import Mock
 
+  setup_all do
+    Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
+    :ok
+  end
+
   test "enqueues an element according to priority" do
     queue = [%{item: 1, priority: 2}]
 

From dd8aee332cf939f1a76f60a95b117ab90530178b Mon Sep 17 00:00:00 2001
From: Maksim Pechnikov <parallel588@gmail.com>
Date: Tue, 4 Dec 2018 17:48:55 +0300
Subject: [PATCH 11/13] formatting the code

---
 lib/pleroma/http/connection.ex                |  4 ++
 lib/pleroma/http/http.ex                      |  5 +-
 test/formatter_test.exs                       |  1 +
 test/support/http_request_mock.ex             | 60 ++++++++++++++-----
 .../activity_pub_controller_test.exs          |  2 +
 test/web/activity_pub/transmogrifier_test.exs |  1 +
 6 files changed, 57 insertions(+), 16 deletions(-)

diff --git a/lib/pleroma/http/connection.ex b/lib/pleroma/http/connection.ex
index f64d4e18e..5e8f2aabd 100644
--- a/lib/pleroma/http/connection.ex
+++ b/lib/pleroma/http/connection.ex
@@ -1,4 +1,8 @@
 defmodule Pleroma.HTTP.Connection do
+  @moduledoc """
+  Connection for http-requests.
+  """
+
   @hackney_options [pool: :default]
   @adapter Application.get_env(:tesla, :adapter)
 
diff --git a/lib/pleroma/http/http.ex b/lib/pleroma/http/http.ex
index 59afacf4c..4ab12ed3a 100644
--- a/lib/pleroma/http/http.ex
+++ b/lib/pleroma/http/http.ex
@@ -1,8 +1,10 @@
 defmodule Pleroma.HTTP do
-  require HTTPoison
   alias Pleroma.HTTP.Connection
   alias Pleroma.HTTP.RequestBuilder, as: Builder
 
+  @doc """
+  Builds and perform http request.
+  """
   def request(method, url, body \\ "", headers \\ [], options \\ []) do
     options =
       process_request_options(options)
@@ -19,6 +21,7 @@ def request(method, url, body \\ "", headers \\ [], options \\ []) do
   end
 
   defp process_sni_options(options, nil), do: options
+
   defp process_sni_options(options, url) do
     uri = URI.parse(url)
     host = uri.host |> to_charlist()
diff --git a/test/formatter_test.exs b/test/formatter_test.exs
index d5c74a321..5d745510f 100644
--- a/test/formatter_test.exs
+++ b/test/formatter_test.exs
@@ -4,6 +4,7 @@ defmodule Pleroma.FormatterTest do
   use Pleroma.DataCase
 
   import Pleroma.Factory
+
   setup_all do
     Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
     :ok
diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex
index c1b1c8589..391342ad7 100644
--- a/test/support/http_request_mock.ex
+++ b/test/support/http_request_mock.ex
@@ -14,7 +14,7 @@ def request(
       res
     else
       {_, r} = error ->
-        #Logger.warn(r)
+        # Logger.warn(r)
         error
     end
   end
@@ -27,13 +27,17 @@ def get("https://osada.macgirvin.com/channel/mike", _, _, _) do
     {:ok,
      %Tesla.Env{
        status: 200,
-       body: File.read!(
-         "test/fixtures/httpoison_mock/https___osada.macgirvin.com_channel_mike.json"
-       )
+       body:
+         File.read!("test/fixtures/httpoison_mock/https___osada.macgirvin.com_channel_mike.json")
      }}
   end
 
-  def get("https://osada.macgirvin.com/.well-known/webfinger?resource=acct:mike@osada.macgirvin.com", _, _, [Accept: "application/xrd+xml,application/jrd+json"]) do
+  def get(
+        "https://osada.macgirvin.com/.well-known/webfinger?resource=acct:mike@osada.macgirvin.com",
+        _,
+        _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
     {:ok,
      %Tesla.Env{
        status: 200,
@@ -41,8 +45,12 @@ def get("https://osada.macgirvin.com/.well-known/webfinger?resource=acct:mike@os
      }}
   end
 
-  def get("https://social.heldscal.la/.well-known/webfinger?resource=https://social.heldscal.la/user/29191",
-    _, _, [Accept: "application/xrd+xml,application/jrd+json"]) do
+  def get(
+        "https://social.heldscal.la/.well-known/webfinger?resource=https://social.heldscal.la/user/29191",
+        _,
+        _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
     {:ok,
      %Tesla.Env{
        status: 200,
@@ -58,8 +66,12 @@ def get("https://pawoo.net/users/pekorino.atom", _, _, _) do
      }}
   end
 
-  def get("https://pawoo.net/.well-known/webfinger?resource=acct:https://pawoo.net/users/pekorino",
-    _, _, [Accept: "application/xrd+xml,application/jrd+json"]) do
+  def get(
+        "https://pawoo.net/.well-known/webfinger?resource=acct:https://pawoo.net/users/pekorino",
+        _,
+        _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
     {:ok,
      %Tesla.Env{
        status: 200,
@@ -67,7 +79,12 @@ def get("https://pawoo.net/.well-known/webfinger?resource=acct:https://pawoo.net
      }}
   end
 
-  def get("https://social.stopwatchingus-heidelberg.de/api/statuses/user_timeline/18330.atom", _, _, _) do
+  def get(
+        "https://social.stopwatchingus-heidelberg.de/api/statuses/user_timeline/18330.atom",
+        _,
+        _,
+        _
+      ) do
     {:ok,
      %Tesla.Env{
        status: 200,
@@ -75,8 +92,12 @@ def get("https://social.stopwatchingus-heidelberg.de/api/statuses/user_timeline/
      }}
   end
 
-  def get("https://social.stopwatchingus-heidelberg.de/.well-known/webfinger?resource=acct:https://social.stopwatchingus-heidelberg.de/user/18330",
-    _, _, [Accept: "application/xrd+xml,application/jrd+json"]) do
+  def get(
+        "https://social.stopwatchingus-heidelberg.de/.well-known/webfinger?resource=acct:https://social.stopwatchingus-heidelberg.de/user/18330",
+        _,
+        _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
     {:ok,
      %Tesla.Env{
        status: 200,
@@ -92,8 +113,12 @@ def get("https://mamot.fr/users/Skruyb.atom", _, _, _) do
      }}
   end
 
-  def get("https://mamot.fr/.well-known/webfinger?resource=acct:https://mamot.fr/users/Skruyb",
-    _, _, [Accept: "application/xrd+xml,application/jrd+json"]) do
+  def get(
+        "https://mamot.fr/.well-known/webfinger?resource=acct:https://mamot.fr/users/Skruyb",
+        _,
+        _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
     {:ok,
      %Tesla.Env{
        status: 200,
@@ -101,7 +126,12 @@ def get("https://mamot.fr/.well-known/webfinger?resource=acct:https://mamot.fr/u
      }}
   end
 
-  def get("https://social.heldscal.la/.well-known/webfinger?resource=nonexistant@social.heldscal.la", _, _, [Accept: "application/xrd+xml,application/jrd+json"]) do
+  def get(
+        "https://social.heldscal.la/.well-known/webfinger?resource=nonexistant@social.heldscal.la",
+        _,
+        _,
+        Accept: "application/xrd+xml,application/jrd+json"
+      ) do
     {:ok,
      %Tesla.Env{
        status: 200,
diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs
index 414759110..980f43553 100644
--- a/test/web/activity_pub/activity_pub_controller_test.exs
+++ b/test/web/activity_pub/activity_pub_controller_test.exs
@@ -4,10 +4,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
   alias Pleroma.Web.ActivityPub.{UserView, ObjectView}
   alias Pleroma.{Repo, User}
   alias Pleroma.Activity
+
   setup_all do
     Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
     :ok
   end
+
   describe "/relay" do
     test "with the relay active, it returns the relay user", %{conn: conn} do
       res =
diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs
index eeb0cb5cf..fa526a222 100644
--- a/test/web/activity_pub/transmogrifier_test.exs
+++ b/test/web/activity_pub/transmogrifier_test.exs
@@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do
 
   import Pleroma.Factory
   alias Pleroma.Web.CommonAPI
+
   setup_all do
     Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end)
     :ok

From 50e72f6c4851d50b27f213b34b5d383b9e8aabb9 Mon Sep 17 00:00:00 2001
From: Maksim Pechnikov <parallel588@gmail.com>
Date: Tue, 4 Dec 2018 17:51:49 +0300
Subject: [PATCH 12/13] remove httpoison_mock

---
 lib/pleroma/http/http.ex       |  25 +
 test/support/httpoison_mock.ex | 883 ---------------------------------
 2 files changed, 25 insertions(+), 883 deletions(-)
 delete mode 100644 test/support/httpoison_mock.ex

diff --git a/lib/pleroma/http/http.ex b/lib/pleroma/http/http.ex
index 4ab12ed3a..3c0256575 100644
--- a/lib/pleroma/http/http.ex
+++ b/lib/pleroma/http/http.ex
@@ -1,9 +1,24 @@
 defmodule Pleroma.HTTP do
+  @moduledoc """
+
+  """
+
   alias Pleroma.HTTP.Connection
   alias Pleroma.HTTP.RequestBuilder, as: Builder
 
   @doc """
   Builds and perform http request.
+
+  # Arguments:
+  `method` - :get, :post, :put, :delete
+  `url`
+  `body`
+  `headers` - a keyworld list of headers, e.g. `[{"content-type", "text/plain"}]`
+  `options` - custom, per-request middleware or adapter options
+
+  # Returns:
+  `{:ok, %Tesla.Env{}}` or `{:error, error}`
+
   """
   def request(method, url, body \\ "", headers \\ [], options \\ []) do
     options =
@@ -43,9 +58,19 @@ def process_request_options(options) do
     end
   end
 
+  @doc """
+  Performs GET request.
+
+  See `Pleroma.HTTP.request/5`
+  """
   def get(url, headers \\ [], options \\ []),
     do: request(:get, url, "", headers, options)
 
+  @doc """
+  Performs POST request.
+
+  See `Pleroma.HTTP.request/5`
+  """
   def post(url, body, headers \\ [], options \\ []),
     do: request(:post, url, body, headers, options)
 end
diff --git a/test/support/httpoison_mock.ex b/test/support/httpoison_mock.ex
deleted file mode 100644
index e7344500f..000000000
--- a/test/support/httpoison_mock.ex
+++ /dev/null
@@ -1,883 +0,0 @@
-defmodule HTTPoisonMock do
-  alias HTTPoison.Response
-
-  def process_request_options(options), do: options
-
-  def get(url, body \\ [], headers \\ [])
-
-  def get("https://prismo.news/@mxb", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___prismo.news__mxb.json")
-     }}
-  end
-
-  def get("https://osada.macgirvin.com/channel/mike", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!("test/fixtures/httpoison_mock/https___osada.macgirvin.com_channel_mike.json")
-     }}
-  end
-
-  def get(
-        "https://osada.macgirvin.com/.well-known/webfinger?resource=acct:mike@osada.macgirvin.com",
-        _,
-        _
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/mike@osada.macgirvin.com.json")
-     }}
-  end
-
-  def get("https://info.pleroma.site/activity.json", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https__info.pleroma.site_activity.json")
-     }}
-  end
-
-  def get("https://info.pleroma.site/activity2.json", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https__info.pleroma.site_activity2.json")
-     }}
-  end
-
-  def get("https://info.pleroma.site/activity3.json", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https__info.pleroma.site_activity3.json")
-     }}
-  end
-
-  def get("https://info.pleroma.site/activity4.json", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https__info.pleroma.site_activity4.json")
-     }}
-  end
-
-  def get("https://info.pleroma.site/actor.json", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___info.pleroma.site_actor.json")
-     }}
-  end
-
-  def get("https://puckipedia.com/", [Accept: "application/activity+json"], _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/puckipedia.com.json")
-     }}
-  end
-
-  def get(
-        "https://gerzilla.de/.well-known/webfinger?resource=acct:kaniini@gerzilla.de",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/kaniini@gerzilla.de.json")
-     }}
-  end
-
-  def get(
-        "https://framatube.org/.well-known/webfinger?resource=acct:framasoft@framatube.org",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/framasoft@framatube.org.json")
-     }}
-  end
-
-  def get(
-        "https://gnusocial.de/.well-known/webfinger?resource=acct:winterdienst@gnusocial.de",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/winterdienst_webfinger.json")
-     }}
-  end
-
-  def get(
-        "https://social.heldscal.la/.well-known/webfinger",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        params: [resource: "nonexistant@social.heldscal.la"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 500,
-       body: File.read!("test/fixtures/httpoison_mock/nonexistant@social.heldscal.la.xml")
-     }}
-  end
-
-  def get(
-        "https://social.heldscal.la/.well-known/webfinger?resource=shp@social.heldscal.la",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/shp@social.heldscal.la.xml")
-     }}
-  end
-
-  def get(
-        "https://social.heldscal.la/.well-known/webfinger",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        params: [resource: "shp@social.heldscal.la"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/shp@social.heldscal.la.xml")
-     }}
-  end
-
-  def get(
-        "https://social.heldscal.la/.well-known/webfinger",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        params: [resource: "https://social.heldscal.la/user/23211"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_user_23211.xml")
-     }}
-  end
-
-  def get(
-        "https://social.heldscal.la/.well-known/webfinger?resource=https://social.heldscal.la/user/23211",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_user_23211.xml")
-     }}
-  end
-
-  def get(
-        "https://social.heldscal.la/.well-known/webfinger",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        params: [resource: "https://social.heldscal.la/user/29191"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_user_29191.xml")
-     }}
-  end
-
-  def get(
-        "https://social.heldscal.la/.well-known/webfinger?resource=https://social.heldscal.la/user/29191",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___social.heldscal.la_user_29191.xml")
-     }}
-  end
-
-  def get(
-        "https://mastodon.social/.well-known/webfinger",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        params: [resource: "https://mastodon.social/users/lambadalambda"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!(
-           "test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.xml"
-         )
-     }}
-  end
-
-  def get(
-        "https://mastodon.social/.well-known/webfinger?resource=https://mastodon.social/users/lambadalambda",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!(
-           "test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.xml"
-         )
-     }}
-  end
-
-  def get(
-        "https://shitposter.club/.well-known/webfinger",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        params: [resource: "https://shitposter.club/user/1"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___shitposter.club_user_1.xml")
-     }}
-  end
-
-  def get(
-        "https://shitposter.club/.well-known/webfinger?resource=https://shitposter.club/user/1",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___shitposter.club_user_1.xml")
-     }}
-  end
-
-  def get(
-        "https://shitposter.club/.well-known/webfinger?resource=https://shitposter.club/user/5381",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/spc_5381_xrd.xml")
-     }}
-  end
-
-  def get(
-        "http://gs.example.org/.well-known/webfinger",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        params: [resource: "http://gs.example.org:4040/index.php/user/1"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!(
-           "test/fixtures/httpoison_mock/http___gs.example.org_4040_index.php_user_1.xml"
-         )
-     }}
-  end
-
-  def get(
-        "http://gs.example.org/.well-known/webfinger?resource=http://gs.example.org:4040/index.php/user/1",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!(
-           "test/fixtures/httpoison_mock/http___gs.example.org_4040_index.php_user_1.xml"
-         )
-     }}
-  end
-
-  def get(
-        "https://social.stopwatchingus-heidelberg.de/.well-known/webfinger?resource=https://social.stopwatchingus-heidelberg.de/user/18330",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/atarifrosch_webfinger.xml")
-     }}
-  end
-
-  def get(
-        "https://pleroma.soykaf.com/.well-known/webfinger",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        params: [resource: "https://pleroma.soykaf.com/users/lain"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain.xml")
-     }}
-  end
-
-  def get(
-        "https://pleroma.soykaf.com/.well-known/webfinger?resource=https://pleroma.soykaf.com/users/lain",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain.xml")
-     }}
-  end
-
-  def get("https://social.heldscal.la/api/statuses/user_timeline/29191.atom", _body, _headers) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!(
-           "test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_29191.atom.xml"
-         )
-     }}
-  end
-
-  def get("https://shitposter.club/api/statuses/user_timeline/5381.atom", _body, _headers) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/spc_5381.atom")
-     }}
-  end
-
-  def get("https://social.heldscal.la/api/statuses/user_timeline/23211.atom", _body, _headers) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!(
-           "test/fixtures/httpoison_mock/https___social.heldscal.la_api_statuses_user_timeline_23211.atom.xml"
-         )
-     }}
-  end
-
-  def get("https://mastodon.social/users/lambadalambda.atom", _body, _headers) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!(
-           "test/fixtures/httpoison_mock/https___mastodon.social_users_lambadalambda.atom"
-         )
-     }}
-  end
-
-  def get(
-        "https://social.stopwatchingus-heidelberg.de/api/statuses/user_timeline/18330.atom",
-        _body,
-        _headers
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/atarifrosch_feed.xml")
-     }}
-  end
-
-  def get("https://pleroma.soykaf.com/users/lain/feed.atom", _body, _headers) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!(
-           "test/fixtures/httpoison_mock/https___pleroma.soykaf.com_users_lain_feed.atom.xml"
-         )
-     }}
-  end
-
-  def get("https://social.sakamoto.gq/users/eal/feed.atom", _body, _headers) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/sakamoto_eal_feed.atom")
-     }}
-  end
-
-  def get("http://gs.example.org/index.php/api/statuses/user_timeline/1.atom", _body, _headers) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!(
-           "test/fixtures/httpoison_mock/http__gs.example.org_index.php_api_statuses_user_timeline_1.atom.xml"
-         )
-     }}
-  end
-
-  def get("https://shitposter.club/notice/2827873", _body, _headers) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!("test/fixtures/httpoison_mock/https___shitposter.club_notice_2827873.html")
-     }}
-  end
-
-  def get("https://shitposter.club/api/statuses/show/2827873.atom", _body, _headers) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!(
-           "test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_show_2827873.atom.xml"
-         )
-     }}
-  end
-
-  def get("https://shitposter.club/api/statuses/user_timeline/1.atom", _body, _headers) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!(
-           "test/fixtures/httpoison_mock/https___shitposter.club_api_statuses_user_timeline_1.atom.xml"
-         )
-     }}
-  end
-
-  def post(
-        "https://social.heldscal.la/main/push/hub",
-        {:form, _data},
-        "Content-type": "application/x-www-form-urlencoded"
-      ) do
-    {:ok,
-     %Response{
-       status_code: 202
-     }}
-  end
-
-  def get("http://mastodon.example.org/users/admin/statuses/100787282858396771", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!(
-           "test/fixtures/httpoison_mock/http___mastodon.example.org_users_admin_status_1234.json"
-         )
-     }}
-  end
-
-  def get(
-        "https://pawoo.net/.well-known/webfinger",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        params: [resource: "https://pawoo.net/users/pekorino"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___pawoo.net_users_pekorino.xml")
-     }}
-  end
-
-  def get(
-        "https://pawoo.net/.well-known/webfinger?resource=https://pawoo.net/users/pekorino",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___pawoo.net_users_pekorino.xml")
-     }}
-  end
-
-  def get("https://pawoo.net/users/pekorino.atom", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___pawoo.net_users_pekorino.atom")
-     }}
-  end
-
-  def get(
-        "https://mamot.fr/.well-known/webfinger",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        params: [resource: "https://mamot.fr/users/Skruyb"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/skruyb@mamot.fr.atom")
-     }}
-  end
-
-  def get(
-        "https://mamot.fr/.well-known/webfinger?resource=https://mamot.fr/users/Skruyb",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/skruyb@mamot.fr.atom")
-     }}
-  end
-
-  def get(
-        "https://social.sakamoto.gq/.well-known/webfinger",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        params: [resource: "https://social.sakamoto.gq/users/eal"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/eal_sakamoto.xml")
-     }}
-  end
-
-  def get(
-        "https://social.sakamoto.gq/.well-known/webfinger?resource=https://social.sakamoto.gq/users/eal",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/eal_sakamoto.xml")
-     }}
-  end
-
-  def get(
-        "https://pleroma.soykaf.com/.well-known/webfinger?resource=https://pleroma.soykaf.com/users/shp",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/shp@pleroma.soykaf.com.webfigner")
-     }}
-  end
-
-  def get(
-        "https://squeet.me/xrd/?uri=lain@squeet.me",
-        [Accept: "application/xrd+xml,application/jrd+json"],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/lain_squeet.me_webfinger.xml")
-     }}
-  end
-
-  def get("https://mamot.fr/users/Skruyb.atom", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/https___mamot.fr_users_Skruyb.atom")
-     }}
-  end
-
-  def get(
-        "https://social.sakamoto.gq/objects/0ccc1a2c-66b0-4305-b23a-7f7f2b040056",
-        [Accept: "application/atom+xml"],
-        _
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/sakamoto.atom")
-     }}
-  end
-
-  def get("https://pleroma.soykaf.com/users/shp/feed.atom", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/shp@pleroma.soykaf.com.feed")
-     }}
-  end
-
-  def get("http://social.heldscal.la/.well-known/host-meta", [], follow_redirect: true) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/social.heldscal.la_host_meta")
-     }}
-  end
-
-  def get("http://status.alpicola.com/.well-known/host-meta", [], follow_redirect: true) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/status.alpicola.com_host_meta")
-     }}
-  end
-
-  def get("http://macgirvin.com/.well-known/host-meta", [], follow_redirect: true) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/macgirvin.com_host_meta")
-     }}
-  end
-
-  def get("http://mastodon.social/.well-known/host-meta", [], follow_redirect: true) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/mastodon.social_host_meta")
-     }}
-  end
-
-  def get("http://shitposter.club/.well-known/host-meta", [], follow_redirect: true) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/shitposter.club_host_meta")
-     }}
-  end
-
-  def get("http://pleroma.soykaf.com/.well-known/host-meta", [], follow_redirect: true) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/pleroma.soykaf.com_host_meta")
-     }}
-  end
-
-  def get("http://social.sakamoto.gq/.well-known/host-meta", [], follow_redirect: true) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/social.sakamoto.gq_host_meta")
-     }}
-  end
-
-  def get("http://gs.example.org/.well-known/host-meta", [], follow_redirect: true) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/gs.example.org_host_meta")
-     }}
-  end
-
-  def get("http://pawoo.net/.well-known/host-meta", [], follow_redirect: true) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/pawoo.net_host_meta")
-     }}
-  end
-
-  def get("http://mamot.fr/.well-known/host-meta", [], follow_redirect: true) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/mamot.fr_host_meta")
-     }}
-  end
-
-  def get("http://mastodon.xyz/.well-known/host-meta", [], follow_redirect: true) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/mastodon.xyz_host_meta")
-     }}
-  end
-
-  def get("http://social.wxcafe.net/.well-known/host-meta", [], follow_redirect: true) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/social.wxcafe.net_host_meta")
-     }}
-  end
-
-  def get("http://squeet.me/.well-known/host-meta", [], follow_redirect: true) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/squeet.me_host_meta")
-     }}
-  end
-
-  def get(
-        "http://social.stopwatchingus-heidelberg.de/.well-known/host-meta",
-        [],
-        follow_redirect: true
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body:
-         File.read!("test/fixtures/httpoison_mock/social.stopwatchingus-heidelberg.de_host_meta")
-     }}
-  end
-
-  def get("http://mastodon.example.org/users/admin", [Accept: "application/activity+json"], _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/admin@mastdon.example.org.json")
-     }}
-  end
-
-  def get(
-        "https://hubzilla.example.org/channel/kaniini",
-        [Accept: "application/activity+json"],
-        _
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/kaniini@hubzilla.example.org.json")
-     }}
-  end
-
-  def get("https://masto.quad.moe/users/_HellPie", [Accept: "application/activity+json"], _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/hellpie.json")
-     }}
-  end
-
-  def get("https://niu.moe/users/rye", [Accept: "application/activity+json"], _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/rye.json")
-     }}
-  end
-
-  def get("https://n1u.moe/users/rye", [Accept: "application/activity+json"], _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/rye.json")
-     }}
-  end
-
-  def get(
-        "https://mst3k.interlinked.me/users/luciferMysticus",
-        [Accept: "application/activity+json"],
-        _
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/lucifermysticus.json")
-     }}
-  end
-
-  def get("https://mstdn.io/users/mayuutann", [Accept: "application/activity+json"], _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/mayumayu.json")
-     }}
-  end
-
-  def get(
-        "http://mastodon.example.org/@admin/99541947525187367",
-        [Accept: "application/activity+json"],
-        _
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/mastodon-note-object.json")
-     }}
-  end
-
-  def get(
-        "https://mstdn.io/users/mayuutann/statuses/99568293732299394",
-        [Accept: "application/activity+json"],
-        _
-      ) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/mayumayupost.json")
-     }}
-  end
-
-  def get("https://shitposter.club/notice/7369654", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/7369654.html")
-     }}
-  end
-
-  def get("https://shitposter.club/api/statuses/show/7369654.atom", _body, _headers) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/7369654.atom")
-     }}
-  end
-
-  def get("https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/baptiste.gelex.xyz-article.json")
-     }}
-  end
-
-  def get("https://baptiste.gelez.xyz/@/BaptisteGelez", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/baptiste.gelex.xyz-user.json")
-     }}
-  end
-
-  def get("https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/peertube.moe-vid.json")
-     }}
-  end
-
-  def get("https://peertube.moe/accounts/7even", _, _) do
-    {:ok,
-     %Response{
-       status_code: 200,
-       body: File.read!("test/fixtures/httpoison_mock/7even.json")
-     }}
-  end
-
-  def get(url, body, headers) do
-    {:error,
-     "Not implemented the mock response for get #{inspect(url)}, #{inspect(body)}, #{
-       inspect(headers)
-     }"}
-  end
-
-  def post(url, _body, _headers) do
-    {:error, "Not implemented the mock response for post #{inspect(url)}"}
-  end
-
-  def post(url, _body, _headers, _options) do
-    {:error, "Not implemented the mock response for post #{inspect(url)}"}
-  end
-end

From a9e3e387c9798a810f82bbf92023b4d29abffbe5 Mon Sep 17 00:00:00 2001
From: Maksim Pechnikov <parallel588@gmail.com>
Date: Tue, 4 Dec 2018 19:43:00 +0300
Subject: [PATCH 13/13] add test

---
 test/http_test.exs | 55 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)
 create mode 100644 test/http_test.exs

diff --git a/test/http_test.exs b/test/http_test.exs
new file mode 100644
index 000000000..62f3ccb30
--- /dev/null
+++ b/test/http_test.exs
@@ -0,0 +1,55 @@
+defmodule Pleroma.HTTPTest do
+  use Pleroma.DataCase
+  import Tesla.Mock
+
+  setup do
+    mock(fn
+      %{
+        method: :get,
+        url: "http://example.com/hello",
+        headers: [{"content-type", "application/json"}]
+      } ->
+        json(%{"my" => "data"})
+
+      %{method: :get, url: "http://example.com/hello"} ->
+        %Tesla.Env{status: 200, body: "hello"}
+
+      %{method: :post, url: "http://example.com/world"} ->
+        %Tesla.Env{status: 200, body: "world"}
+    end)
+
+    :ok
+  end
+
+  describe "get/1" do
+    test "returns successfully result" do
+      assert Pleroma.HTTP.get("http://example.com/hello") == {
+               :ok,
+               %Tesla.Env{status: 200, body: "hello"}
+             }
+    end
+  end
+
+  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"}]) ==
+               {
+                 :ok,
+                 %Tesla.Env{
+                   status: 200,
+                   body: "{\"my\":\"data\"}",
+                   headers: [{"content-type", "application/json"}]
+                 }
+               }
+    end
+  end
+
+  describe "post/2" do
+    test "returns successfully result" do
+      assert Pleroma.HTTP.post("http://example.com/world", "") == {
+               :ok,
+               %Tesla.Env{status: 200, body: "world"}
+             }
+    end
+  end
+end