Commit 91fd974f authored by Rémy Coutable's avatar Rémy Coutable

Merge branch 'Fix-RSpec/TimecopTravel-offenses-(Part-2/2)' into 'master'

Fix RSpec/TimecopTravel offenses (Part 2/2)

See merge request gitlab-org/gitlab!76034
parents b598005c 6a092c05
...@@ -7,15 +7,5 @@ RSpec/TimecopTravel: ...@@ -7,15 +7,5 @@ RSpec/TimecopTravel:
- ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb - ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb
- ee/spec/models/broadcast_message_spec.rb - ee/spec/models/broadcast_message_spec.rb
- ee/spec/models/burndown_spec.rb - ee/spec/models/burndown_spec.rb
- qa/spec/support/repeater_spec.rb
- spec/features/users/terms_spec.rb
- spec/lib/feature_spec.rb
- spec/models/broadcast_message_spec.rb
- spec/models/concerns/issuable_spec.rb
- spec/requests/api/ci/runner/jobs_trace_spec.rb
- spec/requests/api/issues/put_projects_issues_spec.rb
- spec/support/shared_contexts/cache_allowed_users_in_namespace_shared_context.rb
- spec/support/shared_examples/requests/api/time_tracking_shared_examples.rb
- spec/support/shared_examples/workers/concerns/reenqueuer_shared_examples.rb
- spec/workers/concerns/reenqueuer_spec.rb - spec/workers/concerns/reenqueuer_spec.rb
- spec/lib/gitlab/analytics/cycle_analytics/median_spec.rb - qa/spec/support/repeater_spec.rb
...@@ -99,7 +99,7 @@ RSpec.describe 'Users > Terms', :js do ...@@ -99,7 +99,7 @@ RSpec.describe 'Users > Terms', :js do
enforce_terms enforce_terms
# Application settings are cached for a minute # Application settings are cached for a minute
Timecop.travel 2.minutes do travel_to 2.minutes.from_now do
within('.nav-sidebar') do within('.nav-sidebar') do
click_link 'Issues' click_link 'Issues'
end end
......
...@@ -257,7 +257,7 @@ RSpec.describe Feature, stub_feature_flags: false do ...@@ -257,7 +257,7 @@ RSpec.describe Feature, stub_feature_flags: false do
end end
it 'caches the status in L2 cache after 2 minutes' do it 'caches the status in L2 cache after 2 minutes' do
Timecop.travel 2.minutes do travel_to 2.minutes.from_now do
expect do expect do
expect(described_class.send(:l1_cache_backend)).to receive(:fetch).once.and_call_original expect(described_class.send(:l1_cache_backend)).to receive(:fetch).once.and_call_original
expect(described_class.send(:l2_cache_backend)).to receive(:fetch).once.and_call_original expect(described_class.send(:l2_cache_backend)).to receive(:fetch).once.and_call_original
...@@ -267,7 +267,7 @@ RSpec.describe Feature, stub_feature_flags: false do ...@@ -267,7 +267,7 @@ RSpec.describe Feature, stub_feature_flags: false do
end end
it 'fetches the status after an hour' do it 'fetches the status after an hour' do
Timecop.travel 61.minutes do travel_to 61.minutes.from_now do
expect do expect do
expect(described_class.send(:l1_cache_backend)).to receive(:fetch).once.and_call_original expect(described_class.send(:l1_cache_backend)).to receive(:fetch).once.and_call_original
expect(described_class.send(:l2_cache_backend)).to receive(:fetch).once.and_call_original expect(described_class.send(:l2_cache_backend)).to receive(:fetch).once.and_call_original
......
...@@ -30,11 +30,11 @@ RSpec.describe Gitlab::Analytics::CycleAnalytics::Median do ...@@ -30,11 +30,11 @@ RSpec.describe Gitlab::Analytics::CycleAnalytics::Median do
merge_request1 = create(:merge_request, source_branch: '1', target_project: project, source_project: project) merge_request1 = create(:merge_request, source_branch: '1', target_project: project, source_project: project)
merge_request2 = create(:merge_request, source_branch: '2', target_project: project, source_project: project) merge_request2 = create(:merge_request, source_branch: '2', target_project: project, source_project: project)
Timecop.travel(5.minutes.from_now) do travel_to(5.minutes.from_now) do
merge_request1.metrics.update!(merged_at: Time.zone.now) merge_request1.metrics.update!(merged_at: Time.zone.now)
end end
Timecop.travel(10.minutes.from_now) do travel_to(10.minutes.from_now) do
merge_request2.metrics.update!(merged_at: Time.zone.now) merge_request2.metrics.update!(merged_at: Time.zone.now)
end end
......
...@@ -62,7 +62,7 @@ RSpec.describe BroadcastMessage do ...@@ -62,7 +62,7 @@ RSpec.describe BroadcastMessage do
subject.call subject.call
Timecop.travel(3.weeks) do travel_to(3.weeks.from_now) do
subject.call subject.call
end end
end end
...@@ -73,7 +73,7 @@ RSpec.describe BroadcastMessage do ...@@ -73,7 +73,7 @@ RSpec.describe BroadcastMessage do
expect(subject.call).to match_array([message]) expect(subject.call).to match_array([message])
expect(described_class.cache).to receive(:expire).and_call_original expect(described_class.cache).to receive(:expire).and_call_original
Timecop.travel(1.week) do travel_to(1.week.from_now) do
2.times { expect(subject.call).to be_empty } 2.times { expect(subject.call).to be_empty }
end end
end end
...@@ -96,7 +96,7 @@ RSpec.describe BroadcastMessage do ...@@ -96,7 +96,7 @@ RSpec.describe BroadcastMessage do
expect(subject.call.length).to eq(1) expect(subject.call.length).to eq(1)
Timecop.travel(future.starts_at) do travel_to(future.starts_at + 1.second) do
expect(subject.call.length).to eq(2) expect(subject.call.length).to eq(2)
end end
end end
......
...@@ -798,7 +798,7 @@ RSpec.describe Issuable do ...@@ -798,7 +798,7 @@ RSpec.describe Issuable do
it 'updates issues updated_at' do it 'updates issues updated_at' do
issue issue
Timecop.travel(1.minute.from_now) do travel_to(2.minutes.from_now) do
expect { spend_time(1800) }.to change { issue.updated_at } expect { spend_time(1800) }.to change { issue.updated_at }
end end
end end
...@@ -823,7 +823,7 @@ RSpec.describe Issuable do ...@@ -823,7 +823,7 @@ RSpec.describe Issuable do
context 'when time to subtract exceeds the total time spent' do context 'when time to subtract exceeds the total time spent' do
it 'raise a validation error' do it 'raise a validation error' do
Timecop.travel(1.minute.from_now) do travel_to(1.minute.from_now) do
expect do expect do
expect do expect do
spend_time(-3600) spend_time(-3600)
......
...@@ -35,7 +35,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_trace_chunks do ...@@ -35,7 +35,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_trace_chunks do
let(:headers) { { API::Ci::Helpers::Runner::JOB_TOKEN_HEADER => job.token, 'Content-Type' => 'text/plain' } } let(:headers) { { API::Ci::Helpers::Runner::JOB_TOKEN_HEADER => job.token, 'Content-Type' => 'text/plain' } }
let(:headers_with_range) { headers.merge({ 'Content-Range' => '11-20' }) } let(:headers_with_range) { headers.merge({ 'Content-Range' => '11-20' }) }
let(:update_interval) { 10.seconds.to_i } let(:update_interval) { 10.seconds }
before do before do
initial_patch_the_trace initial_patch_the_trace
...@@ -81,7 +81,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_trace_chunks do ...@@ -81,7 +81,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_trace_chunks do
end end
context 'when job was not updated recently' do context 'when job was not updated recently' do
let(:update_interval) { 15.minutes.to_i } let(:update_interval) { 16.minutes }
it { expect { patch_the_trace }.to change { job.updated_at } } it { expect { patch_the_trace }.to change { job.updated_at } }
...@@ -293,10 +293,10 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_trace_chunks do ...@@ -293,10 +293,10 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_trace_chunks do
end end
end end
Timecop.travel(job.updated_at + update_interval) do travel_to(job.updated_at + update_interval) do
patch api("/jobs/#{job_id}/trace"), params: content, headers: request_headers patch api("/jobs/#{job_id}/trace"), params: content, headers: request_headers
job.reload
end end
job.reload
end end
def initial_patch_the_trace def initial_patch_the_trace
......
...@@ -323,44 +323,44 @@ RSpec.describe API::Issues do ...@@ -323,44 +323,44 @@ RSpec.describe API::Issues do
end end
it 'removes all labels and touches the record' do it 'removes all labels and touches the record' do
Timecop.travel(1.minute.from_now) do travel_to(2.minutes.from_now) do
put api_for_user, params: { labels: '' } put api_for_user, params: { labels: '' }
end end
expect(response).to have_gitlab_http_status(:ok) expect(response).to have_gitlab_http_status(:ok)
expect(json_response['labels']).to eq([]) expect(json_response['labels']).to eq([])
expect(json_response['updated_at']).to be > Time.now expect(json_response['updated_at']).to be > Time.current
end end
it 'removes all labels and touches the record with labels param as array' do it 'removes all labels and touches the record with labels param as array' do
Timecop.travel(1.minute.from_now) do travel_to(2.minutes.from_now) do
put api_for_user, params: { labels: [''] } put api_for_user, params: { labels: [''] }
end end
expect(response).to have_gitlab_http_status(:ok) expect(response).to have_gitlab_http_status(:ok)
expect(json_response['labels']).to eq([]) expect(json_response['labels']).to eq([])
expect(json_response['updated_at']).to be > Time.now expect(json_response['updated_at']).to be > Time.current
end end
it 'updates labels and touches the record' do it 'updates labels and touches the record' do
Timecop.travel(1.minute.from_now) do travel_to(2.minutes.from_now) do
put api_for_user, params: { labels: 'foo,bar' } put api_for_user, params: { labels: 'foo,bar' }
end end
expect(response).to have_gitlab_http_status(:ok) expect(response).to have_gitlab_http_status(:ok)
expect(json_response['labels']).to contain_exactly('foo', 'bar') expect(json_response['labels']).to contain_exactly('foo', 'bar')
expect(json_response['updated_at']).to be > Time.now expect(json_response['updated_at']).to be > Time.current
end end
it 'updates labels and touches the record with labels param as array' do it 'updates labels and touches the record with labels param as array' do
Timecop.travel(1.minute.from_now) do travel_to(2.minutes.from_now) do
put api_for_user, params: { labels: %w(foo bar) } put api_for_user, params: { labels: %w(foo bar) }
end end
expect(response).to have_gitlab_http_status(:ok) expect(response).to have_gitlab_http_status(:ok)
expect(json_response['labels']).to include 'foo' expect(json_response['labels']).to include 'foo'
expect(json_response['labels']).to include 'bar' expect(json_response['labels']).to include 'bar'
expect(json_response['updated_at']).to be > Time.now expect(json_response['updated_at']).to be > Time.current
end end
it 'allows special label names' do it 'allows special label names' do
......
...@@ -10,7 +10,7 @@ RSpec.shared_examples 'allowed user IDs are cached' do ...@@ -10,7 +10,7 @@ RSpec.shared_examples 'allowed user IDs are cached' do
end end
it 'caches the allowed user IDs in L1 cache for 1 minute', :use_clean_rails_memory_store_caching do it 'caches the allowed user IDs in L1 cache for 1 minute', :use_clean_rails_memory_store_caching do
Timecop.travel 2.minutes do travel_to 2.minutes.from_now do
expect do expect do
expect(described_class.l1_cache_backend).to receive(:fetch).and_call_original expect(described_class.l1_cache_backend).to receive(:fetch).and_call_original
expect(described_class.l2_cache_backend).to receive(:fetch).and_call_original expect(described_class.l2_cache_backend).to receive(:fetch).and_call_original
...@@ -20,7 +20,7 @@ RSpec.shared_examples 'allowed user IDs are cached' do ...@@ -20,7 +20,7 @@ RSpec.shared_examples 'allowed user IDs are cached' do
end end
it 'caches the allowed user IDs in L2 cache for 5 minutes', :use_clean_rails_memory_store_caching do it 'caches the allowed user IDs in L2 cache for 5 minutes', :use_clean_rails_memory_store_caching do
Timecop.travel 6.minutes do travel_to 6.minutes.from_now do
expect do expect do
expect(described_class.l1_cache_backend).to receive(:fetch).and_call_original expect(described_class.l1_cache_backend).to receive(:fetch).and_call_original
expect(described_class.l2_cache_backend).to receive(:fetch).and_call_original expect(described_class.l2_cache_backend).to receive(:fetch).and_call_original
......
...@@ -86,7 +86,7 @@ RSpec.shared_examples 'time tracking endpoints' do |issuable_name| ...@@ -86,7 +86,7 @@ RSpec.shared_examples 'time tracking endpoints' do |issuable_name|
end end
it "add spent time for #{issuable_name}" do it "add spent time for #{issuable_name}" do
Timecop.travel(1.minute.from_now) do travel_to(2.minutes.from_now) do
expect do expect do
post api("/projects/#{project.id}/#{issuable_collection_name}/#{issuable.iid}/add_spent_time", user), params: { duration: '2h' } post api("/projects/#{project.id}/#{issuable_collection_name}/#{issuable.iid}/add_spent_time", user), params: { duration: '2h' }
end.to change { issuable.reload.updated_at } end.to change { issuable.reload.updated_at }
...@@ -98,7 +98,7 @@ RSpec.shared_examples 'time tracking endpoints' do |issuable_name| ...@@ -98,7 +98,7 @@ RSpec.shared_examples 'time tracking endpoints' do |issuable_name|
context 'when subtracting time' do context 'when subtracting time' do
it 'subtracts time of the total spent time' do it 'subtracts time of the total spent time' do
Timecop.travel(1.minute.from_now) do travel_to(2.minutes.from_now) do
expect do expect do
issuable.update!(spend_time: { duration: 7200, user_id: user.id }) issuable.update!(spend_time: { duration: 7200, user_id: user.id })
end.to change { issuable.reload.updated_at } end.to change { issuable.reload.updated_at }
...@@ -115,7 +115,7 @@ RSpec.shared_examples 'time tracking endpoints' do |issuable_name| ...@@ -115,7 +115,7 @@ RSpec.shared_examples 'time tracking endpoints' do |issuable_name|
it 'does not modify the total time spent' do it 'does not modify the total time spent' do
issuable.update!(spend_time: { duration: 7200, user_id: user.id }) issuable.update!(spend_time: { duration: 7200, user_id: user.id })
Timecop.travel(1.minute.from_now) do travel_to(2.minutes.from_now) do
expect do expect do
post api("/projects/#{project.id}/#{issuable_collection_name}/#{issuable.iid}/add_spent_time", user), params: { duration: '-1w' } post api("/projects/#{project.id}/#{issuable_collection_name}/#{issuable.iid}/add_spent_time", user), params: { duration: '-1w' }
end.not_to change { issuable.reload.updated_at } end.not_to change { issuable.reload.updated_at }
...@@ -160,7 +160,7 @@ RSpec.shared_examples 'time tracking endpoints' do |issuable_name| ...@@ -160,7 +160,7 @@ RSpec.shared_examples 'time tracking endpoints' do |issuable_name|
end end
it "resets spent time for #{issuable_name}" do it "resets spent time for #{issuable_name}" do
Timecop.travel(1.minute.from_now) do travel_to(2.minutes.from_now) do
expect do expect do
post api("/projects/#{project.id}/#{issuable_collection_name}/#{issuable.iid}/reset_spent_time", user) post api("/projects/#{project.id}/#{issuable_collection_name}/#{issuable.iid}/reset_spent_time", user)
end.to change { issuable.reload.updated_at } end.to change { issuable.reload.updated_at }
......
...@@ -30,18 +30,11 @@ end ...@@ -30,18 +30,11 @@ end
# `job_args` to be arguments to #perform if it takes arguments # `job_args` to be arguments to #perform if it takes arguments
RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_duration| RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_duration|
before do before do
# Allow Timecop freeze and travel without the block form freeze_time
Timecop.safe_mode = false
Timecop.freeze
time_travel_during_perform(actual_duration) time_travel_during_perform(actual_duration)
end end
after do
Timecop.return
Timecop.safe_mode = true
end
let(:subject_perform) { defined?(job_args) ? subject.perform(job_args) : subject.perform } let(:subject_perform) { defined?(job_args) ? subject.perform(job_args) : subject.perform }
context 'when the work finishes in 0 seconds' do context 'when the work finishes in 0 seconds' do
...@@ -58,7 +51,7 @@ RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_durat ...@@ -58,7 +51,7 @@ RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_durat
let(:actual_duration) { 0.1 * minimum_duration } let(:actual_duration) { 0.1 * minimum_duration }
it 'sleeps 90% of minimum duration' do it 'sleeps 90% of minimum duration' do
expect(subject).to receive(:sleep).with(a_value_within(0.01).of(0.9 * minimum_duration)) expect(subject).to receive(:sleep).with(a_value_within(1).of(0.9 * minimum_duration))
subject_perform subject_perform
end end
...@@ -68,7 +61,7 @@ RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_durat ...@@ -68,7 +61,7 @@ RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_durat
let(:actual_duration) { 0.9 * minimum_duration } let(:actual_duration) { 0.9 * minimum_duration }
it 'sleeps 10% of minimum duration' do it 'sleeps 10% of minimum duration' do
expect(subject).to receive(:sleep).with(a_value_within(0.01).of(0.1 * minimum_duration)) expect(subject).to receive(:sleep).with(a_value_within(1).of(0.1 * minimum_duration))
subject_perform subject_perform
end end
...@@ -111,7 +104,7 @@ RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_durat ...@@ -111,7 +104,7 @@ RSpec.shared_examples '#perform is rate limited to 1 call per' do |minimum_durat
allow(subject).to receive(:ensure_minimum_duration) do |minimum_duration, &block| allow(subject).to receive(:ensure_minimum_duration) do |minimum_duration, &block|
original_ensure_minimum_duration.call(minimum_duration) do original_ensure_minimum_duration.call(minimum_duration) do
# Time travel inside the block inside ensure_minimum_duration # Time travel inside the block inside ensure_minimum_duration
Timecop.travel(actual_duration) if actual_duration && actual_duration > 0 travel_to(actual_duration.from_now) if actual_duration && actual_duration > 0
end end
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment