defmodule Mobilizon.Federation.ActivityStream.Converter.EventMetadataTest do
  @moduledoc """
  Module to test converting from EventMetadata to AS
  """
  use Mobilizon.DataCase
  import Mobilizon.Factory
  alias Mobilizon.Events.EventMetadata
  alias Mobilizon.Federation.ActivityStream.Converter.EventMetadata, as: EventMetadataConverter

  @property_value "PropertyValue"

  describe "metadata_to_as/1" do
    test "convert a simple metadata" do
      %EventMetadata{} = metadata = build(:event_metadata)

      assert %{"propertyID" => metadata.key, "value" => metadata.value, "type" => @property_value} ==
               EventMetadataConverter.metadata_to_as(metadata)
    end

    test "convert a boolean" do
      %EventMetadata{} = metadata = build(:event_metadata, type: :boolean, value: "false")

      assert %{"propertyID" => metadata.key, "value" => false, "type" => @property_value} ==
               EventMetadataConverter.metadata_to_as(metadata)
    end

    test "convert an integer" do
      %EventMetadata{} = metadata = build(:event_metadata, type: :integer, value: "36")

      assert %{"propertyID" => metadata.key, "value" => 36, "type" => @property_value} ==
               EventMetadataConverter.metadata_to_as(metadata)
    end

    test "convert a float" do
      %EventMetadata{} = metadata = build(:event_metadata, type: :float, value: "36.53")

      assert %{"propertyID" => metadata.key, "value" => 36.53, "type" => @property_value} ==
               EventMetadataConverter.metadata_to_as(metadata)
    end

    test "convert custom metadata with title" do
      %EventMetadata{} = metadata = build(:event_metadata, title: "hello")

      assert %{
               "propertyID" => metadata.key,
               "value" => metadata.value,
               "name" => "hello",
               "type" => @property_value
             } ==
               EventMetadataConverter.metadata_to_as(metadata)
    end
  end

  describe "as_to_metadata/1" do
    test "parse a simple metadata" do
      assert %{key: "somekey", value: "somevalue", type: :string} ==
               EventMetadataConverter.as_to_metadata(%{
                 "propertyID" => "somekey",
                 "value" => "somevalue",
                 "type" => @property_value
               })
    end

    test "parse a boolean metadata" do
      assert %{key: "somekey", value: "false", type: :boolean} ==
               EventMetadataConverter.as_to_metadata(%{
                 "propertyID" => "somekey",
                 "value" => false,
                 "type" => @property_value
               })
    end

    test "parse an integer metadata" do
      assert %{key: "somekey", value: "4", type: :integer} ==
               EventMetadataConverter.as_to_metadata(%{
                 "propertyID" => "somekey",
                 "value" => 4,
                 "type" => @property_value
               })
    end

    test "parse a float metadata" do
      assert %{key: "somekey", value: "4.36", type: :float} ==
               EventMetadataConverter.as_to_metadata(%{
                 "propertyID" => "somekey",
                 "value" => 4.36,
                 "type" => @property_value
               })
    end

    test "parse a custom metadata with title" do
      assert %{key: "somekey", value: "somevalue", type: :string, title: "title"} ==
               EventMetadataConverter.as_to_metadata(%{
                 "propertyID" => "somekey",
                 "value" => "somevalue",
                 "name" => "title",
                 "type" => @property_value
               })
    end
  end
end