From 729e3765d5feb762df1ccfbc228a8dd4662aa3f9 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 24 Mar 2020 12:09:42 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- spec/models/event_collection_spec.rb | 81 +++++++++++++++++++++++++++----- spec/models/event_spec.rb | 21 +++++++-- spec/models/evidence_spec.rb | 87 ----------------------------------- spec/models/release_spec.rb | 10 ++-- spec/models/releases/evidence_spec.rb | 87 +++++++++++++++++++++++++++++++++++ 5 files changed, 179 insertions(+), 107 deletions(-) delete mode 100644 spec/models/evidence_spec.rb create mode 100644 spec/models/releases/evidence_spec.rb (limited to 'spec/models') diff --git a/spec/models/event_collection_spec.rb b/spec/models/event_collection_spec.rb index e6f80a4c4d0..6d1954700bf 100644 --- a/spec/models/event_collection_spec.rb +++ b/spec/models/event_collection_spec.rb @@ -8,22 +8,68 @@ describe EventCollection do let_it_be(:project) { create(:project_empty_repo, group: group) } let_it_be(:projects) { Project.where(id: project.id) } let_it_be(:user) { create(:user) } + let_it_be(:merge_request) { create(:merge_request) } context 'with project events' do - before do - 20.times do - event = create(:push_event, project: project, author: user) - - create(:push_event_payload, event: event) + let_it_be(:push_event_payloads) do + Array.new(9) do + create(:push_event_payload, + event: create(:push_event, project: project, author: user)) end - - create(:closed_issue_event, project: project, author: user) end - it 'returns an Array of events' do + let_it_be(:merge_request_events) { create_list(:event, 10, :commented, project: project, target: merge_request) } + let_it_be(:closed_issue_event) { create(:closed_issue_event, project: project, author: user) } + let_it_be(:wiki_page_event) { create(:wiki_page_event, project: project) } + let(:push_events) { push_event_payloads.map(&:event) } + + it 'returns an Array of events', :aggregate_failures do + most_recent_20_events = [ + wiki_page_event, + closed_issue_event, + *push_events, + *merge_request_events + ].sort_by(&:id).reverse.take(20) events = described_class.new(projects).to_a expect(events).to be_an_instance_of(Array) + expect(events).to match_array(most_recent_20_events) + end + + context 'the wiki_events feature flag is disabled' do + before do + stub_feature_flags(wiki_events: false) + end + + it 'omits the wiki page events when using to_a' do + events = described_class.new(projects).to_a + + expect(events).not_to include(wiki_page_event) + end + + it 'omits the wiki page events when using all_project_events' do + events = described_class.new(projects).all_project_events + + expect(events).not_to include(wiki_page_event) + end + end + + context 'the wiki_events feature flag is enabled' do + before do + stub_feature_flags(wiki_events: true) + end + + it 'includes the wiki page events when using to_a' do + events = described_class.new(projects).to_a + + expect(events).to include(wiki_page_event) + end + + it 'includes the wiki page events when using all_project_events' do + events = described_class.new(projects).all_project_events + + expect(events).to include(wiki_page_event) + end end it 'applies a limit to the number of events' do @@ -44,12 +90,25 @@ describe EventCollection do expect(events).to be_empty end - it 'allows filtering of events using an EventFilter' do + it 'allows filtering of events using an EventFilter, returning single item' do filter = EventFilter.new(EventFilter::ISSUE) events = described_class.new(projects, filter: filter).to_a - expect(events.length).to eq(1) - expect(events[0].action).to eq(Event::CLOSED) + expect(events).to contain_exactly(closed_issue_event) + end + + it 'allows filtering of events using an EventFilter, returning several items' do + filter = EventFilter.new(EventFilter::COMMENTS) + events = described_class.new(projects, filter: filter).to_a + + expect(events).to match_array(merge_request_events) + end + + it 'allows filtering of events using an EventFilter, returning pushes' do + filter = EventFilter.new(EventFilter::PUSH) + events = described_class.new(projects, filter: filter).to_a + + expect(events).to match_array(push_events) end end diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index b2676a79b55..3239c7a843a 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -454,9 +454,10 @@ describe Event do end end - describe '.for_wiki_page' do + describe 'wiki_page predicate scopes' do let_it_be(:events) do [ + create(:push_event), create(:closed_issue_event), create(:wiki_page_event), create(:closed_issue_event), @@ -465,10 +466,22 @@ describe Event do ] end - it 'only contains the wiki page events' do - wiki_events = events.select(&:wiki_page?) + describe '.for_wiki_page' do + it 'only contains the wiki page events' do + wiki_events = events.select(&:wiki_page?) - expect(described_class.for_wiki_page).to match_array(wiki_events) + expect(events).not_to match_array(wiki_events) + expect(described_class.for_wiki_page).to match_array(wiki_events) + end + end + + describe '.not_wiki_page' do + it 'does not contain the wiki page events' do + non_wiki_events = events.reject(&:wiki_page?) + + expect(events).not_to match_array(non_wiki_events) + expect(described_class.not_wiki_page).to match_array(non_wiki_events) + end end end diff --git a/spec/models/evidence_spec.rb b/spec/models/evidence_spec.rb deleted file mode 100644 index 8f534517fc1..00000000000 --- a/spec/models/evidence_spec.rb +++ /dev/null @@ -1,87 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -describe Evidence do - let_it_be(:project) { create(:project) } - let(:release) { create(:release, project: project) } - let(:schema_file) { 'evidences/evidence' } - let(:summary_json) { described_class.last.summary.to_json } - - describe 'associations' do - it { is_expected.to belong_to(:release) } - end - - describe 'summary_sha' do - it 'returns nil if summary is nil' do - expect(build(:evidence, summary: nil).summary_sha).to be_nil - end - end - - describe '#generate_summary_and_sha' do - before do - described_class.create!(release: release) - end - - context 'when a release name is not provided' do - let(:release) { create(:release, project: project, name: nil) } - - it 'creates a valid JSON object' do - expect(release.name).to eq(release.tag) - expect(summary_json).to match_schema(schema_file) - end - end - - context 'when a release is associated to a milestone' do - let(:milestone) { create(:milestone, project: project) } - let(:release) { create(:release, project: project, milestones: [milestone]) } - - context 'when a milestone has no issue associated with it' do - it 'creates a valid JSON object' do - expect(milestone.issues).to be_empty - expect(summary_json).to match_schema(schema_file) - end - end - - context 'when a milestone has no description' do - let(:milestone) { create(:milestone, project: project, description: nil) } - - it 'creates a valid JSON object' do - expect(milestone.description).to be_nil - expect(summary_json).to match_schema(schema_file) - end - end - - context 'when a milestone has no due_date' do - let(:milestone) { create(:milestone, project: project, due_date: nil) } - - it 'creates a valid JSON object' do - expect(milestone.due_date).to be_nil - expect(summary_json).to match_schema(schema_file) - end - end - - context 'when a milestone has an issue' do - context 'when the issue has no description' do - let(:issue) { create(:issue, project: project, description: nil, state: 'closed') } - - before do - milestone.issues << issue - end - - it 'creates a valid JSON object' do - expect(milestone.issues.first.description).to be_nil - expect(summary_json).to match_schema(schema_file) - end - end - end - end - - context 'when a release is not associated to any milestone' do - it 'creates a valid JSON object' do - expect(release.milestones).to be_empty - expect(summary_json).to match_schema(schema_file) - end - end - end -end diff --git a/spec/models/release_spec.rb b/spec/models/release_spec.rb index 3884b8138be..8b1b738ab58 100644 --- a/spec/models/release_spec.rb +++ b/spec/models/release_spec.rb @@ -15,7 +15,7 @@ RSpec.describe Release do it { is_expected.to have_many(:links).class_name('Releases::Link') } it { is_expected.to have_many(:milestones) } it { is_expected.to have_many(:milestone_releases) } - it { is_expected.to have_one(:evidence) } + it { is_expected.to have_many(:evidences).class_name('Releases::Evidence') } end describe 'validation' do @@ -97,7 +97,7 @@ RSpec.describe Release do describe '#create_evidence!' do context 'when a release is created' do it 'creates one Evidence object too' do - expect { release_with_evidence }.to change(Evidence, :count).by(1) + expect { release_with_evidence }.to change(Releases::Evidence, :count).by(1) end end end @@ -106,7 +106,7 @@ RSpec.describe Release do it 'also deletes the associated evidence' do release_with_evidence - expect { release_with_evidence.destroy }.to change(Evidence, :count).by(-1) + expect { release_with_evidence.destroy }.to change(Releases::Evidence, :count).by(-1) end end end @@ -155,7 +155,7 @@ RSpec.describe Release do context 'when a release was created with evidence collection' do let!(:release) { create(:release, :with_evidence) } - it { is_expected.to eq(release.evidence.summary_sha) } + it { is_expected.to eq(release.evidences.first.summary_sha) } end end @@ -171,7 +171,7 @@ RSpec.describe Release do context 'when a release was created with evidence collection' do let!(:release) { create(:release, :with_evidence) } - it { is_expected.to eq(release.evidence.summary) } + it { is_expected.to eq(release.evidences.first.summary) } end end diff --git a/spec/models/releases/evidence_spec.rb b/spec/models/releases/evidence_spec.rb new file mode 100644 index 00000000000..d38d2021117 --- /dev/null +++ b/spec/models/releases/evidence_spec.rb @@ -0,0 +1,87 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Releases::Evidence do + let_it_be(:project) { create(:project) } + let(:release) { create(:release, project: project) } + let(:schema_file) { 'evidences/evidence' } + let(:summary_json) { described_class.last.summary.to_json } + + describe 'associations' do + it { is_expected.to belong_to(:release) } + end + + describe 'summary_sha' do + it 'returns nil if summary is nil' do + expect(build(:evidence, summary: nil).summary_sha).to be_nil + end + end + + describe '#generate_summary_and_sha' do + before do + described_class.create!(release: release) + end + + context 'when a release name is not provided' do + let(:release) { create(:release, project: project, name: nil) } + + it 'creates a valid JSON object' do + expect(release.name).to eq(release.tag) + expect(summary_json).to match_schema(schema_file) + end + end + + context 'when a release is associated to a milestone' do + let(:milestone) { create(:milestone, project: project) } + let(:release) { create(:release, project: project, milestones: [milestone]) } + + context 'when a milestone has no issue associated with it' do + it 'creates a valid JSON object' do + expect(milestone.issues).to be_empty + expect(summary_json).to match_schema(schema_file) + end + end + + context 'when a milestone has no description' do + let(:milestone) { create(:milestone, project: project, description: nil) } + + it 'creates a valid JSON object' do + expect(milestone.description).to be_nil + expect(summary_json).to match_schema(schema_file) + end + end + + context 'when a milestone has no due_date' do + let(:milestone) { create(:milestone, project: project, due_date: nil) } + + it 'creates a valid JSON object' do + expect(milestone.due_date).to be_nil + expect(summary_json).to match_schema(schema_file) + end + end + + context 'when a milestone has an issue' do + context 'when the issue has no description' do + let(:issue) { create(:issue, project: project, description: nil, state: 'closed') } + + before do + milestone.issues << issue + end + + it 'creates a valid JSON object' do + expect(milestone.issues.first.description).to be_nil + expect(summary_json).to match_schema(schema_file) + end + end + end + end + + context 'when a release is not associated to any milestone' do + it 'creates a valid JSON object' do + expect(release.milestones).to be_empty + expect(summary_json).to match_schema(schema_file) + end + end + end +end -- cgit v1.2.3