diff options
Diffstat (limited to 'spec')
12 files changed, 162 insertions, 24 deletions
diff --git a/spec/features/merge_request/user_creates_image_diff_notes_spec.rb b/spec/features/merge_request/user_creates_image_diff_notes_spec.rb index 47529518ba4..15f186b649a 100644 --- a/spec/features/merge_request/user_creates_image_diff_notes_spec.rb +++ b/spec/features/merge_request/user_creates_image_diff_notes_spec.rb @@ -28,7 +28,7 @@ RSpec.describe 'Merge request > User creates image diff notes', :js do it 'shows indicator and avatar badges, and allows collapsing/expanding the discussion notes' do indicator = find('.js-image-badge') - badge = find('.image-diff-avatar-link .badge') + badge = find('.image-diff-avatar-link .design-note-pin') expect(indicator).to have_content('1') expect(badge).to have_content('1') diff --git a/spec/frontend/batch_comments/components/diff_file_drafts_spec.js b/spec/frontend/batch_comments/components/diff_file_drafts_spec.js index 8805f6bf204..6a5ff1af7c9 100644 --- a/spec/frontend/batch_comments/components/diff_file_drafts_spec.js +++ b/spec/frontend/batch_comments/components/diff_file_drafts_spec.js @@ -3,6 +3,7 @@ import Vue from 'vue'; import Vuex from 'vuex'; import DiffFileDrafts from '~/batch_comments/components/diff_file_drafts.vue'; import DraftNote from '~/batch_comments/components/draft_note.vue'; +import DesignNotePin from '~/vue_shared/components/design_management/design_note_pin.vue'; Vue.use(Vuex); @@ -40,10 +41,12 @@ describe('Batch comments diff file drafts component', () => { it('renders index of draft note', () => { factory(); - expect(vm.findAll('.js-diff-notes-index').length).toEqual(2); + const elements = vm.findAll(DesignNotePin); - expect(vm.findAll('.js-diff-notes-index').at(0).text()).toEqual('1'); + expect(elements.length).toEqual(2); - expect(vm.findAll('.js-diff-notes-index').at(1).text()).toEqual('2'); + expect(elements.at(0).props('label')).toEqual(1); + + expect(elements.at(1).props('label')).toEqual(2); }); }); diff --git a/spec/frontend/diffs/components/diff_discussions_spec.js b/spec/frontend/diffs/components/diff_discussions_spec.js index 8d0c9b01188..2da68adddf6 100644 --- a/spec/frontend/diffs/components/diff_discussions_spec.js +++ b/spec/frontend/diffs/components/diff_discussions_spec.js @@ -71,7 +71,7 @@ describe('DiffDiscussions', () => { expect(diffNotesToggle.text().trim()).toBe('1'); expect(diffNotesToggle.classes()).toEqual( - expect.arrayContaining(['btn-transparent', 'badge', 'badge-pill']), + expect.arrayContaining(['js-diff-notes-toggle', 'gl-translate-x-n50', 'design-note-pin']), ); }); @@ -87,8 +87,8 @@ describe('DiffDiscussions', () => { createComponent({ renderAvatarBadge: true }); const noteableDiscussion = wrapper.find(NoteableDiscussion); - expect(noteableDiscussion.find('.badge-pill').exists()).toBe(true); - expect(noteableDiscussion.find('.badge-pill').text().trim()).toBe('1'); + expect(noteableDiscussion.find('.design-note-pin').exists()).toBe(true); + expect(noteableDiscussion.find('.design-note-pin').text().trim()).toBe('1'); }); }); }); diff --git a/spec/frontend/diffs/components/image_diff_overlay_spec.js b/spec/frontend/diffs/components/image_diff_overlay_spec.js index 8c1a8041f6c..70191620eb6 100644 --- a/spec/frontend/diffs/components/image_diff_overlay_spec.js +++ b/spec/frontend/diffs/components/image_diff_overlay_spec.js @@ -1,5 +1,5 @@ import { GlIcon } from '@gitlab/ui'; -import { shallowMount } from '@vue/test-utils'; +import { mount } from '@vue/test-utils'; import ImageDiffOverlay from '~/diffs/components/image_diff_overlay.vue'; import { createStore } from '~/mr_notes/stores'; import { imageDiffDiscussions } from '../mock_data/diff_discussions'; @@ -19,7 +19,7 @@ describe('Diffs image diff overlay component', () => { extendStore(store); dispatch = jest.spyOn(store, 'dispatch').mockImplementation(); - wrapper = shallowMount(ImageDiffOverlay, { + wrapper = mount(ImageDiffOverlay, { store, parentComponent: { data() { diff --git a/spec/frontend/image_diff/helpers/badge_helper_spec.js b/spec/frontend/image_diff/helpers/badge_helper_spec.js index c970ccc535d..9ac6ebf6fdb 100644 --- a/spec/frontend/image_diff/helpers/badge_helper_spec.js +++ b/spec/frontend/image_diff/helpers/badge_helper_spec.js @@ -62,7 +62,10 @@ describe('badge helper', () => { }); it('should add badge classes', () => { - expect(buttonEl.className).toContain('badge badge-pill'); + const classes = buttonEl.className.split(' '); + expect(classes).toEqual( + expect.arrayContaining(['design-note-pin', 'on-image', 'gl-absolute']), + ); }); it('should set the badge text', () => { @@ -105,7 +108,7 @@ describe('badge helper', () => { beforeEach(() => { containerEl.innerHTML = ` <div id="${noteId}"> - <div class="badge hidden"> + <div class="design-note-pin hidden"> </div> </div> `; @@ -116,7 +119,7 @@ describe('badge helper', () => { badgeNumber, }, }); - avatarBadgeEl = containerEl.querySelector(`#${noteId} .badge`); + avatarBadgeEl = containerEl.querySelector(`#${noteId} .design-note-pin`); }); it('should update badge number', () => { diff --git a/spec/frontend/image_diff/helpers/dom_helper_spec.js b/spec/frontend/image_diff/helpers/dom_helper_spec.js index 9357d626bbe..1c5f1cbe3da 100644 --- a/spec/frontend/image_diff/helpers/dom_helper_spec.js +++ b/spec/frontend/image_diff/helpers/dom_helper_spec.js @@ -37,14 +37,16 @@ describe('domHelper', () => { discussionEl = document.createElement('div'); discussionEl.innerHTML = ` <a href="#" class="image-diff-avatar-link"> - <div class="badge"></div> + <div class="design-note-pin"></div> </a> `; domHelper.updateDiscussionAvatarBadgeNumber(discussionEl, badgeNumber); }); it('should update avatar badge number', () => { - expect(discussionEl.querySelector('.badge').textContent).toEqual(badgeNumber.toString()); + expect(discussionEl.querySelector('.design-note-pin').textContent).toEqual( + badgeNumber.toString(), + ); }); }); @@ -54,13 +56,15 @@ describe('domHelper', () => { beforeEach(() => { discussionEl = document.createElement('div'); discussionEl.innerHTML = ` - <div class="badge"></div> + <div class="design-note-pin"></div> `; domHelper.updateDiscussionBadgeNumber(discussionEl, badgeNumber); }); it('should update discussion badge number', () => { - expect(discussionEl.querySelector('.badge').textContent).toEqual(badgeNumber.toString()); + expect(discussionEl.querySelector('.design-note-pin').textContent).toEqual( + badgeNumber.toString(), + ); }); }); diff --git a/spec/frontend/image_diff/image_diff_spec.js b/spec/frontend/image_diff/image_diff_spec.js index 16d19f45496..710aa7108a8 100644 --- a/spec/frontend/image_diff/image_diff_spec.js +++ b/spec/frontend/image_diff/image_diff_spec.js @@ -15,9 +15,9 @@ describe('ImageDiff', () => { <div class="js-image-frame"> <img src="${TEST_HOST}/image.png"> <div class="comment-indicator"></div> - <div id="badge-1" class="badge">1</div> - <div id="badge-2" class="badge">2</div> - <div id="badge-3" class="badge">3</div> + <div id="badge-1" class="design-note-pin">1</div> + <div id="badge-2" class="design-note-pin">2</div> + <div id="badge-3" class="design-note-pin">3</div> </div> <div class="note-container"> <div class="discussion-notes"> @@ -335,7 +335,7 @@ describe('ImageDiff', () => { describe('cascade badge count', () => { it('should update next imageBadgeEl value', () => { - const imageBadgeEls = imageDiff.imageFrameEl.querySelectorAll('.badge'); + const imageBadgeEls = imageDiff.imageFrameEl.querySelectorAll('.design-note-pin'); expect(imageBadgeEls[0].textContent).toEqual('1'); expect(imageBadgeEls[1].textContent).toEqual('2'); diff --git a/spec/frontend/vue_shared/components/design_management/design_note_pin_spec.js b/spec/frontend/vue_shared/components/design_management/design_note_pin_spec.js index 984a28c93d6..353d493add9 100644 --- a/spec/frontend/vue_shared/components/design_management/design_note_pin_spec.js +++ b/spec/frontend/vue_shared/components/design_management/design_note_pin_spec.js @@ -39,4 +39,72 @@ describe('Design note pin component', () => { createComponent({ position: null }); expect(wrapper.element).toMatchSnapshot(); }); + + it('applies `on-image` class when isOnImage is true', () => { + createComponent({ isOnImage: true }); + + expect(wrapper.find('.on-image').exists()).toBe(true); + }); + + it('applies `draft` class when isDraft is true', () => { + createComponent({ isDraft: true }); + + expect(wrapper.find('.draft').exists()).toBe(true); + }); + + describe('size', () => { + it('is `sm` it applies `small` class', () => { + createComponent({ size: 'sm' }); + expect(wrapper.find('.small').exists()).toBe(true); + }); + + it('is `md` it applies no size class', () => { + createComponent({ size: 'md' }); + expect(wrapper.find('.small').exists()).toBe(false); + expect(wrapper.find('.medium').exists()).toBe(false); + }); + + it('throws when passed any other value except `sm` or `md`', () => { + jest.spyOn(console, 'error').mockImplementation(() => {}); + + createComponent({ size: 'lg' }); + + // eslint-disable-next-line no-console + expect(console.error).toHaveBeenCalled(); + }); + }); + + describe('ariaLabel', () => { + describe('when value is passed', () => { + it('overrides default aria-label', () => { + const ariaLabel = 'Aria Label'; + + createComponent({ ariaLabel }); + + const button = wrapper.find('button'); + + expect(button.attributes('aria-label')).toBe(ariaLabel); + }); + }); + + describe('when no value is passed', () => { + it('shows new note label as aria-label when label is absent', () => { + createComponent({ label: null }); + + const button = wrapper.find('button'); + + expect(button.attributes('aria-label')).toBe('Comment form position'); + }); + + it('shows label position as aria-label when label is present', () => { + const label = 1; + + createComponent({ label, isNewNote: false }); + + const button = wrapper.find('button'); + + expect(button.attributes('aria-label')).toBe(`Comment '${label}' position`); + }); + }); + }); }); diff --git a/spec/graphql/types/repository/blob_type_spec.rb b/spec/graphql/types/repository/blob_type_spec.rb index 489b617f763..565341d15b9 100644 --- a/spec/graphql/types/repository/blob_type_spec.rb +++ b/spec/graphql/types/repository/blob_type_spec.rb @@ -41,7 +41,8 @@ RSpec.describe Types::Repository::BlobType do :ide_edit_path, :external_storage_url, :fork_and_edit_path, - :ide_fork_and_edit_path + :ide_fork_and_edit_path, + :language ) end end diff --git a/spec/lib/gitlab/event_store/store_spec.rb b/spec/lib/gitlab/event_store/store_spec.rb index 711e1d5b4d5..284018582a7 100644 --- a/spec/lib/gitlab/event_store/store_spec.rb +++ b/spec/lib/gitlab/event_store/store_spec.rb @@ -224,6 +224,26 @@ RSpec.describe Gitlab::EventStore::Store do store.publish(event) end end + + context 'when the event does not have any subscribers' do + let(:store) do + described_class.new do |s| + s.subscribe unrelated_worker, to: another_event_klass + end + end + + let(:event) { event_klass.new(data: data) } + + it 'returns successfully' do + expect { store.publish(event) }.not_to raise_error + end + + it 'does not dispatch the event to another subscription' do + expect(unrelated_worker).not_to receive(:perform_async) + + store.publish(event) + end + end end describe 'subscriber' do diff --git a/spec/presenters/blob_presenter_spec.rb b/spec/presenters/blob_presenter_spec.rb index abeeef69d39..225386d9596 100644 --- a/spec/presenters/blob_presenter_spec.rb +++ b/spec/presenters/blob_presenter_spec.rb @@ -170,13 +170,13 @@ RSpec.describe BlobPresenter do let(:git_blob) { blob.__getobj__ } it 'returns highlighted content' do - expect(Gitlab::Highlight).to receive(:highlight).with('files/ruby/regex.rb', git_blob.data, plain: nil, language: nil) + expect(Gitlab::Highlight).to receive(:highlight).with('files/ruby/regex.rb', git_blob.data, plain: nil, language: 'ruby') presenter.highlight end it 'returns plain content when :plain is true' do - expect(Gitlab::Highlight).to receive(:highlight).with('files/ruby/regex.rb', git_blob.data, plain: true, language: nil) + expect(Gitlab::Highlight).to receive(:highlight).with('files/ruby/regex.rb', git_blob.data, plain: true, language: 'ruby') presenter.highlight(plain: true) end @@ -189,7 +189,7 @@ RSpec.describe BlobPresenter do end it 'returns limited highlighted content' do - expect(Gitlab::Highlight).to receive(:highlight).with('files/ruby/regex.rb', "line one\n", plain: nil, language: nil) + expect(Gitlab::Highlight).to receive(:highlight).with('files/ruby/regex.rb', "line one\n", plain: nil, language: 'ruby') presenter.highlight(to: 1) end @@ -247,6 +247,36 @@ RSpec.describe BlobPresenter do end end + describe '#blob_language' do + subject { presenter.blob_language } + + it { is_expected.to eq('ruby') } + + context 'gitlab-language contains a match' do + before do + allow(blob).to receive(:language_from_gitattributes).and_return('cpp') + end + + it { is_expected.to eq('cpp') } + end + + context 'when blob is ipynb' do + let(:blob) { repository.blob_at('f6b7a707', 'files/ipython/markdown-table.ipynb') } + + before do + allow(Gitlab::Diff::CustomDiff).to receive(:transformed_for_diff?).and_return(true) + end + + it { is_expected.to eq('md') } + end + + context 'when blob is binary' do + let(:blob) { repository.blob_at('HEAD', 'Gemfile.zip') } + + it { is_expected.to be_nil } + end + end + describe '#raw_plain_data' do let(:blob) { repository.blob_at('HEAD', file) } diff --git a/spec/services/members/create_service_spec.rb b/spec/services/members/create_service_spec.rb index 13f56fe7458..b3bfdfbcc4d 100644 --- a/spec/services/members/create_service_spec.rb +++ b/spec/services/members/create_service_spec.rb @@ -39,6 +39,15 @@ RSpec.describe Members::CreateService, :aggregate_failures, :clean_gitlab_redis_ expect(source.users).to include member expect(OnboardingProgress.completed?(source, :user_added)).to be(true) end + + it 'triggers a members added event' do + expect(Gitlab::EventStore) + .to receive(:publish) + .with(an_instance_of(Members::MembersAddedEvent)) + .and_call_original + + expect(execute_service[:status]).to eq(:success) + end end end |