diff options
Diffstat (limited to 'spec/models/milestone_spec.rb')
-rw-r--r-- | spec/models/milestone_spec.rb | 155 |
1 files changed, 96 insertions, 59 deletions
diff --git a/spec/models/milestone_spec.rb b/spec/models/milestone_spec.rb index e51108947a7..33f84da27f6 100644 --- a/spec/models/milestone_spec.rb +++ b/spec/models/milestone_spec.rb @@ -81,7 +81,7 @@ describe Milestone do end it_behaves_like 'within_timeframe scope' do - let_it_be(:now) { Time.now } + let_it_be(:now) { Time.current } let_it_be(:project) { create(:project, :empty_repo) } let_it_be(:resource_1) { create(:milestone, project: project, start_date: now - 1.day, due_date: now + 1.day) } let_it_be(:resource_2) { create(:milestone, project: project, start_date: now + 2.days, due_date: now + 3.days) } @@ -130,7 +130,7 @@ describe Milestone do describe '#upcoming?' do it 'returns true when start_date is in the future' do - milestone = build(:milestone, start_date: Time.now + 1.month) + milestone = build(:milestone, start_date: Time.current + 1.month) expect(milestone.upcoming?).to be_truthy end @@ -225,70 +225,88 @@ describe Milestone do end end - describe '#for_projects_and_groups' do - let(:project) { create(:project) } - let(:project_other) { create(:project) } - let(:group) { create(:group) } - let(:group_other) { create(:group) } + shared_examples '#for_projects_and_groups' do + describe '#for_projects_and_groups' do + let_it_be(:project) { create(:project) } + let_it_be(:project_other) { create(:project) } + let_it_be(:group) { create(:group) } + let_it_be(:group_other) { create(:group) } + + before(:all) do + create(:milestone, project: project) + create(:milestone, project: project_other) + create(:milestone, group: group) + create(:milestone, group: group_other) + end - before do - create(:milestone, project: project) - create(:milestone, project: project_other) - create(:milestone, group: group) - create(:milestone, group: group_other) - end + subject { described_class.for_projects_and_groups(projects, groups) } + + shared_examples 'filters by projects and groups' do + it 'returns milestones filtered by project' do + milestones = described_class.for_projects_and_groups(projects, []) - subject { described_class.for_projects_and_groups(projects, groups) } + expect(milestones.count).to eq(1) + expect(milestones.first.project_id).to eq(project.id) + end + + it 'returns milestones filtered by group' do + milestones = described_class.for_projects_and_groups([], groups) + + expect(milestones.count).to eq(1) + expect(milestones.first.group_id).to eq(group.id) + end - shared_examples 'filters by projects and groups' do - it 'returns milestones filtered by project' do - milestones = described_class.for_projects_and_groups(projects, []) + it 'returns milestones filtered by both project and group' do + milestones = described_class.for_projects_and_groups(projects, groups) - expect(milestones.count).to eq(1) - expect(milestones.first.project_id).to eq(project.id) + expect(milestones.count).to eq(2) + expect(milestones).to contain_exactly(project.milestones.first, group.milestones.first) + end end - it 'returns milestones filtered by group' do - milestones = described_class.for_projects_and_groups([], groups) + context 'ids as params' do + let(:projects) { [project.id] } + let(:groups) { [group.id] } - expect(milestones.count).to eq(1) - expect(milestones.first.group_id).to eq(group.id) + it_behaves_like 'filters by projects and groups' end - it 'returns milestones filtered by both project and group' do - milestones = described_class.for_projects_and_groups(projects, groups) + context 'relations as params' do + let(:projects) { Project.where(id: project.id).select(:id) } + let(:groups) { Group.where(id: group.id).select(:id) } - expect(milestones.count).to eq(2) - expect(milestones).to contain_exactly(project.milestones.first, group.milestones.first) + it_behaves_like 'filters by projects and groups' end - end - context 'ids as params' do - let(:projects) { [project.id] } - let(:groups) { [group.id] } + context 'objects as params' do + let(:projects) { [project] } + let(:groups) { [group] } - it_behaves_like 'filters by projects and groups' - end + it_behaves_like 'filters by projects and groups' + end - context 'relations as params' do - let(:projects) { Project.where(id: project.id).select(:id) } - let(:groups) { Group.where(id: group.id).select(:id) } + it 'returns no records if projects and groups are nil' do + milestones = described_class.for_projects_and_groups(nil, nil) - it_behaves_like 'filters by projects and groups' + expect(milestones).to be_empty + end end + end - context 'objects as params' do - let(:projects) { [project] } - let(:groups) { [group] } - - it_behaves_like 'filters by projects and groups' + context 'when `optimized_timebox_queries` feature flag is enabled' do + before do + stub_feature_flags(optimized_timebox_queries: true) end - it 'returns no records if projects and groups are nil' do - milestones = described_class.for_projects_and_groups(nil, nil) + it_behaves_like '#for_projects_and_groups' + end - expect(milestones).to be_empty + context 'when `optimized_timebox_queries` feature flag is disabled' do + before do + stub_feature_flags(optimized_timebox_queries: false) end + + it_behaves_like '#for_projects_and_groups' end describe '.upcoming_ids' do @@ -297,30 +315,30 @@ describe Milestone do let(:group_3) { create(:group) } let(:groups) { [group_1, group_2, group_3] } - let!(:past_milestone_group_1) { create(:milestone, group: group_1, due_date: Time.now - 1.day) } - let!(:current_milestone_group_1) { create(:milestone, group: group_1, due_date: Time.now + 1.day) } - let!(:future_milestone_group_1) { create(:milestone, group: group_1, due_date: Time.now + 2.days) } + let!(:past_milestone_group_1) { create(:milestone, group: group_1, due_date: Time.current - 1.day) } + let!(:current_milestone_group_1) { create(:milestone, group: group_1, due_date: Time.current + 1.day) } + let!(:future_milestone_group_1) { create(:milestone, group: group_1, due_date: Time.current + 2.days) } - let!(:past_milestone_group_2) { create(:milestone, group: group_2, due_date: Time.now - 1.day) } - let!(:closed_milestone_group_2) { create(:milestone, :closed, group: group_2, due_date: Time.now + 1.day) } - let!(:current_milestone_group_2) { create(:milestone, group: group_2, due_date: Time.now + 2.days) } + let!(:past_milestone_group_2) { create(:milestone, group: group_2, due_date: Time.current - 1.day) } + let!(:closed_milestone_group_2) { create(:milestone, :closed, group: group_2, due_date: Time.current + 1.day) } + let!(:current_milestone_group_2) { create(:milestone, group: group_2, due_date: Time.current + 2.days) } - let!(:past_milestone_group_3) { create(:milestone, group: group_3, due_date: Time.now - 1.day) } + let!(:past_milestone_group_3) { create(:milestone, group: group_3, due_date: Time.current - 1.day) } let(:project_1) { create(:project) } let(:project_2) { create(:project) } let(:project_3) { create(:project) } let(:projects) { [project_1, project_2, project_3] } - let!(:past_milestone_project_1) { create(:milestone, project: project_1, due_date: Time.now - 1.day) } - let!(:current_milestone_project_1) { create(:milestone, project: project_1, due_date: Time.now + 1.day) } - let!(:future_milestone_project_1) { create(:milestone, project: project_1, due_date: Time.now + 2.days) } + let!(:past_milestone_project_1) { create(:milestone, project: project_1, due_date: Time.current - 1.day) } + let!(:current_milestone_project_1) { create(:milestone, project: project_1, due_date: Time.current + 1.day) } + let!(:future_milestone_project_1) { create(:milestone, project: project_1, due_date: Time.current + 2.days) } - let!(:past_milestone_project_2) { create(:milestone, project: project_2, due_date: Time.now - 1.day) } - let!(:closed_milestone_project_2) { create(:milestone, :closed, project: project_2, due_date: Time.now + 1.day) } - let!(:current_milestone_project_2) { create(:milestone, project: project_2, due_date: Time.now + 2.days) } + let!(:past_milestone_project_2) { create(:milestone, project: project_2, due_date: Time.current - 1.day) } + let!(:closed_milestone_project_2) { create(:milestone, :closed, project: project_2, due_date: Time.current + 1.day) } + let!(:current_milestone_project_2) { create(:milestone, project: project_2, due_date: Time.current + 2.days) } - let!(:past_milestone_project_3) { create(:milestone, project: project_3, due_date: Time.now - 1.day) } + let!(:past_milestone_project_3) { create(:milestone, project: project_3, due_date: Time.current - 1.day) } let(:milestone_ids) { described_class.upcoming_ids(projects, groups).map(&:id) } @@ -498,4 +516,23 @@ describe Milestone do end end end + + describe '#subgroup_milestone' do + context 'parent is subgroup' do + it 'returns true' do + group = create(:group) + subgroup = create(:group, :private, parent: group) + + expect(build(:milestone, group: subgroup).subgroup_milestone?).to eq(true) + end + end + + context 'parent is not subgroup' do + it 'returns false' do + group = create(:group) + + expect(build(:milestone, group: group).subgroup_milestone?).to eq(false) + end + end + end end |