Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-02-25 18:11:34 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-02-25 18:11:34 +0300
commitc00ed910738a6db7db12fb9eb67ec318e6dabec5 (patch)
tree721f0abddce20b6b9fac54e9424a2bc2d46918ed /spec
parentb2452a369250083ed416b90fe233583c64413877 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/factories/iteration_cadences.rb13
-rw-r--r--spec/factories/iterations.rb66
-rw-r--r--spec/frontend/blob/viewer/index_spec.js6
-rw-r--r--spec/lib/gitlab/background_migration/merge_request_assignees_migration_progress_check_spec.rb99
-rw-r--r--spec/migrations/schedule_merge_request_assignees_migration_progress_check_spec.rb16
-rw-r--r--spec/models/bulk_imports/entity_spec.rb7
-rw-r--r--spec/models/group_spec.rb1
-rw-r--r--spec/models/iteration_spec.rb438
-rw-r--r--spec/models/iterations/cadence_spec.rb22
-rw-r--r--spec/services/issuable/bulk_update_service_spec.rb45
-rw-r--r--spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb19
-rw-r--r--spec/views/notify/change_in_merge_request_draft_status_email.text.erb_spec.rb20
12 files changed, 48 insertions, 704 deletions
diff --git a/spec/factories/iteration_cadences.rb b/spec/factories/iteration_cadences.rb
deleted file mode 100644
index b36f15e3dd4..00000000000
--- a/spec/factories/iteration_cadences.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-FactoryBot.define do
- sequence(:cadence_sequential_date) do |n|
- n.days.from_now
- end
-
- factory :iterations_cadence, class: 'Iterations::Cadence' do
- title
- group
- start_date { generate(:cadence_sequential_date) }
- end
-end
diff --git a/spec/factories/iterations.rb b/spec/factories/iterations.rb
deleted file mode 100644
index bd61cd469af..00000000000
--- a/spec/factories/iterations.rb
+++ /dev/null
@@ -1,66 +0,0 @@
-# frozen_string_literal: true
-
-FactoryBot.define do
- sequence(:sequential_date) do |n|
- n.days.from_now
- end
-
- factory :iteration do
- title
- start_date { generate(:sequential_date) }
- due_date { generate(:sequential_date) }
-
- transient do
- project { nil }
- group { nil }
- project_id { nil }
- group_id { nil }
- resource_parent { nil }
- end
-
- trait :upcoming do
- state_enum { Iteration::STATE_ENUM_MAP[:upcoming] }
- end
-
- trait :started do
- state_enum { Iteration::STATE_ENUM_MAP[:started] }
- end
-
- trait :closed do
- state_enum { Iteration::STATE_ENUM_MAP[:closed] }
- end
-
- trait(:skip_future_date_validation) do
- after(:stub, :build) do |iteration|
- iteration.skip_future_date_validation = true
- end
- end
-
- trait(:skip_project_validation) do
- after(:stub, :build) do |iteration|
- iteration.skip_project_validation = true
- end
- end
-
- after(:build, :stub) do |iteration, evaluator|
- if evaluator.group
- iteration.group = evaluator.group
- elsif evaluator.group_id
- iteration.group_id = evaluator.group_id
- elsif evaluator.project
- iteration.project = evaluator.project
- elsif evaluator.project_id
- iteration.project_id = evaluator.project_id
- elsif evaluator.resource_parent
- id = evaluator.resource_parent.id
- evaluator.resource_parent.is_a?(Group) ? evaluator.group_id = id : evaluator.project_id = id
- else
- iteration.group = create(:group)
- end
- end
-
- factory :upcoming_iteration, traits: [:upcoming]
- factory :started_iteration, traits: [:started]
- factory :closed_iteration, traits: [:closed]
- end
-end
diff --git a/spec/frontend/blob/viewer/index_spec.js b/spec/frontend/blob/viewer/index_spec.js
index 7449de48ec0..d793b5eb190 100644
--- a/spec/frontend/blob/viewer/index_spec.js
+++ b/spec/frontend/blob/viewer/index_spec.js
@@ -85,9 +85,11 @@ describe('Blob viewer', () => {
describe('copy blob button', () => {
let copyButton;
+ let copyButtonTooltip;
beforeEach(() => {
copyButton = document.querySelector('.js-copy-blob-source-btn');
+ copyButtonTooltip = document.querySelector('.js-copy-blob-source-btn-tooltip');
});
it('disabled on load', () => {
@@ -95,7 +97,7 @@ describe('Blob viewer', () => {
});
it('has tooltip when disabled', () => {
- expect(copyButton.getAttribute('title')).toBe(
+ expect(copyButtonTooltip.getAttribute('title')).toBe(
'Switch to the source to copy the file contents',
);
});
@@ -131,7 +133,7 @@ describe('Blob viewer', () => {
document.querySelector('.js-blob-viewer-switch-btn[data-viewer="simple"]').click();
setImmediate(() => {
- expect(copyButton.getAttribute('title')).toBe('Copy file contents');
+ expect(copyButtonTooltip.getAttribute('title')).toBe('Copy file contents');
done();
});
diff --git a/spec/lib/gitlab/background_migration/merge_request_assignees_migration_progress_check_spec.rb b/spec/lib/gitlab/background_migration/merge_request_assignees_migration_progress_check_spec.rb
deleted file mode 100644
index 85a9c88ebff..00000000000
--- a/spec/lib/gitlab/background_migration/merge_request_assignees_migration_progress_check_spec.rb
+++ /dev/null
@@ -1,99 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::BackgroundMigration::MergeRequestAssigneesMigrationProgressCheck do
- context 'rescheduling' do
- context 'when there are ongoing and no dead jobs' do
- it 'reschedules check' do
- allow(Gitlab::BackgroundMigration).to receive(:exists?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(true)
-
- allow(Gitlab::BackgroundMigration).to receive(:dead_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- expect(BackgroundMigrationWorker).to receive(:perform_in).with(described_class::RESCHEDULE_DELAY, described_class.name)
-
- described_class.new.perform
- end
- end
-
- context 'when there are ongoing and dead jobs' do
- it 'reschedules check' do
- allow(Gitlab::BackgroundMigration).to receive(:exists?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(true)
-
- allow(Gitlab::BackgroundMigration).to receive(:dead_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(true)
-
- expect(BackgroundMigrationWorker).to receive(:perform_in).with(described_class::RESCHEDULE_DELAY, described_class.name)
-
- described_class.new.perform
- end
- end
-
- context 'when there retrying jobs and no scheduled' do
- it 'reschedules check' do
- allow(Gitlab::BackgroundMigration).to receive(:exists?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- allow(Gitlab::BackgroundMigration).to receive(:retrying_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(true)
-
- expect(BackgroundMigrationWorker).to receive(:perform_in).with(described_class::RESCHEDULE_DELAY, described_class.name)
-
- described_class.new.perform
- end
- end
- end
-
- context 'when there are no scheduled, or retrying or dead' do
- before do
- stub_feature_flags(multiple_merge_request_assignees: false)
- end
-
- it 'enables feature' do
- allow(Gitlab::BackgroundMigration).to receive(:exists?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- allow(Gitlab::BackgroundMigration).to receive(:retrying_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- allow(Gitlab::BackgroundMigration).to receive(:dead_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- described_class.new.perform
-
- expect(Feature.enabled?(:multiple_merge_request_assignees, type: :licensed)).to eq(true)
- end
- end
-
- context 'when there are only dead jobs' do
- it 'raises DeadJobsError error' do
- allow(Gitlab::BackgroundMigration).to receive(:exists?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- allow(Gitlab::BackgroundMigration).to receive(:retrying_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(false)
-
- allow(Gitlab::BackgroundMigration).to receive(:dead_jobs?)
- .with('PopulateMergeRequestAssigneesTable')
- .and_return(true)
-
- expect { described_class.new.perform }
- .to raise_error(described_class::DeadJobsError,
- "Only dead background jobs in the queue for #{described_class::WORKER}")
- end
- end
-end
diff --git a/spec/migrations/schedule_merge_request_assignees_migration_progress_check_spec.rb b/spec/migrations/schedule_merge_request_assignees_migration_progress_check_spec.rb
deleted file mode 100644
index 0a69f49f10d..00000000000
--- a/spec/migrations/schedule_merge_request_assignees_migration_progress_check_spec.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-require Rails.root.join('db', 'post_migrate', '20190402224749_schedule_merge_request_assignees_migration_progress_check.rb')
-
-RSpec.describe ScheduleMergeRequestAssigneesMigrationProgressCheck do
- describe '#up' do
- it 'schedules MergeRequestAssigneesMigrationProgressCheck background job' do
- expect(BackgroundMigrationWorker).to receive(:perform_async)
- .with(described_class::MIGRATION)
- .and_call_original
-
- subject.up
- end
- end
-end
diff --git a/spec/models/bulk_imports/entity_spec.rb b/spec/models/bulk_imports/entity_spec.rb
index a3a22c386c9..17ab4d5954c 100644
--- a/spec/models/bulk_imports/entity_spec.rb
+++ b/spec/models/bulk_imports/entity_spec.rb
@@ -103,7 +103,9 @@ RSpec.describe BulkImports::Entity, type: :model do
)
expect(entity).not_to be_valid
- expect(entity.errors).to include(:destination_namespace)
+ expect(entity.errors).to include(:base)
+ expect(entity.errors[:base])
+ .to include('Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again.')
end
it 'is invalid if destination namespace is a descendant of the source' do
@@ -118,7 +120,8 @@ RSpec.describe BulkImports::Entity, type: :model do
)
expect(entity).not_to be_valid
- expect(entity.errors).to include(:destination_namespace)
+ expect(entity.errors[:base])
+ .to include('Import failed: Destination cannot be a subgroup of the source group. Change the destination and try again.')
end
end
end
diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb
index 7d18e0503d8..528ce661370 100644
--- a/spec/models/group_spec.rb
+++ b/spec/models/group_spec.rb
@@ -25,7 +25,6 @@ RSpec.describe Group do
it { is_expected.to have_many(:clusters).class_name('Clusters::Cluster') }
it { is_expected.to have_many(:container_repositories) }
it { is_expected.to have_many(:milestones) }
- it { is_expected.to have_many(:iterations) }
it { is_expected.to have_many(:group_deploy_keys) }
it { is_expected.to have_many(:services) }
it { is_expected.to have_one(:dependency_proxy_setting) }
diff --git a/spec/models/iteration_spec.rb b/spec/models/iteration_spec.rb
deleted file mode 100644
index 7c57f08b2bd..00000000000
--- a/spec/models/iteration_spec.rb
+++ /dev/null
@@ -1,438 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Iteration do
- let(:set_cadence) { nil }
-
- let_it_be(:group) { create(:group) }
- let_it_be(:project) { create(:project, group: group) }
-
- describe 'associations' do
- it { is_expected.to belong_to(:project) }
- it { is_expected.to belong_to(:group) }
- it { is_expected.to belong_to(:iterations_cadence).inverse_of(:iterations) }
- end
-
- describe "#iid" do
- it "is properly scoped on project and group" do
- iteration1 = create(:iteration, :skip_project_validation, project: project)
- iteration2 = create(:iteration, :skip_project_validation, project: project)
- iteration3 = create(:iteration, group: group)
- iteration4 = create(:iteration, group: group)
- iteration5 = create(:iteration, :skip_project_validation, project: project)
-
- want = {
- iteration1: 1,
- iteration2: 2,
- iteration3: 1,
- iteration4: 2,
- iteration5: 3
- }
- got = {
- iteration1: iteration1.iid,
- iteration2: iteration2.iid,
- iteration3: iteration3.iid,
- iteration4: iteration4.iid,
- iteration5: iteration5.iid
- }
- expect(got).to eq(want)
- end
- end
-
- describe 'setting iteration cadence' do
- let_it_be(:iterations_cadence) { create(:iterations_cadence, group: group, start_date: 10.days.ago) }
- let(:iteration) { create(:iteration, group: group, iterations_cadence: set_cadence, start_date: 2.days.from_now) }
-
- context 'when iterations_cadence is set correctly' do
- let(:set_cadence) { iterations_cadence}
-
- it 'does not change the iterations_cadence' do
- expect(iteration.iterations_cadence).to eq(iterations_cadence)
- end
- end
-
- context 'when iterations_cadence exists for the group' do
- let(:set_cadence) { nil }
-
- it 'sets the iterations_cadence to the existing record' do
- expect(iteration.iterations_cadence).to eq(iterations_cadence)
- end
- end
-
- context 'when iterations_cadence does not exists for the group' do
- let_it_be(:group) { create(:group, name: 'Test group')}
- let(:iteration) { build(:iteration, group: group, iterations_cadence: set_cadence) }
-
- it 'creates a default iterations_cadence and uses it for the iteration' do
- expect { iteration.save! }.to change { Iterations::Cadence.count }.by(1)
- end
-
- it 'sets the newly created iterations_cadence to the record' do
- iteration.save!
-
- expect(iteration.iterations_cadence).to eq(Iterations::Cadence.last)
- end
-
- it 'creates the iterations_cadence with the correct attributes' do
- iteration.save!
-
- cadence = Iterations::Cadence.last
-
- expect(cadence.reload.start_date).to eq(iteration.start_date)
- expect(cadence.title).to eq('Test group Iterations')
- end
- end
-
- context 'when iteration is a project iteration' do
- it 'does not set the iterations_cadence' do
- iteration = create(:iteration, iterations_cadence: nil, project: project, skip_project_validation: true)
-
- expect(iteration.reload.iterations_cadence).to be_nil
- end
- end
- end
-
- describe '.filter_by_state' do
- let_it_be(:closed_iteration) { create(:iteration, :closed, :skip_future_date_validation, group: group, start_date: 8.days.ago, due_date: 2.days.ago) }
- let_it_be(:started_iteration) { create(:iteration, :started, :skip_future_date_validation, group: group, start_date: 1.day.ago, due_date: 6.days.from_now) }
- let_it_be(:upcoming_iteration) { create(:iteration, :upcoming, group: group, start_date: 1.week.from_now, due_date: 2.weeks.from_now) }
-
- shared_examples_for 'filter_by_state' do
- it 'filters by the given state' do
- expect(described_class.filter_by_state(Iteration.all, state)).to match(expected_iterations)
- end
- end
-
- context 'filtering by closed iterations' do
- it_behaves_like 'filter_by_state' do
- let(:state) { 'closed' }
- let(:expected_iterations) { [closed_iteration] }
- end
- end
-
- context 'filtering by started iterations' do
- it_behaves_like 'filter_by_state' do
- let(:state) { 'started' }
- let(:expected_iterations) { [started_iteration] }
- end
- end
-
- context 'filtering by opened iterations' do
- it_behaves_like 'filter_by_state' do
- let(:state) { 'opened' }
- let(:expected_iterations) { [started_iteration, upcoming_iteration] }
- end
- end
-
- context 'filtering by upcoming iterations' do
- it_behaves_like 'filter_by_state' do
- let(:state) { 'upcoming' }
- let(:expected_iterations) { [upcoming_iteration] }
- end
- end
-
- context 'filtering by "all"' do
- it_behaves_like 'filter_by_state' do
- let(:state) { 'all' }
- let(:expected_iterations) { [closed_iteration, started_iteration, upcoming_iteration] }
- end
- end
-
- context 'filtering by nonexistent filter' do
- it 'raises ArgumentError' do
- expect { described_class.filter_by_state(Iteration.none, 'unknown') }.to raise_error(ArgumentError, 'Unknown state filter: unknown')
- end
- end
- end
-
- context 'Validations' do
- subject { build(:iteration, group: group, start_date: start_date, due_date: due_date) }
-
- describe 'when iteration belongs to project' do
- subject { build(:iteration, project: project, start_date: Time.current, due_date: 1.day.from_now) }
-
- it 'is invalid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:project_id]).to include('is not allowed. We do not currently support project-level iterations')
- end
- end
-
- describe '#dates_do_not_overlap' do
- let_it_be(:existing_iteration) { create(:iteration, group: group, start_date: 4.days.from_now, due_date: 1.week.from_now) }
-
- context 'when no Iteration dates overlap' do
- let(:start_date) { 2.weeks.from_now }
- let(:due_date) { 3.weeks.from_now }
-
- it { is_expected.to be_valid }
- end
-
- context 'when updated iteration dates overlap with its own dates' do
- it 'is valid' do
- existing_iteration.start_date = 5.days.from_now
-
- expect(existing_iteration).to be_valid
- end
- end
-
- context 'when dates overlap' do
- let(:start_date) { 5.days.from_now }
- let(:due_date) { 6.days.from_now }
-
- shared_examples_for 'overlapping dates' do |skip_constraint_test: false|
- context 'when start_date overlaps' do
- let(:start_date) { 5.days.from_now }
- let(:due_date) { 3.weeks.from_now }
-
- it 'is not valid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:base]).to include('Dates cannot overlap with other existing Iterations within this group')
- end
-
- unless skip_constraint_test
- it 'is not valid even if forced' do
- subject.validate # to generate iid/etc
- expect { subject.save!(validate: false) }.to raise_exception(ActiveRecord::StatementInvalid, /#{constraint_name}/)
- end
- end
- end
-
- context 'when due_date overlaps' do
- let(:start_date) { Time.current }
- let(:due_date) { 6.days.from_now }
-
- it 'is not valid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:base]).to include('Dates cannot overlap with other existing Iterations within this group')
- end
-
- unless skip_constraint_test
- it 'is not valid even if forced' do
- subject.validate # to generate iid/etc
- expect { subject.save!(validate: false) }.to raise_exception(ActiveRecord::StatementInvalid, /#{constraint_name}/)
- end
- end
- end
-
- context 'when both overlap' do
- it 'is not valid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:base]).to include('Dates cannot overlap with other existing Iterations within this group')
- end
-
- unless skip_constraint_test
- it 'is not valid even if forced' do
- subject.validate # to generate iid/etc
- expect { subject.save!(validate: false) }.to raise_exception(ActiveRecord::StatementInvalid, /#{constraint_name}/)
- end
- end
- end
- end
-
- context 'group' do
- it_behaves_like 'overlapping dates' do
- let(:constraint_name) { 'iteration_start_and_due_date_iterations_cadence_id_constraint' }
- end
-
- context 'different group' do
- let(:group) { create(:group) }
-
- it { is_expected.to be_valid }
-
- it 'does not trigger exclusion constraints' do
- expect { subject.save! }.not_to raise_exception
- end
- end
-
- context 'sub-group' do
- let(:subgroup) { create(:group, parent: group) }
-
- subject { build(:iteration, group: subgroup, start_date: start_date, due_date: due_date) }
-
- it { is_expected.to be_valid }
- end
- end
-
- # Skipped. Pending https://gitlab.com/gitlab-org/gitlab/-/issues/299864
- xcontext 'project' do
- let_it_be(:existing_iteration) { create(:iteration, :skip_project_validation, project: project, start_date: 4.days.from_now, due_date: 1.week.from_now) }
-
- subject { build(:iteration, :skip_project_validation, project: project, start_date: start_date, due_date: due_date) }
-
- it_behaves_like 'overlapping dates' do
- let(:constraint_name) { 'iteration_start_and_due_daterange_project_id_constraint' }
- end
-
- context 'different project' do
- let(:project) { create(:project) }
-
- it { is_expected.to be_valid }
-
- it 'does not trigger exclusion constraints' do
- expect { subject.save! }.not_to raise_exception
- end
- end
-
- context 'in a group' do
- let(:group) { create(:group) }
-
- subject { build(:iteration, group: group, start_date: start_date, due_date: due_date) }
-
- it { is_expected.to be_valid }
-
- it 'does not trigger exclusion constraints' do
- expect { subject.save! }.not_to raise_exception
- end
- end
-
- context 'project in a group' do
- let_it_be(:project) { create(:project, group: create(:group)) }
- let_it_be(:existing_iteration) { create(:iteration, :skip_project_validation, project: project, start_date: 4.days.from_now, due_date: 1.week.from_now) }
-
- subject { build(:iteration, :skip_project_validation, project: project, start_date: start_date, due_date: due_date) }
-
- it_behaves_like 'overlapping dates' do
- let(:constraint_name) { 'iteration_start_and_due_daterange_project_id_constraint' }
- end
- end
- end
- end
- end
-
- describe '#future_date' do
- context 'when dates are in the future' do
- let(:start_date) { Time.current }
- let(:due_date) { 1.week.from_now }
-
- it { is_expected.to be_valid }
- end
-
- context 'when start_date is in the past' do
- let(:start_date) { 1.week.ago }
- let(:due_date) { 1.week.from_now }
-
- it { is_expected.to be_valid }
- end
-
- context 'when due_date is in the past' do
- let(:start_date) { 2.weeks.ago }
- let(:due_date) { 1.week.ago }
-
- it { is_expected.to be_valid }
- end
-
- context 'when due_date is before start date' do
- let(:start_date) { Time.current }
- let(:due_date) { 1.week.ago }
-
- it 'is not valid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:due_date]).to include('must be greater than start date')
- end
- end
-
- context 'when start_date is over 500 years in the future' do
- let(:start_date) { 501.years.from_now }
- let(:due_date) { Time.current }
-
- it 'is not valid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:start_date]).to include('cannot be more than 500 years in the future')
- end
- end
-
- context 'when due_date is over 500 years in the future' do
- let(:start_date) { Time.current }
- let(:due_date) { 501.years.from_now }
-
- it 'is not valid' do
- expect(subject).not_to be_valid
- expect(subject.errors[:due_date]).to include('cannot be more than 500 years in the future')
- end
- end
- end
- end
-
- context 'time scopes' do
- let_it_be(:project) { create(:project, :empty_repo) }
- let_it_be(:iteration_1) { create(:iteration, :skip_future_date_validation, :skip_project_validation, project: project, start_date: 3.days.ago, due_date: 1.day.from_now) }
- let_it_be(:iteration_2) { create(:iteration, :skip_future_date_validation, :skip_project_validation, project: project, start_date: 10.days.ago, due_date: 4.days.ago) }
- let_it_be(:iteration_3) { create(:iteration, :skip_project_validation, project: project, start_date: 4.days.from_now, due_date: 1.week.from_now) }
-
- describe 'start_date_passed' do
- it 'returns iterations where start_date is in the past but due_date is in the future' do
- expect(described_class.start_date_passed).to contain_exactly(iteration_1)
- end
- end
-
- describe 'due_date_passed' do
- it 'returns iterations where due date is in the past' do
- expect(described_class.due_date_passed).to contain_exactly(iteration_2)
- end
- end
- end
-
- describe '#validate_group' do
- let_it_be(:iterations_cadence) { create(:iterations_cadence, group: group) }
-
- context 'when the iteration and iteration cadence groups are same' do
- it 'is valid' do
- iteration = build(:iteration, group: group, iterations_cadence: iterations_cadence)
-
- expect(iteration).to be_valid
- end
- end
-
- context 'when the iteration and iteration cadence groups are different' do
- it 'is invalid' do
- other_group = create(:group)
- iteration = build(:iteration, group: other_group, iterations_cadence: iterations_cadence)
-
- expect(iteration).not_to be_valid
- end
- end
-
- context 'when the iteration belongs to a project and the iteration cadence is set' do
- it 'is invalid' do
- iteration = build(:iteration, project: project, iterations_cadence: iterations_cadence, skip_project_validation: true)
-
- expect(iteration).to be_invalid
- end
- end
-
- context 'when the iteration belongs to a project and the iteration cadence is not set' do
- it 'is valid' do
- iteration = build(:iteration, project: project, skip_project_validation: true)
-
- expect(iteration).to be_valid
- end
- end
- end
-
- describe '.within_timeframe' do
- let_it_be(:now) { Time.current }
- let_it_be(:project) { create(:project, :empty_repo) }
- let_it_be(:iteration_1) { create(:iteration, :skip_project_validation, project: project, start_date: now, due_date: 1.day.from_now) }
- let_it_be(:iteration_2) { create(:iteration, :skip_project_validation, project: project, start_date: 2.days.from_now, due_date: 3.days.from_now) }
- let_it_be(:iteration_3) { create(:iteration, :skip_project_validation, project: project, start_date: 4.days.from_now, due_date: 1.week.from_now) }
-
- it 'returns iterations with start_date and/or end_date between timeframe' do
- iterations = described_class.within_timeframe(2.days.from_now, 3.days.from_now)
-
- expect(iterations).to match_array([iteration_2])
- end
-
- it 'returns iterations which starts before the timeframe' do
- iterations = described_class.within_timeframe(1.day.from_now, 3.days.from_now)
-
- expect(iterations).to match_array([iteration_1, iteration_2])
- end
-
- it 'returns iterations which ends after the timeframe' do
- iterations = described_class.within_timeframe(3.days.from_now, 5.days.from_now)
-
- expect(iterations).to match_array([iteration_2, iteration_3])
- end
- end
-end
diff --git a/spec/models/iterations/cadence_spec.rb b/spec/models/iterations/cadence_spec.rb
deleted file mode 100644
index cdeeef97580..00000000000
--- a/spec/models/iterations/cadence_spec.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Iterations::Cadence do
- describe 'associations' do
- subject { build(:iterations_cadence) }
-
- it { is_expected.to belong_to(:group) }
- it { is_expected.to have_many(:iterations).inverse_of(:iterations_cadence) }
- end
-
- describe 'validations' do
- subject { build(:iterations_cadence) }
-
- it { is_expected.to validate_presence_of(:title) }
- it { is_expected.to validate_presence_of(:start_date) }
- it { is_expected.to validate_presence_of(:group_id) }
- it { is_expected.to validate_presence_of(:active) }
- it { is_expected.to validate_presence_of(:automatic) }
- end
-end
diff --git a/spec/services/issuable/bulk_update_service_spec.rb b/spec/services/issuable/bulk_update_service_spec.rb
index 79543fe9f5d..c749f282cd3 100644
--- a/spec/services/issuable/bulk_update_service_spec.rb
+++ b/spec/services/issuable/bulk_update_service_spec.rb
@@ -31,23 +31,6 @@ RSpec.describe Issuable::BulkUpdateService do
end
end
- shared_examples 'updates iterations' do
- it 'succeeds' do
- result = bulk_update(issuables, sprint_id: iteration.id)
-
- expect(result.success?).to be_truthy
- expect(result.payload[:count]).to eq(issuables.count)
- end
-
- it 'updates the issuables iteration' do
- bulk_update(issuables, sprint_id: iteration.id)
-
- issuables.each do |issuable|
- expect(issuable.reload.iteration).to eq(iteration)
- end
- end
- end
-
shared_examples 'updating labels' do
def create_issue_with_labels(labels)
create(:labeled_issue, project: project, labels: labels)
@@ -250,21 +233,6 @@ RSpec.describe Issuable::BulkUpdateService do
it_behaves_like 'updates milestones'
end
- describe 'updating iterations' do
- let_it_be(:group) { create(:group) }
- let_it_be(:project) { create(:project, group: group) }
- let_it_be(:issuables) { [create(:issue, project: project)] }
- let_it_be(:iteration) { create(:iteration, group: group) }
-
- let(:parent) { project }
-
- before do
- group.add_reporter(user)
- end
-
- it_behaves_like 'updates iterations'
- end
-
describe 'updating labels' do
let(:bug) { create(:label, project: project) }
let(:regression) { create(:label, project: project) }
@@ -347,19 +315,6 @@ RSpec.describe Issuable::BulkUpdateService do
end
end
- describe 'updating iterations' do
- let_it_be(:iteration) { create(:iteration, group: group) }
- let_it_be(:project) { create(:project, :repository, group: group) }
-
- context 'when issues' do
- let_it_be(:issue1) { create(:issue, project: project) }
- let_it_be(:issue2) { create(:issue, project: project) }
- let_it_be(:issuables) { [issue1, issue2] }
-
- it_behaves_like 'updates iterations'
- end
- end
-
describe 'updating labels' do
let(:project) { create(:project, :repository, group: group) }
let(:bug) { create(:group_label, group: group) }
diff --git a/spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb b/spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb
new file mode 100644
index 00000000000..6c25eba03b9
--- /dev/null
+++ b/spec/views/notify/change_in_merge_request_draft_status_email.html.haml_spec.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe 'notify/change_in_merge_request_draft_status_email.html.haml' do
+ let(:user) { create(:user) }
+ let(:merge_request) { create(:merge_request) }
+
+ before do
+ assign(:updated_by_user, user)
+ assign(:merge_request, merge_request)
+ end
+
+ it 'renders the email correctly' do
+ render
+
+ expect(rendered).to have_content("#{user.name} changed the draft status of merge request #{merge_request.to_reference}")
+ end
+end
diff --git a/spec/views/notify/change_in_merge_request_draft_status_email.text.erb_spec.rb b/spec/views/notify/change_in_merge_request_draft_status_email.text.erb_spec.rb
new file mode 100644
index 00000000000..a05c20fd8c4
--- /dev/null
+++ b/spec/views/notify/change_in_merge_request_draft_status_email.text.erb_spec.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+require 'spec_helper'
+
+RSpec.describe 'notify/change_in_merge_request_draft_status_email.text.erb' do
+ let(:user) { create(:user) }
+ let(:merge_request) { create(:merge_request) }
+
+ before do
+ assign(:updated_by_user, user)
+ assign(:merge_request, merge_request)
+ end
+
+ it_behaves_like 'renders plain text email correctly'
+
+ it 'renders the email correctly' do
+ render
+
+ expect(rendered).to have_content("#{user.name} changed the draft status of merge request #{merge_request.to_reference}")
+ end
+end