defmodule Mobilizon.Service.Activity.ConversationTest do
  @moduledoc """
  Test the Comment activity provider module
  """

  alias Mobilizon.Actors.Actor
  alias Mobilizon.Conversations
  alias Mobilizon.Conversations.{Conversation, ConversationParticipant}
  alias Mobilizon.Discussions.Comment
  alias Mobilizon.Service.Activity.Conversation, as: ConversationActivity
  alias Mobilizon.Service.Workers.LegacyNotifierBuilder
  alias Mobilizon.Users.User

  use Mobilizon.DataCase
  use Oban.Testing, repo: Mobilizon.Storage.Repo
  import Mobilizon.Factory

  describe "handle conversation" do
    test "with participants" do
      %User{} = user = insert(:user)
      %Actor{id: actor_id} = actor = insert(:actor, user: user)

      %Conversation{
        id: conversation_id,
        last_comment: %Comment{actor_id: last_comment_actor_id}
      } =
        conversation = insert(:conversation, event: nil)

      %ConversationParticipant{id: conversation_participant_actor_id} =
        insert(:conversation_participant, actor: actor, conversation: conversation)

      %ConversationParticipant{
        id: conversation_participant_id,
        actor: %Actor{id: conversation_other_participant_actor_id}
      } = insert(:conversation_participant, conversation: conversation)

      conversation = Conversations.get_conversation(conversation_id)

      assert {:ok, _} =
               ConversationActivity.insert_activity(conversation, subject: "conversation_created")

      assert_enqueued(
        worker: LegacyNotifierBuilder,
        args: %{
          "author_id" => last_comment_actor_id,
          "participant" => %{"actor_id" => actor_id, "id" => conversation_participant_actor_id},
          "object_id" => to_string(conversation_id),
          "object_type" => "conversation",
          "op" => "legacy_notify",
          "subject" => "conversation_created",
          "subject_params" => %{
            "conversation_id" => conversation_id,
            "conversation_participant_id" => conversation_participant_actor_id
          },
          "type" => "conversation"
        }
      )

      assert_enqueued(
        worker: LegacyNotifierBuilder,
        args: %{
          "author_id" => last_comment_actor_id,
          "participant" => %{
            "actor_id" => conversation_other_participant_actor_id,
            "id" => conversation_participant_id
          },
          "object_id" => to_string(conversation_id),
          "object_type" => "conversation",
          "op" => "legacy_notify",
          "subject" => "conversation_created",
          "subject_params" => %{
            "conversation_id" => conversation_id,
            "conversation_participant_id" => conversation_participant_id
          },
          "type" => "conversation"
        }
      )
    end
  end
end