Module: SemanticLogger::Test::RSpec

Defined in:
lib/semantic_logger/test/rspec.rb

Overview

RSpec matchers and helpers for asserting on Semantic Logger events.

These mirror the Minitest helpers in SemanticLogger::Test::Minitest.

Enable them once, in spec_helper.rb:

require "semantic_logger/test/rspec"

RSpec.configure do |config|
config.include SemanticLogger::Test::RSpec
end

Capture the events emitted whilst running a block, then assert on them:

events = capture_semantic_logger_events { User.new.enable! }
expect(events.first).to be_a_semantic_logger_event(level: :info, message: "User enabled")

Or assert directly that a block logs a matching event:

expect { User.new.enable! }.to(
log_semantic_logger_event(level: :info, message: "User enabled")
)

Defined Under Namespace

Classes: EventMatcher, LogEventMatcher

Constant Summary collapse

EVENT_ATTRIBUTES =

Attributes that may be asserted on a single log event. The keys map directly onto SemanticLogger::Log attributes, except for the *_includes variants which assert a partial (substring / subset) match.

%i[
  level name message thread_name tags named_tags context
  metric metric_amount dimensions level_index duration time
  exception backtrace payload
].freeze

Instance Method Summary collapse

Instance Method Details

#a_semantic_logger_event(**expected) ⇒ Object

Composable alias, for use inside other matchers:

expect(events).to include(a_semantic_logger_event(message: "Hi"))


224
225
226
# File 'lib/semantic_logger/test/rspec.rb', line 224

def a_semantic_logger_event(**expected)
  EventMatcher.new(**expected)
end

#be_a_semantic_logger_event(**expected) ⇒ Object

Matcher for a single captured log event.

expect(events.first).to be_a_semantic_logger_event(level: :info, message: "Hi")


217
218
219
# File 'lib/semantic_logger/test/rspec.rb', line 217

def be_a_semantic_logger_event(**expected)
  EventMatcher.new(**expected)
end

#capture_semantic_logger_events(klass = nil, silence: :trace, &block) ⇒ Object

Returns [ArraySemanticLogger::Log] the log events captured whilst running the supplied block.

Notes:

  • All log events are captured regardless of the global default log level.
  • Pass a class to capture only events logged through that class's logger. Otherwise every log event in the process is captured for the duration of the block.


197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
# File 'lib/semantic_logger/test/rspec.rb', line 197

def capture_semantic_logger_events(klass = nil, silence: :trace, &block)
  logger = SemanticLogger::Test::CaptureLogEvents.new

  if klass
    allow(klass).to receive(:logger).and_return(logger)
    block.call
  elsif silence
    SemanticLogger.silence(silence) do
      stub_processor(logger, &block)
    end
  else
    stub_processor(logger, &block)
  end

  logger.events
end

#log_semantic_logger_event(on: nil, **expected) ⇒ Object

Block matcher asserting that the block logs a matching event.

expect { User.new.enable! }.to(
log_semantic_logger_event(level: :info, message: "User enabled")
)

Pass on: to capture only one class's events.



235
236
237
# File 'lib/semantic_logger/test/rspec.rb', line 235

def log_semantic_logger_event(on: nil, **expected)
  LogEventMatcher.new(method(:capture_semantic_logger_events), on: on, expected: expected)
end