-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_errors_module.rb
More file actions
157 lines (136 loc) · 4.87 KB
/
Copy pathtest_errors_module.rb
File metadata and controls
157 lines (136 loc) · 4.87 KB
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# frozen_string_literal: true
require "minitest/autorun"
require "logger"
require "json"
require "allstak"
# Backfill coverage for AllStak::Modules::Errors: payload shape, breadcrumbs,
# disabled transport, before_send drop, and structured-frame extraction.
class TestErrorsModule < Minitest::Test
# Records posts; controllable disabled state + canned response.
class FakeTransport
attr_reader :posts
attr_accessor :disabled_flag, :response
def initialize
@posts = []
@disabled_flag = false
@response = [202, '{"data":{"id":"err-1"}}']
end
def disabled?
@disabled_flag
end
def post(path, payload)
@posts << [path, payload]
@response
end
end
def teardown
# The breadcrumb ring buffer is thread-local; clear it so an example that
# adds crumbs without capturing can never leak into the next one.
Thread.current[AllStak::Modules::Errors::BREADCRUMB_TLS_KEY] = nil
end
def build(before_send: nil, sample_rate: 1.0)
config = AllStak::Config.new
config.api_key = "k"
config.before_send = before_send
config.sample_rate = sample_rate
transport = FakeTransport.new
errors = AllStak::Modules::Errors.new(transport, config, Logger.new(IO::NULL))
[errors, transport, config]
end
def begin_raised(msg = "boom")
raise RuntimeError, msg
rescue => e
e
end
def test_capture_exception_returns_id_and_posts
errors, transport, _ = build
id = errors.capture_exception(begin_raised)
assert_equal "err-1", id
path, payload = transport.posts.first
assert_equal "/ingest/v1/errors", path
assert_equal "RuntimeError", payload[:exceptionClass]
assert_equal "boom", payload[:message]
end
def test_disabled_transport_returns_nil_no_post
errors, transport, _ = build
transport.disabled_flag = true
assert_nil errors.capture_exception(begin_raised)
assert_empty transport.posts
end
def test_breadcrumbs_attached_and_cleared
errors, transport, _ = build
errors.add_breadcrumb(type: "nav", message: "clicked")
errors.capture_exception(begin_raised)
_, payload = transport.posts.first
assert_equal 1, payload[:breadcrumbs].length
assert_equal "clicked", payload[:breadcrumbs].first[:message]
# Breadcrumbs are drained after capture.
errors.capture_exception(begin_raised)
_, payload2 = transport.posts.last
refute payload2.key?(:breadcrumbs)
end
def test_breadcrumb_ring_buffer_caps_at_max
errors, transport, _ = build
(AllStak::Modules::Errors::MAX_BREADCRUMBS + 10).times { |i| errors.add_breadcrumb(type: "x", message: "m#{i}") }
errors.capture_exception(begin_raised)
_, payload = transport.posts.first
assert_equal AllStak::Modules::Errors::MAX_BREADCRUMBS, payload[:breadcrumbs].length
end
def test_before_send_can_drop_event
errors, transport, _ = build(before_send: ->(_e) { nil })
assert_nil errors.capture_exception(begin_raised)
assert_empty transport.posts
end
def test_before_send_can_mutate_event
hook = ->(e) { e[:message] = "scrubbed"; e }
errors, transport, _ = build(before_send: hook)
errors.capture_exception(begin_raised)
_, payload = transport.posts.first
assert_equal "scrubbed", payload[:message]
end
def test_before_send_failure_sends_original
hook = ->(_e) { raise "buggy hook" }
errors, transport, _ = build(before_send: hook)
id = errors.capture_exception(begin_raised)
assert_equal "err-1", id
refute_empty transport.posts
end
def test_sample_rate_zero_drops
errors, transport, _ = build(sample_rate: 0.0)
assert_nil errors.capture_exception(begin_raised)
assert_empty transport.posts
end
def test_structured_frames_present
errors, transport, _ = build
errors.capture_exception(begin_raised)
_, payload = transport.posts.first
frames = payload[:frames]
assert frames.is_a?(Array)
refute_empty frames
assert frames.first.key?(:filename)
assert frames.first.key?(:lineno)
assert_equal "ruby", frames.first[:platform]
end
def test_capture_error_posts_with_message
errors, transport, _ = build
result = errors.capture_error("CustomError", "something")
assert_equal "CustomError", result
_, payload = transport.posts.first
assert_equal "CustomError", payload[:exceptionClass]
assert_equal "something", payload[:message]
end
def test_user_context_attached
errors, transport, _ = build
errors.set_user(id: "u1", email: "a@b")
errors.capture_exception(begin_raised)
_, payload = transport.posts.first
assert_equal "u1", payload[:user][:id]
end
def test_release_tags_merged_into_metadata
errors, transport, _ = build
errors.capture_exception(begin_raised, metadata: { "k" => "v" })
_, payload = transport.posts.first
assert_equal "allstak-ruby", payload[:metadata]["sdk.name"]
assert_equal "v", payload[:metadata]["k"]
end
end