Fix intermittent failing spec in spec/support/helpers/cycle_analytics_helpers.rb
There was a race condition in the spec where if the commit is created on disk within a second of the frozen `Timecop` time, the test fails. Closes #43981
This commit is contained in:
parent
fe0ebf76c4
commit
d65cdd4416
2 changed files with 21 additions and 22 deletions
|
@ -3,7 +3,12 @@ require 'spec_helper'
|
|||
describe Gitlab::CycleAnalytics::UsageData do
|
||||
describe '#to_json' do
|
||||
before do
|
||||
Timecop.freeze do
|
||||
# Since git commits only have second precision, round up to the
|
||||
# nearest second to ensure we have accurate median and standard
|
||||
# deviation calculations.
|
||||
current_time = Time.at(Time.now.to_i)
|
||||
|
||||
Timecop.freeze(current_time) do
|
||||
user = create(:user, :admin)
|
||||
projects = create_list(:project, 2, :repository)
|
||||
|
||||
|
@ -37,13 +42,7 @@ describe Gitlab::CycleAnalytics::UsageData do
|
|||
|
||||
expected_values.each_pair do |op, value|
|
||||
expect(stage_values).to have_key(op)
|
||||
|
||||
if op == :missing
|
||||
expect(stage_values[op]).to eq(value)
|
||||
else
|
||||
# delta is used because of git timings that Timecop does not stub
|
||||
expect(stage_values[op].to_i).to be_within(5).of(value.to_i)
|
||||
end
|
||||
expect(stage_values[op]).to eq(value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -58,8 +57,8 @@ describe Gitlab::CycleAnalytics::UsageData do
|
|||
missing: 0
|
||||
},
|
||||
plan: {
|
||||
average: 2,
|
||||
sd: 2,
|
||||
average: 1,
|
||||
sd: 0,
|
||||
missing: 0
|
||||
},
|
||||
code: {
|
||||
|
|
|
@ -4,12 +4,12 @@ module CycleAnalyticsHelpers
|
|||
create_commit("Commit for ##{issue.iid}", issue.project, user, branch_name)
|
||||
end
|
||||
|
||||
def create_commit(message, project, user, branch_name, count: 1)
|
||||
def create_commit(message, project, user, branch_name, count: 1, commit_time: nil, skip_push_handler: false)
|
||||
repository = project.repository
|
||||
oldrev = repository.commit(branch_name).sha
|
||||
oldrev = repository.commit(branch_name)&.sha || Gitlab::Git::BLANK_SHA
|
||||
|
||||
if Timecop.frozen? && Gitlab::GitalyClient.feature_enabled?(:operation_user_commit_files)
|
||||
mock_gitaly_multi_action_dates(repository.raw)
|
||||
mock_gitaly_multi_action_dates(repository.raw, commit_time)
|
||||
end
|
||||
|
||||
commit_shas = Array.new(count) do |index|
|
||||
|
@ -19,6 +19,8 @@ module CycleAnalyticsHelpers
|
|||
commit_sha
|
||||
end
|
||||
|
||||
return if skip_push_handler
|
||||
|
||||
GitPushService.new(project,
|
||||
user,
|
||||
oldrev: oldrev,
|
||||
|
@ -44,13 +46,11 @@ module CycleAnalyticsHelpers
|
|||
project.repository.add_branch(user, source_branch, 'master')
|
||||
end
|
||||
|
||||
sha = project.repository.create_file(
|
||||
user,
|
||||
generate(:branch),
|
||||
'content',
|
||||
message: commit_message,
|
||||
branch_name: source_branch)
|
||||
project.repository.commit(sha)
|
||||
# Cycle analytic specs often test with frozen times, which causes metrics to be
|
||||
# pinned to the current time. For example, in the plan stage, we assume that an issue
|
||||
# milestone has been created before any code has been written. We add a second
|
||||
# to ensure that the plan time is positive.
|
||||
create_commit(commit_message, project, user, source_branch, commit_time: Time.now + 1.second, skip_push_handler: true)
|
||||
|
||||
opts = {
|
||||
title: 'Awesome merge_request',
|
||||
|
@ -116,9 +116,9 @@ module CycleAnalyticsHelpers
|
|||
protected: false)
|
||||
end
|
||||
|
||||
def mock_gitaly_multi_action_dates(raw_repository)
|
||||
def mock_gitaly_multi_action_dates(raw_repository, commit_time)
|
||||
allow(raw_repository).to receive(:multi_action).and_wrap_original do |m, *args|
|
||||
new_date = Time.now
|
||||
new_date = commit_time || Time.now
|
||||
branch_update = m.call(*args)
|
||||
|
||||
if branch_update.newrev
|
||||
|
|
Loading…
Reference in a new issue