diff options
Diffstat (limited to 'spec/services/issue_rebalancing_service_spec.rb')
-rw-r--r-- | spec/services/issue_rebalancing_service_spec.rb | 108 |
1 files changed, 63 insertions, 45 deletions
diff --git a/spec/services/issue_rebalancing_service_spec.rb b/spec/services/issue_rebalancing_service_spec.rb index 94f594c8083..7b3d4213b24 100644 --- a/spec/services/issue_rebalancing_service_spec.rb +++ b/spec/services/issue_rebalancing_service_spec.rb @@ -32,70 +32,88 @@ RSpec.describe IssueRebalancingService do project.reload.issues.reorder(relative_position: :asc).to_a end - it 'rebalances a set of issues with clumps at the end and start' do - all_issues = start_clump + unclumped + end_clump.reverse - service = described_class.new(project.issues.first) + shared_examples 'IssueRebalancingService shared examples' do + it 'rebalances a set of issues with clumps at the end and start' do + all_issues = start_clump + unclumped + end_clump.reverse + service = described_class.new(project.issues.first) - expect { service.execute }.not_to change { issues_in_position_order.map(&:id) } + expect { service.execute }.not_to change { issues_in_position_order.map(&:id) } - all_issues.each(&:reset) + all_issues.each(&:reset) - gaps = all_issues.take(all_issues.count - 1).zip(all_issues.drop(1)).map do |a, b| - b.relative_position - a.relative_position + gaps = all_issues.take(all_issues.count - 1).zip(all_issues.drop(1)).map do |a, b| + b.relative_position - a.relative_position + end + + expect(gaps).to all(be > RelativePositioning::MIN_GAP) + expect(all_issues.first.relative_position).to be > (RelativePositioning::MIN_POSITION * 0.9999) + expect(all_issues.last.relative_position).to be < (RelativePositioning::MAX_POSITION * 0.9999) end - expect(gaps).to all(be > RelativePositioning::MIN_GAP) - expect(all_issues.first.relative_position).to be > (RelativePositioning::MIN_POSITION * 0.9999) - expect(all_issues.last.relative_position).to be < (RelativePositioning::MAX_POSITION * 0.9999) - end + it 'is idempotent' do + service = described_class.new(project.issues.first) - it 'is idempotent' do - service = described_class.new(project.issues.first) + expect do + service.execute + service.execute + end.not_to change { issues_in_position_order.map(&:id) } + end - expect do - service.execute - service.execute - end.not_to change { issues_in_position_order.map(&:id) } - end + it 'does nothing if the feature flag is disabled' do + stub_feature_flags(rebalance_issues: false) + issue = project.issues.first + issue.project + issue.project.group + old_pos = issue.relative_position - it 'does nothing if the feature flag is disabled' do - stub_feature_flags(rebalance_issues: false) - issue = project.issues.first - issue.project - issue.project.group - old_pos = issue.relative_position + service = described_class.new(issue) - service = described_class.new(issue) + expect { service.execute }.not_to exceed_query_limit(0) + expect(old_pos).to eq(issue.reload.relative_position) + end - expect { service.execute }.not_to exceed_query_limit(0) - expect(old_pos).to eq(issue.reload.relative_position) - end + it 'acts if the flag is enabled for the project' do + issue = create(:issue, project: project, author: user, relative_position: max_pos) + stub_feature_flags(rebalance_issues: issue.project) - it 'acts if the flag is enabled for the project' do - issue = create(:issue, project: project, author: user, relative_position: max_pos) - stub_feature_flags(rebalance_issues: issue.project) + service = described_class.new(issue) - service = described_class.new(issue) + expect { service.execute }.to change { issue.reload.relative_position } + end - expect { service.execute }.to change { issue.reload.relative_position } - end + it 'acts if the flag is enabled for the group' do + issue = create(:issue, project: project, author: user, relative_position: max_pos) + project.update!(group: create(:group)) + stub_feature_flags(rebalance_issues: issue.project.group) - it 'acts if the flag is enabled for the group' do - issue = create(:issue, project: project, author: user, relative_position: max_pos) - project.update!(group: create(:group)) - stub_feature_flags(rebalance_issues: issue.project.group) + service = described_class.new(issue) - service = described_class.new(issue) + expect { service.execute }.to change { issue.reload.relative_position } + end + + it 'aborts if there are too many issues' do + issue = project.issues.first + base = double(count: 10_001) - expect { service.execute }.to change { issue.reload.relative_position } + allow(Issue).to receive(:relative_positioning_query_base).with(issue).and_return(base) + + expect { described_class.new(issue).execute }.to raise_error(described_class::TooManyIssues) + end end - it 'aborts if there are too many issues' do - issue = project.issues.first - base = double(count: 10_001) + context 'when issue_rebalancing_optimization feature flag is on' do + before do + stub_feature_flags(issue_rebalancing_optimization: true) + end + + it_behaves_like 'IssueRebalancingService shared examples' + end - allow(Issue).to receive(:relative_positioning_query_base).with(issue).and_return(base) + context 'when issue_rebalancing_optimization feature flag is on' do + before do + stub_feature_flags(issue_rebalancing_optimization: false) + end - expect { described_class.new(issue).execute }.to raise_error(described_class::TooManyIssues) + it_behaves_like 'IssueRebalancingService shared examples' end end |