defmodule Mobilizon.Service.Workers.ActivityBuilderTest do
  @moduledoc """
  Test the ActivityBuilder module
  """

  alias Mobilizon.Activities.Activity
  alias Mobilizon.Actors.Actor
  alias Mobilizon.Service.Notifier.Mock2, as: NotifierMock
  alias Mobilizon.Service.Workers.ActivityBuilder
  alias Mobilizon.Users.User

  use Mobilizon.DataCase
  use Mobilizon.Tests.Helpers

  import Mobilizon.Factory
  import Mox

  setup_all do
    Mox.defmock(NotifierMock, for: Mobilizon.Service.Notifier)

    clear_config([Mobilizon.Service.Notifier, :notifiers], [
      NotifierMock
    ])

    :ok
  end

  setup :verify_on_exit!

  describe "Sends direct email notification to users" do
    test "if the user has a profile member of a group" do
      %User{} = user = insert(:user)

      %Actor{} = actor = insert(:actor, user: user)

      %Actor{type: :Group} = group = insert(:group)
      insert(:member, parent: group, actor: actor, role: :member)

      %Activity{} =
        activity = insert(:mobilizon_activity, group: group, inserted_at: DateTime.utc_now())

      NotifierMock
      |> expect(:ready?, 1, fn -> true end)
      |> expect(:send, 1, fn %User{},
                             %Activity{
                               type: :event,
                               subject: :event_created,
                               object_type: :event
                             },
                             [single_activity: true] ->
        {:ok, :sent}
      end)

      assert :ok == ActivityBuilder.notify_activity(activity)
    end

    test "unless if the user has a profile member of a group" do
      %User{} = user = insert(:user)

      %Actor{} = actor = insert(:actor, user: user)

      %Actor{type: :Group} = group = insert(:group)
      insert(:member, parent: group, actor: actor, role: :member)

      %Activity{} =
        activity =
        insert(:mobilizon_activity, group: group, inserted_at: DateTime.utc_now(), author: actor)

      assert :ok == ActivityBuilder.notify_activity(activity)

      NotifierMock
      |> expect(:ready?, 0, fn -> true end)
      |> expect(:send, 0, fn %User{},
                             %Activity{
                               type: :event,
                               subject: :event_created,
                               object_type: :event
                             },
                             [single_activity: true] ->
        {:ok, :sent}
      end)
    end
  end
end