appsignal 2.11.10-java → 3.0.0.beta.1-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -1
  3. data/.semaphore/semaphore.yml +161 -70
  4. data/CHANGELOG.md +5 -18
  5. data/Rakefile +3 -13
  6. data/appsignal.gemspec +2 -24
  7. data/build_matrix.yml +20 -22
  8. data/gemfiles/capistrano2.gemfile +1 -0
  9. data/gemfiles/capistrano3.gemfile +1 -0
  10. data/gemfiles/grape.gemfile +1 -0
  11. data/gemfiles/no_dependencies.gemfile +1 -4
  12. data/gemfiles/rails-3.2.gemfile +0 -2
  13. data/gemfiles/rails-4.2.gemfile +0 -6
  14. data/gemfiles/resque-2.gemfile +4 -0
  15. data/gemfiles/sequel-435.gemfile +1 -0
  16. data/gemfiles/sequel.gemfile +1 -0
  17. data/gemfiles/sinatra.gemfile +1 -0
  18. data/lib/appsignal/auth_check.rb +2 -8
  19. data/lib/appsignal/cli.rb +1 -23
  20. data/lib/appsignal/config.rb +0 -24
  21. data/lib/appsignal/event_formatter.rb +0 -25
  22. data/lib/appsignal/extension.rb +0 -50
  23. data/lib/appsignal/hooks/action_cable.rb +5 -44
  24. data/lib/appsignal/hooks/active_support_notifications.rb +7 -86
  25. data/lib/appsignal/hooks/celluloid.rb +5 -9
  26. data/lib/appsignal/hooks/net_http.rb +2 -12
  27. data/lib/appsignal/hooks/puma.rb +3 -5
  28. data/lib/appsignal/hooks/que.rb +1 -1
  29. data/lib/appsignal/hooks/rake.rb +2 -24
  30. data/lib/appsignal/hooks/redis.rb +2 -13
  31. data/lib/appsignal/hooks/resque.rb +2 -43
  32. data/lib/appsignal/hooks/sidekiq.rb +1 -5
  33. data/lib/appsignal/hooks/unicorn.rb +3 -24
  34. data/lib/appsignal/hooks/webmachine.rb +1 -7
  35. data/lib/appsignal/hooks.rb +0 -23
  36. data/lib/appsignal/integrations/action_cable.rb +34 -0
  37. data/lib/appsignal/integrations/active_support_notifications.rb +77 -0
  38. data/lib/appsignal/integrations/net_http.rb +16 -0
  39. data/lib/appsignal/integrations/object.rb +61 -4
  40. data/lib/appsignal/integrations/padrino.rb +5 -7
  41. data/lib/appsignal/integrations/que.rb +26 -33
  42. data/lib/appsignal/integrations/railtie.rb +1 -4
  43. data/lib/appsignal/integrations/rake.rb +26 -2
  44. data/lib/appsignal/integrations/redis.rb +17 -0
  45. data/lib/appsignal/integrations/resque.rb +39 -10
  46. data/lib/appsignal/integrations/unicorn.rb +28 -0
  47. data/lib/appsignal/integrations/webmachine.rb +22 -24
  48. data/lib/appsignal/minutely.rb +0 -18
  49. data/lib/appsignal/transaction.rb +1 -1
  50. data/lib/appsignal/version.rb +1 -1
  51. data/lib/appsignal.rb +1 -27
  52. data/spec/lib/appsignal/auth_check_spec.rb +1 -24
  53. data/spec/lib/appsignal/cli_spec.rb +1 -1
  54. data/spec/lib/appsignal/config_spec.rb +0 -66
  55. data/spec/lib/appsignal/event_formatter_spec.rb +0 -37
  56. data/spec/lib/appsignal/extension_install_failure_spec.rb +7 -0
  57. data/spec/lib/appsignal/extension_spec.rb +9 -43
  58. data/spec/lib/appsignal/hooks/action_cable_spec.rb +0 -88
  59. data/spec/lib/appsignal/hooks/celluloid_spec.rb +6 -1
  60. data/spec/lib/appsignal/hooks/rake_spec.rb +1 -2
  61. data/spec/lib/appsignal/hooks/redis_spec.rb +50 -15
  62. data/spec/lib/appsignal/hooks/sidekiq_spec.rb +7 -61
  63. data/spec/lib/appsignal/hooks/unicorn_spec.rb +14 -3
  64. data/spec/lib/appsignal/hooks/webmachine_spec.rb +2 -13
  65. data/spec/lib/appsignal/hooks_spec.rb +0 -57
  66. data/spec/lib/appsignal/integrations/object_spec.rb +4 -95
  67. data/spec/lib/appsignal/integrations/padrino_spec.rb +2 -3
  68. data/spec/lib/appsignal/integrations/railtie_spec.rb +0 -45
  69. data/spec/lib/appsignal/integrations/webmachine_spec.rb +26 -8
  70. data/spec/lib/appsignal/minutely_spec.rb +0 -19
  71. data/spec/lib/appsignal/transaction_spec.rb +1 -31
  72. data/spec/lib/appsignal/transmitter_spec.rb +1 -1
  73. data/spec/lib/appsignal/utils/data_spec.rb +87 -133
  74. data/spec/lib/appsignal_spec.rb +0 -69
  75. data/spec/lib/puma/appsignal_spec.rb +0 -28
  76. data/spec/spec_helper.rb +1 -37
  77. data/spec/support/testing.rb +1 -11
  78. data/support/install_deps +0 -4
  79. metadata +10 -23
  80. data/lib/appsignal/cli/notify_of_deploy.rb +0 -131
  81. data/lib/appsignal/integrations/object_ruby_19.rb +0 -37
  82. data/lib/appsignal/integrations/object_ruby_modern.rb +0 -41
  83. data/lib/appsignal/integrations/resque_active_job.rb +0 -19
  84. data/lib/appsignal/js_exception_transaction.rb +0 -56
  85. data/lib/appsignal/rack/js_exception_catcher.rb +0 -80
  86. data/spec/lib/appsignal/cli/notify_of_deploy_spec.rb +0 -180
  87. data/spec/lib/appsignal/integrations/object_19_spec.rb +0 -266
  88. data/spec/lib/appsignal/integrations/resque_active_job_spec.rb +0 -28
  89. data/spec/lib/appsignal/integrations/resque_spec.rb +0 -28
  90. data/spec/lib/appsignal/js_exception_transaction_spec.rb +0 -128
  91. data/spec/lib/appsignal/rack/js_exception_catcher_spec.rb +0 -170
@@ -1,266 +0,0 @@
1
- require "appsignal/integrations/object"
2
-
3
- def is_ruby_19
4
- RUBY_VERSION < "2.0"
5
- end
6
-
7
- describe Object do
8
- describe "#instrument_method" do
9
- context "with instance method" do
10
- let(:klass) do
11
- Class.new do
12
- def foo(param1, options = {})
13
- [param1, options]
14
- end
15
- appsignal_instrument_method :foo
16
- end
17
- end
18
- let(:instance) { klass.new }
19
-
20
- def call_with_arguments
21
- instance.foo(
22
- "abc",
23
- :foo => "bar"
24
- )
25
- end
26
-
27
- context "when active" do
28
- let(:transaction) { http_request_transaction }
29
- before do
30
- Appsignal.config = project_fixture_config
31
- expect(Appsignal::Transaction).to receive(:current).at_least(:once).and_return(transaction)
32
- end
33
- after { Appsignal.config = nil }
34
-
35
- context "with anonymous class" do
36
- it "instruments the method and calls it" do
37
- expect(Appsignal.active?).to be_truthy
38
- expect(transaction).to receive(:start_event)
39
- expect(transaction).to receive(:finish_event).with \
40
- "foo.AnonymousClass.other", nil, nil, Appsignal::EventFormatter::DEFAULT
41
- expect(call_with_arguments).to eq(["abc", { :foo => "bar" }])
42
- end
43
- end
44
-
45
- context "with named class" do
46
- before do
47
- class NamedClass
48
- def foo
49
- 1
50
- end
51
- appsignal_instrument_method :foo
52
- end
53
- end
54
- after { Object.send(:remove_const, :NamedClass) }
55
- let(:klass) { NamedClass }
56
-
57
- it "instruments the method and calls it" do
58
- expect(Appsignal.active?).to be_truthy
59
- expect(transaction).to receive(:start_event)
60
- expect(transaction).to receive(:finish_event).with \
61
- "foo.NamedClass.other", nil, nil, Appsignal::EventFormatter::DEFAULT
62
- expect(instance.foo).to eq(1)
63
- end
64
- end
65
-
66
- context "with nested named class" do
67
- before do
68
- module MyModule
69
- module NestedModule
70
- class NamedClass
71
- def bar
72
- 2
73
- end
74
- appsignal_instrument_method :bar
75
- end
76
- end
77
- end
78
- end
79
- after { Object.send(:remove_const, :MyModule) }
80
- let(:klass) { MyModule::NestedModule::NamedClass }
81
-
82
- it "instruments the method and calls it" do
83
- expect(Appsignal.active?).to be_truthy
84
- expect(transaction).to receive(:start_event)
85
- expect(transaction).to receive(:finish_event).with \
86
- "bar.NamedClass.NestedModule.MyModule.other", nil, nil,
87
- Appsignal::EventFormatter::DEFAULT
88
- expect(instance.bar).to eq(2)
89
- end
90
- end
91
-
92
- context "with custom name" do
93
- let(:klass) do
94
- Class.new do
95
- def foo
96
- 1
97
- end
98
- appsignal_instrument_method :foo, :name => "my_method.group"
99
- end
100
- end
101
-
102
- it "instruments with custom name" do
103
- expect(Appsignal.active?).to be_truthy
104
- expect(transaction).to receive(:start_event)
105
- expect(transaction).to receive(:finish_event).with \
106
- "my_method.group", nil, nil, Appsignal::EventFormatter::DEFAULT
107
- expect(instance.foo).to eq(1)
108
- end
109
- end
110
-
111
- context "with a method given a block" do
112
- let(:klass) do
113
- Class.new do
114
- def foo
115
- yield
116
- end
117
- appsignal_instrument_method :foo
118
- end
119
- end
120
-
121
- it "should yield the block" do
122
- expect(instance.foo { 42 }).to eq(42)
123
- end
124
- end
125
- end
126
-
127
- context "when not active" do
128
- let(:transaction) { Appsignal::Transaction.current }
129
-
130
- it "does not instrument, but still calls the method" do
131
- expect(Appsignal.active?).to be_falsy
132
- expect(transaction).to_not receive(:start_event)
133
- expect(call_with_arguments).to eq(["abc", { :foo => "bar" }])
134
- end
135
- end
136
- end
137
-
138
- context "with class method" do
139
- let(:klass) do
140
- Class.new do
141
- def self.bar(param1, options = {})
142
- [param1, options]
143
- end
144
- appsignal_instrument_class_method :bar
145
- end
146
- end
147
- def call_with_arguments
148
- klass.bar(
149
- "abc",
150
- :foo => "bar"
151
- )
152
- end
153
-
154
- context "when active" do
155
- let(:transaction) { http_request_transaction }
156
- before do
157
- Appsignal.config = project_fixture_config
158
- expect(Appsignal::Transaction).to receive(:current).at_least(:once)
159
- .and_return(transaction)
160
- end
161
- after { Appsignal.config = nil }
162
-
163
- context "with anonymous class" do
164
- it "instruments the method and calls it" do
165
- expect(Appsignal.active?).to be_truthy
166
- expect(transaction).to receive(:start_event)
167
- expect(transaction).to receive(:finish_event).with \
168
- "bar.class_method.AnonymousClass.other", nil, nil, Appsignal::EventFormatter::DEFAULT
169
- expect(call_with_arguments).to eq(["abc", { :foo => "bar" }])
170
- end
171
- end
172
-
173
- context "with named class" do
174
- before do
175
- class NamedClass
176
- def self.bar
177
- 2
178
- end
179
- appsignal_instrument_class_method :bar
180
- end
181
- end
182
- after { Object.send(:remove_const, :NamedClass) }
183
- let(:klass) { NamedClass }
184
-
185
- it "instruments the method and calls it" do
186
- expect(Appsignal.active?).to be_truthy
187
- expect(transaction).to receive(:start_event)
188
- expect(transaction).to receive(:finish_event).with \
189
- "bar.class_method.NamedClass.other", nil, nil, Appsignal::EventFormatter::DEFAULT
190
- expect(klass.bar).to eq(2)
191
- end
192
-
193
- context "with nested named class" do
194
- before do
195
- module MyModule
196
- module NestedModule
197
- class NamedClass
198
- def self.bar
199
- 2
200
- end
201
- appsignal_instrument_class_method :bar
202
- end
203
- end
204
- end
205
- end
206
- after { Object.send(:remove_const, :MyModule) }
207
- let(:klass) { MyModule::NestedModule::NamedClass }
208
-
209
- it "instruments the method and calls it" do
210
- expect(Appsignal.active?).to be_truthy
211
- expect(transaction).to receive(:start_event)
212
- expect(transaction).to receive(:finish_event).with \
213
- "bar.class_method.NamedClass.NestedModule.MyModule.other", nil, nil,
214
- Appsignal::EventFormatter::DEFAULT
215
- expect(klass.bar).to eq(2)
216
- end
217
- end
218
- end
219
-
220
- context "with custom name" do
221
- let(:klass) do
222
- Class.new do
223
- def self.bar
224
- 2
225
- end
226
- appsignal_instrument_class_method :bar, :name => "my_method.group"
227
- end
228
- end
229
-
230
- it "instruments with custom name" do
231
- expect(Appsignal.active?).to be_truthy
232
- expect(transaction).to receive(:start_event)
233
- expect(transaction).to receive(:finish_event).with \
234
- "my_method.group", nil, nil, Appsignal::EventFormatter::DEFAULT
235
- expect(klass.bar).to eq(2)
236
- end
237
- end
238
-
239
- context "with a method given a block" do
240
- let(:klass) do
241
- Class.new do
242
- def self.bar
243
- yield
244
- end
245
- appsignal_instrument_class_method :bar
246
- end
247
- end
248
-
249
- it "should yield the block" do
250
- expect(klass.bar { 42 }).to eq(42)
251
- end
252
- end
253
- end
254
-
255
- context "when not active" do
256
- let(:transaction) { Appsignal::Transaction.current }
257
-
258
- it "does not instrument, but still call the method" do
259
- expect(Appsignal.active?).to be_falsy
260
- expect(transaction).to_not receive(:start_event)
261
- expect(call_with_arguments).to eq(["abc", { :foo => "bar" }])
262
- end
263
- end
264
- end
265
- end
266
- end
@@ -1,28 +0,0 @@
1
- require "appsignal/integrations/resque_active_job"
2
-
3
- describe "Legacy Resque ActiveJob integration" do
4
- let(:err_stream) { std_stream }
5
- let(:stderr) { err_stream.read }
6
- let(:log_stream) { std_stream }
7
- let(:log) { log_contents(log_stream) }
8
-
9
- it "logs and prints a deprecation message on extend" do
10
- Appsignal.logger = test_logger(log_stream)
11
-
12
- capture_std_streams(std_stream, err_stream) do
13
- Class.new do
14
- include Appsignal::Integrations::ResqueActiveJobPlugin
15
- end
16
- end
17
-
18
- deprecation_message =
19
- "The AppSignal ResqueActiveJobPlugin is deprecated and does " \
20
- "nothing on extend. In this version of the AppSignal Ruby gem " \
21
- "the integration with Resque is automatic on all Resque workers. " \
22
- "Please remove the following line from this file to remove this " \
23
- "message: include Appsignal::Integrations::ResqueActiveJobPlugin\n" \
24
- "#{__FILE__}:"
25
- expect(stderr).to include "appsignal WARNING: #{deprecation_message}"
26
- expect(log).to contains_log :warn, deprecation_message
27
- end
28
- end
@@ -1,28 +0,0 @@
1
- require "appsignal/integrations/resque"
2
-
3
- describe "Legacy Resque integration" do
4
- let(:err_stream) { std_stream }
5
- let(:stderr) { err_stream.read }
6
- let(:log_stream) { std_stream }
7
- let(:log) { log_contents(log_stream) }
8
-
9
- it "logs and prints a deprecation message on extend" do
10
- Appsignal.logger = test_logger(log_stream)
11
-
12
- capture_std_streams(std_stream, err_stream) do
13
- Class.new do
14
- extend Appsignal::Integrations::ResquePlugin
15
- end
16
- end
17
-
18
- deprecation_message =
19
- "The AppSignal ResquePlugin is deprecated and does " \
20
- "nothing on extend. In this version of the AppSignal Ruby gem " \
21
- "the integration with Resque is automatic on all Resque workers. " \
22
- "Please remove the following line from this file to remove this " \
23
- "message: extend Appsignal::Integrations::ResquePlugin\n" \
24
- "#{__FILE__}:"
25
- expect(stderr).to include "appsignal WARNING: #{deprecation_message}"
26
- expect(log).to contains_log :warn, deprecation_message
27
- end
28
- end
@@ -1,128 +0,0 @@
1
- describe Appsignal::JSExceptionTransaction do
2
- before { allow(SecureRandom).to receive(:uuid).and_return("123abc") }
3
-
4
- let!(:transaction) { Appsignal::JSExceptionTransaction.new(data) }
5
- let(:data) do
6
- {
7
- "name" => "TypeError",
8
- "message" => "foo is not a valid method",
9
- "action" => "ExceptionIncidentComponent",
10
- "path" => "foo.bar/moo",
11
- "environment" => "development",
12
- "backtrace" => [
13
- "foo.bar/js:11:1",
14
- "foo.bar/js:22:2"
15
- ],
16
- "tags" => [
17
- "tag1"
18
- ]
19
- }
20
- end
21
-
22
- describe "#initialize" do
23
- it "should call all required methods" do
24
- expect(Appsignal::Extension).to receive(:start_transaction).with("123abc", "frontend", 0).and_return(1)
25
-
26
- expect(transaction).to receive(:set_action)
27
- expect(transaction).to receive(:set_metadata)
28
- expect(transaction).to receive(:set_error)
29
- expect(transaction).to receive(:set_sample_data)
30
-
31
- transaction.send :initialize, data
32
-
33
- expect(transaction.ext).to_not be_nil
34
- end
35
- end
36
-
37
- describe "#set_action" do
38
- it "should call `Appsignal::Extension.set_action`" do
39
- expect(transaction.ext).to receive(:set_action).with(
40
- "ExceptionIncidentComponent"
41
- )
42
-
43
- transaction.set_action
44
- end
45
- end
46
-
47
- describe "#set_metadata" do
48
- it "should call `Appsignal::Extension.set_transaction_metadata`" do
49
- expect(transaction.ext).to receive(:set_metadata).with(
50
- "path",
51
- "foo.bar/moo"
52
- )
53
-
54
- transaction.set_metadata
55
- end
56
- end
57
-
58
- describe "#set_error" do
59
- it "should call `Appsignal::Extension.set_transaction_error`" do
60
- expect(transaction.ext).to receive(:set_error).with(
61
- "TypeError",
62
- "foo is not a valid method",
63
- Appsignal::Utils::Data.generate(["foo.bar/js:11:1", "foo.bar/js:22:2"])
64
- )
65
-
66
- transaction.set_error
67
- end
68
- end
69
-
70
- describe "#set_sample_data" do
71
- it "should call `Appsignal::Extension.set_transaction_error_data`" do
72
- expect(transaction.ext).to receive(:set_sample_data).with(
73
- "tags",
74
- Appsignal::Utils::Data.generate(["tag1"])
75
- )
76
-
77
- transaction.set_sample_data
78
- end
79
- end
80
-
81
- context "when sending just the name" do
82
- let(:data) { { "name" => "TypeError" } }
83
-
84
- describe "#set_action" do
85
- it "should not call `Appsignal::Extension.set_action`" do
86
- expect(transaction.ext).to_not receive(:set_action)
87
-
88
- transaction.set_action
89
- end
90
- end
91
-
92
- describe "#set_metadata" do
93
- it "should not call `Appsignal::Extension.set_transaction_metadata`" do
94
- expect(transaction.ext).to_not receive(:set_metadata)
95
-
96
- transaction.set_metadata
97
- end
98
- end
99
-
100
- describe "#set_error" do
101
- it "should call `Appsignal::Extension.set_transaction_error` with just the name" do
102
- expect(transaction.ext).to receive(:set_error).with(
103
- "TypeError",
104
- "",
105
- Appsignal::Utils::Data.generate([])
106
- )
107
-
108
- transaction.set_error
109
- end
110
- end
111
-
112
- describe "#set_sample_data" do
113
- it "should not call `Appsignal::Extension.set_transaction_error_data`" do
114
- expect(transaction.ext).to_not receive(:set_sample_data)
115
-
116
- transaction.set_sample_data
117
- end
118
- end
119
- end
120
-
121
- describe "#complete!" do
122
- it "should call all required methods" do
123
- expect(transaction.ext).to receive(:finish).and_call_original
124
- expect(transaction.ext).to receive(:complete).and_call_original
125
- transaction.complete!
126
- end
127
- end
128
- end
@@ -1,170 +0,0 @@
1
- describe Appsignal::Rack::JSExceptionCatcher do
2
- let(:app) { double(:call => true) }
3
- let(:options) { nil }
4
- let(:config_options) { { :enable_frontend_error_catching => true } }
5
- let(:config) { project_fixture_config("production", config_options) }
6
- let(:deprecation_message) do
7
- "The Appsignal::Rack::JSExceptionCatcher is " \
8
- "deprecated and will be removed in a future version. Please use " \
9
- "the official AppSignal JavaScript integration by disabling " \
10
- "`enable_frontend_error_catching` in your configuration and " \
11
- "installing AppSignal for JavaScript instead. " \
12
- "(https://docs.appsignal.com/front-end/)"
13
- end
14
- before { Appsignal.config = config }
15
-
16
- describe "#initialize" do
17
- let(:out_stream) { std_stream }
18
- let(:err_stream) { std_stream }
19
- let(:output) { out_stream.read }
20
- let(:stderr) { err_stream.read }
21
-
22
- it "logs to the logger" do
23
- log = capture_logs do
24
- capture_std_streams(out_stream, err_stream) do
25
- Appsignal::Rack::JSExceptionCatcher.new(app, options)
26
- end
27
- end
28
- expect(log).to contains_log(:warn, deprecation_message)
29
- expect(log).to contains_log(:debug, "Initializing Appsignal::Rack::JSExceptionCatcher")
30
- expect(stderr).to include "appsignal WARNING: #{deprecation_message}"
31
- expect(stderr).to_not include("appsignal:")
32
- expect(output).to be_empty
33
- end
34
- end
35
-
36
- describe "#call" do
37
- let(:catcher) do
38
- silence :allowed => ["enable_frontend_error_catching"] do
39
- Appsignal::Rack::JSExceptionCatcher.new(app, options)
40
- end
41
- end
42
- after { catcher.call(env) }
43
-
44
- context "when path is not frontend_error_catching_path" do
45
- let(:env) { { "PATH_INFO" => "/foo" } }
46
-
47
- context "when AppSignal is not active" do
48
- before { config[:active] = false }
49
-
50
- it "calls the next middleware" do
51
- expect(app).to receive(:call).with(env)
52
- end
53
- end
54
-
55
- context "when AppSignal is active" do
56
- before { config[:active] = true }
57
-
58
- it "calls the next middleware" do
59
- expect(app).to receive(:call).with(env)
60
- end
61
- end
62
- end
63
-
64
- context "when path is frontend_error_catching_path" do
65
- let(:transaction) { double(:complete! => true) }
66
- let(:env) do
67
- {
68
- "PATH_INFO" => "/appsignal_error_catcher",
69
- "rack.input" => double(:read => '{"name": "error"}')
70
- }
71
- end
72
-
73
- context "when AppSignal is not active" do
74
- before { config[:active] = false }
75
-
76
- it "doesn't create an AppSignal transaction" do
77
- expect(Appsignal::JSExceptionTransaction).to_not receive(:new)
78
- end
79
-
80
- it "returns a 202 status" do
81
- expect(catcher.call(env)).to eq(
82
- [202, {}, ["AppSignal JavaScript error catching endpoint is not active."]]
83
- )
84
- end
85
- end
86
-
87
- context "when AppSignal is active" do
88
- before { config[:active] = true }
89
-
90
- it "creates a JSExceptionTransaction" do
91
- expect(Appsignal::JSExceptionTransaction).to receive(:new)
92
- .with("name" => "error")
93
- .and_return(transaction)
94
-
95
- expect(transaction).to receive(:complete!)
96
- end
97
-
98
- it "returns 200" do
99
- allow(Appsignal::JSExceptionTransaction).to receive(:new)
100
- .and_return(transaction)
101
-
102
- expect(catcher.call(env)).to eq([200, {}, []])
103
- end
104
-
105
- context "when request payload is empty" do
106
- let(:env) do
107
- {
108
- "PATH_INFO" => "/appsignal_error_catcher",
109
- "rack.input" => double(:read => "")
110
- }
111
- end
112
-
113
- it "does not create a transaction" do
114
- expect(Appsignal::JSExceptionTransaction).to_not receive(:new)
115
- end
116
-
117
- it "returns 400" do
118
- expect(catcher.call(env)).to eq([400, {}, ["Request payload is not valid JSON."]])
119
- end
120
- end
121
-
122
- context "when `frontend_error_catching_path` is different" do
123
- let(:config_options) { { :frontend_error_catching_path => "/foo" } }
124
-
125
- it "does not create a transaction" do
126
- expect(Appsignal::JSExceptionTransaction).to_not receive(:new)
127
- end
128
-
129
- it "calls the next middleware" do
130
- expect(app).to receive(:call).with(env)
131
- end
132
- end
133
-
134
- context "when `name` is empty" do
135
- let(:env) do
136
- {
137
- "PATH_INFO" => "/appsignal_error_catcher",
138
- "rack.input" => double(:read => '{"name": ""}')
139
- }
140
- end
141
-
142
- it "does not create a transaction" do
143
- expect(Appsignal::JSExceptionTransaction).to_not receive(:new)
144
- end
145
-
146
- it "returns 422" do
147
- expect(catcher.call(env)).to eq([422, {}, []])
148
- end
149
- end
150
-
151
- context "when `name` doesn't exist" do
152
- let(:env) do
153
- {
154
- "PATH_INFO" => "/appsignal_error_catcher",
155
- "rack.input" => double(:read => '{"foo": ""}')
156
- }
157
- end
158
-
159
- it "does not create a transaction" do
160
- expect(Appsignal::JSExceptionTransaction).to_not receive(:new)
161
- end
162
-
163
- it "returns 422" do
164
- expect(catcher.call(env)).to eq([422, {}, []])
165
- end
166
- end
167
- end
168
- end
169
- end
170
- end