1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
require_relative "../test_helper"
require "rack/test"

require "pro_tacts/refusal_alerts"

class RefusalAlertsTest < Minitest::Test
  include Sentry::TestHelper
  include SentryMessages
  include Rack::Test::Methods

  def setup
    setup_sentry
    @status = 200
  end

  def teardown
    teardown_sentry_test
  end

  def app
    ProTacts::RefusalAlerts.new(->(_env) { [@status, {}, [""]] })
  end

  def dav(path, method: "PUT")
    request path, method:, ProTacts::ExchangeLog::ENV_KEY => "abc123"
  end

  def test_each_refusal_warns
    [403, 404, 410, 412].each do |status|
      @status = status

      dav "/dav/addressbook/"
    end

    assert_equal 4, sentry_events.length
    assert(sentry_events.all? { it.level == :warning })
  end

  def test_other_statuses_are_quiet
    [200, 201, 207, 400, 401, 500].each do |status|
      @status = status

      dav "/dav/addressbook/"
    end

    assert_empty sentry_events
  end

  def test_a_refusal_repeated_across_cards_is_one_group
    @status = 412

    dav "/dav/addressbook/aiden.vcf"
    dav "/dav/addressbook/bea.vcf"

    assert_equal [%w[PUT /dav/addressbook/{id}.vcf 412]] * 2, sentry_events.map(&:fingerprint)
    assert_equal "PUT /dav/addressbook/{id}.vcf answered 412 Precondition Failed", sentry_messages.first
  end

  def test_the_card_a_refusal_names_is_a_tag
    @status = 412

    dav "/dav/addressbook/aiden.vcf"
    dav "/dav/addressbook/"

    assert_equal ["aiden", nil], sentry_events.map { it.tags[:card] }
  end

  def test_the_method_and_status_split_groups
    @status = 412
    dav "/dav/addressbook/aiden.vcf", method: "PUT"
    dav "/dav/addressbook/aiden.vcf", method: "DELETE"
    @status = 404
    dav "/dav/addressbook/aiden.vcf", method: "DELETE"

    assert_equal 3, sentry_events.map(&:fingerprint).uniq.length
  end

  def test_an_exchange_the_log_did_not_mark_is_quiet
    @status = 404

    get "/contacts/nope"

    assert_empty sentry_events
  end
end