module YetiLogger::TestHelper

Helper methods for tests that interact with the Logging system

Public Instance Methods

expect_to_not_see_log_message(message, level = :debug, &block) click to toggle source

Execute a block and ensure that the supplied log message is not among the messages logged at the specified level.

# File lib/yeti_logger/test_helper.rb, line 49
def expect_to_not_see_log_message(message, level = :debug, &block)
  expect_to_not_see_log_messages([message], level, &block)
end
expect_to_not_see_log_messages(messages, level = :debug, &block) click to toggle source

Plural version of above

# File lib/yeti_logger/test_helper.rb, line 54
def expect_to_not_see_log_messages(messages, level = :debug, &block)
  log_messages = get_log_messages(level, &block)

  found = messages.find do |message|
    if message.is_a?(Regexp)
      log_messages.find do |log_message|
        log_message =~ message
      end
    else
      log_messages.include?(message)
    end
  end

  if found.present?
    fail "Should not have found #{found.inspect} amongst #{log_messages.inspect}"
  end
end
expect_to_see_log_message(message, level = :debug, &block) click to toggle source

Execute a block and ensure that among all the log messages received, message is among them. Not as elegant as a should_log type of method, but I can't figure out how to inject that into the rspec framework so it's evaluated after the method is done being called like should_receive's are.

# File lib/yeti_logger/test_helper.rb, line 21
def expect_to_see_log_message(message, level = :debug, &block)
  expect_to_see_log_messages([message], level, &block)
end
expect_to_see_log_messages(messages, level = :debug, &block) click to toggle source

Plural version of above

# File lib/yeti_logger/test_helper.rb, line 26
def expect_to_see_log_messages(messages, level = :debug, &block)
  log_messages = get_log_messages(level, &block)

  # Find each message, removing the first occurrence.
  messages.each do |message|
    if message.is_a?(Regexp)
      found = log_messages.find do |log_message|
        log_message =~ message
      end
      if found
        log_messages.delete_at(log_messages.find_index(found))
      else
        fail "Should have found #{message.inspect} amongst #{log_messages.inspect}"
      end
    else
      expect(log_messages).to include(message)
      log_messages.delete_at(log_messages.find_index(message))
    end
  end
end
get_log_messages(level = :debug, &block) click to toggle source
# File lib/yeti_logger/test_helper.rb, line 72
def get_log_messages(level = :debug, &block)
  log_messages = []

  allow(YetiLogger.logger).to receive(level) do |log_line|
    log_messages << log_line
  end

  block.call

  # There is no unstub in rspec 3, but the closest to that would be to
  # continue to stub it, but defer to the original implementation.
  allow(YetiLogger.logger).to receive(level).and_call_original

  log_messages
end
should_log(level = :info) click to toggle source
# File lib/yeti_logger/test_helper.rb, line 88
def should_log(level = :info)
  expect(YetiLogger.logger).to(receive(level))
end
should_not_log(level = :info) click to toggle source
# File lib/yeti_logger/test_helper.rb, line 92
def should_not_log(level = :info)
  expect(YetiLogger.logger).to_not(receive(level))
end
with_log_level(level = Logger::DEBUG) { || ... } click to toggle source

Execute a block within the context of a changed log level. This will ensure the level is returned to is original state upon exit.

# File lib/yeti_logger/test_helper.rb, line 7
def with_log_level(level = Logger::DEBUG)
  orig_level = YetiLogger.logger.level
  begin
    YetiLogger.logger.level = level
    yield
  ensure
    YetiLogger.logger.level = orig_level
  end
end