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
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/event_spec.rb')
-rw-r--r--spec/models/event_spec.rb170
1 files changed, 147 insertions, 23 deletions
diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb
index ac89f8fe9e1..14066b1e9d2 100644
--- a/spec/models/event_spec.rb
+++ b/spec/models/event_spec.rb
@@ -13,6 +13,7 @@ describe Event do
it { is_expected.to respond_to(:author_email) }
it { is_expected.to respond_to(:issue_title) }
it { is_expected.to respond_to(:merge_request_title) }
+ it { is_expected.to respond_to(:design_title) }
end
describe 'Callbacks' do
@@ -37,7 +38,7 @@ describe Event do
project.reload
- expect(project.last_repository_updated_at).to be_within(1.minute).of(Time.now)
+ expect(project.last_repository_updated_at).to be_within(1.minute).of(Time.current)
end
end
@@ -67,19 +68,32 @@ describe Event do
end
end
- describe 'after_create :track_user_interacted_projects' do
+ describe 'after_create UserInteractedProject.track' do
let(:event) { build(:push_event, project: project, author: project.owner) }
it 'passes event to UserInteractedProject.track' do
- expect(UserInteractedProject).to receive(:available?).and_return(true)
expect(UserInteractedProject).to receive(:track).with(event)
event.save
end
+ end
+ end
- it 'does not call UserInteractedProject.track if its not yet available' do
- expect(UserInteractedProject).to receive(:available?).and_return(false)
- expect(UserInteractedProject).not_to receive(:track)
- event.save
+ describe 'validations' do
+ describe 'action' do
+ context 'for a design' do
+ where(:action, :valid) do
+ valid = described_class::DESIGN_ACTIONS.map(&:to_s).to_set
+
+ described_class.actions.keys.map do |action|
+ [action, valid.include?(action)]
+ end
+ end
+
+ with_them do
+ let(:event) { build(:design_event, action: action) }
+
+ specify { expect(event.valid?).to eq(valid) }
+ end
end
end
end
@@ -552,7 +566,7 @@ describe Event do
end
end
- context 'design event' do
+ context 'design note event' do
include DesignManagementTestHelpers
let(:target) { note_on_design }
@@ -577,6 +591,32 @@ describe Event do
include_examples 'visible to assignee and author', true
end
end
+
+ context 'design event' do
+ include DesignManagementTestHelpers
+
+ let(:target) { design }
+
+ before do
+ enable_design_management
+ end
+
+ include_examples 'visibility examples' do
+ let(:visibility) { visible_to_all }
+ end
+
+ include_examples 'visible to assignee and author', true
+
+ context 'the event refers to a design on a confidential issue' do
+ let(:design) { create(:design, issue: confidential_issue, project: project) }
+
+ include_examples 'visibility examples' do
+ let(:visibility) { visible_to_none_except(:member, :admin) }
+ end
+
+ include_examples 'visible to assignee and author', true
+ end
+ end
end
describe 'wiki_page predicate scopes' do
@@ -587,10 +627,31 @@ describe Event do
create(:wiki_page_event),
create(:closed_issue_event),
create(:event, :created),
- create(:wiki_page_event)
+ create(:design_event, :destroyed),
+ create(:wiki_page_event),
+ create(:design_event)
]
end
+ describe '.for_design' do
+ it 'only includes design events' do
+ design_events = events.select(&:design?)
+
+ expect(described_class.for_design)
+ .to be_present
+ .and match_array(design_events)
+ end
+ end
+
+ describe '.not_design' do
+ it 'does not contain the design events' do
+ non_design_events = events.reject(&:design?)
+
+ expect(events).not_to match_array(non_design_events)
+ expect(described_class.not_design).to match_array(non_design_events)
+ end
+ end
+
describe '.for_wiki_page' do
it 'only contains the wiki page events' do
wiki_events = events.select(&:wiki_page?)
@@ -618,26 +679,76 @@ describe Event do
end
end
- describe '#wiki_page and #wiki_page?' do
+ describe 'categorization' do
let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:all_valid_events) do
+ # mapping from factory name to whether we need to supply the project
+ valid_target_factories = {
+ issue: true,
+ note_on_issue: true,
+ user: false,
+ merge_request: true,
+ note_on_merge_request: true,
+ project_snippet: true,
+ personal_snippet: false,
+ note_on_project_snippet: true,
+ note_on_personal_snippet: false,
+ wiki_page_meta: true,
+ milestone: true,
+ project: false,
+ design: true,
+ note_on_design: true,
+ note_on_commit: true
+ }
+ valid_target_factories.map do |kind, needs_project|
+ extra_data = needs_project ? { project: project } : {}
+ target = kind == :project ? nil : build(kind, **extra_data)
+ [kind, build(:event, :created, project: project, target: target)]
+ end.to_h
+ end
+
+ it 'passes a sanity check', :aggregate_failures do
+ expect(all_valid_events.values).to all(be_valid)
+ end
- context 'for a wiki page event' do
- let(:wiki_page) do
- create(:wiki_page, project: project)
+ describe '#wiki_page and #wiki_page?' do
+ context 'for a wiki page event' do
+ let(:wiki_page) do
+ create(:wiki_page, project: project)
+ end
+
+ subject(:event) { create(:wiki_page_event, project: project, wiki_page: wiki_page) }
+
+ it { is_expected.to have_attributes(wiki_page?: be_truthy, wiki_page: wiki_page) }
end
- subject(:event) { create(:wiki_page_event, project: project, wiki_page: wiki_page) }
+ context 'for any other event' do
+ it 'has no wiki_page and is not a wiki_page', :aggregate_failures do
+ all_valid_events.each do |k, event|
+ next if k == :wiki_page_meta
- it { is_expected.to have_attributes(wiki_page?: be_truthy, wiki_page: wiki_page) }
+ expect(event).to have_attributes(wiki_page: be_nil, wiki_page?: be_falsy)
+ end
+ end
+ end
end
- [:issue, :user, :merge_request, :snippet, :milestone, nil].each do |kind|
- context "for a #{kind} event" do
- it 'is nil' do
- target = create(kind) if kind
- event = create(:event, project: project, target: target)
+ describe '#design and #design?' do
+ context 'for a design event' do
+ let(:design) { build(:design, project: project) }
+
+ subject(:event) { build(:design_event, target: design, project: project) }
+
+ it { is_expected.to have_attributes(design?: be_truthy, design: design) }
+ end
+
+ context 'for any other event' do
+ it 'has no design and is not a design', :aggregate_failures do
+ all_valid_events.each do |k, event|
+ next if k == :design
- expect(event).to have_attributes(wiki_page: be_nil, wiki_page?: be_falsy)
+ expect(event).to have_attributes(design: be_nil, design?: be_falsy)
+ end
end
end
end
@@ -665,7 +776,7 @@ describe Event do
context 'when a project was updated less than 1 hour ago' do
it 'does not update the project' do
- project.update(last_activity_at: Time.now)
+ project.update(last_activity_at: Time.current)
expect(project).not_to receive(:update_column)
.with(:last_activity_at, a_kind_of(Time))
@@ -682,7 +793,7 @@ describe Event do
project.reload
- expect(project.last_activity_at).to be_within(1.minute).of(Time.now)
+ expect(project.last_activity_at).to be_within(1.minute).of(Time.current)
end
end
end
@@ -765,6 +876,19 @@ describe Event do
end
end
+ describe '#action_name' do
+ it 'handles all valid design events' do
+ created, updated, destroyed, archived = %i[created updated destroyed archived].map do |trait|
+ build(:design_event, trait).action_name
+ end
+
+ expect(created).to eq('uploaded')
+ expect(updated).to eq('revised')
+ expect(destroyed).to eq('deleted')
+ expect(archived).to eq('archived')
+ end
+ end
+
def create_push_event(project, user)
event = create(:push_event, project: project, author: user)