diff --git a/changelog/fix_an_incorrect_autocorrect_for_rails_freeze_time.md b/changelog/fix_an_incorrect_autocorrect_for_rails_freeze_time.md new file mode 100644 index 0000000000..0fdd38a0df --- /dev/null +++ b/changelog/fix_an_incorrect_autocorrect_for_rails_freeze_time.md @@ -0,0 +1 @@ +* [#764](https://github.com/rubocop/rubocop-rails/issues/764): Fix an incorrect autocorrect for `Rails/FreezeTime` when using `travel_to` with an argument of the current time and proc argument. ([@koic][]) diff --git a/lib/rubocop/cop/rails/freeze_time.rb b/lib/rubocop/cop/rails/freeze_time.rb index 21d2748544..77438bc3c3 100644 --- a/lib/rubocop/cop/rails/freeze_time.rb +++ b/lib/rubocop/cop/rails/freeze_time.rb @@ -46,7 +46,11 @@ def on_send(node) child_node, method_name = *node.first_argument.children return unless current_time?(child_node, method_name) || current_time_with_convert?(child_node, method_name) - add_offense(node) { |corrector| corrector.replace(node, 'freeze_time') } + add_offense(node) do |corrector| + last_argument = node.last_argument + freeze_time_method = last_argument.block_pass_type? ? "freeze_time(#{last_argument.source})" : 'freeze_time' + corrector.replace(node, freeze_time_method) + end end private diff --git a/spec/rubocop/cop/rails/freeze_time_spec.rb b/spec/rubocop/cop/rails/freeze_time_spec.rb index 12c3b91b37..66b0f5efdb 100644 --- a/spec/rubocop/cop/rails/freeze_time_spec.rb +++ b/spec/rubocop/cop/rails/freeze_time_spec.rb @@ -56,6 +56,21 @@ RUBY end + it 'registers an offense when using `travel_to` with an argument of the current time and proc argument' do + expect_offense(<<~RUBY) + around do |example| + travel_to(Time.current, &example) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `freeze_time` instead of `travel_to`. + end + RUBY + + expect_correction(<<~RUBY) + around do |example| + freeze_time(&example) + end + RUBY + end + it 'does not register an offense when using `freeze_time`' do expect_no_offenses(<<~RUBY) freeze_time