diff options
45 files changed, 758 insertions, 346 deletions
diff --git a/.rubocop.yml b/.rubocop.yml index 91bad953638..08cb7f08316 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -349,8 +349,8 @@ RSpec/HaveGitlabHttpStatus: - 'ee/spec/requests/{groups,projects,repositories}/**/*' - 'spec/requests/api/*/**/*.rb' - 'ee/spec/requests/api/*/**/*.rb' - - 'spec/requests/api/[a-f]*.rb' - - 'ee/spec/requests/api/[a-f]*.rb' + - 'spec/requests/api/[a-l]*.rb' + - 'ee/spec/requests/api/[a-l]*.rb' Style/MultilineWhenThen: Enabled: false @@ -159,7 +159,7 @@ gem 'escape_utils', '~> 1.1' gem 'icalendar' # Diffs -gem 'diffy', '~> 3.1.0' +gem 'diffy', '~> 3.3' gem 'diff_match_patch', '~> 0.1.0' # Application server diff --git a/Gemfile.lock b/Gemfile.lock index 5fe50053428..f90507ba23a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -237,7 +237,7 @@ GEM rotp (~> 2.0) diff-lcs (1.3) diff_match_patch (0.1.0) - diffy (3.1.0) + diffy (3.3.0) discordrb-webhooks-blackst0ne (3.3.0) rest-client (~> 2.0) docile (1.3.1) @@ -1195,7 +1195,7 @@ DEPENDENCIES devise (~> 4.6) devise-two-factor (~> 3.1.0) diff_match_patch (~> 0.1.0) - diffy (~> 3.1.0) + diffy (~> 3.3) discordrb-webhooks-blackst0ne (~> 3.3) doorkeeper (~> 5.0.2) doorkeeper-openid_connect (~> 1.6.3) diff --git a/app/assets/javascripts/confirm_modal.js b/app/assets/javascripts/confirm_modal.js new file mode 100644 index 00000000000..1c9346e35e0 --- /dev/null +++ b/app/assets/javascripts/confirm_modal.js @@ -0,0 +1,26 @@ +import Vue from 'vue'; +import ConfirmModal from '~/vue_shared/components/confirm_modal.vue'; + +const mountConfirmModal = button => { + const props = { + path: button.dataset.path, + method: button.dataset.method, + modalAttributes: JSON.parse(button.dataset.modalAttributes), + }; + + return new Vue({ + render(h) { + return h(ConfirmModal, { props }); + }, + }).$mount(); +}; + +export default () => { + document.getElementsByClassName('js-confirm-modal-button').forEach(button => { + button.addEventListener('click', e => { + e.preventDefault(); + + mountConfirmModal(button); + }); + }); +}; diff --git a/app/assets/javascripts/dropzone_input.js b/app/assets/javascripts/dropzone_input.js index 86590865892..0e2dd59092a 100644 --- a/app/assets/javascripts/dropzone_input.js +++ b/app/assets/javascripts/dropzone_input.js @@ -259,8 +259,15 @@ export default function dropzoneInput(form) { const insertToTextArea = (filename, url) => { const $child = $(child); - $child.val((index, val) => val.replace(`{{${filename}}}`, url)); - + const textarea = $child.get(0); + const caretStart = textarea.selectionStart; + const caretEnd = textarea.selectionEnd; + const formattedText = `{{${filename}}}`; + $child.val((index, val) => val.replace(formattedText, url)); + textarea.setSelectionRange( + caretStart - formattedText.length + url.length, + caretEnd - formattedText.length + url.length, + ); $child.trigger('change'); }; diff --git a/app/assets/javascripts/lib/utils/datetime_utility.js b/app/assets/javascripts/lib/utils/datetime_utility.js index fd9a13be18b..ad8095e1ae3 100644 --- a/app/assets/javascripts/lib/utils/datetime_utility.js +++ b/app/assets/javascripts/lib/utils/datetime_utility.js @@ -175,6 +175,7 @@ export const localTimeAgo = ($timeagoEls, setTimeago = true) => { function addTimeAgoTooltip() { $timeagoEls.each((i, el) => { // Recreate with custom template + el.setAttribute('title', formatDate(el.dateTime)); $(el).tooltip({ template: '<div class="tooltip local-timeago" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>', diff --git a/app/assets/javascripts/projects/project_new.js b/app/assets/javascripts/projects/project_new.js index 2aa5f6ec626..9cbda324aff 100644 --- a/app/assets/javascripts/projects/project_new.js +++ b/app/assets/javascripts/projects/project_new.js @@ -169,6 +169,10 @@ const bindEvents = () => { text: s__('ProjectTemplates|Go Micro'), icon: '.template-option .icon-gomicro', }, + gatsby: { + text: s__('ProjectTemplates|Pages/Gatsby'), + icon: '.template-option .icon-gatsby', + }, hugo: { text: s__('ProjectTemplates|Pages/Hugo'), icon: '.template-option .icon-hugo', diff --git a/app/assets/javascripts/vue_shared/components/confirm_modal.vue b/app/assets/javascripts/vue_shared/components/confirm_modal.vue new file mode 100644 index 00000000000..21722f62133 --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/confirm_modal.vue @@ -0,0 +1,63 @@ +<script> +import { GlModal } from '@gitlab/ui'; +import csrf from '~/lib/utils/csrf'; + +export default { + components: { + GlModal, + }, + props: { + modalAttributes: { + type: Object, + required: true, + }, + path: { + type: String, + required: true, + }, + method: { + type: String, + required: true, + }, + }, + data() { + return { + isDismissed: false, + }; + }, + mounted() { + this.openModal(); + }, + methods: { + openModal() { + this.$refs.modal.show(); + }, + submitModal() { + this.$refs.form.requestSubmit(); + }, + dismiss() { + this.isDismissed = true; + }, + }, + csrf, +}; +</script> + +<template> + <gl-modal + v-if="!isDismissed" + ref="modal" + v-bind="modalAttributes" + @primary="submitModal" + @canceled="dismiss" + > + <form ref="form" :action="path" method="post"> + <!-- Rails workaround for <form method="delete" /> + https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts/rails-ujs/features/method.coffee + --> + <input type="hidden" name="_method" :value="method" /> + <input type="hidden" name="authenticity_token" :value="$options.csrf.token" /> + <div>{{ modalAttributes.message }}</div> + </form> + </gl-modal> +</template> diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss index db1b8c559e5..81e910f91c2 100644 --- a/app/assets/stylesheets/pages/tree.scss +++ b/app/assets/stylesheets/pages/tree.scss @@ -17,12 +17,6 @@ .tree-controls { text-align: right; - > .btn, - .project-action-button > .btn, - .git-clone-holder > .btn { - margin-left: 8px; - } - .control { float: left; margin-left: 10px; diff --git a/app/assets/stylesheets/utilities.scss b/app/assets/stylesheets/utilities.scss index 0fd6aafef0d..e27ec571531 100644 --- a/app/assets/stylesheets/utilities.scss +++ b/app/assets/stylesheets/utilities.scss @@ -45,6 +45,12 @@ .border-bottom-color-default { border-bottom-color: $border-color; } .box-shadow-default { box-shadow: 0 2px 4px 0 $black-transparent; } +.gl-children-ml-sm-3 > * { + @include media-breakpoint-up(sm) { + @include gl-ml-3; + } +} + .mh-50vh { max-height: 50vh; } .font-size-inherit { font-size: inherit; } diff --git a/app/views/projects/blob/_breadcrumb.html.haml b/app/views/projects/blob/_breadcrumb.html.haml index e611df8df2a..810c8b9082f 100644 --- a/app/views/projects/blob/_breadcrumb.html.haml +++ b/app/views/projects/blob/_breadcrumb.html.haml @@ -17,7 +17,7 @@ - else = link_to title, project_tree_path(@project, tree_join(@ref, path)) - .tree-controls< + .tree-controls.gl-children-ml-sm-3< = render 'projects/find_file_link' -# only show normal/blame view links for text files - if blob.readable_text? diff --git a/app/views/projects/notes/_actions.html.haml b/app/views/projects/notes/_actions.html.haml index 407de590efb..7de7dd3b98b 100644 --- a/app/views/projects/notes/_actions.html.haml +++ b/app/views/projects/notes/_actions.html.haml @@ -29,8 +29,7 @@ ":title" => "buttonText", ":ref" => "'button'" } - = icon('spin spinner', 'v-if' => 'loading', class: 'loading', 'aria-hidden' => 'true', 'aria-label' => 'Loading') - %div{ 'v-else' => '' } + %div %template{ 'v-if' => 'isResolved' } = render 'shared/icons/icon_status_success_solid.svg' %template{ 'v-else' => '' } @@ -40,7 +39,6 @@ - if note.emoji_awardable? .note-actions-item = button_tag title: 'Add reaction', class: "note-action-button note-emoji-button js-add-award js-note-emoji has-tooltip btn btn-transparent", data: { position: 'right', container: 'body' } do - = icon('spinner spin') %span{ class: 'link-highlight award-control-icon-neutral' }= sprite_icon('slight-smile') %span{ class: 'link-highlight award-control-icon-positive' }= sprite_icon('smiley') %span{ class: 'link-highlight award-control-icon-super-positive' }= sprite_icon('smile') diff --git a/app/views/projects/tree/_tree_header.html.haml b/app/views/projects/tree/_tree_header.html.haml index 4d3c24aee6b..d5f7673488f 100644 --- a/app/views/projects/tree/_tree_header.html.haml +++ b/app/views/projects/tree/_tree_header.html.haml @@ -75,34 +75,35 @@ = link_to new_project_tag_path(@project) do #{ _('New tag') } -.tree-controls{ class: ("gl-font-size-0" if vue_file_list_enabled?) }< - = render_if_exists 'projects/tree/lock_link' - - if vue_file_list_enabled? - #js-tree-history-link.d-inline-block{ data: { history_link: project_commits_path(@project, @ref) } } - - else - = link_to s_('Commits|History'), project_commits_path(@project, @id), class: 'btn' - - = render 'projects/find_file_link' - - - if can_collaborate || current_user&.already_forked?(@project) +.tree-controls + .d-block.d-sm-flex.flex-wrap.align-items-start.gl-children-ml-sm-3< + = render_if_exists 'projects/tree/lock_link' - if vue_file_list_enabled? - #js-tree-web-ide-link.d-inline-block + #js-tree-history-link.d-inline-block{ data: { history_link: project_commits_path(@project, @ref) } } - else - = link_to ide_edit_path(@project, @ref, @path), class: 'btn btn-default qa-web-ide-button' do + = link_to s_('Commits|History'), project_commits_path(@project, @id), class: 'btn' + + = render 'projects/find_file_link' + + - if can_collaborate || current_user&.already_forked?(@project) + - if vue_file_list_enabled? + #js-tree-web-ide-link.d-inline-block + - else + = link_to ide_edit_path(@project, @ref, @path), class: 'btn btn-default qa-web-ide-button' do + = _('Web IDE') + - elsif can_create_mr_from_fork + = link_to '#modal-confirm-fork', class: 'btn btn-default qa-web-ide-button', data: { target: '#modal-confirm-fork', toggle: 'modal'} do = _('Web IDE') - - elsif can_create_mr_from_fork - = link_to '#modal-confirm-fork', class: 'btn btn-default qa-web-ide-button', data: { target: '#modal-confirm-fork', toggle: 'modal'} do - = _('Web IDE') - = render 'shared/confirm_fork_modal', fork_path: ide_fork_and_edit_path(@project, @ref, @path) + = render 'shared/confirm_fork_modal', fork_path: ide_fork_and_edit_path(@project, @ref, @path) - - if show_xcode_link?(@project) - .project-action-button.project-xcode.inline< - = render "projects/buttons/xcode_link" + - if show_xcode_link?(@project) + .project-action-button.project-xcode.inline< + = render "projects/buttons/xcode_link" - = render 'projects/buttons/download', project: @project, ref: @ref + = render 'projects/buttons/download', project: @project, ref: @ref - .project-clone-holder.d-block.d-md-none.mt-sm-2.mt-md-0> - = render "shared/mobile_clone_panel" + .project-clone-holder.d-none.d-md-inline-block> + = render "projects/buttons/clone", dropdown_class: 'dropdown-menu-right' - .project-clone-holder.d-none.d-md-inline-block> - = render "projects/buttons/clone", dropdown_class: 'dropdown-menu-right' + .project-clone-holder.d-block.d-md-none.mt-sm-2.mt-md-0.ml-sm-2> + = render "shared/mobile_clone_panel" diff --git a/changelogs/unreleased/207857-fix-web-ide-modal-no-text.yml b/changelogs/unreleased/207857-fix-web-ide-modal-no-text.yml new file mode 100644 index 00000000000..74bbb312f19 --- /dev/null +++ b/changelogs/unreleased/207857-fix-web-ide-modal-no-text.yml @@ -0,0 +1,5 @@ +--- +title: Fix Web IDE fork modal showing no text +merge_request: 25842 +author: +type: fixed diff --git a/changelogs/unreleased/37951-project-settings-required-approval-input-not-sequential-order.yml b/changelogs/unreleased/37951-project-settings-required-approval-input-not-sequential-order.yml new file mode 100644 index 00000000000..909dd38bbee --- /dev/null +++ b/changelogs/unreleased/37951-project-settings-required-approval-input-not-sequential-order.yml @@ -0,0 +1,5 @@ +--- +title: Fix project setting approval input in non-sequential order +merge_request: 25391 +author: +type: fixed diff --git a/changelogs/unreleased/Resolve-Migrate--fa-spinner-app-views-projects-notes.yml b/changelogs/unreleased/Resolve-Migrate--fa-spinner-app-views-projects-notes.yml new file mode 100644 index 00000000000..339b2b61e3e --- /dev/null +++ b/changelogs/unreleased/Resolve-Migrate--fa-spinner-app-views-projects-notes.yml @@ -0,0 +1,5 @@ +--- +title: Remove spinner from app/views/projects/notes +merge_request: 25015 +author: nuwe1 +type: other diff --git a/changelogs/unreleased/add-gatsby.yml b/changelogs/unreleased/add-gatsby.yml new file mode 100644 index 00000000000..28d57bda6d8 --- /dev/null +++ b/changelogs/unreleased/add-gatsby.yml @@ -0,0 +1,5 @@ +--- +title: Add Project template for Gatsby +merge_request: 25486 +author: +type: added diff --git a/changelogs/unreleased/fixes-caret-position-after-pasting-an-image-15011.yml b/changelogs/unreleased/fixes-caret-position-after-pasting-an-image-15011.yml new file mode 100644 index 00000000000..f111a2e075b --- /dev/null +++ b/changelogs/unreleased/fixes-caret-position-after-pasting-an-image-15011.yml @@ -0,0 +1,5 @@ +--- +title: Fixes caret position after pasting an image 15011 +merge_request: 21382 +author: Carolina Carvalhosa +type: fixed diff --git a/changelogs/unreleased/sarnold-format-timestamps-locally.yml b/changelogs/unreleased/sarnold-format-timestamps-locally.yml new file mode 100644 index 00000000000..0d2186ac32e --- /dev/null +++ b/changelogs/unreleased/sarnold-format-timestamps-locally.yml @@ -0,0 +1,5 @@ +--- +title: Fix timezones for popovers. +merge_request: 24942 +author: +type: fixed diff --git a/doc/administration/job_artifacts.md b/doc/administration/job_artifacts.md index 0c0be1da3c0..54eab36b0bb 100644 --- a/doc/administration/job_artifacts.md +++ b/doc/administration/job_artifacts.md @@ -200,11 +200,18 @@ by the `gitlab:artifacts:migrate` script. ### Migrating from object storage to local storage +**In Omnibus installations:** + In order to migrate back to local storage: -1. Set both `direct_upload` and `background_upload` to false under the artifacts object storage settings. Don't forget to restart GitLab. -1. Run `rake gitlab:artifacts:migrate_to_local` on your console. -1. Disable `object_storage` for artifacts in `gitlab.rb`. Remember to restart GitLab afterwards. +1. Set both `direct_upload` and `background_upload` to false in `gitlab.rb`, under the artifacts object storage settings. +1. [reconfigure GitLab][]. +1. Run `gitlab-rake gitlab:artifacts:migrate_to_local`. +1. Disable object_storage for artifacts in `gitlab.rb`: + - Set `gitlab_rails['artifacts_object_store_enabled'] = false`. + - Comment out all other `artifacts_object_store` settings, including the entire + `artifacts_object_store_connection` section, including the closing `}`. +1. [reconfigure GitLab][]. ## Expiring artifacts diff --git a/doc/development/event_tracking/frontend.md b/doc/development/event_tracking/frontend.md index 4139bf2322d..42c82a745db 100644 --- a/doc/development/event_tracking/frontend.md +++ b/doc/development/event_tracking/frontend.md @@ -118,7 +118,31 @@ button.addEventListener('click', () => { ## Tests and test helpers -In Karma tests, you can use the following: +In Jest particularly in vue tests, you can use the following: + +```javascript +import { mockTracking } from 'helpers/tracking_helper'; + +describe('MyTracking', () => { + let spy; + + beforeEach(() => { + spy = mockTracking('_category_', wrapper.element, jest.spyOn); + }); + + it('tracks an event when clicked on feedback', () => { + wrapper.find('.discover-feedback-icon').trigger('click'); + + expect(spy).toHaveBeenCalledWith('_category_', 'click_button', { + label: 'security-discover-feedback-cta', + property: '0', + }); + }); +}); + +``` + +In obsolete Karma tests it's used as below: ```javascript import { mockTracking, triggerEvent } from 'spec/helpers/tracking_helper'; diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md index cabde1f4e8d..4ebe37394b4 100644 --- a/doc/user/project/pages/index.md +++ b/doc/user/project/pages/index.md @@ -30,7 +30,7 @@ instances (GitLab Core, Starter, Premium, and Ultimate). <div class="col-md-9"> <p style="margin-top: 18px;"> To publish a website with Pages, you can use any Static Site Generator (SSG), -such as Jekyll, Hugo, Middleman, Harp, Hexo, and Brunch, just to name a few. You can also +such as Gatsby, Jekyll, Hugo, Middleman, Harp, Hexo, and Brunch, just to name a few. You can also publish any website written directly in plain HTML, CSS, and JavaScript.</p> <p>Pages does <strong>not</strong> support dynamic server-side processing, for instance, as <code>.php</code> and <code>.asp</code> requires. See this article to learn more about <a href="https://about.gitlab.com/blog/2016/06/03/ssg-overview-gitlab-pages-part-1-dynamic-x-static/">static websites vs dynamic websites</a>.</p> diff --git a/doc/user/project/pipelines/settings.md b/doc/user/project/pipelines/settings.md index 96710e957ff..fe62f5e2185 100644 --- a/doc/user/project/pipelines/settings.md +++ b/doc/user/project/pipelines/settings.md @@ -182,9 +182,14 @@ If **Public pipelines** is disabled: > [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/9362) in GitLab 9.1. -If you want to auto-cancel all pending non-HEAD pipelines on branch, when -new pipeline will be created (after your Git push or manually from UI), -check **Auto-cancel pending pipelines** checkbox and save the changes. +If you want all pending non-HEAD pipelines on branches to auto-cancel each time +a new pipeline is created, such as after a Git push or manually from the UI, +you can enable this in the project settings: + +1. Go to **{settings}** **Settings > CI / CD**. +1. Expand **General Pipelines**. +1. Check the **Auto-cancel redundant, pending pipelines** checkbox. +1. Click **Save changes**. ## Pipeline Badges diff --git a/lib/gitlab/project_template.rb b/lib/gitlab/project_template.rb index b4ee8818925..7a5b5b0c6d9 100644 --- a/lib/gitlab/project_template.rb +++ b/lib/gitlab/project_template.rb @@ -44,6 +44,7 @@ module Gitlab ProjectTemplate.new('dotnetcore', '.NET Core', _('A .NET Core console application template, customizable for any .NET Core project'), 'https://gitlab.com/gitlab-org/project-templates/dotnetcore', 'illustrations/logos/dotnet.svg'), ProjectTemplate.new('android', 'Android', _('A ready-to-go template for use with Android apps.'), 'https://gitlab.com/gitlab-org/project-templates/android', 'illustrations/logos/android.svg'), ProjectTemplate.new('gomicro', 'Go Micro', _('Go Micro is a framework for micro service development.'), 'https://gitlab.com/gitlab-org/project-templates/go-micro'), + ProjectTemplate.new('gatsby', 'Pages/Gatsby', _('Everything you need to create a GitLab Pages site using Gatsby.'), 'https://gitlab.com/pages/gatsby'), ProjectTemplate.new('hugo', 'Pages/Hugo', _('Everything you need to create a GitLab Pages site using Hugo.'), 'https://gitlab.com/pages/hugo'), ProjectTemplate.new('jekyll', 'Pages/Jekyll', _('Everything you need to create a GitLab Pages site using Jekyll.'), 'https://gitlab.com/pages/jekyll'), ProjectTemplate.new('plainhtml', 'Pages/Plain HTML', _('Everything you need to create a GitLab Pages site using plain HTML.'), 'https://gitlab.com/pages/plain-html'), diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 2a5d7c8ceeb..4c90b213539 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -7924,6 +7924,9 @@ msgstr "" msgid "Everything on your to-do list is marked as done." msgstr "" +msgid "Everything you need to create a GitLab Pages site using Gatsby." +msgstr "" + msgid "Everything you need to create a GitLab Pages site using GitBook." msgstr "" @@ -15206,6 +15209,9 @@ msgstr "" msgid "ProjectTemplates|NodeJS Express" msgstr "" +msgid "ProjectTemplates|Pages/Gatsby" +msgstr "" + msgid "ProjectTemplates|Pages/GitBook" msgstr "" @@ -18558,6 +18564,9 @@ msgstr "" msgid "Subscription deletion failed." msgstr "" +msgid "Subscription successfully applied to \"%{group_name}\"" +msgstr "" + msgid "Subscription successfully created." msgstr "" diff --git a/spec/features/projects/environments/environments_spec.rb b/spec/features/projects/environments/environments_spec.rb index 12412e87a7b..d7f12411a93 100644 --- a/spec/features/projects/environments/environments_spec.rb +++ b/spec/features/projects/environments/environments_spec.rb @@ -37,6 +37,7 @@ describe 'Environments page', :js do expect(page).to have_css('.environments-container') expect(page.all('.environment-name').length).to eq(1) + expect(page.all('.ic-stop').length).to eq(1) end end @@ -105,6 +106,7 @@ describe 'Environments page', :js do expect(page).to have_css('.environments-container') expect(page.all('.environment-name').length).to eq(1) + expect(page.all('.ic-stop').length).to eq(0) end end end diff --git a/spec/frontend/confirm_modal_spec.js b/spec/frontend/confirm_modal_spec.js new file mode 100644 index 00000000000..f133cef675f --- /dev/null +++ b/spec/frontend/confirm_modal_spec.js @@ -0,0 +1,127 @@ +import Vue from 'vue'; +import initConfirmModal from '~/confirm_modal'; +import { TEST_HOST } from 'helpers/test_constants'; + +describe('ConfirmModal', () => { + const buttons = [ + { + path: `${TEST_HOST}/1`, + method: 'delete', + modalAttributes: { + modalId: 'geo-entry-removal-modal', + title: 'Remove tracking database entry', + message: 'Tracking database entry will be removed. Are you sure?', + okVariant: 'danger', + okTitle: 'Remove entry', + }, + }, + { + path: `${TEST_HOST}/1`, + method: 'post', + modalAttributes: { + modalId: 'geo-entry-removal-modal', + title: 'Update tracking database entry', + message: 'Tracking database entry will be updated. Are you sure?', + okVariant: 'success', + okTitle: 'Update entry', + }, + }, + ]; + + beforeEach(() => { + const buttonContainer = document.createElement('div'); + + 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.innerHTML = 'Action'; + buttonContainer.appendChild(button); + }); + + document.body.appendChild(buttonContainer); + }); + + afterEach(() => { + document.body.innerHTML = ''; + }); + + const findJsHooks = () => document.querySelectorAll('.js-confirm-modal-button'); + const findModal = () => document.querySelector('.gl-modal'); + const findModalOkButton = (modal, variant) => + modal.querySelector(`.modal-footer .btn-${variant}`); + const findModalCancelButton = modal => modal.querySelector('.modal-footer .btn-secondary'); + + const serializeModal = (modal, buttonIndex) => { + const { modalAttributes } = buttons[buttonIndex]; + + return { + path: modal.querySelector('form').action, + method: modal.querySelector('input[name="_method"]').value, + modalAttributes: { + modalId: modal.id, + title: modal.querySelector('.modal-title').innerHTML, + message: modal.querySelector('.modal-body div').innerHTML, + okVariant: [...findModalOkButton(modal, modalAttributes.okVariant).classList] + .find(x => x.match('btn-')) + .replace('btn-', ''), + okTitle: findModalOkButton(modal, modalAttributes.okVariant).innerHTML, + }, + }; + }; + + it('starts with only JsHooks', () => { + expect(findJsHooks()).toHaveLength(buttons.length); + expect(findModal()).not.toExist(); + }); + + describe('when button clicked', () => { + beforeEach(() => { + initConfirmModal(); + findJsHooks() + .item(0) + .click(); + }); + + it('does not replace JsHook with GlModal', () => { + expect(findJsHooks()).toHaveLength(buttons.length); + }); + + describe('GlModal', () => { + it('is rendered', () => { + expect(findModal()).toExist(); + }); + + describe('Cancel Button', () => { + beforeEach(() => { + findModalCancelButton(findModal()).click(); + + return Vue.nextTick(); + }); + + it('closes the modal', () => { + expect(findModal()).not.toExist(); + }); + }); + }); + }); + + describe.each` + index + ${0} + ${1} + `(`when multiple buttons exist`, ({ index }) => { + beforeEach(() => { + initConfirmModal(); + findJsHooks() + .item(index) + .click(); + }); + + it('correct props are passed to gl-modal', () => { + expect(serializeModal(findModal(), index)).toEqual(buttons[index]); + }); + }); +}); diff --git a/spec/frontend/lib/utils/datetime_utility_spec.js b/spec/frontend/lib/utils/datetime_utility_spec.js index e584150ba70..27b88d78ff0 100644 --- a/spec/frontend/lib/utils/datetime_utility_spec.js +++ b/spec/frontend/lib/utils/datetime_utility_spec.js @@ -1,4 +1,6 @@ import { __, s__ } from '~/locale'; +import $ from 'jquery'; +import '~/commons/bootstrap'; import * as datetimeUtility from '~/lib/utils/datetime_utility'; describe('Date time utils', () => { @@ -563,3 +565,23 @@ describe('approximateDuration', () => { expect(datetimeUtility.approximateDuration(seconds)).toBe(approximation); }); }); + +describe('localTimeAgo', () => { + beforeEach(() => { + document.body.innerHTML = `<time title="some time" datetime="2020-02-18T22:22:32Z">1 hour ago</time>`; + }); + + it.each` + timeagoArg | title | dataOriginalTitle + ${false} | ${'some time'} | ${null} + ${true} | ${''} | ${'Feb 18, 2020 10:22pm GMT+0000'} + `('converts $seconds seconds to $approximation', ({ timeagoArg, title, dataOriginalTitle }) => { + const element = document.querySelector('time'); + datetimeUtility.localTimeAgo($(element), timeagoArg); + + jest.runAllTimers(); + + expect(element.getAttribute('data-original-title')).toBe(dataOriginalTitle); + expect(element.getAttribute('title')).toBe(title); + }); +}); diff --git a/spec/frontend/vue_shared/components/confirm_modal_spec.js b/spec/frontend/vue_shared/components/confirm_modal_spec.js new file mode 100644 index 00000000000..722380d3383 --- /dev/null +++ b/spec/frontend/vue_shared/components/confirm_modal_spec.js @@ -0,0 +1,84 @@ +import { shallowMount } from '@vue/test-utils'; +import { GlModal } from '@gitlab/ui'; +import { TEST_HOST } from 'helpers/test_constants'; +import ConfirmModal from '~/vue_shared/components/confirm_modal.vue'; + +describe('vue_shared/components/confirm_modal', () => { + const testModalProps = { + path: `${TEST_HOST}/1`, + method: 'delete', + modalAttributes: { + modalId: 'test-confirm-modal', + title: 'Are you sure?', + message: 'This will remove item 1', + okVariant: 'danger', + okTitle: 'Remove item', + }, + }; + + const actionSpies = { + openModal: jest.fn(), + }; + + let wrapper; + + const createComponent = (props = {}) => { + wrapper = shallowMount(ConfirmModal, { + propsData: { + ...testModalProps, + ...props, + }, + methods: { + ...actionSpies, + }, + }); + }; + + afterEach(() => { + wrapper.destroy(); + }); + + const findModal = () => wrapper.find(GlModal); + + describe('template', () => { + beforeEach(() => { + createComponent(); + }); + + it('calls openModal on mount', () => { + expect(actionSpies.openModal).toHaveBeenCalled(); + }); + + it('renders GlModal', () => { + expect(findModal().exists()).toBeTruthy(); + }); + }); + + describe('methods', () => { + beforeEach(() => { + createComponent(); + }); + + describe('submitModal', () => { + beforeEach(() => { + wrapper.vm.$refs.form.requestSubmit = jest.fn(); + }); + + it('calls requestSubmit', () => { + wrapper.vm.submitModal(); + expect(wrapper.vm.$refs.form.requestSubmit).toHaveBeenCalled(); + }); + }); + + describe('dismiss', () => { + it('removes gl-modal', () => { + expect(findModal().exists()).toBeTruthy(); + wrapper.vm.dismiss(); + + return wrapper.vm.$nextTick(() => { + expect(findModal().exists()).toBeFalsy(); + }); + }); + }); + }); +}); diff --git a/spec/lib/gitlab/project_template_spec.rb b/spec/lib/gitlab/project_template_spec.rb index 528eeb0f919..3948e53bc17 100644 --- a/spec/lib/gitlab/project_template_spec.rb +++ b/spec/lib/gitlab/project_template_spec.rb @@ -13,6 +13,7 @@ describe Gitlab::ProjectTemplate do described_class.new('dotnetcore', '.NET Core', 'A .NET Core console application template, customizable for any .NET Core project', 'https://gitlab.com/gitlab-org/project-templates/dotnetcore'), described_class.new('android', 'Android', 'A ready-to-go template for use with Android apps.', 'https://gitlab.com/gitlab-org/project-templates/android'), described_class.new('gomicro', 'Go Micro', 'Go Micro is a framework for micro service development.', 'https://gitlab.com/gitlab-org/project-templates/go-micro'), + described_class.new('gatsby', 'Pages/Gatsby', 'Everything you need to get started using a Gatsby site.', 'https://gitlab.com/pages/gatsby'), described_class.new('hugo', 'Pages/Hugo', 'Everything you need to get started using a Hugo Pages site.', 'https://gitlab.com/pages/hugo'), described_class.new('jekyll', 'Pages/Jekyll', 'Everything you need to get started using a Jekyll Pages site.', 'https://gitlab.com/pages/jekyll'), described_class.new('plainhtml', 'Pages/Plain HTML', 'Everything you need to get started using a plain HTML Pages site.', 'https://gitlab.com/pages/plain-html'), diff --git a/spec/requests/api/graphql_spec.rb b/spec/requests/api/graphql_spec.rb index cad9329fcb8..ece80424791 100644 --- a/spec/requests/api/graphql_spec.rb +++ b/spec/requests/api/graphql_spec.rb @@ -58,7 +58,7 @@ describe 'GraphQL' do it 'returns an error' do post_graphql(query, variables: "This is not JSON") - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) expect(json_response['errors'].first['message']).not_to be_nil end end @@ -114,7 +114,7 @@ describe 'GraphQL' do post_graphql(query, headers: { 'PRIVATE-TOKEN' => token.token }) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(graphql_data['echo']).to eq('nil says: Hello world') end diff --git a/spec/requests/api/group_boards_spec.rb b/spec/requests/api/group_boards_spec.rb index d2d10f357fe..a9083f82f25 100644 --- a/spec/requests/api/group_boards_spec.rb +++ b/spec/requests/api/group_boards_spec.rb @@ -50,7 +50,7 @@ describe API::GroupBoards do post api(url, user), params: { label_id: project_label.id } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end end end diff --git a/spec/requests/api/group_clusters_spec.rb b/spec/requests/api/group_clusters_spec.rb index 14027db01c4..d3bd84f1604 100644 --- a/spec/requests/api/group_clusters_spec.rb +++ b/spec/requests/api/group_clusters_spec.rb @@ -26,7 +26,7 @@ describe API::GroupClusters do it 'responds with 403' do get api("/groups/#{group.id}/clusters", developer_user) - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -36,7 +36,7 @@ describe API::GroupClusters do end it 'responds with 200' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'includes pagination headers' do @@ -70,7 +70,7 @@ describe API::GroupClusters do it 'responds with 403' do get api("/groups/#{group.id}/clusters/#{cluster_id}", developer_user) - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -140,7 +140,7 @@ describe API::GroupClusters do let(:cluster_id) { 123 } it 'returns 404' do - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -179,7 +179,7 @@ describe API::GroupClusters do it 'responds with 403' do post api("/groups/#{group.id}/clusters/user", developer_user), params: cluster_params - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -190,7 +190,7 @@ describe API::GroupClusters do context 'with valid params' do it 'responds with 201' do - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) end it 'creates a new Cluster::Cluster' do @@ -238,7 +238,7 @@ describe API::GroupClusters do let(:api_url) { 'invalid_api_url' } it 'responds with 400' do - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it 'does not create a new Clusters::Cluster' do @@ -260,7 +260,7 @@ describe API::GroupClusters do end it 'responds with 400' do - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['message']['base'].first).to eq(_('Instance does not support multiple Kubernetes clusters')) end end @@ -271,7 +271,7 @@ describe API::GroupClusters do end it 'responds with 403' do - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) expect(json_response['message']).to eq('403 Forbidden') end @@ -305,7 +305,7 @@ describe API::GroupClusters do it 'responds with 403' do put api("/groups/#{group.id}/clusters/#{cluster.id}", developer_user), params: update_params - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -320,7 +320,7 @@ describe API::GroupClusters do context 'with valid params' do it 'responds with 200' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'updates cluster attributes' do @@ -333,7 +333,7 @@ describe API::GroupClusters do let(:domain) { 'invalid domain' } it 'responds with 400' do - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it 'does not update cluster attributes' do @@ -350,7 +350,7 @@ describe API::GroupClusters do let(:management_project_id) { create(:project).id } it 'responds with 400' do - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it 'returns validation errors' do @@ -368,7 +368,7 @@ describe API::GroupClusters do end it 'responds with 400' do - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it 'returns validation error' do @@ -380,7 +380,7 @@ describe API::GroupClusters do let(:domain) { 'new-domain.com' } it 'responds with 200' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end end @@ -408,7 +408,7 @@ describe API::GroupClusters do end it 'responds with 200' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'updates platform kubernetes attributes' do @@ -424,7 +424,7 @@ describe API::GroupClusters do let(:cluster) { create(:cluster, :group, :provided_by_user) } it 'responds with 404' do - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -442,7 +442,7 @@ describe API::GroupClusters do it 'responds with 403' do delete api("/groups/#{group.id}/clusters/#{cluster.id}", developer_user), params: cluster_params - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -452,7 +452,7 @@ describe API::GroupClusters do end it 'responds with 204' do - expect(response).to have_gitlab_http_status(204) + expect(response).to have_gitlab_http_status(:no_content) end it 'deletes the cluster' do @@ -463,7 +463,7 @@ describe API::GroupClusters do let(:cluster) { create(:cluster, :group, :provided_by_user) } it 'responds with 404' do - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end diff --git a/spec/requests/api/group_export_spec.rb b/spec/requests/api/group_export_spec.rb index 6128f2e4a87..47193591cf1 100644 --- a/spec/requests/api/group_export_spec.rb +++ b/spec/requests/api/group_export_spec.rb @@ -44,7 +44,7 @@ describe API::GroupExport do it 'downloads exported group archive' do get api(download_path, user) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end context 'when export_file.file does not exist' do @@ -57,7 +57,7 @@ describe API::GroupExport do it 'returns 404' do get api(download_path, user) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -66,7 +66,7 @@ describe API::GroupExport do it 'returns 404' do get api(download_path, user) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -79,7 +79,7 @@ describe API::GroupExport do it 'responds with 404 Not Found' do get api(download_path, user) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -98,7 +98,7 @@ describe API::GroupExport do it 'accepts download' do post api(path, user) - expect(response).to have_gitlab_http_status(202) + expect(response).to have_gitlab_http_status(:accepted) end end @@ -110,7 +110,7 @@ describe API::GroupExport do it 'forbids the request' do post api(path, user) - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end end @@ -123,7 +123,7 @@ describe API::GroupExport do it 'responds with 404 Not Found' do post api(path, user) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end diff --git a/spec/requests/api/group_import_spec.rb b/spec/requests/api/group_import_spec.rb index 1594881677f..3f85428aac2 100644 --- a/spec/requests/api/group_import_spec.rb +++ b/spec/requests/api/group_import_spec.rb @@ -42,7 +42,7 @@ describe API::GroupImport do it 'creates new group and accepts request' do subject - expect(response).to have_gitlab_http_status(202) + expect(response).to have_gitlab_http_status(:accepted) end it 'creates private group' do @@ -63,7 +63,7 @@ describe API::GroupImport do subject - expect(response).to have_gitlab_http_status(202) + expect(response).to have_gitlab_http_status(:accepted) expect(group.children.count).to eq(1) end @@ -81,7 +81,7 @@ describe API::GroupImport do subject - expect(response).to have_gitlab_http_status(202) + expect(response).to have_gitlab_http_status(:accepted) expect(public_parent_group.children.first.visibility_level).to eq(Gitlab::VisibilityLevel::PUBLIC) end @@ -90,7 +90,7 @@ describe API::GroupImport do subject - expect(response).to have_gitlab_http_status(202) + expect(response).to have_gitlab_http_status(:accepted) expect(internal_parent_group.children.first.visibility_level).to eq(Gitlab::VisibilityLevel::INTERNAL) end end @@ -101,7 +101,7 @@ describe API::GroupImport do expect { subject }.not_to change { Group.count } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) expect(json_response['message']).to eq('404 Group Not Found') end @@ -111,7 +111,7 @@ describe API::GroupImport do subject - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) expect(json_response['message']).to eq('403 Forbidden') end end @@ -128,7 +128,7 @@ describe API::GroupImport do it 'returns 400 HTTP status' do subject - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end end end @@ -139,7 +139,7 @@ describe API::GroupImport do it 'forbids the request' do subject - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end end @@ -154,7 +154,7 @@ describe API::GroupImport do post api('/groups/import', user), params: params, headers: workhorse_header end.not_to change { Group.count }.from(1) - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['error']).to eq(error_message) end end diff --git a/spec/requests/api/group_labels_spec.rb b/spec/requests/api/group_labels_spec.rb index f7994b55efa..dea26ec7274 100644 --- a/spec/requests/api/group_labels_spec.rb +++ b/spec/requests/api/group_labels_spec.rb @@ -15,7 +15,7 @@ describe API::GroupLabels do it 'returns all available labels for the group' do get api("/groups/#{group.id}/labels", user) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response).to all(match_schema('public_api/v4/labels/label')) @@ -27,7 +27,7 @@ describe API::GroupLabels do it 'includes counts in the response' do get api("/groups/#{group.id}/labels", user), params: { with_counts: true } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response).to all(match_schema('public_api/v4/labels/label_with_counts')) @@ -42,7 +42,7 @@ describe API::GroupLabels do it 'returns all available labels for the group and ancestor groups' do get api("/groups/#{subgroup.id}/labels", user) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response).to all(match_schema('public_api/v4/labels/label')) @@ -55,7 +55,7 @@ describe API::GroupLabels do it 'returns all available labels for the group but not for ancestor groups' do get api("/groups/#{subgroup.id}/labels", user), params: { include_ancestor_groups: false } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response).to all(match_schema('public_api/v4/labels/label')) @@ -69,7 +69,7 @@ describe API::GroupLabels do it 'returns a single label for the group' do get api("/groups/#{group.id}/labels/#{group_label1.name}", user) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['name']).to eq(group_label1.name) expect(json_response['color']).to eq(group_label1.color) expect(json_response['description']).to eq(group_label1.description) @@ -85,7 +85,7 @@ describe API::GroupLabels do description: 'test' } - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response['name']).to eq('Foo') expect(json_response['color']).to eq('#FFAABB') expect(json_response['description']).to eq('test') @@ -107,13 +107,13 @@ describe API::GroupLabels do it 'returns a 400 bad request if name not given' do post api("/groups/#{group.id}/labels", user), params: { color: '#FFAABB' } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it 'returns a 400 bad request if color is not given' do post api("/groups/#{group.id}/labels", user), params: { name: 'Foobar' } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it 'returns 409 if label already exists' do @@ -123,7 +123,7 @@ describe API::GroupLabels do color: '#FFAABB' } - expect(response).to have_gitlab_http_status(409) + expect(response).to have_gitlab_http_status(:conflict) expect(json_response['message']).to eq('Label already exists') end end @@ -132,20 +132,20 @@ describe API::GroupLabels do it 'returns 204 for existing label' do delete api("/groups/#{group.id}/labels", user), params: { name: group_label1.name } - expect(response).to have_gitlab_http_status(204) + expect(response).to have_gitlab_http_status(:no_content) end it 'returns 404 for non existing label' do delete api("/groups/#{group.id}/labels", user), params: { name: 'not_exists' } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) expect(json_response['message']).to eq('404 Label Not Found') end it 'returns 400 for wrong parameters' do delete api("/groups/#{group.id}/labels", user) - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it "does not delete parent's group labels" do @@ -154,7 +154,7 @@ describe API::GroupLabels do delete api("/groups/#{subgroup.id}/labels", user), params: { name: subgroup_label.name } - expect(response).to have_gitlab_http_status(204) + expect(response).to have_gitlab_http_status(:no_content) expect(subgroup.labels.size).to eq(0) expect(group.labels).to include(group_label1) end @@ -169,13 +169,13 @@ describe API::GroupLabels do it 'returns 204 for existing label' do delete api("/groups/#{group.id}/labels/#{group_label1.name}", user) - expect(response).to have_gitlab_http_status(204) + expect(response).to have_gitlab_http_status(:no_content) end it 'returns 404 for non existing label' do delete api("/groups/#{group.id}/labels/not_exists", user) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) expect(json_response['message']).to eq('404 Label Not Found') end @@ -185,7 +185,7 @@ describe API::GroupLabels do delete api("/groups/#{subgroup.id}/labels/#{subgroup_label.name}", user) - expect(response).to have_gitlab_http_status(204) + expect(response).to have_gitlab_http_status(:no_content) expect(subgroup.labels.size).to eq(0) expect(group.labels).to include(group_label1) end @@ -205,7 +205,7 @@ describe API::GroupLabels do description: 'test' } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['name']).to eq('New Label') expect(json_response['color']).to eq('#FFFFFF') expect(json_response['description']).to eq('test') @@ -221,7 +221,7 @@ describe API::GroupLabels do new_name: 'New Label' } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(subgroup.labels[0].name).to eq('New Label') expect(group_label1.name).to eq('feature') end @@ -233,20 +233,20 @@ describe API::GroupLabels do new_name: 'label3' } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'returns 400 if no label name given' do put api("/groups/#{group.id}/labels", user), params: { new_name: group_label1.name } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['error']).to eq('label_id, name are missing, exactly one parameter must be provided') end it 'returns 400 if no new parameters given' do put api("/groups/#{group.id}/labels", user), params: { name: group_label1.name } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['error']).to eq('new_name, color, description are missing, '\ 'at least one parameter must be provided') end @@ -261,7 +261,7 @@ describe API::GroupLabels do description: 'test' } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['name']).to eq('New Label') expect(json_response['color']).to eq('#FFFFFF') expect(json_response['description']).to eq('test') @@ -276,7 +276,7 @@ describe API::GroupLabels do new_name: 'New Label' } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(subgroup.labels[0].name).to eq('New Label') expect(group_label1.name).to eq('feature') end @@ -287,13 +287,13 @@ describe API::GroupLabels do new_name: 'label3' } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'returns 400 if no new parameters given' do put api("/groups/#{group.id}/labels/#{group_label1.name}", user) - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['error']).to eq('new_name, color, description are missing, '\ 'at least one parameter must be provided') end @@ -304,7 +304,7 @@ describe API::GroupLabels do it 'subscribes to the label' do post api("/groups/#{group.id}/labels/#{group_label1.title}/subscribe", user) - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response['name']).to eq(group_label1.title) expect(json_response['subscribed']).to be_truthy end @@ -314,7 +314,7 @@ describe API::GroupLabels do it 'subscribes to the label' do post api("/groups/#{group.id}/labels/#{group_label1.id}/subscribe", user) - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response['name']).to eq(group_label1.title) expect(json_response['subscribed']).to be_truthy end @@ -328,7 +328,7 @@ describe API::GroupLabels do it 'returns 304' do post api("/groups/#{group.id}/labels/#{group_label1.id}/subscribe", user) - expect(response).to have_gitlab_http_status(304) + expect(response).to have_gitlab_http_status(:not_modified) end end @@ -336,7 +336,7 @@ describe API::GroupLabels do it 'returns 404 error' do post api("/groups/#{group.id}/labels/1234/subscribe", user) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -350,7 +350,7 @@ describe API::GroupLabels do it 'unsubscribes from the label' do post api("/groups/#{group.id}/labels/#{group_label1.title}/unsubscribe", user) - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response['name']).to eq(group_label1.title) expect(json_response['subscribed']).to be_falsey end @@ -360,7 +360,7 @@ describe API::GroupLabels do it 'unsubscribes from the label' do post api("/groups/#{group.id}/labels/#{group_label1.id}/unsubscribe", user) - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response['name']).to eq(group_label1.title) expect(json_response['subscribed']).to be_falsey end @@ -374,7 +374,7 @@ describe API::GroupLabels do it 'returns 304' do post api("/groups/#{group.id}/labels/#{group_label1.id}/unsubscribe", user) - expect(response).to have_gitlab_http_status(304) + expect(response).to have_gitlab_http_status(:not_modified) end end @@ -382,7 +382,7 @@ describe API::GroupLabels do it 'returns 404 error' do post api("/groups/#{group.id}/labels/1234/unsubscribe", user) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end diff --git a/spec/requests/api/group_variables_spec.rb b/spec/requests/api/group_variables_spec.rb index 3f9e80e6613..a5b48985df5 100644 --- a/spec/requests/api/group_variables_spec.rb +++ b/spec/requests/api/group_variables_spec.rb @@ -17,7 +17,7 @@ describe API::GroupVariables do it 'returns group variables' do get api("/groups/#{group.id}/variables", user) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_a(Array) end end @@ -26,7 +26,7 @@ describe API::GroupVariables do it 'does not return group variables' do get api("/groups/#{group.id}/variables", user) - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -34,7 +34,7 @@ describe API::GroupVariables do it 'does not return group variables' do get api("/groups/#{group.id}/variables") - expect(response).to have_gitlab_http_status(401) + expect(response).to have_gitlab_http_status(:unauthorized) end end end @@ -50,7 +50,7 @@ describe API::GroupVariables do it 'returns group variable details' do get api("/groups/#{group.id}/variables/#{variable.key}", user) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['value']).to eq(variable.value) expect(json_response['protected']).to eq(variable.protected?) expect(json_response['variable_type']).to eq(variable.variable_type) @@ -59,7 +59,7 @@ describe API::GroupVariables do it 'responds with 404 Not Found if requesting non-existing variable' do get api("/groups/#{group.id}/variables/non_existing_variable", user) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -67,7 +67,7 @@ describe API::GroupVariables do it 'does not return group variable details' do get api("/groups/#{group.id}/variables/#{variable.key}", user) - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -75,7 +75,7 @@ describe API::GroupVariables do it 'does not return group variable details' do get api("/groups/#{group.id}/variables/#{variable.key}") - expect(response).to have_gitlab_http_status(401) + expect(response).to have_gitlab_http_status(:unauthorized) end end end @@ -93,7 +93,7 @@ describe API::GroupVariables do post api("/groups/#{group.id}/variables", user), params: { key: 'TEST_VARIABLE_2', value: 'PROTECTED_VALUE_2', protected: true, masked: true } end.to change {group.variables.count}.by(1) - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response['key']).to eq('TEST_VARIABLE_2') expect(json_response['value']).to eq('PROTECTED_VALUE_2') expect(json_response['protected']).to be_truthy @@ -106,7 +106,7 @@ describe API::GroupVariables do post api("/groups/#{group.id}/variables", user), params: { variable_type: 'file', key: 'TEST_VARIABLE_2', value: 'VALUE_2' } end.to change {group.variables.count}.by(1) - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response['key']).to eq('TEST_VARIABLE_2') expect(json_response['value']).to eq('VALUE_2') expect(json_response['protected']).to be_falsey @@ -119,7 +119,7 @@ describe API::GroupVariables do post api("/groups/#{group.id}/variables", user), params: { key: variable.key, value: 'VALUE_2' } end.to change {group.variables.count}.by(0) - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end end @@ -127,7 +127,7 @@ describe API::GroupVariables do it 'does not create variable' do post api("/groups/#{group.id}/variables", user) - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -135,7 +135,7 @@ describe API::GroupVariables do it 'does not create variable' do post api("/groups/#{group.id}/variables") - expect(response).to have_gitlab_http_status(401) + expect(response).to have_gitlab_http_status(:unauthorized) end end end @@ -156,7 +156,7 @@ describe API::GroupVariables do updated_variable = group.variables.reload.first - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(value_before).to eq(variable.value) expect(updated_variable.value).to eq('VALUE_1_UP') expect(updated_variable).to be_protected @@ -167,7 +167,7 @@ describe API::GroupVariables do it 'responds with 404 Not Found if requesting non-existing variable' do put api("/groups/#{group.id}/variables/non_existing_variable", user) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -175,7 +175,7 @@ describe API::GroupVariables do it 'does not update variable' do put api("/groups/#{group.id}/variables/#{variable.key}", user) - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -183,7 +183,7 @@ describe API::GroupVariables do it 'does not update variable' do put api("/groups/#{group.id}/variables/#{variable.key}") - expect(response).to have_gitlab_http_status(401) + expect(response).to have_gitlab_http_status(:unauthorized) end end end @@ -200,14 +200,14 @@ describe API::GroupVariables do expect do delete api("/groups/#{group.id}/variables/#{variable.key}", user) - expect(response).to have_gitlab_http_status(204) + expect(response).to have_gitlab_http_status(:no_content) end.to change {group.variables.count}.by(-1) end it 'responds with 404 Not Found if requesting non-existing variable' do delete api("/groups/#{group.id}/variables/non_existing_variable", user) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it_behaves_like '412 response' do @@ -219,7 +219,7 @@ describe API::GroupVariables do it 'does not delete variable' do delete api("/groups/#{group.id}/variables/#{variable.key}", user) - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -227,7 +227,7 @@ describe API::GroupVariables do it 'does not delete variable' do delete api("/groups/#{group.id}/variables/#{variable.key}") - expect(response).to have_gitlab_http_status(401) + expect(response).to have_gitlab_http_status(:unauthorized) end end end diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb index 35b77832c73..e8499246840 100644 --- a/spec/requests/api/groups_spec.rb +++ b/spec/requests/api/groups_spec.rb @@ -26,7 +26,7 @@ describe API::Groups do it "returns public groups" do get api("/groups") - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response.length).to eq(1) @@ -54,7 +54,7 @@ describe API::Groups do it "normal user: returns an array of groups of user1" do get api("/groups", user1) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response.length).to eq(1) @@ -65,7 +65,7 @@ describe API::Groups do it "does not include runners_token information" do get api("/groups", user1) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response.length).to eq(1) @@ -75,7 +75,7 @@ describe API::Groups do it "does not include statistics" do get api("/groups", user1), params: { statistics: true } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response.first).not_to include 'statistics' @@ -86,7 +86,7 @@ describe API::Groups do it "admin: returns an array of all groups" do get api("/groups", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response.length).to eq(2) @@ -95,7 +95,7 @@ describe API::Groups do it "does not include runners_token information" do get api("/groups", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response.length).to eq(2) @@ -105,7 +105,7 @@ describe API::Groups do it "does not include statistics by default" do get api("/groups", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response.first).not_to include('statistics') @@ -126,7 +126,7 @@ describe API::Groups do get api("/groups", admin), params: { statistics: true } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response) @@ -138,7 +138,7 @@ describe API::Groups do it "returns all groups excluding skipped groups" do get api("/groups", admin), params: { skip_groups: [group2.id] } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response.length).to eq(1) @@ -153,7 +153,7 @@ describe API::Groups do get api("/groups", user1), params: { all_available: true } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(response_groups).to contain_exactly(public_group.name, group1.name) @@ -176,7 +176,7 @@ describe API::Groups do it "sorts by name ascending by default" do get api("/groups", user1) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(response_groups).to eq(groups_visible_to_user(user1).order(:name).pluck(:name)) @@ -185,7 +185,7 @@ describe API::Groups do it "sorts in descending order when passed" do get api("/groups", user1), params: { sort: "desc" } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(response_groups).to eq(groups_visible_to_user(user1).order(name: :desc).pluck(:name)) @@ -194,7 +194,7 @@ describe API::Groups do it "sorts by path in order_by param" do get api("/groups", user1), params: { order_by: "path" } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(response_groups).to eq(groups_visible_to_user(user1).order(:path).pluck(:name)) @@ -203,7 +203,7 @@ describe API::Groups do it "sorts by id in the order_by param" do get api("/groups", user1), params: { order_by: "id" } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(response_groups).to eq(groups_visible_to_user(user1).order(:id).pluck(:name)) @@ -212,7 +212,7 @@ describe API::Groups do it "sorts also by descending id with pagination fix" do get api("/groups", user1), params: { order_by: "id", sort: "desc" } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(response_groups).to eq(groups_visible_to_user(user1).order(id: :desc).pluck(:name)) @@ -221,7 +221,7 @@ describe API::Groups do it "sorts identical keys by id for good pagination" do get api("/groups", user1), params: { search: "same-name", order_by: "name" } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(response_groups_ids).to eq(Group.select { |group| group['name'] == 'same-name' }.map { |group| group['id'] }.sort) @@ -230,7 +230,7 @@ describe API::Groups do it "sorts descending identical keys by id for good pagination" do get api("/groups", user1), params: { search: "same-name", order_by: "name", sort: "desc" } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(response_groups_ids).to eq(Group.select { |group| group['name'] == 'same-name' }.map { |group| group['id'] }.sort) @@ -247,7 +247,7 @@ describe API::Groups do get api('/groups', user2), params: { owned: true } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response.length).to eq(1) @@ -267,7 +267,7 @@ describe API::Groups do it 'returns an array of groups the user has at least master access' do get api('/groups', user2), params: { min_access_level: 40 } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(response_groups).to eq([group2.id, group3.id]) @@ -308,13 +308,13 @@ describe API::Groups do it 'returns 404 for a private group' do get api("/groups/#{group2.id}") - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'returns 200 for a public group' do get api("/groups/#{group1.id}") - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).not_to include('runners_token') end @@ -346,7 +346,7 @@ describe API::Groups do get api("/groups/#{group1.id}", user1) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['id']).to eq(group1.id) expect(json_response['name']).to eq(group1.name) expect(json_response['path']).to eq(group1.path) @@ -379,7 +379,7 @@ describe API::Groups do get api("/groups/#{group1.id}", user1), params: { with_projects: false } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['projects']).to be_nil expect(json_response['shared_projects']).to be_nil expect(json_response).not_to include('runners_token') @@ -388,7 +388,7 @@ describe API::Groups do it "doesn't return runners_token if the user is not the owner of the group" do get api("/groups/#{group1.id}", user3) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).not_to include('runners_token') end @@ -396,20 +396,20 @@ describe API::Groups do group1.add_owner(user3) get api("/groups/#{group1.id}", user3) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to include('runners_token') end it "does not return a non existing group" do get api("/groups/1328", user1) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it "does not return a group not attached to user1" do get api("/groups/#{group2.id}", user1) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'returns only public and internal projects in the group' do @@ -451,21 +451,21 @@ describe API::Groups do it "returns any existing group" do get api("/groups/#{group2.id}", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['name']).to eq(group2.name) end it "returns information of the runners_token for the group" do get api("/groups/#{group2.id}", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to include('runners_token') end it "does not return a non existing group" do get api("/groups/1328", admin) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -473,20 +473,20 @@ describe API::Groups do it 'returns any existing group' do get api("/groups/#{group1.path}", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['name']).to eq(group1.name) end it 'does not return a non existing group' do get api('/groups/unknown', admin) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'does not return a group not attached to user1' do get api("/groups/#{group2.path}", user1) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -548,7 +548,7 @@ describe API::Groups do subgroup_creation_level: "maintainer" } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['name']).to eq(new_group_name) expect(json_response['description']).to eq('') expect(json_response['visibility']).to eq('public') @@ -571,7 +571,7 @@ describe API::Groups do it 'returns 404 for a non existing group' do put api('/groups/1328', user1), params: { name: new_group_name } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end context 'within a subgroup' do @@ -585,14 +585,14 @@ describe API::Groups do it 'does not change visibility when not requested' do put api("/groups/#{group3.id}", user3), params: { description: 'Bug #23083' } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['visibility']).to eq('public') end it 'prevents making private a group containing public subgroups' do put api("/groups/#{group3.id}", user3), params: { visibility: 'private' } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['message']['visibility_level']).to contain_exactly('private is not allowed since there are sub-groups with higher visibility.') end end @@ -602,7 +602,7 @@ describe API::Groups do it 'updates the group' do put api("/groups/#{group1.id}", admin), params: { name: new_group_name } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['name']).to eq(new_group_name) end end @@ -611,7 +611,7 @@ describe API::Groups do it 'does not updates the group' do put api("/groups/#{group1.id}", user2), params: { name: new_group_name } - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -619,7 +619,7 @@ describe API::Groups do it 'returns 404 when trying to update the group' do put api("/groups/#{group2.id}", user1), params: { name: new_group_name } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -645,7 +645,7 @@ describe API::Groups do it "returns the group's projects" do get api("/groups/#{group1.id}/projects", user1) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response.length).to eq(2) project_names = json_response.map { |proj| proj['name'] } @@ -656,7 +656,7 @@ describe API::Groups do it "returns the group's projects with simple representation" do get api("/groups/#{group1.id}/projects", user1), params: { simple: true } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response.length).to eq(2) project_names = json_response.map { |proj| proj['name'] } @@ -669,7 +669,7 @@ describe API::Groups do get api("/groups/#{group1.id}/projects", user1), params: { visibility: 'public' } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an(Array) expect(json_response.length).to eq(1) @@ -683,7 +683,7 @@ describe API::Groups do get api("/groups/#{group1.id}/projects", user1), params: { with_shared: false } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an(Array) expect(json_response.length).to eq(2) @@ -696,7 +696,7 @@ describe API::Groups do get api("/groups/#{group1.id}/projects", user1), params: { include_subgroups: true } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an(Array) expect(json_response.length).to eq(4) @@ -705,13 +705,13 @@ describe API::Groups do it "does not return a non existing group" do get api("/groups/1328/projects", user1) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it "does not return a group not attached to user1" do get api("/groups/#{group2.id}/projects", user1) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it "only returns projects to which user has access" do @@ -719,7 +719,7 @@ describe API::Groups do get api("/groups/#{group1.id}/projects", user3) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response.length).to eq(1) expect(json_response.first['name']).to eq(project3.name) @@ -730,7 +730,7 @@ describe API::Groups do get api("/groups/#{project2.group.id}/projects", user3), params: { owned: true } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response.length).to eq(1) expect(json_response.first['name']).to eq(project2.name) end @@ -740,7 +740,7 @@ describe API::Groups do get api("/groups/#{group1.id}/projects", user1), params: { starred: true } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response.length).to eq(1) expect(json_response.first['name']).to eq(project1.name) end @@ -750,7 +750,7 @@ describe API::Groups do it "returns any existing group" do get api("/groups/#{group2.id}/projects", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response.length).to eq(1) expect(json_response.first['name']).to eq(project2.name) @@ -759,7 +759,7 @@ describe API::Groups do it "does not return a non existing group" do get api("/groups/1328/projects", admin) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'avoids N+1 queries' do @@ -781,7 +781,7 @@ describe API::Groups do it 'returns any existing group' do get api("/groups/#{group1.path}/projects", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers project_names = json_response.map { |proj| proj['name'] } expect(project_names).to match_array([project1.name, project3.name]) @@ -790,13 +790,13 @@ describe API::Groups do it 'does not return a non existing group' do get api('/groups/unknown/projects', admin) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'does not return a group not attached to user1' do get api("/groups/#{group2.path}/projects", user1) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -810,7 +810,7 @@ describe API::Groups do it 'returns only public subgroups' do get api("/groups/#{group1.id}/subgroups") - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response.length).to eq(1) @@ -821,7 +821,7 @@ describe API::Groups do it 'returns 404 for a private group' do get api("/groups/#{group2.id}/subgroups") - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -830,7 +830,7 @@ describe API::Groups do it 'returns no subgroups for the public group' do get api("/groups/#{group1.id}/subgroups", user2) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_an Array expect(json_response.length).to eq(0) end @@ -839,7 +839,7 @@ describe API::Groups do it 'returns public subgroups' do get api("/groups/#{group1.id}/subgroups", user2), params: { all_available: true } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_an Array expect(json_response.length).to eq(1) expect(json_response[0]['id']).to eq(subgroup1.id) @@ -852,7 +852,7 @@ describe API::Groups do it 'returns 404 for the private group' do get api("/groups/#{group2.id}/subgroups", user1) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -864,7 +864,7 @@ describe API::Groups do it 'returns private subgroups' do get api("/groups/#{group1.id}/subgroups", user2) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response.length).to eq(2) @@ -878,7 +878,7 @@ describe API::Groups do it 'does not include statistics' do get api("/groups/#{group1.id}/subgroups", user2), params: { statistics: true } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_an Array expect(json_response.first).not_to include 'statistics' end @@ -893,7 +893,7 @@ describe API::Groups do it 'returns subgroups' do get api("/groups/#{group2.id}/subgroups", user1) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_an Array expect(json_response.length).to eq(1) expect(json_response.first['id']).to eq(subgroup3.id) @@ -906,7 +906,7 @@ describe API::Groups do it 'returns private subgroups of a public group' do get api("/groups/#{group1.id}/subgroups", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_an Array expect(json_response.length).to eq(2) end @@ -914,7 +914,7 @@ describe API::Groups do it 'returns subgroups of a private group' do get api("/groups/#{group2.id}/subgroups", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_an Array expect(json_response.length).to eq(1) end @@ -922,7 +922,7 @@ describe API::Groups do it 'does not include statistics by default' do get api("/groups/#{group1.id}/subgroups", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_an Array expect(json_response.first).not_to include('statistics') end @@ -930,7 +930,7 @@ describe API::Groups do it 'includes statistics if requested' do get api("/groups/#{group1.id}/subgroups", admin), params: { statistics: true } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_an Array expect(json_response.first).to include('statistics') end @@ -944,7 +944,7 @@ describe API::Groups do post api("/groups", user1), params: group - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end context 'as owner' do @@ -955,7 +955,7 @@ describe API::Groups do it 'can create subgroups' do post api("/groups", user1), params: { parent_id: group2.id, name: 'foo', path: 'foo' } - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) end end @@ -967,7 +967,7 @@ describe API::Groups do it 'can create subgroups' do post api("/groups", user1), params: { parent_id: group2.id, name: 'foo', path: 'foo' } - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) end end end @@ -978,7 +978,7 @@ describe API::Groups do post api("/groups", user3), params: group - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response["name"]).to eq(group[:name]) expect(json_response["path"]).to eq(group[:path]) @@ -993,7 +993,7 @@ describe API::Groups do post api("/groups", user3), params: group - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response["full_path"]).to eq("#{parent.path}/#{group[:path]}") expect(json_response["parent_id"]).to eq(parent.id) @@ -1002,20 +1002,20 @@ describe API::Groups do it "does not create group, duplicate" do post api("/groups", user3), params: { name: 'Duplicate Test', path: group2.path } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(response.message).to eq("Bad Request") end it "returns 400 bad request error if name not given" do post api("/groups", user3), params: { path: group2.path } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it "returns 400 bad request error if path not given" do post api("/groups", user3), params: { name: 'test' } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end end end @@ -1027,7 +1027,7 @@ describe API::Groups do expect { delete api("/groups/#{group1.id}", user1) }.to change(GroupDestroyWorker.jobs, :size).by(1) end - expect(response).to have_gitlab_http_status(202) + expect(response).to have_gitlab_http_status(:accepted) end it_behaves_like '412 response' do @@ -1041,19 +1041,19 @@ describe API::Groups do delete api("/groups/#{group1.id}", user3) - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end it "does not remove a non existing group" do delete api("/groups/1328", user1) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it "does not remove a group not attached to user1" do delete api("/groups/#{group2.id}", user1) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -1061,13 +1061,13 @@ describe API::Groups do it "removes any existing group" do delete api("/groups/#{group2.id}", admin) - expect(response).to have_gitlab_http_status(202) + expect(response).to have_gitlab_http_status(:accepted) end it "does not remove a non existing group" do delete api("/groups/1328", admin) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -1086,7 +1086,7 @@ describe API::Groups do it "does not transfer project to group" do post api("/groups/#{group1.id}/projects/#{project.id}", user2) - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -1094,7 +1094,7 @@ describe API::Groups do it "transfers project to group" do post api("/groups/#{group1.id}/projects/#{project.id}", admin) - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) end context 'when using project path in URL' do @@ -1102,7 +1102,7 @@ describe API::Groups do it "transfers project to group" do post api("/groups/#{group1.id}/projects/#{project_path}", admin) - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) end end @@ -1110,7 +1110,7 @@ describe API::Groups do it "does not transfer project to group" do post api("/groups/#{group1.id}/projects/nogroup%2Fnoproject", admin) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -1120,7 +1120,7 @@ describe API::Groups do it "transfers project to group" do post api("/groups/#{group1.path}/projects/#{project_path}", admin) - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) end end @@ -1128,7 +1128,7 @@ describe API::Groups do it "does not transfer project to group" do post api("/groups/noexist/projects/#{project_path}", admin) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end diff --git a/spec/requests/api/helpers_spec.rb b/spec/requests/api/helpers_spec.rb index 26174611c58..98904a4d79f 100644 --- a/spec/requests/api/helpers_spec.rb +++ b/spec/requests/api/helpers_spec.rb @@ -269,7 +269,7 @@ describe API::Helpers do # The 500 status is expected as we're testing a case where an exception # is raised, but Grape shouldn't raise an additional exception - expect(response).to have_gitlab_http_status(500) + expect(response).to have_gitlab_http_status(:internal_server_error) expect(json_response['message']).not_to include("undefined local variable or method `request'") expect(json_response['message']).to start_with("\nRuntimeError (Runtime Error!):") end diff --git a/spec/requests/api/import_github_spec.rb b/spec/requests/api/import_github_spec.rb index 3ff7102479c..1a7d3b18d11 100644 --- a/spec/requests/api/import_github_spec.rb +++ b/spec/requests/api/import_github_spec.rb @@ -36,7 +36,7 @@ describe API::ImportGithub do personal_access_token: token, repo_id: 1234 } - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response).to be_a Hash expect(json_response['name']).to eq(project.name) end @@ -50,7 +50,7 @@ describe API::ImportGithub do repo_id: 1234 } - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end end end diff --git a/spec/requests/api/jobs_spec.rb b/spec/requests/api/jobs_spec.rb index 652be20f1e4..03dfd13c25b 100644 --- a/spec/requests/api/jobs_spec.rb +++ b/spec/requests/api/jobs_spec.rb @@ -66,7 +66,7 @@ describe API::Jobs do context 'authorized user' do it 'returns project jobs' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array end @@ -122,7 +122,7 @@ describe API::Jobs do let(:query) { { 'scope' => 'pending' } } it do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_an Array end end @@ -131,7 +131,7 @@ describe API::Jobs do let(:query) { { scope: %w(pending running) } } it do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_an Array end end @@ -139,7 +139,7 @@ describe API::Jobs do context 'respond 400 when scope contains invalid state' do let(:query) { { scope: %w(unknown running) } } - it { expect(response).to have_gitlab_http_status(400) } + it { expect(response).to have_gitlab_http_status(:bad_request) } end end @@ -148,7 +148,7 @@ describe API::Jobs do let(:api_user) { nil } it 'does not return project jobs' do - expect(response).to have_gitlab_http_status(401) + expect(response).to have_gitlab_http_status(:unauthorized) end end @@ -156,7 +156,7 @@ describe API::Jobs do let(:api_user) { guest } it 'does not return project jobs' do - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end end @@ -178,7 +178,7 @@ describe API::Jobs do context 'authorized user' do it 'returns pipeline jobs' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array end @@ -210,7 +210,7 @@ describe API::Jobs do let(:query) { { 'scope' => 'pending' } } it do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_an Array end end @@ -219,7 +219,7 @@ describe API::Jobs do let(:query) { { scope: %w(pending running) } } it do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_an Array end end @@ -227,7 +227,7 @@ describe API::Jobs do context 'respond 400 when scope contains invalid state' do let(:query) { { scope: %w(unknown running) } } - it { expect(response).to have_gitlab_http_status(400) } + it { expect(response).to have_gitlab_http_status(:bad_request) } end context 'jobs in different pipelines' do @@ -257,7 +257,7 @@ describe API::Jobs do let(:api_user) { nil } it 'does not return jobs' do - expect(response).to have_gitlab_http_status(401) + expect(response).to have_gitlab_http_status(:unauthorized) end end @@ -265,7 +265,7 @@ describe API::Jobs do let(:api_user) { guest } it 'does not return jobs' do - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end end @@ -280,7 +280,7 @@ describe API::Jobs do context 'authorized user' do it 'returns specific job data' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['id']).to eq(job.id) expect(json_response['status']).to eq(job.status) expect(json_response['stage']).to eq(job.stage) @@ -319,7 +319,7 @@ describe API::Jobs do let(:api_user) { nil } it 'does not return specific job data' do - expect(response).to have_gitlab_http_status(401) + expect(response).to have_gitlab_http_status(:unauthorized) end end end @@ -339,7 +339,7 @@ describe API::Jobs do end it 'returns status 401 (unauthorized)' do - expect(response).to have_http_status :unauthorized + expect(response).to have_gitlab_http_status(:unauthorized) end end @@ -349,7 +349,7 @@ describe API::Jobs do end it 'returns status 403 (forbidden)' do - expect(response).to have_http_status :forbidden + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -362,7 +362,7 @@ describe API::Jobs do end it 'returns status 204 (no content)' do - expect(response).to have_http_status :no_content + expect(response).to have_gitlab_http_status(:no_content) end end end @@ -386,7 +386,7 @@ describe API::Jobs do get_artifact_file(artifact) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end @@ -398,7 +398,7 @@ describe API::Jobs do get_artifact_file(artifact) - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -410,7 +410,7 @@ describe API::Jobs do get_artifact_file(artifact) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -423,7 +423,7 @@ describe API::Jobs do get_artifact_file(artifact) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.headers.to_h) .to include('Content-Type' => 'application/json', 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/) @@ -435,7 +435,7 @@ describe API::Jobs do it 'does not return job artifact file' do get_artifact_file('some/artifact') - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -453,7 +453,7 @@ describe API::Jobs do end it 'returns specific job artifacts' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.headers.to_h).to include(download_headers) expect(response.body).to match_file(job.artifacts_file.file.file) end @@ -476,7 +476,7 @@ describe API::Jobs do let(:api_user) { nil } it 'does not return specific job artifacts' do - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -507,7 +507,7 @@ describe API::Jobs do context 'when proxy download is disabled' do it 'returns location redirect' do - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) end end @@ -521,7 +521,7 @@ describe API::Jobs do let(:api_user) { nil } it 'does not return specific job artifacts' do - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -557,7 +557,7 @@ describe API::Jobs do it 'does not find a resource in a private project' do expect(project).to be_private - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -569,7 +569,7 @@ describe API::Jobs do end it 'gives 403' do - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -604,7 +604,7 @@ describe API::Jobs do %Q(attachment; filename="#{job.artifacts_file.filename}"; filename*=UTF-8''#{job.artifacts_file.filename}) } end - it { expect(response).to have_http_status(:ok) } + it { expect(response).to have_gitlab_http_status(:ok) } it { expect(response.headers.to_h).to include(download_headers) } end @@ -619,7 +619,7 @@ describe API::Jobs do end it 'returns location redirect' do - expect(response).to have_http_status(:found) + expect(response).to have_gitlab_http_status(:found) end end end @@ -677,7 +677,7 @@ describe API::Jobs do let(:public_builds) { true } it 'allows to access artifacts', :sidekiq_might_not_need_inline do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.headers.to_h) .to include('Content-Type' => 'application/json', 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/) @@ -689,7 +689,7 @@ describe API::Jobs do let(:public_builds) { false } it 'rejects access to artifacts' do - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) expect(json_response).to have_key('message') expect(response.headers.to_h) .not_to include('Gitlab-Workhorse-Send-Data' => /artifacts-entry/) @@ -701,7 +701,7 @@ describe API::Jobs do let(:public_builds) { true } it 'rejects access and hides existence of artifacts' do - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) expect(json_response).to have_key('message') expect(response.headers.to_h) .not_to include('Gitlab-Workhorse-Send-Data' => /artifacts-entry/) @@ -720,7 +720,7 @@ describe API::Jobs do get_artifact_file(artifact) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.headers.to_h) .to include('Content-Type' => 'application/json', 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/) @@ -737,7 +737,7 @@ describe API::Jobs do it 'returns a specific artifact file for a valid path', :sidekiq_might_not_need_inline do get_artifact_file(artifact, 'improve/awesome') - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.headers.to_h) .to include('Content-Type' => 'application/json', 'Gitlab-Workhorse-Send-Data' => /artifacts-entry/) @@ -773,7 +773,7 @@ describe API::Jobs do it 'does not return job artifact file' do get_artifact_file('some/artifact') - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -803,7 +803,7 @@ describe API::Jobs do end it 'returns specific job trace' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.body).to eq(job.trace.raw) end end @@ -812,7 +812,7 @@ describe API::Jobs do let(:job) { create(:ci_build, :trace_artifact, pipeline: pipeline) } it 'returns specific job trace' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.body).to eq(job.trace.raw) end end @@ -821,7 +821,7 @@ describe API::Jobs do let(:job) { create(:ci_build, :trace_live, pipeline: pipeline) } it 'returns specific job trace' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.body).to eq(job.trace.raw) end end @@ -831,7 +831,7 @@ describe API::Jobs do let(:api_user) { nil } it 'does not return specific job trace' do - expect(response).to have_gitlab_http_status(401) + expect(response).to have_gitlab_http_status(:unauthorized) end end end @@ -844,7 +844,7 @@ describe API::Jobs do context 'authorized user' do context 'user with :update_build persmission' do it 'cancels running or pending job' do - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(project.builds.first.status).to eq('success') end end @@ -853,7 +853,7 @@ describe API::Jobs do let(:api_user) { reporter } it 'does not cancel job' do - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end end @@ -862,7 +862,7 @@ describe API::Jobs do let(:api_user) { nil } it 'does not cancel job' do - expect(response).to have_gitlab_http_status(401) + expect(response).to have_gitlab_http_status(:unauthorized) end end end @@ -877,7 +877,7 @@ describe API::Jobs do context 'authorized user' do context 'user with :update_build permission' do it 'retries non-running job' do - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(project.builds.first.status).to eq('canceled') expect(json_response['status']).to eq('pending') end @@ -887,7 +887,7 @@ describe API::Jobs do let(:api_user) { reporter } it 'does not retry job' do - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end end @@ -896,7 +896,7 @@ describe API::Jobs do let(:api_user) { nil } it 'does not retry job' do - expect(response).to have_gitlab_http_status(401) + expect(response).to have_gitlab_http_status(:unauthorized) end end end @@ -914,7 +914,7 @@ describe API::Jobs do let(:job) { create(:ci_build, :trace_artifact, :artifacts, :test_reports, :success, project: project, pipeline: pipeline) } it 'erases job content' do - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(job.job_artifacts.count).to eq(0) expect(job.trace.exist?).to be_falsy expect(job.artifacts_file.present?).to be_falsy @@ -934,7 +934,7 @@ describe API::Jobs do let(:job) { create(:ci_build, :trace_live, project: project, pipeline: pipeline) } it 'responds with forbidden' do - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -945,13 +945,13 @@ describe API::Jobs do context 'when the build was created by the developer' do let(:owner) { user } - it { expect(response).to have_gitlab_http_status(201) } + it { expect(response).to have_gitlab_http_status(:created) } end context 'when the build was created by the other' do let(:owner) { create(:user) } - it { expect(response).to have_gitlab_http_status(403) } + it { expect(response).to have_gitlab_http_status(:forbidden) } end end end @@ -968,7 +968,7 @@ describe API::Jobs do end it 'keeps artifacts' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(job.reload.artifacts_expire_at).to be_nil end end @@ -977,7 +977,7 @@ describe API::Jobs do let(:job) { create(:ci_build, project: project, pipeline: pipeline) } it 'responds with not found' do - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -992,7 +992,7 @@ describe API::Jobs do context 'when user is authorized to trigger a manual action' do it 'plays the job' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['user']['id']).to eq(user.id) expect(json_response['id']).to eq(job.id) expect(job.reload).to be_pending @@ -1005,7 +1005,7 @@ describe API::Jobs do it 'does not trigger a manual action' do expect(job.reload).to be_manual - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -1014,7 +1014,7 @@ describe API::Jobs do it 'does not trigger a manual action' do expect(job.reload).to be_manual - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end end @@ -1022,7 +1022,7 @@ describe API::Jobs do context 'on a non-playable job' do it 'returns a status code 400, Bad Request' do - expect(response).to have_gitlab_http_status 400 + expect(response).to have_gitlab_http_status(:bad_request) expect(response.body).to match("Unplayable Job") end end diff --git a/spec/requests/api/keys_spec.rb b/spec/requests/api/keys_spec.rb index c743cb3f633..df0bae603b1 100644 --- a/spec/requests/api/keys_spec.rb +++ b/spec/requests/api/keys_spec.rb @@ -12,21 +12,21 @@ describe API::Keys do context 'when unauthenticated' do it 'returns authentication error' do get api("/keys/#{key.id}") - expect(response).to have_gitlab_http_status(401) + expect(response).to have_gitlab_http_status(:unauthorized) end end context 'when authenticated' do it 'returns 404 for non-existing key' do get api('/keys/0', admin) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) expect(json_response['message']).to eq('404 Not found') end it 'returns single ssh key with user information' do user.keys << key get api("/keys/#{key.id}", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['title']).to eq(key.title) expect(json_response['user']['id']).to eq(user.id) expect(json_response['user']['username']).to eq(user.username) @@ -44,27 +44,27 @@ describe API::Keys do it 'returns authentication error' do get api("/keys?fingerprint=#{key.fingerprint}") - expect(response).to have_gitlab_http_status(401) + expect(response).to have_gitlab_http_status(:unauthorized) end it 'returns authentication error when authenticated as user' do get api("/keys?fingerprint=#{key.fingerprint}", user) - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end context 'when authenticated as admin' do it 'returns 404 for non-existing SSH md5 fingerprint' do get api("/keys?fingerprint=11:11:11:11:11:11:11:11:11:11:11:11:11:11:11:11", admin) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) expect(json_response['message']).to eq('404 Key Not Found') end it 'returns 404 for non-existing SSH sha256 fingerprint' do get api("/keys?fingerprint=#{URI.encode_www_form_component("SHA256:nUhzNyftwADy8AH3wFY31tAKs7HufskYTte2aXo1lCg")}", admin) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) expect(json_response['message']).to eq('404 Key Not Found') end @@ -73,7 +73,7 @@ describe API::Keys do get api("/keys?fingerprint=#{key.fingerprint}", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['title']).to eq(key.title) expect(json_response['user']['id']).to eq(user.id) expect(json_response['user']['username']).to eq(user.username) @@ -84,7 +84,7 @@ describe API::Keys do get api("/keys?fingerprint=#{URI.encode_www_form_component("SHA256:" + key.fingerprint_sha256)}", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['title']).to eq(key.title) expect(json_response['user']['id']).to eq(user.id) expect(json_response['user']['username']).to eq(user.username) @@ -95,7 +95,7 @@ describe API::Keys do get api("/keys?fingerprint=#{URI.encode_www_form_component("sha256:" + key.fingerprint_sha256)}", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['title']).to eq(key.title) expect(json_response['user']['id']).to eq(user.id) expect(json_response['user']['username']).to eq(user.username) @@ -125,7 +125,7 @@ describe API::Keys do get api("/keys?fingerprint=#{URI.encode_www_form_component("SHA256:" + deploy_key.fingerprint_sha256)}", admin) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['title']).to eq(deploy_key.title) expect(json_response['user']['id']).to eq(user.id) diff --git a/spec/requests/api/labels_spec.rb b/spec/requests/api/labels_spec.rb index d027738c8db..f8216da3419 100644 --- a/spec/requests/api/labels_spec.rb +++ b/spec/requests/api/labels_spec.rb @@ -27,7 +27,7 @@ describe API::Labels do it "returns 200 if name is changed (#{route_type} route)" do put_labels_api(route_type, user, spec_params, new_name: 'New Label') - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['name']).to eq('New Label') expect(json_response['color']).to eq(label1.color) end @@ -35,7 +35,7 @@ describe API::Labels do it "returns 200 if colors is changed (#{route_type} route)" do put_labels_api(route_type, user, spec_params, color: '#FFFFFF') - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['name']).to eq(label1.name) expect(json_response['color']).to eq('#FFFFFF') end @@ -51,7 +51,7 @@ describe API::Labels do it "returns 400 if no new parameters given (#{route_type} route)" do put_labels_api(route_type, user, spec_params) - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['error']).to eq('new_name, color, description, priority are missing, '\ 'at least one parameter must be provided') end @@ -59,27 +59,27 @@ describe API::Labels do it "returns 400 when color code is too short (#{route_type} route)" do put_labels_api(route_type, user, spec_params, color: '#FF') - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['message']['color']).to eq(['must be a valid color code']) end it "returns 400 for too long color code (#{route_type} route)" do put_labels_api(route_type, user, spec_params, color: '#FFAAFFFF') - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['message']['color']).to eq(['must be a valid color code']) end it "returns 400 for invalid priority (#{route_type} route)" do put_labels_api(route_type, user, spec_params, priority: 'foo') - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it "returns 200 if name and colors and description are changed (#{route_type} route)" do put_labels_api(route_type, user, spec_params, new_name: 'New Label', color: '#FFFFFF', description: 'test') - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['name']).to eq('New Label') expect(json_response['color']).to eq('#FFFFFF') expect(json_response['description']).to eq('test') @@ -88,14 +88,14 @@ describe API::Labels do it "returns 400 for invalid name (#{route_type} route)" do put_labels_api(route_type, user, spec_params, new_name: ',', color: '#FFFFFF') - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['message']['title']).to eq(['is invalid']) end it "returns 200 if description is changed (#{route_type} route)" do put_labels_api(route_type, user, spec_params, description: 'test') - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['id']).to eq(expected_response_label_id) expect(json_response['description']).to eq('test') end @@ -162,14 +162,14 @@ describe API::Labels do it 'returns 204 for existing label (deprecated route)' do delete api("/projects/#{project.id}/labels", user), params: spec_params - expect(response).to have_gitlab_http_status(204) + expect(response).to have_gitlab_http_status(:no_content) end it 'returns 204 for existing label (rest route)' do label_id = spec_params[:name] || spec_params[:label_id] delete api("/projects/#{project.id}/labels/#{label_id}", user), params: spec_params.except(:name, :label_id) - expect(response).to have_gitlab_http_status(204) + expect(response).to have_gitlab_http_status(:no_content) end end @@ -188,7 +188,7 @@ describe API::Labels do it 'returns all available labels to the project' do get api("/projects/#{project.id}/labels", user) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to all(match_schema('public_api/v4/labels/project_label')) expect(json_response.size).to eq(3) @@ -205,7 +205,7 @@ describe API::Labels do it 'includes counts in the response' do get api("/projects/#{project.id}/labels", user), params: { with_counts: true } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to all(match_schema('public_api/v4/labels/project_label_with_counts')) expect(json_response.size).to eq(3) @@ -264,7 +264,7 @@ describe API::Labels do it 'returns all available labels for the project, parent group and ancestor groups' do get api("/projects/#{project.id}/labels", user) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response).to all(match_schema('public_api/v4/labels/label')) @@ -287,7 +287,7 @@ describe API::Labels do it 'returns all available labels for the project and the parent group only' do get api("/projects/#{project.id}/labels", user), params: { include_ancestor_groups: false } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response).to all(match_schema('public_api/v4/labels/label')) @@ -307,7 +307,7 @@ describe API::Labels do priority: 2 } - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response['name']).to eq('Foo') expect(json_response['color']).to eq('#FFAABB') expect(json_response['description']).to eq('test') @@ -345,12 +345,12 @@ describe API::Labels do it 'returns a 400 bad request if name not given' do post api("/projects/#{project.id}/labels", user), params: { color: '#FFAABB' } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it 'returns a 400 bad request if color not given' do post api("/projects/#{project.id}/labels", user), params: { name: 'Foobar' } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it 'returns 400 for invalid color' do @@ -359,7 +359,7 @@ describe API::Labels do name: 'Foo', color: '#FFAA' } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['message']['color']).to eq(['must be a valid color code']) end @@ -369,7 +369,7 @@ describe API::Labels do name: 'Foo', color: '#FFAAFFFF' } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['message']['color']).to eq(['must be a valid color code']) end @@ -379,7 +379,7 @@ describe API::Labels do name: ',', color: '#FFAABB' } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['message']['title']).to eq(['is invalid']) end @@ -394,7 +394,7 @@ describe API::Labels do color: '#FFAABB' } - expect(response).to have_gitlab_http_status(409) + expect(response).to have_gitlab_http_status(:conflict) expect(json_response['message']).to eq('Label already exists') end @@ -406,7 +406,7 @@ describe API::Labels do priority: 'foo' } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it 'returns 409 if label already exists in project' do @@ -415,7 +415,7 @@ describe API::Labels do name: 'label1', color: '#FFAABB' } - expect(response).to have_gitlab_http_status(409) + expect(response).to have_gitlab_http_status(:conflict) expect(json_response['message']).to eq('Label already exists') end end @@ -432,14 +432,14 @@ describe API::Labels do it 'returns 404 for non existing label' do delete api("/projects/#{project.id}/labels", user), params: { name: 'label2' } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) expect(json_response['message']).to eq('404 Label Not Found') end it 'returns 400 for wrong parameters' do delete api("/projects/#{project.id}/labels", user) - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it 'fails if label_id and name are given in params' do @@ -449,7 +449,7 @@ describe API::Labels do name: priority_label.name } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end it_behaves_like '412 response' do @@ -480,7 +480,7 @@ describe API::Labels do new_name: 'label3' } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'returns 404 if label by id does not exist' do @@ -490,13 +490,13 @@ describe API::Labels do new_name: 'label3' } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'returns 400 if no label name and id is given' do put api("/projects/#{project.id}/labels", user), params: { new_name: 'label2' } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['error']).to eq('label_id, name are missing, exactly one parameter must be provided') end @@ -508,7 +508,7 @@ describe API::Labels do new_name: 'New Label' } - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) end end @@ -523,7 +523,7 @@ describe API::Labels do it 'returns 200 if label is promoted' do put api("/projects/#{project.id}/labels/promote", user), params: { name: label1.name } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['name']).to eq(label1.name) expect(json_response['color']).to eq(label1.color) end @@ -535,7 +535,7 @@ describe API::Labels do .to change(project.labels, :count).by(-1) .and change(group.labels, :count).by(0) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'returns 403 if guest promotes label' do @@ -544,19 +544,19 @@ describe API::Labels do put api("/projects/#{project.id}/labels/promote", guest), params: { name: label1.name } - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end it 'returns 404 if label does not exist' do put api("/projects/#{project.id}/labels/promote", user), params: { name: 'unknown' } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'returns 400 if no label name given' do put api("/projects/#{project.id}/labels/promote", user) - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['error']).to eq('name is missing') end end @@ -566,7 +566,7 @@ describe API::Labels do it "subscribes to the label" do post api("/projects/#{project.id}/labels/#{label1.title}/subscribe", user) - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response["name"]).to eq(label1.title) expect(json_response["subscribed"]).to be_truthy end @@ -576,7 +576,7 @@ describe API::Labels do it "subscribes to the label" do post api("/projects/#{project.id}/labels/#{label1.id}/subscribe", user) - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response["name"]).to eq(label1.title) expect(json_response["subscribed"]).to be_truthy end @@ -590,7 +590,7 @@ describe API::Labels do it "returns 304" do post api("/projects/#{project.id}/labels/#{label1.id}/subscribe", user) - expect(response).to have_gitlab_http_status(304) + expect(response).to have_gitlab_http_status(:not_modified) end end @@ -598,7 +598,7 @@ describe API::Labels do it "returns 404 error" do post api("/projects/#{project.id}/labels/1234/subscribe", user) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -612,7 +612,7 @@ describe API::Labels do it "unsubscribes from the label" do post api("/projects/#{project.id}/labels/#{label1.title}/unsubscribe", user) - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response["name"]).to eq(label1.title) expect(json_response["subscribed"]).to be_falsey end @@ -622,7 +622,7 @@ describe API::Labels do it "unsubscribes from the label" do post api("/projects/#{project.id}/labels/#{label1.id}/unsubscribe", user) - expect(response).to have_gitlab_http_status(201) + expect(response).to have_gitlab_http_status(:created) expect(json_response["name"]).to eq(label1.title) expect(json_response["subscribed"]).to be_falsey end @@ -636,7 +636,7 @@ describe API::Labels do it "returns 304" do post api("/projects/#{project.id}/labels/#{label1.id}/unsubscribe", user) - expect(response).to have_gitlab_http_status(304) + expect(response).to have_gitlab_http_status(:not_modified) end end @@ -644,7 +644,7 @@ describe API::Labels do it "returns 404 error" do post api("/projects/#{project.id}/labels/1234/unsubscribe", user) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end diff --git a/spec/requests/api/lint_spec.rb b/spec/requests/api/lint_spec.rb index 46d23bd16b9..5815ce07125 100644 --- a/spec/requests/api/lint_spec.rb +++ b/spec/requests/api/lint_spec.rb @@ -12,7 +12,7 @@ describe API::Lint do it 'passes validation' do post api('/ci/lint'), params: { content: yaml_content } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to be_an Hash expect(json_response['status']).to eq('valid') expect(json_response['errors']).to eq([]) @@ -23,7 +23,7 @@ describe API::Lint do it 'responds with errors about invalid syntax' do post api('/ci/lint'), params: { content: 'invalid content' } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['status']).to eq('invalid') expect(json_response['errors']).to eq(['Invalid configuration format']) end @@ -31,7 +31,7 @@ describe API::Lint do it "responds with errors about invalid configuration" do post api('/ci/lint'), params: { content: '{ image: "ruby:2.1", services: ["postgres"] }' } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response['status']).to eq('invalid') expect(json_response['errors']).to eq(['jobs config should contain at least one visible job']) end @@ -41,7 +41,7 @@ describe API::Lint do it 'responds with validation error about missing content' do post api('/ci/lint') - expect(response).to have_gitlab_http_status(400) + expect(response).to have_gitlab_http_status(:bad_request) expect(json_response['error']).to eq('content is missing') end end diff --git a/vendor/project_templates/gatsby.tar.gz b/vendor/project_templates/gatsby.tar.gz Binary files differnew file mode 100644 index 00000000000..d9025978126 --- /dev/null +++ b/vendor/project_templates/gatsby.tar.gz |