diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-05-12 00:08:09 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-05-12 00:08:09 +0300 |
commit | fdc26e021b1e3eea4161bf6891f3a151fb7414b0 (patch) | |
tree | f06ce58930f41f8d031e827df198fed5dfab09be /spec | |
parent | 11df4bf91b8cf9ac7bb601241992e300eebf684c (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
48 files changed, 179 insertions, 237 deletions
diff --git a/spec/factories/namespace_ci_cd_settings.rb b/spec/factories/namespace_ci_cd_settings.rb new file mode 100644 index 00000000000..0e58a19ee8d --- /dev/null +++ b/spec/factories/namespace_ci_cd_settings.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :namespace_ci_cd_settings, class: 'NamespaceCiCdSetting' do + namespace + end +end diff --git a/spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb b/spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb index 23b03e33f5d..03f9f6ef565 100644 --- a/spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb +++ b/spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb @@ -61,38 +61,6 @@ RSpec.describe 'Merge request < User sees mini pipeline graph', :js do wait_for_requests end - # Status icon button styles should update as described in - # https://gitlab.com/gitlab-org/gitlab-foss/issues/42769 - it 'has unique styles for default, :hover, :active, and :focus states' do - default_background_color, default_foreground_color, default_box_shadow = get_toggle_colors(dropdown_selector) - - toggle.hover - hover_background_color, hover_foreground_color, hover_box_shadow = get_toggle_colors(dropdown_selector) - - page.driver.browser.action.click_and_hold(toggle.native).perform - active_background_color, active_foreground_color, active_box_shadow = get_toggle_colors(dropdown_selector) - page.driver.browser.action.release(toggle.native).perform - - page.driver.browser.action.click(toggle.native).move_by(100, 100).perform - focus_background_color, focus_foreground_color, focus_box_shadow = get_toggle_colors(dropdown_selector) - - expect(default_background_color).not_to eq(hover_background_color) - expect(hover_background_color).not_to eq(active_background_color) - expect(default_background_color).not_to eq(active_background_color) - - expect(default_foreground_color).not_to eq(hover_foreground_color) - expect(hover_foreground_color).not_to eq(active_foreground_color) - expect(default_foreground_color).not_to eq(active_foreground_color) - - expect(focus_background_color).to eq(hover_background_color) - expect(focus_foreground_color).to eq(hover_foreground_color) - - expect(default_box_shadow).to eq('none') - expect(hover_box_shadow).to eq('none') - expect(active_box_shadow).not_to eq('none') - expect(focus_box_shadow).not_to eq('none') - end - it 'shows tooltip when hovered' do toggle.hover @@ -147,15 +115,4 @@ RSpec.describe 'Merge request < User sees mini pipeline graph', :js do end end end - - private - - def get_toggle_colors(selector) - find(selector) - [ - evaluate_script("$('#{selector} button:visible').css('background-color');"), - evaluate_script("$('#{selector} button:visible svg').css('fill');"), - evaluate_script("$('#{selector} button:visible').css('box-shadow');") - ] - end end diff --git a/spec/features/projects/commit/mini_pipeline_graph_spec.rb b/spec/features/projects/commit/mini_pipeline_graph_spec.rb index 57b35d81bb8..e472cff38ce 100644 --- a/spec/features/projects/commit/mini_pipeline_graph_spec.rb +++ b/spec/features/projects/commit/mini_pipeline_graph_spec.rb @@ -29,7 +29,7 @@ RSpec.describe 'Mini Pipeline Graph in Commit View', :js do it 'displays a mini pipeline graph' do expect(page).to have_selector('[data-testid="commit-box-mini-graph"]') - first('.mini-pipeline-graph-dropdown-toggle').click + first('[data-testid="mini-pipeline-graph-dropdown"]').click wait_for_requests diff --git a/spec/finders/error_tracking/errors_finder_spec.rb b/spec/finders/error_tracking/errors_finder_spec.rb deleted file mode 100644 index 66eb7769a4c..00000000000 --- a/spec/finders/error_tracking/errors_finder_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe ErrorTracking::ErrorsFinder do - let_it_be(:project) { create(:project) } - let_it_be(:user) { project.creator } - let_it_be(:error) { create(:error_tracking_error, project: project) } - let_it_be(:error_resolved) { create(:error_tracking_error, :resolved, project: project, first_seen_at: 2.hours.ago) } - let_it_be(:error_yesterday) { create(:error_tracking_error, project: project, first_seen_at: Time.zone.now.yesterday) } - - before do - project.add_maintainer(user) - end - - describe '#execute' do - let(:params) { {} } - - subject { described_class.new(user, project, params).execute } - - it { is_expected.to contain_exactly(error, error_resolved, error_yesterday) } - - context 'with status parameter' do - let(:params) { { status: 'resolved' } } - - it { is_expected.to contain_exactly(error_resolved) } - end - - context 'with sort parameter' do - let(:params) { { status: 'unresolved', sort: 'first_seen' } } - - it { expect(subject.to_a).to eq([error, error_yesterday]) } - end - - context 'pagination' do - let(:params) { { limit: '1', sort: 'first_seen' } } - - # Sort by first_seen is DESC by default, so the most recent error is `error` - it { is_expected.to contain_exactly(error) } - - it { expect(subject.has_next_page?).to be_truthy } - - it 'returns next page by cursor' do - params_with_cursor = params.merge(cursor: subject.cursor_for_next_page) - errors = described_class.new(user, project, params_with_cursor).execute - - expect(errors).to contain_exactly(error_resolved) - expect(errors.has_next_page?).to be_truthy - expect(errors.has_previous_page?).to be_truthy - end - end - end -end diff --git a/spec/frontend/__helpers__/init_vue_mr_page_helper.js b/spec/frontend/__helpers__/init_vue_mr_page_helper.js index ee01e9e6268..6b719a32480 100644 --- a/spec/frontend/__helpers__/init_vue_mr_page_helper.js +++ b/spec/frontend/__helpers__/init_vue_mr_page_helper.js @@ -13,16 +13,16 @@ export default function initVueMRPage() { const diffsAppProjectPath = 'testproject'; const mrEl = document.createElement('div'); mrEl.className = 'merge-request fixture-mr'; - mrEl.setAttribute('data-mr-action', 'diffs'); + mrEl.dataset.mrAction = 'diffs'; mrTestEl.appendChild(mrEl); const mrDiscussionsEl = document.createElement('div'); mrDiscussionsEl.id = 'js-vue-mr-discussions'; - mrDiscussionsEl.setAttribute('data-current-user-data', JSON.stringify(userDataMock)); - mrDiscussionsEl.setAttribute('data-noteable-data', JSON.stringify(noteableDataMock)); - mrDiscussionsEl.setAttribute('data-notes-data', JSON.stringify(notesDataMock)); - mrDiscussionsEl.setAttribute('data-noteable-type', 'merge-request'); - mrDiscussionsEl.setAttribute('data-is-locked', 'false'); + mrDiscussionsEl.dataset.currentUserData = JSON.stringify(userDataMock); + mrDiscussionsEl.dataset.noteableData = JSON.stringify(noteableDataMock); + mrDiscussionsEl.dataset.notesData = JSON.stringify(notesDataMock); + mrDiscussionsEl.dataset.noteableType = 'merge-request'; + mrDiscussionsEl.dataset.isLocked = 'false'; mrTestEl.appendChild(mrDiscussionsEl); const discussionCounterEl = document.createElement('div'); @@ -31,9 +31,9 @@ export default function initVueMRPage() { const diffsAppEl = document.createElement('div'); diffsAppEl.id = 'js-diffs-app'; - diffsAppEl.setAttribute('data-endpoint', diffsAppEndpoint); - diffsAppEl.setAttribute('data-project-path', diffsAppProjectPath); - diffsAppEl.setAttribute('data-current-user-data', JSON.stringify(userDataMock)); + diffsAppEl.dataset.endpoint = diffsAppEndpoint; + diffsAppEl.dataset.projectPath = diffsAppProjectPath; + diffsAppEl.dataset.currentUserData = JSON.stringify(userDataMock); mrTestEl.appendChild(diffsAppEl); const mock = new MockAdapter(axios); diff --git a/spec/frontend/__helpers__/matchers/to_have_sprite_icon.js b/spec/frontend/__helpers__/matchers/to_have_sprite_icon.js index bce9d93bea8..45b9c31c4db 100644 --- a/spec/frontend/__helpers__/matchers/to_have_sprite_icon.js +++ b/spec/frontend/__helpers__/matchers/to_have_sprite_icon.js @@ -9,7 +9,7 @@ export const toHaveSpriteIcon = (element, iconName) => { const iconReferences = [].slice.apply(element.querySelectorAll('svg use')); const matchingIcon = iconReferences.find( - (reference) => reference.parentNode.getAttribute('data-testid') === `${iconName}-icon`, + (reference) => reference.parentNode.dataset.testid === `${iconName}-icon`, ); const pass = Boolean(matchingIcon); diff --git a/spec/frontend/access_tokens/index_spec.js b/spec/frontend/access_tokens/index_spec.js index 1d8ac7cec25..5f0a7dfc775 100644 --- a/spec/frontend/access_tokens/index_spec.js +++ b/spec/frontend/access_tokens/index_spec.js @@ -39,7 +39,7 @@ describe('access tokens', () => { const input = document.createElement('input'); input.setAttribute('name', nameAttribute); - input.setAttribute('data-js-name', fieldName); + input.dataset.jsName = fieldName; input.setAttribute('id', idAttribute); input.setAttribute('placeholder', 'Foo bar'); input.setAttribute('value', '1,2'); diff --git a/spec/frontend/admin/users/index_spec.js b/spec/frontend/admin/users/index_spec.js index 06dbadd6d3d..961fa96acdd 100644 --- a/spec/frontend/admin/users/index_spec.js +++ b/spec/frontend/admin/users/index_spec.js @@ -12,8 +12,8 @@ describe('initAdminUsersApp', () => { beforeEach(() => { el = document.createElement('div'); - el.setAttribute('data-users', JSON.stringify(users)); - el.setAttribute('data-paths', JSON.stringify(paths)); + el.dataset.users = JSON.stringify(users); + el.dataset.paths = JSON.stringify(paths); wrapper = createWrapper(initAdminUsersApp(el)); }); @@ -40,8 +40,8 @@ describe('initAdminUserActions', () => { beforeEach(() => { el = document.createElement('div'); - el.setAttribute('data-user', JSON.stringify(user)); - el.setAttribute('data-paths', JSON.stringify(paths)); + el.dataset.user = JSON.stringify(user); + el.dataset.paths = JSON.stringify(paths); wrapper = createWrapper(initAdminUserActions(el)); }); diff --git a/spec/frontend/authentication/two_factor_auth/index_spec.js b/spec/frontend/authentication/two_factor_auth/index_spec.js index 0ff9d60f409..f9a6b2df662 100644 --- a/spec/frontend/authentication/two_factor_auth/index_spec.js +++ b/spec/frontend/authentication/two_factor_auth/index_spec.js @@ -15,8 +15,8 @@ describe('initRecoveryCodes', () => { beforeEach(() => { el = document.createElement('div'); el.setAttribute('class', 'js-2fa-recovery-codes'); - el.setAttribute('data-codes', codesJsonString); - el.setAttribute('data-profile-account-path', profileAccountPath); + el.dataset.codes = codesJsonString; + el.dataset.profileAccountPath = profileAccountPath; document.body.appendChild(el); wrapper = createWrapper(initRecoveryCodes()); diff --git a/spec/frontend/blob/components/table_contents_spec.js b/spec/frontend/blob/components/table_contents_spec.js index ade35d39b4f..abb69a0be48 100644 --- a/spec/frontend/blob/components/table_contents_spec.js +++ b/spec/frontend/blob/components/table_contents_spec.js @@ -10,7 +10,7 @@ function createComponent() { } async function setLoaded(loaded) { - document.querySelector('.blob-viewer').setAttribute('data-loaded', loaded); + document.querySelector('.blob-viewer').dataset.loaded = loaded; await nextTick(); } @@ -51,7 +51,7 @@ describe('Markdown table of contents component', () => { it('does not show dropdown when viewing non-rich content', async () => { createComponent(); - document.querySelector('.blob-viewer').setAttribute('data-type', 'simple'); + document.querySelector('.blob-viewer').dataset.type = 'simple'; await setLoaded(true); diff --git a/spec/frontend/blob/viewer/index_spec.js b/spec/frontend/blob/viewer/index_spec.js index fe55a537b89..94422746fa7 100644 --- a/spec/frontend/blob/viewer/index_spec.js +++ b/spec/frontend/blob/viewer/index_spec.js @@ -77,9 +77,9 @@ describe('Blob viewer', () => { return asyncClick() .then(() => asyncClick()) .then(() => { - expect( - document.querySelector('.blob-viewer[data-type="simple"]').getAttribute('data-loaded'), - ).toBe('true'); + expect(document.querySelector('.blob-viewer[data-type="simple"]').dataset.loaded).toBe( + 'true', + ); }); }); diff --git a/spec/frontend/cascading_settings/components/lock_popovers_spec.js b/spec/frontend/cascading_settings/components/lock_popovers_spec.js index 585e6ac505b..182e3c1c8ff 100644 --- a/spec/frontend/cascading_settings/components/lock_popovers_spec.js +++ b/spec/frontend/cascading_settings/components/lock_popovers_spec.js @@ -21,12 +21,12 @@ describe('LockPopovers', () => { }; if (lockedByApplicationSetting) { - popoverMountEl.setAttribute('data-popover-data', JSON.stringify(popoverData)); + popoverMountEl.dataset.popoverData = JSON.stringify(popoverData); } else if (lockedByAncestor) { - popoverMountEl.setAttribute( - 'data-popover-data', - JSON.stringify({ ...popoverData, ancestor_namespace: mockNamespace }), - ); + popoverMountEl.dataset.popoverData = JSON.stringify({ + ...popoverData, + ancestor_namespace: mockNamespace, + }); } document.body.appendChild(popoverMountEl); diff --git a/spec/frontend/code_navigation/store/actions_spec.js b/spec/frontend/code_navigation/store/actions_spec.js index c26416aca94..a734fd44403 100644 --- a/spec/frontend/code_navigation/store/actions_spec.js +++ b/spec/frontend/code_navigation/store/actions_spec.js @@ -190,8 +190,8 @@ describe('Code navigation actions', () => { it('commits SET_CURRENT_DEFINITION with LSIF data', () => { target.classList.add('js-code-navigation'); - target.setAttribute('data-line-index', '0'); - target.setAttribute('data-char-index', '0'); + target.dataset.lineIndex = '0'; + target.dataset.charIndex = '0'; return testAction( actions.showDefinition, @@ -213,8 +213,8 @@ describe('Code navigation actions', () => { it('adds hll class to target element', () => { target.classList.add('js-code-navigation'); - target.setAttribute('data-line-index', '0'); - target.setAttribute('data-char-index', '0'); + target.dataset.lineIndex = '0'; + target.dataset.charIndex = '0'; return testAction( actions.showDefinition, @@ -238,8 +238,8 @@ describe('Code navigation actions', () => { it('caches current target element', () => { target.classList.add('js-code-navigation'); - target.setAttribute('data-line-index', '0'); - target.setAttribute('data-char-index', '0'); + target.dataset.lineIndex = '0'; + target.dataset.charIndex = '0'; return testAction( actions.showDefinition, diff --git a/spec/frontend/confirm_modal_spec.js b/spec/frontend/confirm_modal_spec.js index 53991349ee5..4224fb6be2a 100644 --- a/spec/frontend/confirm_modal_spec.js +++ b/spec/frontend/confirm_modal_spec.js @@ -31,9 +31,9 @@ describe('ConfirmModal', () => { buttons.forEach((x) => { const button = document.createElement('button'); button.setAttribute('class', 'js-confirm-modal-button'); - button.setAttribute('data-path', x.path); - button.setAttribute('data-method', x.method); - button.setAttribute('data-modal-attributes', JSON.stringify(x.modalAttributes)); + button.dataset.path = x.path; + button.dataset.method = x.method; + button.dataset.modalAttributes = JSON.stringify(x.modalAttributes); button.innerHTML = 'Action'; buttonContainer.appendChild(button); }); diff --git a/spec/frontend/helpers/startup_css_helper_spec.js b/spec/frontend/helpers/startup_css_helper_spec.js index 703bdbd342f..dca9faecea7 100644 --- a/spec/frontend/helpers/startup_css_helper_spec.js +++ b/spec/frontend/helpers/startup_css_helper_spec.js @@ -56,9 +56,10 @@ describe('waitForCSSLoaded', () => { <link href="two.css" data-startupcss="loading"> `); const events = waitForCSSLoaded(mockedCallback); - document - .querySelectorAll('[data-startupcss="loading"]') - .forEach((elem) => elem.setAttribute('data-startupcss', 'loaded')); + document.querySelectorAll('[data-startupcss="loading"]').forEach((elem) => { + // eslint-disable-next-line no-param-reassign + elem.dataset.startupcss = 'loaded'; + }); document.dispatchEvent(new CustomEvent('CSSStartupLinkLoaded')); await events; diff --git a/spec/frontend/issues/create_merge_request_dropdown_spec.js b/spec/frontend/issues/create_merge_request_dropdown_spec.js index 20b26f5abba..cb7173c56a8 100644 --- a/spec/frontend/issues/create_merge_request_dropdown_spec.js +++ b/spec/frontend/issues/create_merge_request_dropdown_spec.js @@ -84,7 +84,7 @@ describe('CreateMergeRequestDropdown', () => { }); it('enables when can create confidential issue', () => { - document.querySelector('.js-create-mr').setAttribute('data-is-confidential', 'true'); + document.querySelector('.js-create-mr').dataset.isConfidential = 'true'; confidentialState.selectedProject = { name: 'test' }; dropdown.enable(); @@ -93,7 +93,7 @@ describe('CreateMergeRequestDropdown', () => { }); it('does not enable when can not create confidential issue', () => { - document.querySelector('.js-create-mr').setAttribute('data-is-confidential', 'true'); + document.querySelector('.js-create-mr').dataset.isConfidential = 'true'; dropdown.enable(); diff --git a/spec/frontend/labels/delete_label_modal_spec.js b/spec/frontend/labels/delete_label_modal_spec.js index 98049538948..67220821fe0 100644 --- a/spec/frontend/labels/delete_label_modal_spec.js +++ b/spec/frontend/labels/delete_label_modal_spec.js @@ -25,11 +25,11 @@ describe('DeleteLabelModal', () => { buttons.forEach((x) => { const button = document.createElement('button'); button.setAttribute('class', 'js-delete-label-modal-button'); - button.setAttribute('data-label-name', x.labelName); - button.setAttribute('data-destroy-path', x.destroyPath); + button.dataset.labelName = x.labelName; + button.dataset.destroyPath = x.destroyPath; if (x.subjectName) { - button.setAttribute('data-subject-name', x.subjectName); + button.dataset.subjectName = x.subjectName; } button.innerHTML = 'Action'; diff --git a/spec/frontend/lazy_loader_spec.js b/spec/frontend/lazy_loader_spec.js index 3d8b0d9c307..e0b6c7119f9 100644 --- a/spec/frontend/lazy_loader_spec.js +++ b/spec/frontend/lazy_loader_spec.js @@ -27,7 +27,7 @@ describe('LazyLoader', () => { const createLazyLoadImage = () => { const newImg = document.createElement('img'); newImg.className = 'lazy'; - newImg.setAttribute('data-src', TEST_PATH); + newImg.dataset.src = TEST_PATH; document.body.appendChild(newImg); triggerChildMutation(); @@ -108,7 +108,7 @@ describe('LazyLoader', () => { expect(LazyLoader.loadImage).toHaveBeenCalledWith(img); expect(img.getAttribute('src')).toBe(TEST_PATH); - expect(img.getAttribute('data-src')).toBe(null); + expect(img.dataset.src).toBeUndefined(); expect(img).toHaveClass('js-lazy-loaded'); }); diff --git a/spec/frontend/lib/utils/datetime_utility_spec.js b/spec/frontend/lib/utils/datetime_utility_spec.js index 7a64b654baa..9459878ded0 100644 --- a/spec/frontend/lib/utils/datetime_utility_spec.js +++ b/spec/frontend/lib/utils/datetime_utility_spec.js @@ -308,7 +308,9 @@ describe('datefix', () => { }); describe('parsePikadayDate', () => { - // removed because of https://gitlab.com/gitlab-org/gitlab-foss/issues/39834 + it('should return a UTC date', () => { + expect(datetimeUtility.parsePikadayDate('2020-01-29')).toEqual(new Date('2020-01-29')); + }); }); describe('pikadayToString', () => { diff --git a/spec/frontend/members/index_spec.js b/spec/frontend/members/index_spec.js index efabe54f238..251a8b0b774 100644 --- a/spec/frontend/members/index_spec.js +++ b/spec/frontend/members/index_spec.js @@ -24,7 +24,7 @@ describe('initMembersApp', () => { beforeEach(() => { el = document.createElement('div'); - el.setAttribute('data-members-data', dataAttribute); + el.dataset.membersData = dataAttribute; window.gon = { current_user_id: 123 }; }); diff --git a/spec/frontend/members/utils_spec.js b/spec/frontend/members/utils_spec.js index a157cfa1c1d..b0c9459ff4f 100644 --- a/spec/frontend/members/utils_spec.js +++ b/spec/frontend/members/utils_spec.js @@ -256,7 +256,7 @@ describe('Members Utils', () => { beforeEach(() => { el = document.createElement('div'); - el.setAttribute('data-members-data', dataAttribute); + el.dataset.membersData = dataAttribute; }); afterEach(() => { diff --git a/spec/frontend/notebook/cells/markdown_spec.js b/spec/frontend/notebook/cells/markdown_spec.js index 7dc6f90d202..de415b5bfe0 100644 --- a/spec/frontend/notebook/cells/markdown_spec.js +++ b/spec/frontend/notebook/cells/markdown_spec.js @@ -78,8 +78,8 @@ describe('Markdown component', () => { }); await nextTick(); - expect(findLink().getAttribute('data-remote')).toBe(null); - expect(findLink().getAttribute('data-type')).toBe(null); + expect(findLink().dataset.remote).toBeUndefined(); + expect(findLink().dataset.type).toBeUndefined(); }); describe('When parsing images', () => { diff --git a/spec/frontend/notes/stores/actions_spec.js b/spec/frontend/notes/stores/actions_spec.js index 75e7756cd6b..b18acd591ed 100644 --- a/spec/frontend/notes/stores/actions_spec.js +++ b/spec/frontend/notes/stores/actions_spec.js @@ -400,13 +400,13 @@ describe('Actions Notes Store', () => { beforeEach(() => { axiosMock.onDelete(endpoint).replyOnce(200, {}); - document.body.setAttribute('data-page', ''); + document.body.dataset.page = ''; }); afterEach(() => { axiosMock.restore(); - document.body.setAttribute('data-page', ''); + document.body.dataset.page = ''; }); it('commits DELETE_NOTE and dispatches updateMergeRequestWidget', () => { @@ -436,7 +436,7 @@ describe('Actions Notes Store', () => { it('dispatches removeDiscussionsFromDiff on merge request page', () => { const note = { path: endpoint, id: 1 }; - document.body.setAttribute('data-page', 'projects:merge_requests:show'); + document.body.dataset.page = 'projects:merge_requests:show'; return testAction( actions.removeNote, @@ -469,13 +469,13 @@ describe('Actions Notes Store', () => { beforeEach(() => { axiosMock.onDelete(endpoint).replyOnce(200, {}); - document.body.setAttribute('data-page', ''); + document.body.dataset.page = ''; }); afterEach(() => { axiosMock.restore(); - document.body.setAttribute('data-page', ''); + document.body.dataset.page = ''; }); it('dispatches removeNote', () => { diff --git a/spec/frontend/performance_bar/index_spec.js b/spec/frontend/performance_bar/index_spec.js index 91cb46002be..af256b1d335 100644 --- a/spec/frontend/performance_bar/index_spec.js +++ b/spec/frontend/performance_bar/index_spec.js @@ -16,11 +16,11 @@ describe('performance bar wrapper', () => { performance.getEntriesByType = jest.fn().mockReturnValue([]); peekWrapper.setAttribute('id', 'js-peek'); - peekWrapper.setAttribute('data-env', 'development'); - peekWrapper.setAttribute('data-request-id', '123'); - peekWrapper.setAttribute('data-peek-url', '/-/peek/results'); - peekWrapper.setAttribute('data-stats-url', 'https://log.gprd.gitlab.net/app/dashboards#/view/'); - peekWrapper.setAttribute('data-profile-url', '?lineprofiler=true'); + peekWrapper.dataset.env = 'development'; + peekWrapper.dataset.requestId = '123'; + peekWrapper.dataset.peekUrl = '/-/peek/results'; + peekWrapper.dataset.statsUrl = 'https://log.gprd.gitlab.net/app/dashboards#/view/'; + peekWrapper.dataset.profileUrl = '?lineprofiler=true'; mock = new MockAdapter(axios); diff --git a/spec/frontend/pipelines/components/pipelines_list/pipeline_stage_spec.js b/spec/frontend/pipelines/components/pipelines_list/pipeline_stage_spec.js index 93bc8faa51b..6d0e99ff63e 100644 --- a/spec/frontend/pipelines/components/pipelines_list/pipeline_stage_spec.js +++ b/spec/frontend/pipelines/components/pipelines_list/pipeline_stage_spec.js @@ -1,6 +1,7 @@ import { GlDropdown } from '@gitlab/ui'; import { mount } from '@vue/test-utils'; import MockAdapter from 'axios-mock-adapter'; +import CiIcon from '~/vue_shared/components/ci_icon.vue'; import axios from '~/lib/utils/axios_utils'; import PipelineStage from '~/pipelines/components/pipelines_list/pipeline_stage.vue'; import eventHub from '~/pipelines/event_hub'; @@ -48,11 +49,12 @@ describe('Pipelines stage component', () => { mock.restore(); }); + const findCiActionBtn = () => wrapper.find('.js-ci-action'); + const findCiIcon = () => wrapper.findComponent(CiIcon); const findDropdown = () => wrapper.findComponent(GlDropdown); const findDropdownToggle = () => wrapper.find('button.dropdown-toggle'); const findDropdownMenu = () => wrapper.find('[data-testid="mini-pipeline-graph-dropdown-menu-list"]'); - const findCiActionBtn = () => wrapper.find('.js-ci-action'); const findMergeTrainWarning = () => wrapper.find('[data-testid="warning-message-merge-trains"]'); const openStageDropdown = () => { @@ -74,7 +76,7 @@ describe('Pipelines stage component', () => { it('should render a dropdown with the status icon', () => { expect(findDropdown().exists()).toBe(true); expect(findDropdownToggle().exists()).toBe(true); - expect(wrapper.find('[data-testid="status_success_borderless-icon"]').exists()).toBe(true); + expect(findCiIcon().exists()).toBe(true); }); }); diff --git a/spec/frontend/search_autocomplete_spec.js b/spec/frontend/search_autocomplete_spec.js index 190f2803324..48e0aab6561 100644 --- a/spec/frontend/search_autocomplete_spec.js +++ b/spec/frontend/search_autocomplete_spec.js @@ -52,7 +52,7 @@ describe('Search autocomplete dropdown', () => { }; const disableProjectIssues = () => { - document.querySelector('.js-search-project-options').setAttribute('data-issues-disabled', true); + document.querySelector('.js-search-project-options').dataset.issuesDisabled = true; }; // Mock `gl` object in window for dashboard specific page. App code will need it. diff --git a/spec/frontend/user_popovers_spec.js b/spec/frontend/user_popovers_spec.js index 65137330ac3..e703d283540 100644 --- a/spec/frontend/user_popovers_spec.js +++ b/spec/frontend/user_popovers_spec.js @@ -22,7 +22,7 @@ describe('User Popovers', () => { const link = document.createElement('a'); link.classList.add('js-user-link'); - link.setAttribute('data-user', '1'); + link.dataset.user = '1'; return link; }; diff --git a/spec/frontend/users_select/test_helper.js b/spec/frontend/users_select/test_helper.js index 59edde48eab..9231e38ea90 100644 --- a/spec/frontend/users_select/test_helper.js +++ b/spec/frontend/users_select/test_helper.js @@ -95,10 +95,10 @@ export const setAssignees = (...users) => { const input = document.createElement('input'); input.name = 'merge_request[assignee_ids][]'; input.value = user.id.toString(); - input.setAttribute('data-avatar-url', user.avatar_url); - input.setAttribute('data-name', user.name); - input.setAttribute('data-username', user.username); - input.setAttribute('data-can-merge', user.can_merge); + input.dataset.avatarUrl = user.avatar_url; + input.dataset.name = user.name; + input.dataset.username = user.username; + input.dataset.canMerge = user.can_merge; return input; }), ); diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js index 8efc4d84624..29ee7e0010f 100644 --- a/spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js +++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_merged_spec.js @@ -193,9 +193,7 @@ describe('MRWidgetMerged', () => { it('shows button to copy commit SHA to clipboard', () => { expect(selectors.copyMergeShaButton).not.toBe(null); - expect(selectors.copyMergeShaButton.getAttribute('data-clipboard-text')).toBe( - vm.mr.mergeCommitSha, - ); + expect(selectors.copyMergeShaButton.dataset.clipboardText).toBe(vm.mr.mergeCommitSha); }); it('hides button to copy commit SHA if SHA does not exist', async () => { diff --git a/spec/frontend/vue_mr_widget/mr_widget_options_spec.js b/spec/frontend/vue_mr_widget/mr_widget_options_spec.js index 9719e81fe12..1fe32605f09 100644 --- a/spec/frontend/vue_mr_widget/mr_widget_options_spec.js +++ b/spec/frontend/vue_mr_widget/mr_widget_options_spec.js @@ -423,7 +423,7 @@ describe('MrWidgetOptions', () => { beforeEach(() => { const favicon = document.createElement('link'); favicon.setAttribute('id', 'favicon'); - favicon.setAttribute('data-original-href', faviconDataUrl); + favicon.dataset.originalHref = faviconDataUrl; document.body.appendChild(favicon); faviconElement = document.getElementById('favicon'); diff --git a/spec/frontend_integration/ide/helpers/ide_helper.js b/spec/frontend_integration/ide/helpers/ide_helper.js index 00ce39a5598..4245e1f04c8 100644 --- a/spec/frontend_integration/ide/helpers/ide_helper.js +++ b/spec/frontend_integration/ide/helpers/ide_helper.js @@ -40,14 +40,14 @@ export const findMonacoDiffEditor = () => export const findAndSetEditorValue = async (value) => { const editor = await findMonacoEditor(); - const uri = editor.getAttribute('data-uri'); + const { uri } = editor.dataset; monacoEditor.getModel(uri).setValue(value); }; export const getEditorValue = async () => { const editor = await findMonacoEditor(); - const uri = editor.getAttribute('data-uri'); + const { uri } = editor.dataset; return monacoEditor.getModel(uri).getValue(); }; diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb index ebd8375e191..ffe2e71b50f 100644 --- a/spec/lib/gitlab/database/migration_helpers_spec.rb +++ b/spec/lib/gitlab/database/migration_helpers_spec.rb @@ -2422,8 +2422,6 @@ RSpec.describe Gitlab::Database::MigrationHelpers do describe '#backfill_iids' do include MigrationsHelpers - let_it_be(:issue_type) { table(:work_item_types).first } - let(:issue_class) do Class.new(ActiveRecord::Base) do include AtomicInternalId @@ -2437,8 +2435,6 @@ RSpec.describe Gitlab::Database::MigrationHelpers do scope: :project, init: ->(s, _scope) { s&.project&.issues&.maximum(:iid) }, presence: false - - before_validation -> { self.work_item_type_id = ::WorkItems::Type.default_issue_type.id } end end @@ -2464,7 +2460,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do it 'generates iids properly for models created after the migration when iids are backfilled' do project = setup - issue_a = issues.create!(project_id: project.id, work_item_type_id: issue_type.id) + issue_a = issues.create!(project_id: project.id) model.backfill_iids('issues') @@ -2477,14 +2473,14 @@ RSpec.describe Gitlab::Database::MigrationHelpers do it 'generates iids properly for models created after the migration across multiple projects' do project_a = setup project_b = setup - issues.create!(project_id: project_a.id, work_item_type_id: issue_type.id) - issues.create!(project_id: project_b.id, work_item_type_id: issue_type.id) - issues.create!(project_id: project_b.id, work_item_type_id: issue_type.id) + issues.create!(project_id: project_a.id) + issues.create!(project_id: project_b.id) + issues.create!(project_id: project_b.id) model.backfill_iids('issues') - issue_a = issue_class.create!(project_id: project_a.id, work_item_type_id: issue_type.id) - issue_b = issue_class.create!(project_id: project_b.id, work_item_type_id: issue_type.id) + issue_a = issue_class.create!(project_id: project_a.id) + issue_b = issue_class.create!(project_id: project_b.id) expect(issue_a.iid).to eq(2) expect(issue_b.iid).to eq(3) @@ -2494,7 +2490,7 @@ RSpec.describe Gitlab::Database::MigrationHelpers do it 'generates an iid' do project_a = setup project_b = setup - issue_a = issues.create!(project_id: project_a.id, work_item_type_id: issue_type.id) + issue_a = issues.create!(project_id: project_a.id) model.backfill_iids('issues') @@ -2508,8 +2504,8 @@ RSpec.describe Gitlab::Database::MigrationHelpers do context 'when a row already has an iid set in the database' do it 'backfills iids' do project = setup - issue_a = issues.create!(project_id: project.id, work_item_type_id: issue_type.id, iid: 1) - issue_b = issues.create!(project_id: project.id, work_item_type_id: issue_type.id, iid: 2) + issue_a = issues.create!(project_id: project.id, iid: 1) + issue_b = issues.create!(project_id: project.id, iid: 2) model.backfill_iids('issues') @@ -2520,9 +2516,9 @@ RSpec.describe Gitlab::Database::MigrationHelpers do it 'backfills for multiple projects' do project_a = setup project_b = setup - issue_a = issues.create!(project_id: project_a.id, work_item_type_id: issue_type.id, iid: 1) - issue_b = issues.create!(project_id: project_b.id, work_item_type_id: issue_type.id, iid: 1) - issue_c = issues.create!(project_id: project_a.id, work_item_type_id: issue_type.id, iid: 2) + issue_a = issues.create!(project_id: project_a.id, iid: 1) + issue_b = issues.create!(project_id: project_b.id, iid: 1) + issue_c = issues.create!(project_id: project_a.id, iid: 2) model.backfill_iids('issues') diff --git a/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb b/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb index 38ee87df4be..4287c32b947 100644 --- a/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb +++ b/spec/lib/gitlab/github_import/importer/issue_importer_spec.rb @@ -101,8 +101,7 @@ RSpec.describe Gitlab::GithubImport::Importer::IssueImporter, :clean_gitlab_redi milestone_id: milestone.id, state_id: 1, created_at: created_at, - updated_at: updated_at, - work_item_type_id: ::WorkItems::Type.default_issue_type.id + updated_at: updated_at }, project.issues ) @@ -131,8 +130,7 @@ RSpec.describe Gitlab::GithubImport::Importer::IssueImporter, :clean_gitlab_redi milestone_id: milestone.id, state_id: 1, created_at: created_at, - updated_at: updated_at, - work_item_type_id: ::WorkItems::Type.default_issue_type.id + updated_at: updated_at }, project.issues ) diff --git a/spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb b/spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb index 81910773dfa..d22bef5bda9 100644 --- a/spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb +++ b/spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb @@ -11,8 +11,6 @@ RSpec.describe Gitlab::MarkdownCache::ActiveRecord::Extension do attribute :author attribute :project - - before_validation -> { self.work_item_type_id = ::WorkItems::Type.default_issue_type.id } end end diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb index f95feee47a9..3fe7171728e 100644 --- a/spec/models/ci/build_spec.rb +++ b/spec/models/ci/build_spec.rb @@ -743,7 +743,7 @@ RSpec.describe Ci::Build do it { is_expected.to be_falsey } end - context 'when there are runners' do + context 'when there is a runner' do let(:runner) { create(:ci_runner, :project, projects: [build.project]) } before do @@ -752,19 +752,28 @@ RSpec.describe Ci::Build do it { is_expected.to be_truthy } - it 'that is inactive' do - runner.update!(active: false) - is_expected.to be_falsey + context 'that is inactive' do + before do + runner.update!(active: false) + end + + it { is_expected.to be_falsey } end - it 'that is not online' do - runner.update!(contacted_at: nil) - is_expected.to be_falsey + context 'that is not online' do + before do + runner.update!(contacted_at: nil) + end + + it { is_expected.to be_falsey } end - it 'that cannot handle build' do - expect_any_instance_of(Ci::Runner).to receive(:matches_build?).with(build).and_return(false) - is_expected.to be_falsey + context 'that cannot handle build' do + before do + expect_any_instance_of(Gitlab::Ci::Matching::RunnerMatcher).to receive(:matches?).with(build.build_matcher).and_return(false) + end + + it { is_expected.to be_falsey } end end diff --git a/spec/models/ci/processable_spec.rb b/spec/models/ci/processable_spec.rb index 49260afc232..cdd96d45561 100644 --- a/spec/models/ci/processable_spec.rb +++ b/spec/models/ci/processable_spec.rb @@ -76,7 +76,7 @@ RSpec.describe Ci::Processable do end let(:ignore_accessors) do - %i[type lock_version target_url base_tags trace_sections + %i[type namespace lock_version target_url base_tags trace_sections commit_id deployment erased_by_id project_id runner_id tag_taggings taggings tags trigger_request_id user_id auto_canceled_by_id retried failure_reason diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index bf88cc196d8..2983034868c 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -838,7 +838,7 @@ RSpec.describe Ci::Runner do context 'with legacy_mode enabled' do let(:legacy_mode) { '14.5' } - it { is_expected.to eq(:not_connected) } + it { is_expected.to eq(:never_contacted) } end context 'with legacy_mode disabled' do @@ -914,7 +914,7 @@ RSpec.describe Ci::Runner do runner.contacted_at = nil end - it { is_expected.to eq(:not_connected) } + it { is_expected.to eq(:never_contacted) } end context 'contacted 1s ago' do diff --git a/spec/models/concerns/cache_markdown_field_spec.rb b/spec/models/concerns/cache_markdown_field_spec.rb index 16d88eeebf2..d46f22b2216 100644 --- a/spec/models/concerns/cache_markdown_field_spec.rb +++ b/spec/models/concerns/cache_markdown_field_spec.rb @@ -9,8 +9,6 @@ RSpec.describe CacheMarkdownField, :clean_gitlab_redis_cache do include CacheMarkdownField cache_markdown_field :title, pipeline: :single_line cache_markdown_field :description - - before_validation -> { self.work_item_type_id = ::WorkItems::Type.default_issue_type.id } end end diff --git a/spec/models/concerns/pg_full_text_searchable_spec.rb b/spec/models/concerns/pg_full_text_searchable_spec.rb index d51de48da15..b6da481024a 100644 --- a/spec/models/concerns/pg_full_text_searchable_spec.rb +++ b/spec/models/concerns/pg_full_text_searchable_spec.rb @@ -14,8 +14,6 @@ RSpec.describe PgFullTextSearchable do belongs_to :project has_one :search_data, class_name: 'Issues::SearchData' - before_validation -> { self.work_item_type_id = ::WorkItems::Type.default_issue_type.id } - def persist_pg_full_text_search_vector(search_vector) Issues::SearchData.upsert({ project_id: project_id, issue_id: id, search_vector: search_vector }, unique_by: %i(project_id issue_id)) end @@ -176,8 +174,6 @@ RSpec.describe PgFullTextSearchable do belongs_to :project has_one :search_data, class_name: 'Issues::SearchData' - before_validation -> { self.work_item_type_id = ::WorkItems::Type.default_issue_type.id } - def self.name 'Issue' end diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb index 035ae21e13b..c77c0a5504a 100644 --- a/spec/models/issue_spec.rb +++ b/spec/models/issue_spec.rb @@ -258,18 +258,13 @@ RSpec.describe Issue do end # TODO: Remove when NOT NULL constraint is added to the relationship - describe '#work_item_type_with_fallback' do - let(:issue) { create(:issue, project: reusable_project) } + describe '#work_item_type' do + let(:issue) { create(:issue, :incident, project: reusable_project, work_item_type: nil) } - # Hard to test this scenario as no way to create a record in the DB with no work item type, so emulating in memory it 'returns a default type if the legacy issue does not have a work item type associated yet' do - expect(issue.work_item_type.base_type).to eq('issue') - expect(issue.issue_type).to eq('issue') - - issue.issue_type = 'incident' - issue.work_item_type = nil - - expect(issue.work_item_type_with_fallback).to eq(WorkItems::Type.default_by_type(:incident)) + expect(issue.work_item_type_id).to be_nil + expect(issue.issue_type).to eq('incident') + expect(issue.work_item_type).to eq(WorkItems::Type.default_by_type(:incident)) end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 1431a159f1d..7b01c653981 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -139,7 +139,6 @@ RSpec.describe Project, factory_default: :keep do it { is_expected.to have_many(:pipeline_artifacts).dependent(:restrict_with_error) } it { is_expected.to have_many(:terraform_states).class_name('Terraform::State').inverse_of(:project) } it { is_expected.to have_many(:timelogs) } - it { is_expected.to have_many(:error_tracking_errors).class_name('ErrorTracking::Error') } it { is_expected.to have_many(:error_tracking_client_keys).class_name('ErrorTracking::ClientKey') } it { is_expected.to have_many(:pending_builds).class_name('Ci::PendingBuild') } it { is_expected.to have_many(:ci_feature_usages).class_name('Projects::CiFeatureUsage') } diff --git a/spec/requests/api/ci/runners_spec.rb b/spec/requests/api/ci/runners_spec.rb index ef6be3d374b..3000bdc2ce7 100644 --- a/spec/requests/api/ci/runners_spec.rb +++ b/spec/requests/api/ci/runners_spec.rb @@ -274,7 +274,7 @@ RSpec.describe API::Ci::Runners do expect(response).to have_gitlab_http_status(:ok) expect(json_response['description']).to eq(shared_runner.description) expect(json_response['maximum_timeout']).to be_nil - expect(json_response['status']).to eq("not_connected") + expect(json_response['status']).to eq('never_contacted') expect(json_response['active']).to eq(true) expect(json_response['paused']).to eq(false) end diff --git a/spec/requests/api/error_tracking/collector_spec.rb b/spec/requests/api/error_tracking/collector_spec.rb index fa0b238dcad..c0d7eb5460f 100644 --- a/spec/requests/api/error_tracking/collector_spec.rb +++ b/spec/requests/api/error_tracking/collector_spec.rb @@ -152,7 +152,17 @@ RSpec.describe API::ErrorTracking::Collector do context 'collector fails with validation error' do before do allow(::ErrorTracking::CollectErrorService) - .to receive(:new).and_raise(ActiveRecord::RecordInvalid) + .to receive(:new).and_raise(Gitlab::ErrorTracking::ErrorRepository::DatabaseError) + end + + it_behaves_like 'bad request' + end + + context 'with platform field too long' do + let(:params) do + event = Gitlab::Json.parse(raw_event) + event['platform'] = 'a' * 256 + Gitlab::Json.dump(event) end it_behaves_like 'bad request' diff --git a/spec/requests/api/graphql/ci/runner_spec.rb b/spec/requests/api/graphql/ci/runner_spec.rb index 542876438cc..16352c4dfec 100644 --- a/spec/requests/api/graphql/ci/runner_spec.rb +++ b/spec/requests/api/graphql/ci/runner_spec.rb @@ -237,8 +237,8 @@ RSpec.describe 'Query.runner(id)' do stale_runner_data = graphql_data_at(:stale_runner) expect(stale_runner_data).to match a_hash_including( - 'status' => 'NOT_CONNECTED', - 'legacyStatusWithExplicitVersion' => 'NOT_CONNECTED', + 'status' => 'NEVER_CONTACTED', + 'legacyStatusWithExplicitVersion' => 'NEVER_CONTACTED', 'newStatus' => 'STALE' ) @@ -251,8 +251,8 @@ RSpec.describe 'Query.runner(id)' do never_contacted_instance_runner_data = graphql_data_at(:never_contacted_instance_runner) expect(never_contacted_instance_runner_data).to match a_hash_including( - 'status' => 'NOT_CONNECTED', - 'legacyStatusWithExplicitVersion' => 'NOT_CONNECTED', + 'status' => 'NEVER_CONTACTED', + 'legacyStatusWithExplicitVersion' => 'NEVER_CONTACTED', 'newStatus' => 'NEVER_CONTACTED' ) end diff --git a/spec/requests/api/graphql/ci/runners_spec.rb b/spec/requests/api/graphql/ci/runners_spec.rb index 6b88c82b025..d3e94671724 100644 --- a/spec/requests/api/graphql/ci/runners_spec.rb +++ b/spec/requests/api/graphql/ci/runners_spec.rb @@ -56,9 +56,9 @@ RSpec.describe 'Query.runners' do it_behaves_like 'a working graphql query returning expected runner' end - context 'runner_type is PROJECT_TYPE and status is NOT_CONNECTED' do + context 'runner_type is PROJECT_TYPE and status is NEVER_CONTACTED' do let(:runner_type) { 'PROJECT_TYPE' } - let(:status) { 'NOT_CONNECTED' } + let(:status) { 'NEVER_CONTACTED' } let!(:expected_runner) { project_runner } diff --git a/spec/services/error_tracking/collect_error_service_spec.rb b/spec/services/error_tracking/collect_error_service_spec.rb index faca3c12a48..159c070c683 100644 --- a/spec/services/error_tracking/collect_error_service_spec.rb +++ b/spec/services/error_tracking/collect_error_service_spec.rb @@ -52,12 +52,13 @@ RSpec.describe ErrorTracking::CollectErrorService do end context 'with unusual payload' do - let(:modified_event) { parsed_event } - let(:event) { described_class.new(project, nil, event: modified_event).execute } + let(:event) { ErrorTracking::ErrorEvent.last! } context 'when transaction is missing' do it 'builds actor from stacktrace' do - modified_event.delete('transaction') + parsed_event.delete('transaction') + + subject.execute expect(event.error.actor).to eq 'find()' end @@ -65,7 +66,9 @@ RSpec.describe ErrorTracking::CollectErrorService do context 'when transaction is an empty string' do \ it 'builds actor from stacktrace' do - modified_event['transaction'] = '' + parsed_event['transaction'] = '' + + subject.execute expect(event.error.actor).to eq 'find()' end @@ -73,7 +76,9 @@ RSpec.describe ErrorTracking::CollectErrorService do context 'when timestamp is numeric' do it 'parses timestamp' do - modified_event['timestamp'] = '1631015580.50' + parsed_event['timestamp'] = '1631015580.50' + + subject.execute expect(event.occurred_at).to eq '2021-09-07T11:53:00.5' end diff --git a/spec/services/error_tracking/issue_details_service_spec.rb b/spec/services/error_tracking/issue_details_service_spec.rb index 1eafba08c2f..29f8154a27c 100644 --- a/spec/services/error_tracking/issue_details_service_spec.rb +++ b/spec/services/error_tracking/issue_details_service_spec.rb @@ -53,6 +53,18 @@ RSpec.describe ErrorTracking::IssueDetailsService do expect(result[:status]).to eq(:success) expect(result[:issue].to_json).to eq(error.to_sentry_detailed_error.to_json) end + + context 'when error does not exist' do + let(:params) { { issue_id: non_existing_record_id } } + + it 'returns the error in detailed format' do + expect(result).to match( + status: :error, + message: /Couldn't find ErrorTracking::Error/, + http_status: :bad_request + ) + end + end end end diff --git a/spec/services/error_tracking/issue_latest_event_service_spec.rb b/spec/services/error_tracking/issue_latest_event_service_spec.rb index e17103083eb..aa2430ddffb 100644 --- a/spec/services/error_tracking/issue_latest_event_service_spec.rb +++ b/spec/services/error_tracking/issue_latest_event_service_spec.rb @@ -42,6 +42,18 @@ RSpec.describe ErrorTracking::IssueLatestEventService do expect(result[:status]).to eq(:success) expect(result[:latest_event].to_json).to eq(event.to_sentry_error_event.to_json) end + + context 'when error does not exist' do + let(:params) { { issue_id: non_existing_record_id } } + + it 'returns the error in detailed format' do + expect(result).to match( + status: :error, + message: /Couldn't find ErrorTracking::Error/, + http_status: :bad_request + ) + end + end end end |