diff options
| -rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 32 | ||||
| -rw-r--r-- | test/web/activity_pub/activity_pub_test.exs | 50 | 
2 files changed, 69 insertions, 13 deletions
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 31304c340..1c21d78af 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1530,26 +1530,34 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do    defp normalize_counter(counter) when is_integer(counter), do: counter    defp normalize_counter(_), do: 0 -  defp maybe_update_follow_information(data) do +  def maybe_update_follow_information(user_data) do      with {:enabled, true} <- {:enabled, Config.get([:instance, :external_user_synchronization])}, -         {:ok, info} <- fetch_follow_information_for_user(data), -         {:ok, actor_type} <- Map.fetch(data, :actor_type) do -      info = Map.merge(data[:info] || %{}, info) - -      cond do -        actor_type in ["Person", "Service"] -> Map.put(data, :info, info) -        true -> data -      end +         {_, true} <- {:user_type_check, user_data[:type] in ["Person", "Service"]}, +         {_, true} <- +           {:collections_available, +            !!(user_data[:following_address] && user_data[:follower_address])}, +         {:ok, info} <- +           fetch_follow_information_for_user(user_data) do +      info = Map.merge(user_data[:info] || %{}, info) + +      user_data +      |> Map.put(:info, info)      else +      {:user_type_check, false} -> +        user_data + +      {:collections_available, false} -> +        user_data +        {:enabled, false} -> -        data +        user_data        e ->          Logger.error( -          "Follower/Following counter update for #{data.ap_id} failed.\n" <> inspect(e) +          "Follower/Following counter update for #{user_data.ap_id} failed.\n" <> inspect(e)          ) -        data +        user_data      end    end diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index edd7dfb22..84ead93bb 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -18,9 +18,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do    alias Pleroma.Web.CommonAPI    alias Pleroma.Web.Federator +  import ExUnit.CaptureLog +  import Mock    import Pleroma.Factory    import Tesla.Mock -  import Mock    setup do      mock(fn env -> apply(HttpRequestMock, :request, [env]) end) @@ -2403,4 +2404,51 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do       u3: %{r1: r3_1.id, r2: r3_2.id},       u4: %{r1: r4_1.id}}    end + +  describe "maybe_update_follow_information/1" do +    setup do +      clear_config([:instance, :external_user_synchronization], true) + +      user = %{ +        local: false, +        ap_id: "https://gensokyo.2hu/users/raymoo", +        following_address: "https://gensokyo.2hu/users/following", +        follower_address: "https://gensokyo.2hu/users/followers", +        type: "Person" +      } + +      %{user: user} +    end + +    test "logs an error when it can't fetch the info", %{user: user} do +      assert capture_log(fn -> +               ActivityPub.maybe_update_follow_information(user) +             end) =~ "Follower/Following counter update for #{user.ap_id} failed" +    end + +    test "just returns the input if the user type is Application", %{ +      user: user +    } do +      user = +        user +        |> Map.put(:type, "Application") + +      refute capture_log(fn -> +               assert ^user = ActivityPub.maybe_update_follow_information(user) +             end) =~ "Follower/Following counter update for #{user.ap_id} failed" +    end + +    test "it just returns the input if the user has no following/follower addresses", %{ +      user: user +    } do +      user = +        user +        |> Map.put(:following_address, nil) +        |> Map.put(:follower_address, nil) + +      refute capture_log(fn -> +               assert ^user = ActivityPub.maybe_update_follow_information(user) +             end) =~ "Follower/Following counter update for #{user.ap_id} failed" +    end +  end  end  | 
