Module: Sentry::TestHelper

Defined in:
lib/sentry/test_helper.rb

Constant Summary collapse

DUMMY_DSN =
"http://12345:67890@sentry.localdomain/sentry/42"

Instance Method Summary collapse

Instance Method Details

#extract_sentry_exceptions(event) ⇒ Array<Sentry::SingleExceptionInterface>

Extracts SDK’s internal exception container (not actual exception objects) from an given event.

[View source]

83
84
85
# File 'lib/sentry/test_helper.rb', line 83

def extract_sentry_exceptions(event)
  event&.exception&.values || []
end

#last_sentry_eventEvent?

Returns the last captured event object.

Returns:

[View source]

77
78
79
# File 'lib/sentry/test_helper.rb', line 77

def last_sentry_event
  sentry_events.last
end

#reset_sentry_globals!Object

[View source]

87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/sentry/test_helper.rb', line 87

def reset_sentry_globals!
  Sentry::MUTEX.synchronize do
    # Don't check initialized? because sometimes we stub it in tests
    if Sentry.instance_variable_defined?(:@main_hub)
      Sentry::GLOBALS.each do |var|
        Sentry.instance_variable_set(:"@#{var}", nil)
      end

      Thread.current.thread_variable_set(Sentry::THREAD_LOCAL, nil)
    end
  end
end

#sentry_envelopesArray<Envelope>

Returns the captured envelope objects.

Returns:

[View source]

71
72
73
# File 'lib/sentry/test_helper.rb', line 71

def sentry_envelopes
  sentry_transport.envelopes
end

#sentry_eventsArray<Event>

Returns the captured event objects.

Returns:

[View source]

65
66
67
# File 'lib/sentry/test_helper.rb', line 65

def sentry_events
  sentry_transport.events
end

#sentry_transportTransport

Returns:

[View source]

59
60
61
# File 'lib/sentry/test_helper.rb', line 59

def sentry_transport
  Sentry.get_current_client.transport
end

#setup_sentry_test {|config| ... } ⇒ void

This method returns an undefined value.

Alters the existing SDK configuration with test-suitable options. Mainly:

  • Sets a dummy DSN instead of ‘nil` or an actual DSN.

  • Sets the transport to DummyTransport, which allows easy access to the captured events.

  • Disables background worker.

  • Makes sure the SDK is enabled under the current environment (“test” in most cases).

It should be called before every test case.

Yield Parameters:

[View source]

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
# File 'lib/sentry/test_helper.rb', line 17

def setup_sentry_test(&block)
  raise "please make sure the SDK is initialized for testing" unless Sentry.initialized?
  dummy_config = Sentry.configuration.dup
  # configure dummy DSN, so the events will not be sent to the actual service
  dummy_config.dsn = DUMMY_DSN
  # set transport to DummyTransport, so we can easily intercept the captured events
  dummy_config.transport.transport_class = Sentry::DummyTransport
  # make sure SDK allows sending under the current environment
  dummy_config.enabled_environments += [dummy_config.environment] unless dummy_config.enabled_environments.include?(dummy_config.environment)
  # disble async event sending
  dummy_config.background_worker_threads = 0

  # user can overwrite some of the configs, with a few exceptions like:
  # - include_local_variables
  # - auto_session_tracking
  block&.call(dummy_config)

  # the base layer's client should already use the dummy config so nothing will be sent by accident
  base_client = Sentry::Client.new(dummy_config)
  Sentry.get_current_hub.bind_client(base_client)
  # create a new layer so mutations made to the testing scope or configuration could be simply popped later
  Sentry.get_current_hub.push_scope
  test_client = Sentry::Client.new(dummy_config.dup)
  Sentry.get_current_hub.bind_client(test_client)
end

#teardown_sentry_testvoid

This method returns an undefined value.

Clears all stored events and envelopes. It should be called after every test case.

[View source]

46
47
48
49
50
51
52
53
54
55
56
# File 'lib/sentry/test_helper.rb', line 46

def teardown_sentry_test
  return unless Sentry.initialized?

  # pop testing layer created by `setup_sentry_test`
  # but keep the base layer to avoid nil-pointer errors
  # TODO: find a way to notify users if they somehow popped the test layer before calling this method
  if Sentry.get_current_hub.instance_variable_get(:@stack).size > 1
    Sentry.get_current_hub.pop_scope
  end
  Sentry::Scope.global_event_processors.clear
end