defmodule Plausible.Test.Support.HTTPMocker do @moduledoc """ Currently only supports post request, it's a drop-in replacement for our exvcr usage that wasn't ever needed (e.g. we had no way to re-record the cassettes anyway). """ defmacro __using__(_) do quote do import Mox def mock_http_with(http_mock_fixture) do mocks = "fixture/http_mocks/#{http_mock_fixture}" |> File.read!() |> Jason.decode!() |> Enum.into(%{}, &{{&1["url"], &1["request_body"]}, &1}) stub( Plausible.HTTPClient.Mock, :post, fn url, _, params, _ -> http_mocker_stub(mocks, url, params) end ) stub( Plausible.HTTPClient.Mock, :post, fn url, _, params -> http_mocker_stub(mocks, url, params) end ) end defp http_mocker_stub(mocks, url, params) do params = case Jason.encode(params) do {:ok, p} -> Jason.decode!(p) {:error, _} -> params end mock = Map.fetch!(mocks, {url, params}) response = %Finch.Response{ status: mock["status"], headers: [{"content-type", "application/json"}], body: mock["response_body"] } if mock["status"] >= 200 and mock["status"] < 300 do {:ok, response} else {:error, Plausible.HTTPClient.Non200Error.new(response)} end end end end end