diff options
Diffstat (limited to 'spec/models/event_spec.rb')
-rw-r--r-- | spec/models/event_spec.rb | 170 |
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) |