defmodule Mobilizon.Service.Notifier.PushTest do
  @moduledoc """
  Test the Push notifier module
  """

  alias Mobilizon.Activities.Activity
  alias Mobilizon.Config
  alias Mobilizon.Service.Notifier.Push
  alias Mobilizon.Users.{ActivitySetting, Setting, User}

  use Mobilizon.DataCase
  use Bamboo.Test

  import Mobilizon.Factory

  describe "Returns if the module is loaded" do
    test "Loaded by default" do
      assert Push.ready?() == true
    end

    test "If disabled" do
      Config.put([Push, :enabled], false)
      assert Push.ready?() == false
      Config.put([Push, :enabled], true)
    end
  end

  describe "sending push notification for activities" do
    test "when the user doesn't allow it" do
      %Activity{} = activity = insert(:mobilizon_activity, inserted_at: DateTime.utc_now())
      %User{} = user = insert(:user, activity_settings: [])
      %Setting{} = user_settings = insert(:settings, user_id: user.id)
      user = %User{user | settings: user_settings}

      assert {:ok, :skipped} == Push.send(user, activity)
    end

    test "when the user allows it" do
      event = insert(:event)

      %Activity{} =
        activity =
        insert(:mobilizon_activity,
          inserted_at: DateTime.utc_now(),
          object_id: to_string(event.id),
          subject_params: %{
            "event_title" => event.title,
            "event_uuid" => event.uuid,
            "event_id" => event.id
          }
        )

      %User{} = user = insert(:user)
      %Setting{} = user_settings = insert(:settings, user_id: user.id)

      %ActivitySetting{} =
        activity_setting =
        insert(:mobilizon_activity_setting, user_id: user.id, user: user, method: "push")

      user = %User{user | settings: user_settings, activity_settings: [activity_setting]}
      assert {:ok, :sent} == Push.send(user, activity)
    end
  end
end