Class: RuboCop::Cop::DevDoc::Test::AvoidGlibTravelFreeze

Inherits:
Base
  • Object
show all
Defined in:
lib/rubocop/cop/dev_doc/test/avoid_glib_travel_freeze.rb

Overview

Flag ‘glib_travel_freeze` calls in test files — use `glib_travel` instead.

## Rationale ‘glib_travel_freeze` stops the clock completely, which is not representative of real-world behavior: in production, time ticks as code executes. We have had bugs that went undetected in tests because `glib_travel_freeze` masked timing issues, only to surface in production.

‘glib_travel` advances time normally inside the block — use it instead. Reserve `glib_travel_freeze` only as a last resort when `glib_travel` truly cannot work for a specific test, and document why.

## Escape hatch Disable per-line with a comment explaining why ‘glib_travel` doesn’t work:

glib_travel_freeze(time) do  # rubocop:disable DevDoc/Test/AvoidGlibTravelFreeze
  # Reason: <explanation>
end

Examples:

# bad
glib_travel_freeze(Time.current) do
  expect(order.expired?).to be true
end

# bad (non-block form)
glib_travel_freeze(Time.current)
expect(order.expired?).to be true

# good
glib_travel(Time.current) do
  expect(order.expired?).to be true
end

Constant Summary collapse

MSG =
'Avoid `glib_travel_freeze` — use `glib_travel` instead. ' \
'Frozen time masks timing bugs that surface in production. ' \
'Use `# rubocop:disable DevDoc/Test/AvoidGlibTravelFreeze` ' \
'with a comment explaining why `glib_travel` cannot work for this test.'
RESTRICT_ON_SEND =
%i[glib_travel_freeze].freeze

Instance Method Summary collapse

Instance Method Details

#on_send(node) ⇒ Object



46
47
48
# File 'lib/rubocop/cop/dev_doc/test/avoid_glib_travel_freeze.rb', line 46

def on_send(node)
  add_offense(node.loc.selector)
end