appsignal 2.9.18 → 2.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +0 -6
  3. data/CHANGELOG.md +17 -1
  4. data/Rakefile +16 -2
  5. data/lib/appsignal/cli.rb +9 -2
  6. data/lib/appsignal/cli/diagnose.rb +20 -19
  7. data/lib/appsignal/cli/helpers.rb +22 -10
  8. data/lib/appsignal/cli/install.rb +2 -1
  9. data/lib/appsignal/config.rb +18 -7
  10. data/lib/appsignal/event_formatter.rb +4 -4
  11. data/lib/appsignal/minutely.rb +4 -4
  12. data/lib/appsignal/rack/js_exception_catcher.rb +6 -0
  13. data/lib/appsignal/transaction.rb +1 -1
  14. data/lib/appsignal/version.rb +1 -1
  15. data/spec/lib/appsignal/cli/diagnose_spec.rb +54 -11
  16. data/spec/lib/appsignal/cli/helpers_spec.rb +11 -3
  17. data/spec/lib/appsignal/cli/install_spec.rb +30 -1
  18. data/spec/lib/appsignal/config_spec.rb +75 -7
  19. data/spec/lib/appsignal/hooks/action_cable_spec.rb +1 -5
  20. data/spec/lib/appsignal/hooks/rake_spec.rb +41 -39
  21. data/spec/lib/appsignal/hooks/sidekiq_spec.rb +2 -15
  22. data/spec/lib/appsignal/integrations/object_spec.rb +2 -2
  23. data/spec/lib/appsignal/integrations/que_spec.rb +26 -39
  24. data/spec/lib/appsignal/integrations/resque_active_job_spec.rb +108 -46
  25. data/spec/lib/appsignal/integrations/resque_spec.rb +40 -39
  26. data/spec/lib/appsignal/minutely_spec.rb +3 -3
  27. data/spec/lib/appsignal/rack/js_exception_catcher_spec.rb +19 -5
  28. data/spec/lib/appsignal/transaction_spec.rb +4 -12
  29. data/spec/lib/appsignal_spec.rb +7 -8
  30. data/spec/spec_helper.rb +11 -11
  31. data/spec/support/fixtures/projects/broken/config/appsignal.yml +1 -0
  32. data/spec/support/helpers/cli_helpers.rb +15 -1
  33. data/spec/support/helpers/transaction_helpers.rb +53 -0
  34. data/spec/support/matchers/be_completed.rb +5 -0
  35. data/spec/support/matchers/have_colorized_text.rb +28 -0
  36. data/spec/support/testing.rb +113 -0
  37. metadata +10 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3d3694d0f2970749ad1d8951a3989c2f6ea77c10f3cb695c3992266962bba09e
4
- data.tar.gz: b16b94135fc7f014ec2a3b5b6904696d6b262972bb229d908f3d0c7f2f6bb6ff
3
+ metadata.gz: 4dcc9f0ae3d601a8d8a7851943568176af63fc2aae714f996449227607a74fee
4
+ data.tar.gz: c5a44f8e88184697b7ae5ccd56bb13451a64e5fc51eb427fb04ee01c77aaf7ba
5
5
  SHA512:
6
- metadata.gz: cb9e78c6e46f317ea3092e6045afd21abb7bea8ed3858021fbd4d2ef0d4d743a778becf69a3e2c4dc0dd64a00a353b2793601d22ed5163d99c9dfd779f748b8b
7
- data.tar.gz: fc32dfdfb9beadac21752e730340306674948458a2cc260d66e5dca646efa4bfe7a6c44e01d62a17844f229a08562d55534651c7744d82a9da8c98a8e23e9869
6
+ metadata.gz: 71b733951dfa43726b103e3ba39e5898e68009063b97d74d7382c1f7a0687754dba9e3954da5a3f7e5646ef1871c6ef643e238afac4319b787413fe58822a91a
7
+ data.tar.gz: e0995a18c18ee86162d7a4bc33e046f6b3a956f955c9b6f61f0bc188a161dd222983abc26852ce69bfac0008447612702c587134b010b432dfe449c70b6f1c9d
@@ -89,12 +89,6 @@ Style/ClassAndModuleChildren:
89
89
  Exclude:
90
90
  - 'lib/appsignal/integrations/padrino.rb'
91
91
 
92
- # Offense count: 6
93
- Style/ClassVars:
94
- Exclude:
95
- - 'lib/appsignal/event_formatter.rb'
96
- - 'lib/appsignal/minutely.rb'
97
-
98
92
  # Offense count: 1
99
93
  Style/DoubleNegation:
100
94
  Exclude:
@@ -1,6 +1,22 @@
1
1
  # Changelog
2
2
 
3
- ## 2.9.18 (Beta)
3
+ ## 2.10.0
4
+ - Rescue errors while parsing `appsignal.yml` file. It will prints a warning
5
+ instead. PR #517
6
+ - Refactoring: Reduce class variable usage. PR #520
7
+ - Bump log level about starting new transactions while a transaction is already
8
+ active from debug to a warning. PR #525
9
+ - Refactoring: Add internal AppSignal test helpers and other test suite
10
+ refactorings. PR #536, #537, #538, #539
11
+ - Fix internal Rakefile loading on Ruby 1.9.3. PR #541
12
+ - Add a `--no-color` option to the `appsignal install` command. PR #550
13
+ - Add output coloring to `appsignal diagnose` warnings. PR #551
14
+ - Add validation for empty Push API key. Empty Push API key values will no
15
+ longer start AppSignal. PR #569
16
+ - Deprecate the JSExceptionCatcher middleware in favor of our new front-end
17
+ JavaScript integration (https://docs.appsignal.com/front-end/). PR #572
18
+
19
+ ## 2.9.18
4
20
  - Bump agent to v-c348132
5
21
  - Improve transmitter logging on timeout
6
22
  - Improve queued payloads transmitter. Should prevent payloads being sent
data/Rakefile CHANGED
@@ -143,9 +143,23 @@ namespace :build do
143
143
  end
144
144
  end
145
145
 
146
+ def define_build_task(task_name, base_gemspec, &block)
147
+ Gem::PackageTask.new(base_gemspec, &block)
148
+ rescue StandardError => error
149
+ puts "Warning: An error occurred defining `build:#{task_name}:gem` Rake task."
150
+ puts "This task will not be availble."
151
+ if ENV["DEBUG"]
152
+ puts "#{error}: #{error.message}"
153
+ puts error.backtrace
154
+ else
155
+ puts "For more information, run the same command with `DEBUG=true`."
156
+ end
157
+ puts
158
+ end
159
+
146
160
  namespace :ruby do
147
161
  # Extension default set in `appsignal.gemspec`
148
- Gem::PackageTask.new(base_gemspec) { |_pkg| }
162
+ define_build_task(:ruby, base_gemspec) { |_pkg| }
149
163
  end
150
164
 
151
165
  namespace :jruby do
@@ -157,7 +171,7 @@ namespace :build do
157
171
  s.add_dependency "ffi"
158
172
  end
159
173
 
160
- Gem::PackageTask.new(spec) { |_pkg| }
174
+ define_build_task(:jruby, spec) { |_pkg| }
161
175
  end
162
176
 
163
177
  desc "Build all gem versions"
@@ -32,7 +32,7 @@ module Appsignal
32
32
  when :diagnose
33
33
  Appsignal::CLI::Diagnose.run(options)
34
34
  when :install
35
- Appsignal::CLI::Install.run(argv.shift)
35
+ Appsignal::CLI::Install.run(argv.shift, options)
36
36
  when :notify_of_deploy
37
37
  Appsignal::CLI::NotifyOfDeploy.run(options)
38
38
  end
@@ -85,8 +85,15 @@ module Appsignal
85
85
  o.on "--[no-]send-report", "Confirm sending the report to AppSignal automatically" do |arg|
86
86
  options[:send_report] = arg
87
87
  end
88
+ o.on "--[no-]color", "Colorize the output of the diagnose command" do |arg|
89
+ options[:color] = arg
90
+ end
91
+ end,
92
+ "install" => OptionParser.new do |o|
93
+ o.on "--[no-]color", "Colorize the output of the diagnose command" do |arg|
94
+ options[:color] = arg
95
+ end
88
96
  end,
89
- "install" => OptionParser.new,
90
97
  "notify_of_deploy" => OptionParser.new do |o|
91
98
  o.banner = "Usage: appsignal notify_of_deploy [options]"
92
99
 
@@ -77,6 +77,7 @@ module Appsignal
77
77
  # @return [void]
78
78
  # @api private
79
79
  def run(options = {})
80
+ self.coloring = options.delete(:color) { true }
80
81
  $stdout.sync = true
81
82
  header
82
83
  print_empty_line
@@ -200,7 +201,7 @@ module Appsignal
200
201
  def run_agent_diagnose_mode
201
202
  puts "Agent diagnostics"
202
203
  unless Appsignal.extension_loaded?
203
- puts " Extension is not loaded. No agent report created."
204
+ puts colorize(" Extension is not loaded. No agent report created.", :red)
204
205
  return
205
206
  end
206
207
 
@@ -461,10 +462,11 @@ module Appsignal
461
462
  print " Environment: #{format_config_option(env)}"
462
463
 
463
464
  if env == ""
464
- puts "\n Warning: No environment set, no config loaded!"
465
- puts " Please make sure appsignal diagnose is run within your "
466
- puts " project directory with an environment."
467
- puts " appsignal diagnose --environment=production"
465
+ message = " Warning: No environment set, no config loaded!\n" \
466
+ " Please make sure appsignal diagnose is run within your\n" \
467
+ " project directory with an environment.\n" \
468
+ " appsignal diagnose --environment=production"
469
+ puts "\n#{colorize(message, :red)}"
468
470
  else
469
471
  puts sources_label
470
472
  end
@@ -531,20 +533,19 @@ module Appsignal
531
533
 
532
534
  def check_api_key
533
535
  puts "Validation"
534
- data_section :validation do
535
- auth_check = ::Appsignal::AuthCheck.new(Appsignal.config)
536
- status, error = auth_check.perform_with_result
537
- result =
538
- case status
539
- when "200"
540
- "valid"
541
- when "401"
542
- "invalid"
543
- else
544
- "Failed with status #{status}\n#{error.inspect}"
545
- end
546
- puts_and_save :push_api_key, "Validating Push API key", result
547
- end
536
+ auth_check = ::Appsignal::AuthCheck.new(Appsignal.config)
537
+ status, error = auth_check.perform_with_result
538
+ result, color =
539
+ case status
540
+ when "200"
541
+ ["valid", :green]
542
+ when "401"
543
+ ["invalid", :red]
544
+ else
545
+ ["Failed with status #{status}\n#{error.inspect}", :red]
546
+ end
547
+ data[:validation][:push_api_key] = result
548
+ puts_value "Validating Push API key", colorize(result, color)
548
549
  end
549
550
 
550
551
  def print_paths_section(report)
@@ -7,24 +7,36 @@ module Appsignal
7
7
  module Helpers
8
8
  private
9
9
 
10
+ COLOR_CODES = {
11
+ :red => 31,
12
+ :green => 32,
13
+ :yellow => 33,
14
+ :blue => 34,
15
+ :pink => 35,
16
+ :default => 0
17
+ }.freeze
18
+
10
19
  def ruby_2_6_or_up?
11
20
  Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.6.0")
12
21
  end
13
22
 
23
+ def coloring=(value)
24
+ @coloring = value
25
+ end
26
+
27
+ def coloring?
28
+ return true unless defined?(@coloring)
29
+ @coloring
30
+ end
31
+
14
32
  def colorize(text, color)
33
+ return text unless coloring?
15
34
  return text if Gem.win_platform?
16
35
 
17
- color_code =
18
- case color
19
- when :red then 31
20
- when :green then 32
21
- when :yellow then 33
22
- when :blue then 34
23
- when :pink then 35
24
- else 0
25
- end
36
+ reset_color_code = COLOR_CODES.fetch(:default)
37
+ color_code = COLOR_CODES.fetch(color, reset_color_code)
26
38
 
27
- "\e[#{color_code}m#{text}\e[0m"
39
+ "\e[#{color_code}m#{text}\e[#{reset_color_code}m"
28
40
  end
29
41
 
30
42
  def periods
@@ -13,7 +13,8 @@ module Appsignal
13
13
  EXCLUDED_ENVIRONMENTS = ["test"].freeze
14
14
 
15
15
  class << self
16
- def run(push_api_key)
16
+ def run(push_api_key, options) # rubocop:disable Metrics/AbcSize
17
+ self.coloring = options.delete(:color) { true }
17
18
  $stdout.sync = true
18
19
 
19
20
  puts
@@ -237,11 +237,12 @@ module Appsignal
237
237
  "#{endpoint_uri.scheme}://#{endpoint_uri.host}:#{endpoint_uri.port}"
238
238
  end
239
239
 
240
- if config_hash[:push_api_key]
241
- @valid = true
242
- else
240
+ push_api_key = config_hash[:push_api_key] || ""
241
+ if push_api_key.strip.empty?
243
242
  @valid = false
244
- @logger.error "Push api key not set after loading config"
243
+ @logger.error "Push API key not set after loading config"
244
+ else
245
+ @valid = true
245
246
  end
246
247
  end
247
248
 
@@ -256,8 +257,10 @@ module Appsignal
256
257
  {}.tap do |hash|
257
258
  hash[:log] = "stdout" if Appsignal::System.heroku?
258
259
 
259
- # Make active by default if APPSIGNAL_PUSH_API_KEY is present
260
- hash[:active] = true if ENV["APPSIGNAL_PUSH_API_KEY"]
260
+ # Make AppSignal active by default if APPSIGNAL_PUSH_API_KEY
261
+ # environment variable is present and not empty.
262
+ env_push_api_key = ENV["APPSIGNAL_PUSH_API_KEY"] || ""
263
+ hash[:active] = true unless env_push_api_key.strip.empty?
261
264
  end
262
265
  end
263
266
 
@@ -274,9 +277,17 @@ module Appsignal
274
277
 
275
278
  maintain_backwards_compatibility(config_for_this_env)
276
279
  else
277
- @logger.error "Not loading from config file: config for '#{env}' not found"
280
+ logger.error "Not loading from config file: config for '#{env}' not found"
278
281
  nil
279
282
  end
283
+ rescue => e
284
+ message = "An error occured while loading the AppSignal config file." \
285
+ " Skipping file config.\n" \
286
+ "File: #{config_file.inspect}\n" \
287
+ "#{e.name}: #{e}"
288
+ $stderr.puts "appsignal: #{message}"
289
+ logger.error "#{message}\n#{e.backtrace.join("\n")}"
290
+ nil
280
291
  end
281
292
 
282
293
  # Maintain backwards compatibility with config files generated by earlier
@@ -17,15 +17,15 @@ module Appsignal
17
17
  include Appsignal::Utils::DeprecationMessage
18
18
 
19
19
  def formatters
20
- @@formatters ||= {}
20
+ @formatters ||= {}
21
21
  end
22
22
 
23
23
  def deprecated_formatter_classes
24
- @@deprecated_formatter_classes ||= {}
24
+ @deprecated_formatter_classes ||= {}
25
25
  end
26
26
 
27
27
  def formatter_classes
28
- @@formatter_classes ||= {}
28
+ @formatter_classes ||= {}
29
29
  end
30
30
 
31
31
  def register(name, formatter = nil)
@@ -94,7 +94,7 @@ module Appsignal
94
94
  "https://docs.appsignal.com/ruby/instrumentation/event-formatters.html",
95
95
  logger
96
96
 
97
- deprecated_formatter_classes[name] = self
97
+ EventFormatter.deprecated_formatter_classes[name] = self
98
98
  end
99
99
 
100
100
  def logger
@@ -129,13 +129,13 @@ module Appsignal
129
129
  # @see ProbeCollection
130
130
  # @return [ProbeCollection] Returns list of probes.
131
131
  def probes
132
- @@probes ||= ProbeCollection.new
132
+ @probes ||= ProbeCollection.new
133
133
  end
134
134
 
135
135
  # @api private
136
136
  def start
137
137
  stop
138
- @@thread = Thread.new do
138
+ @thread = Thread.new do
139
139
  sleep initial_wait_time
140
140
  initialize_probes
141
141
  loop do
@@ -157,7 +157,7 @@ module Appsignal
157
157
 
158
158
  # @api private
159
159
  def stop
160
- defined?(@@thread) && @@thread.kill
160
+ defined?(@thread) && @thread.kill
161
161
  probe_instances.clear
162
162
  end
163
163
 
@@ -206,7 +206,7 @@ module Appsignal
206
206
  end
207
207
 
208
208
  def probe_instances
209
- @@probe_instances ||= {}
209
+ @probe_instances ||= {}
210
210
  end
211
211
  end
212
212
  end
@@ -23,9 +23,15 @@ module Appsignal
23
23
  # @see http://docs.appsignal.com/front-end/error-handling.html
24
24
  # @api private
25
25
  class JSExceptionCatcher
26
+ include Appsignal::Utils::DeprecationMessage
27
+
26
28
  def initialize(app, _options = nil)
27
29
  Appsignal.logger.debug \
28
30
  "Initializing Appsignal::Rack::JSExceptionCatcher"
31
+ message = "The Appsignal::Rack::JSExceptionCatcher is deprecated. " \
32
+ "Please use the official AppSignal JavaScript integration instead. " \
33
+ "https://docs.appsignal.com/front-end/"
34
+ deprecation_message message, Appsignal.logger
29
35
  @app = app
30
36
  end
31
37
 
@@ -25,7 +25,7 @@ module Appsignal
25
25
  Thread.current[:appsignal_transaction] = Appsignal::Transaction.new(id, namespace, request, options)
26
26
  else
27
27
  # Otherwise, log the issue about trying to start another transaction
28
- Appsignal.logger.debug "Trying to start new transaction with id " \
28
+ Appsignal.logger.warn "Trying to start new transaction with id " \
29
29
  "'#{id}', but a transaction with id '#{current.transaction_id}' " \
30
30
  "is already running. Using transaction '#{current.transaction_id}'."
31
31
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appsignal
4
- VERSION = "2.9.18".freeze
4
+ VERSION = "2.10.0".freeze
5
5
  end
@@ -2,7 +2,7 @@ require "bundler/cli"
2
2
  require "bundler/cli/common"
3
3
  require "appsignal/cli"
4
4
 
5
- describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_input do
5
+ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_input, :color => false do
6
6
  include CLIHelpers
7
7
 
8
8
  class DiagnosticsReportEndpoint
@@ -24,7 +24,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
24
24
  let(:out_stream) { std_stream }
25
25
  let(:output) { out_stream.read }
26
26
  let(:config) { project_fixture_config }
27
- let(:cli) { described_class }
27
+ let(:cli_class) { described_class }
28
28
  let(:options) { { :environment => config.env } }
29
29
  let(:gem_path) { Bundler::CLI::Common.select_spec("appsignal").full_gem_path.strip }
30
30
  let(:received_report) { DiagnosticsReportEndpoint.received_report }
@@ -34,11 +34,11 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
34
34
  before do
35
35
  # Clear previous reports
36
36
  DiagnosticsReportEndpoint.clear_report!
37
- if cli.instance_variable_defined? :@data
37
+ if cli_class.instance_variable_defined? :@data
38
38
  # Because this is saved on the class rather than an instance of the
39
39
  # class we need to clear it like this in case a certain test doesn't
40
40
  # generate a report.
41
- cli.remove_instance_variable :@data
41
+ cli_class.remove_instance_variable :@data
42
42
  end
43
43
 
44
44
  if DependencyHelper.rails_present?
@@ -54,16 +54,18 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
54
54
  before :api_stub => true do
55
55
  stub_api_request config, "auth"
56
56
  end
57
+ before(:color => false) { options["no-color"] = nil }
58
+ before(:color => true) { options["color"] = nil }
57
59
  before(:send_report => :yes_cli_input) do
58
60
  accept_prompt_to_send_diagnostics_report
59
61
  capture_diagnatics_report_request
60
62
  end
61
63
  before(:send_report => :no_cli_input) { dont_accept_prompt_to_send_diagnostics_report }
62
64
  before(:send_report => :yes_cli_option) do
63
- options[:send_report] = true
65
+ options["send-report"] = nil
64
66
  capture_diagnatics_report_request
65
67
  end
66
- before(:send_report => :no_cli_option) { options[:send_report] = false }
68
+ before(:send_report => :no_cli_option) { options["no-send-report"] = nil }
67
69
  after { Appsignal.config = nil }
68
70
 
69
71
  def capture_diagnatics_report_request
@@ -77,7 +79,7 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
77
79
  def run_within_dir(chdir)
78
80
  prepare_cli_input
79
81
  Dir.chdir chdir do
80
- capture_stdout(out_stream) { cli.run(options) }
82
+ capture_stdout(out_stream) { run_cli("diagnose", options) }
81
83
  end
82
84
  end
83
85
 
@@ -228,6 +230,14 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
228
230
 
229
231
  it "outputs extension is not loaded" do
230
232
  expect(output).to include "Extension loaded: false"
233
+ expect(output).to include "Extension is not loaded. No agent report created."
234
+ end
235
+
236
+ context "with color", :color => true do
237
+ it "outputs extension is not loaded in color" do
238
+ expect(output).to have_colorized_text :red,
239
+ " Extension is not loaded. No agent report created."
240
+ end
231
241
  end
232
242
 
233
243
  it "transmits extension_loaded: false in report" do
@@ -682,6 +692,12 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
682
692
  context "without environment" do
683
693
  let(:config) { project_fixture_config(nil) }
684
694
  let(:options) { {} }
695
+ let(:warning_message) do
696
+ " Warning: No environment set, no config loaded!\n" \
697
+ " Please make sure appsignal diagnose is run within your\n" \
698
+ " project directory with an environment.\n" \
699
+ " appsignal diagnose --environment=production"
700
+ end
685
701
  before do
686
702
  ENV.delete("RAILS_ENV") # From spec_helper
687
703
  ENV.delete("RACK_ENV")
@@ -689,10 +705,15 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
689
705
  end
690
706
 
691
707
  it "outputs a warning that no config is loaded" do
692
- expect(output).to include \
693
- "Environment: \"\"\n",
694
- " Warning: No environment set, no config loaded!",
695
- " appsignal diagnose --environment=production"
708
+ expect(output).to include "Environment: \"\"\n#{warning_message}"
709
+ expect(output).to_not have_color_markers
710
+ end
711
+
712
+ context "with color", :color => true do
713
+ it "outputs a warning that no config is loaded in color" do
714
+ expect(output).to include "Environment: \"\"\n"
715
+ expect(output).to have_colorized_text :red, warning_message
716
+ end
696
717
  end
697
718
 
698
719
  it "outputs config defaults" do
@@ -890,6 +911,13 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
890
911
  "Validating Push API key: valid"
891
912
  end
892
913
 
914
+ context "with color", :color => true do
915
+ it "outputs valid in color" do
916
+ expect(output).to include "Validation",
917
+ "Validating Push API key: #{colorize("valid", :green)}"
918
+ end
919
+ end
920
+
893
921
  it "transmits validation in report" do
894
922
  expect(received_report).to include(
895
923
  "validation" => {
@@ -910,6 +938,13 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
910
938
  "Validating Push API key: invalid"
911
939
  end
912
940
 
941
+ context "with color", :color => true do
942
+ it "outputs invalid in color" do
943
+ expect(output).to include "Validation",
944
+ "Validating Push API key: #{colorize("invalid", :red)}"
945
+ end
946
+ end
947
+
913
948
  it "transmits validation in report" do
914
949
  expect(received_report).to include(
915
950
  "validation" => {
@@ -931,6 +966,14 @@ describe Appsignal::CLI::Diagnose, :api_stub => true, :send_report => :yes_cli_i
931
966
  %("Could not confirm authorization: 500")
932
967
  end
933
968
 
969
+ context "with color", :color => true do
970
+ it "outputs error in color" do
971
+ expect(output).to include "Validation",
972
+ "Validating Push API key: " +
973
+ colorize(%(Failed with status 500\n"Could not confirm authorization: 500"), :red)
974
+ end
975
+ end
976
+
934
977
  it "transmits validation in report" do
935
978
  expect(received_report).to include(
936
979
  "validation" => {