appsignal 2.9.18-java → 2.10.0-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 (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: 2a0dab6e858e72756c796b4c0b4c6d6a131baf35478caf0d74cc7c7301426ed4
4
- data.tar.gz: b16b94135fc7f014ec2a3b5b6904696d6b262972bb229d908f3d0c7f2f6bb6ff
3
+ metadata.gz: 2dad61f29ac406162e596243322f25b61b71f4c89824ea15339d809bc1f2eff7
4
+ data.tar.gz: 6a313f7d4502f6b68539207168d54d8ff525ceb4c79b1b7fe7f1b52b6ba57403
5
5
  SHA512:
6
- metadata.gz: 01e69384f0cae7f784820073c53be90e7e658419b54c54c7487edc0080299d70d44dbf6e33d10924ef7af55a061a3dc1518acd9d6f57c7ce3a8ce60e397fb7bc
7
- data.tar.gz: fc32dfdfb9beadac21752e730340306674948458a2cc260d66e5dca646efa4bfe7a6c44e01d62a17844f229a08562d55534651c7744d82a9da8c98a8e23e9869
6
+ metadata.gz: c1df6bcedb0812080ccc0ada7386b9421b115556e9ebd266b7b4e27f5c70f4f2d33706faacc2e354dc965a1bbb07e7398a638f7686a2c16fafcb3a733bf498bf
7
+ data.tar.gz: ce2f3064a2e8c1361253283a20f29adddea75b49c308fc0f72951c424b20a876cb0d89e172d2a82a7c1ea8a7983c58553d5f8aed8fa59119f1bd42406fbed8ec
@@ -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" => {