# frozen_string_literal: true

require "test_helper"

class DogStatsDDatagramBuilderTest < Minitest::Test
  def setup
    @datagram_builder = StatsD::Instrument::DogStatsDDatagramBuilder.new
  end

  def test_raises_on_unsupported_metrics
    assert_raises(NotImplementedError) { @datagram_builder.kv("foo", 10, nil, nil) }
  end

  def test_simple_service_check
    datagram = @datagram_builder._sc("service", :ok)
    assert_equal("_sc|service|0", datagram)
    parsed_datagram = StatsD::Instrument::DogStatsDDatagramBuilder.datagram_class.new(datagram)
    assert_equal(:_sc, parsed_datagram.type)
    assert_equal("service", parsed_datagram.name)
    assert_equal(0, parsed_datagram.value)
  end

  def test_complex_service_check
    datagram = @datagram_builder._sc(
      "service",
      :warning,
      timestamp: Time.parse("2019-09-30T04:22:12Z"),
      hostname: "localhost",
      tags: { foo: "bar|baz" },
      message: "blah",
    )
    assert_equal("_sc|service|1|h:localhost|d:1569817332|#foo:barbaz|m:blah", datagram)

    parsed_datagram = StatsD::Instrument::DogStatsDDatagramBuilder.datagram_class.new(datagram)
    assert_equal(:_sc, parsed_datagram.type)
    assert_equal("service", parsed_datagram.name)
    assert_equal(1, parsed_datagram.value)
    assert_equal("localhost", parsed_datagram.hostname)
    assert_equal(Time.parse("2019-09-30T04:22:12Z"), parsed_datagram.timestamp)
    assert_equal(["foo:barbaz"], parsed_datagram.tags)
    assert_equal("blah", parsed_datagram.message)
  end

  def test_simple_event
    datagram = @datagram_builder._e("hello", "world")
    assert_equal("_e{5,5}:hello|world", datagram)

    parsed_datagram = StatsD::Instrument::DogStatsDDatagramBuilder.datagram_class.new(datagram)
    assert_equal(:_e, parsed_datagram.type)
    assert_equal("hello", parsed_datagram.name)
    assert_equal("world", parsed_datagram.value)
  end

  def test_complex_event
    datagram = @datagram_builder._e(
      "testing",
      "with\nnewline",
      timestamp: Time.parse("2019-09-30T04:22:12Z"),
      hostname: "localhost",
      aggregation_key: "my-key",
      priority: "low",
      source_type_name: "source",
      alert_type: "success",
      tags: { foo: "bar|baz" },
    )
    assert_equal(
      '_e{7,13}:testing|with\\nnewline|h:localhost|d:1569817332|k:my-key|' \
        "p:low|s:source|t:success|#foo:barbaz",
      datagram,
    )

    parsed_datagram = StatsD::Instrument::DogStatsDDatagramBuilder.datagram_class.new(datagram)
    assert_equal(:_e, parsed_datagram.type)
    assert_equal("testing", parsed_datagram.name)
    assert_equal("with\nnewline", parsed_datagram.value)
    assert_equal("localhost", parsed_datagram.hostname)
    assert_equal(Time.parse("2019-09-30T04:22:12Z"), parsed_datagram.timestamp)
    assert_equal(["foo:barbaz"], parsed_datagram.tags)
    assert_equal("my-key", parsed_datagram.aggregation_key)
    assert_equal("low", parsed_datagram.priority)
    assert_equal("source", parsed_datagram.source_type_name)
    assert_equal("success", parsed_datagram.alert_type)
  end
end