diff --git a/.haml-lint.yml b/.haml-lint.yml index 39090a48d1ca51edf2c9eefd9809118e6b35160b..efbf14b2e224c2d55be00ed63342d77ff6000bf0 100644 --- a/.haml-lint.yml +++ b/.haml-lint.yml @@ -137,7 +137,6 @@ linters: - Style/ParenthesesAroundCondition - Style/RedundantParentheses - Style/SelfAssignment - - Style/Semicolon - Style/TernaryParentheses - Style/TrailingCommaInHashLiteral - Style/UnlessElse diff --git a/app/assets/javascripts/design_management/components/design_notes/design_note.vue b/app/assets/javascripts/design_management/components/design_notes/design_note.vue index 2b8672173279f0aa35bb705e21b88dc37f98e649..833d7081a2c45e6697a90427797d676e0d436605 100644 --- a/app/assets/javascripts/design_management/components/design_notes/design_note.vue +++ b/app/assets/javascripts/design_management/components/design_notes/design_note.vue @@ -1,6 +1,7 @@ <script> import { GlTooltipDirective, GlIcon, GlLink, GlSafeHtmlDirective } from '@gitlab/ui'; import { ApolloMutation } from 'vue-apollo'; +import { __ } from '~/locale'; import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue'; import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue'; import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue'; @@ -10,6 +11,9 @@ import { findNoteId, extractDesignNoteId } from '../../utils/design_management_u import DesignReplyForm from './design_reply_form.vue'; export default { + i18n: { + editCommentLabel: __('Edit comment'), + }, components: { UserAvatarLink, TimelineEntryItem, @@ -113,7 +117,8 @@ export default { v-if="isEditButtonVisible" v-gl-tooltip type="button" - :title="__('Edit comment')" + :title="$options.i18n.editCommentLabel" + :aria-label="$options.i18n.editCommentLabel" class="note-action-button js-note-edit btn btn-transparent qa-note-edit-button" @click="isEditing = true" > diff --git a/app/assets/javascripts/diffs/components/diff_discussions.vue b/app/assets/javascripts/diffs/components/diff_discussions.vue index d0d457d858292b56d4652e9bf20a83fb3ef2e218..5e05ec87f84d1a1929a891c4e99dc4c8faf3af09 100644 --- a/app/assets/javascripts/diffs/components/diff_discussions.vue +++ b/app/assets/javascripts/diffs/components/diff_discussions.vue @@ -68,6 +68,7 @@ export default { }" type="button" class="js-diff-notes-toggle" + :aria-label="__('Show comments')" @click="toggleDiscussion({ discussionId: discussion.id })" > <gl-icon v-if="discussion.expanded" name="collapse" class="collapse-icon" /> diff --git a/app/assets/javascripts/diffs/components/image_diff_overlay.vue b/app/assets/javascripts/diffs/components/image_diff_overlay.vue index 3d05202fb2d4706e8149effc3567152099b91888..5572338908fda497dae9fa5356b84f48a08a32e2 100644 --- a/app/assets/javascripts/diffs/components/image_diff_overlay.vue +++ b/app/assets/javascripts/diffs/components/image_diff_overlay.vue @@ -122,6 +122,7 @@ export default { :disabled="!shouldToggleDiscussion" class="js-image-badge" type="button" + :aria-label="__('Show comments')" @click="clickedToggle(discussion)" > <gl-icon v-if="showCommentIcon" name="image-comment-dark" :size="24" /> diff --git a/app/assets/javascripts/diffs/components/inline_diff_table_row.vue b/app/assets/javascripts/diffs/components/inline_diff_table_row.vue index fd6c69e22c63010fcbc729333cb22dbe39c01fe1..25403b1547e72e3a4a638333d6e9d3646fa57e22 100644 --- a/app/assets/javascripts/diffs/components/inline_diff_table_row.vue +++ b/app/assets/javascripts/diffs/components/inline_diff_table_row.vue @@ -146,6 +146,7 @@ export default { type="button" class="add-diff-note note-button js-add-diff-note-button" :disabled="line.commentsDisabled" + :aria-label="addCommentTooltip" @click="handleCommentButton" > <gl-icon :size="12" name="comment" /> diff --git a/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue b/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue index 147741fa2bbf973ee8cd3ba3715fc89f6a94f5d6..96946d0fd88398321a27d684d2f7032d8aec1ae2 100644 --- a/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue +++ b/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue @@ -195,6 +195,7 @@ export default { type="button" class="add-diff-note note-button js-add-diff-note-button qa-diff-comment" :disabled="line.left.commentsDisabled" + :aria-label="addCommentTooltipLeft" @click="handleCommentButton(line.left)" > <gl-icon :size="12" name="comment" /> @@ -252,6 +253,7 @@ export default { type="button" class="add-diff-note note-button js-add-diff-note-button qa-diff-comment" :disabled="line.right.commentsDisabled" + :aria-label="addCommentTooltipRight" @click="handleCommentButton(line.right)" > <gl-icon :size="12" name="comment" /> diff --git a/app/assets/javascripts/emoji/components/picker.vue b/app/assets/javascripts/emoji/components/picker.vue index 156bbb28ce6e42db11924ab8b3f094cdb0e47f80..cbcc5dcff3abc2186b03b87cb9f19c90c5df9ec6 100644 --- a/app/assets/javascripts/emoji/components/picker.vue +++ b/app/assets/javascripts/emoji/components/picker.vue @@ -105,6 +105,7 @@ export default { }" type="button" class="gl-border-0 gl-border-b-2 gl-border-b-solid gl-flex-fill-1 gl-text-gray-300 gl-pt-3 gl-pb-3 gl-bg-transparent emoji-picker-category-tab" + :aria-label="category.name" @click="scrollToCategory(category.name)" > <gl-icon :name="category.icon" :size="12" /> diff --git a/app/assets/javascripts/error_tracking/components/error_tracking_actions.vue b/app/assets/javascripts/error_tracking/components/error_tracking_actions.vue index db61957d452d9217a8c868fdc269e551dde48025..9438900c736f137b32e284928c00e06b288709de 100644 --- a/app/assets/javascripts/error_tracking/components/error_tracking_actions.vue +++ b/app/assets/javascripts/error_tracking/components/error_tracking_actions.vue @@ -51,6 +51,7 @@ export default { v-gl-tooltip.hover class="gl-display-block gl-mb-4 mb-md-0 gl-w-full" :title="ignoreBtn.title" + :aria-label="ignoreBtn.title" @click="$emit('update-issue-status', { errorId: error.id, status: ignoreBtn.status })" > <gl-icon class="gl-display-none d-md-inline gl-m-0" :name="ignoreBtn.icon" :size="12" /> @@ -62,6 +63,7 @@ export default { v-gl-tooltip.hover class="gl-display-block gl-mb-4 mb-md-0 gl-w-full" :title="resolveBtn.title" + :aria-label="resolveBtn.title" @click="$emit('update-issue-status', { errorId: error.id, status: resolveBtn.status })" > <gl-icon class="gl-display-none d-md-inline gl-m-0" :name="resolveBtn.icon" :size="12" /> diff --git a/app/assets/javascripts/ide/components/jobs/detail/scroll_button.vue b/app/assets/javascripts/ide/components/jobs/detail/scroll_button.vue index f4859b9f3126b3553b369ad9887f3f75b80a8bed..6e1929a1948b331fe5be7134051f902c02ccf76a 100644 --- a/app/assets/javascripts/ide/components/jobs/detail/scroll_button.vue +++ b/app/assets/javascripts/ide/components/jobs/detail/scroll_button.vue @@ -55,6 +55,7 @@ export default { :disabled="disabled" class="btn-scroll btn-transparent btn-blank" type="button" + :aria-label="tooltipTitle" @click="clickedScroll" > <gl-icon :name="iconName" /> diff --git a/app/assets/javascripts/search/topbar/components/searchable_dropdown.vue b/app/assets/javascripts/search/topbar/components/searchable_dropdown.vue index 5fb7217db74268c99c10c0af69d865e8d5e04141..d16850cd8899984d7992e50b77f7674d08a05077 100644 --- a/app/assets/javascripts/search/topbar/components/searchable_dropdown.vue +++ b/app/assets/javascripts/search/topbar/components/searchable_dropdown.vue @@ -9,10 +9,13 @@ import { GlSkeletonLoader, GlTooltipDirective, } from '@gitlab/ui'; - +import { __ } from '~/locale'; import { ANY_OPTION } from '../constants'; export default { + i18n: { + clearLabel: __('Clear'), + }, name: 'SearchableDropdown', components: { GlDropdown, @@ -96,7 +99,8 @@ export default { v-gl-tooltip name="clear" category="tertiary" - :title="__('Clear')" + :title="$options.i18n.clearLabel" + :aria-label="$options.i18n.clearLabel" class="gl-p-0! gl-mr-2" @keydown.enter.stop="resetDropdown" @click.stop="resetDropdown" diff --git a/app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_action_button.vue b/app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_action_button.vue index cc3efae565ac0aba1ae19ee2bc51d2a7d4985d41..b25c0cc0d965cd0b6a0fcdd4d65a389f72264e27 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_action_button.vue +++ b/app/assets/javascripts/vue_merge_request_widget/components/deployment/deployment_action_button.vue @@ -68,6 +68,7 @@ export default { category="primary" size="small" :title="buttonTitle" + :aria-label="buttonTitle" :loading="isLoading" :disabled="isActionInProgress" :class="`inline gl-ml-2 ${containerClasses}`" diff --git a/app/assets/javascripts/vue_shared/components/help_popover.vue b/app/assets/javascripts/vue_shared/components/help_popover.vue index 7222bd82df08d93389cb1e69ba580386e5e4c25c..f36b9107a6e7bb03e814801e7a685601a823dc08 100644 --- a/app/assets/javascripts/vue_shared/components/help_popover.vue +++ b/app/assets/javascripts/vue_shared/components/help_popover.vue @@ -25,7 +25,7 @@ export default { </script> <template> <span> - <gl-button ref="popoverTrigger" variant="link" icon="question" tabindex="0" /> + <gl-button ref="popoverTrigger" variant="link" icon="question" :aria-label="__('Help')" /> <gl-popover :target="() => $refs.popoverTrigger.$el" v-bind="options"> <template v-if="options.title" #title> <span v-safe-html="options.title"></span> diff --git a/app/assets/javascripts/vue_shared/components/rich_content_editor/toolbar_item.vue b/app/assets/javascripts/vue_shared/components/rich_content_editor/toolbar_item.vue index 4271f6053edbf13dce353ec5120e4f8066dbac70..85a67c087bbf29a12cbf8642c2d612520e2fcc87 100644 --- a/app/assets/javascripts/vue_shared/components/rich_content_editor/toolbar_item.vue +++ b/app/assets/javascripts/vue_shared/components/rich_content_editor/toolbar_item.vue @@ -21,7 +21,11 @@ export default { }; </script> <template> - <button v-gl-tooltip="{ title: tooltip }" class="p-0 gl-display-flex toolbar-button"> + <button + v-gl-tooltip="{ title: tooltip }" + :aria-label="tooltip" + class="p-0 gl-display-flex toolbar-button" + > <gl-icon class="gl-mx-auto gl-align-self-center" :name="icon" /> </button> </template> diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 1e44321e148bcb966662cc690558ba2066d06ed4..478c7cd156ff5b5e3029c5fcfb47f22e10b67c95 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -137,14 +137,6 @@ def award_emojis_loaded? scope :references_project, -> { references(:project) } scope :non_archived, -> { join_project.where(projects: { archived: false }) } - scope :includes_for_bulk_update, -> do - associations = %i[author assignees epic group labels metrics project source_project target_project].select do |association| - reflect_on_association(association) - end - - includes(*associations) - end - attr_mentionable :title, pipeline: :single_line attr_mentionable :description diff --git a/app/models/concerns/milestoneable.rb b/app/models/concerns/milestoneable.rb index d42417bb6c17782cfb10271554fe45b475e8538f..ccb334343ff77d5b4c0b1db165a8feaf81ae2c46 100644 --- a/app/models/concerns/milestoneable.rb +++ b/app/models/concerns/milestoneable.rb @@ -39,13 +39,11 @@ module Milestoneable private def milestone_is_valid - errors.add(:milestone_id, 'is invalid') if respond_to?(:milestone_id) && !milestone_available? + errors.add(:milestone_id, 'is invalid') if respond_to?(:milestone_id) && milestone_id.present? && !milestone_available? end end def milestone_available? - return true if milestone_id.blank? - project_id == milestone&.project_id || project.ancestors_upto.compact.include?(milestone&.group) end diff --git a/app/services/issuable/bulk_update_service.rb b/app/services/issuable/bulk_update_service.rb index 13e289716ef42004f491cce8234f940bd5a57b5e..d3d543edcd7ff5b0606e401be78471d9b37c12d2 100644 --- a/app/services/issuable/bulk_update_service.rb +++ b/app/services/issuable/bulk_update_service.rb @@ -15,7 +15,7 @@ def execute(type) set_update_params(type) items = update_issuables(type, ids) - response_success(payload: { count: items.size }) + response_success(payload: { count: items.count }) rescue ArgumentError => e response_error(e.message, 422) end @@ -59,17 +59,10 @@ def update_issuables(type, ids) def find_issuables(parent, model_class, ids) if parent.is_a?(Project) - projects = parent + model_class.id_in(ids).of_projects(parent) elsif parent.is_a?(Group) - projects = parent.all_projects - else - return + model_class.id_in(ids).of_projects(parent.all_projects) end - - model_class - .id_in(ids) - .of_projects(projects) - .includes_for_bulk_update end def response_success(message: nil, payload: nil) diff --git a/app/views/layouts/_flash.html.haml b/app/views/layouts/_flash.html.haml index 35fefe40d3990b247d8328905bcab87940f624a3..433337602f15459db3286cbe90ac80cdbac8de06 100644 --- a/app/views/layouts/_flash.html.haml +++ b/app/views/layouts/_flash.html.haml @@ -1,5 +1,5 @@ -# We currently only support `alert`, `notice`, `success`, 'toast' -- icons = {'alert' => 'error', 'notice' => 'information-o', 'success' => 'check-circle'}; +- icons = {'alert' => 'error', 'notice' => 'information-o', 'success' => 'check-circle'} .flash-container.flash-container-page.sticky{ data: { qa_selector: 'flash_container' } } - flash.each do |key, value| - if key == 'toast' && value diff --git a/app/views/shared/blob/_markdown_buttons.html.haml b/app/views/shared/blob/_markdown_buttons.html.haml index 085206714c64581b4b71df0b8ac123411e14f162..73f3d2a8fcd0efb97fb60130629dc6b317c97dc7 100644 --- a/app/views/shared/blob/_markdown_buttons.html.haml +++ b/app/views/shared/blob/_markdown_buttons.html.haml @@ -1,4 +1,4 @@ -- modifier_key = client_js_flags[:isMac] ? '⌘' : s_('KeyboardKey|Ctrl+'); +- modifier_key = client_js_flags[:isMac] ? '⌘' : s_('KeyboardKey|Ctrl+') .md-header-toolbar.active = markdown_toolbar_button({ icon: "bold", diff --git a/changelogs/unreleased/21068-optimize-issueable-updates.yml b/changelogs/unreleased/21068-optimize-issueable-updates.yml deleted file mode 100644 index 214fd3fe0abbeb6c7815c55d2b71045db36c948f..0000000000000000000000000000000000000000 --- a/changelogs/unreleased/21068-optimize-issueable-updates.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Optimize issuable updates -merge_request: 58114 -author: -type: performance diff --git a/changelogs/unreleased/cngo-add-aria-labels-to-icon-only-buttons-3.yml b/changelogs/unreleased/cngo-add-aria-labels-to-icon-only-buttons-3.yml new file mode 100644 index 0000000000000000000000000000000000000000..8e72b9c9d7cb96670d8c55b111e9dce7a08f734d --- /dev/null +++ b/changelogs/unreleased/cngo-add-aria-labels-to-icon-only-buttons-3.yml @@ -0,0 +1,5 @@ +--- +title: Add aria labels to icon-only buttons +merge_request: 59037 +author: +type: fixed diff --git a/doc/update/index.md b/doc/update/index.md index 5b62e0642c8f20d07ecb1ea6e6591a23ab5c7f75..75bc1ef62f68b1a3bc5caf7b0ff902c69906b85b 100644 --- a/doc/update/index.md +++ b/doc/update/index.md @@ -177,7 +177,7 @@ Find where your version sits in the upgrade path below, and upgrade GitLab accordingly, while also consulting the [version-specific upgrade instructions](#version-specific-upgrading-instructions): -`8.11.Z` -> `8.12.0` -> `8.17.7` -> `9.5.10` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> `13.5.4` - > [latest `13.Y.Z`](https://about.gitlab.com/releases/categories/releases/) +`8.11.Z` -> `8.12.0` -> `8.17.7` -> `9.5.10` -> `10.8.7` -> `11.11.8` -> `12.0.12` -> `12.1.17` -> `12.10.14` -> `13.0.14` -> `13.1.11` -> [latest `13.Y.Z`](https://about.gitlab.com/releases/categories/releases/) The following table, while not exhaustive, shows some examples of the supported upgrade paths. diff --git a/ee/app/assets/javascripts/analytics/productivity_analytics/components/app.vue b/ee/app/assets/javascripts/analytics/productivity_analytics/components/app.vue index 16d2fc4e888f4ba81e0ad2646550c4f390c7e2a5..7331e8685366e6f44b9406f9d8bdbeb6c001bcc9 100644 --- a/ee/app/assets/javascripts/analytics/productivity_analytics/components/app.vue +++ b/ee/app/assets/javascripts/analytics/productivity_analytics/components/app.vue @@ -326,7 +326,12 @@ export default { </span> </gl-dropdown-item> </gl-dropdown> - <gl-button v-gl-tooltip.hover :title="sortTooltipTitle" @click="toggleSortOrder"> + <gl-button + v-gl-tooltip.hover + :title="sortTooltipTitle" + :aria-label="sortTooltipTitle" + @click="toggleSortOrder" + > <gl-icon :name="sortIcon" /> </gl-button> </div> diff --git a/ee/app/assets/javascripts/dependencies/components/dependencies_actions.vue b/ee/app/assets/javascripts/dependencies/components/dependencies_actions.vue index a90d4bf865f92a29e1e03b0e4eaf549fdaafbf74..ce05feeb87db9170f709b42e3de7f8128176915f 100644 --- a/ee/app/assets/javascripts/dependencies/components/dependencies_actions.vue +++ b/ee/app/assets/javascripts/dependencies/components/dependencies_actions.vue @@ -1,10 +1,14 @@ <script> import { GlButton, GlDropdown, GlDropdownItem, GlIcon, GlTooltipDirective } from '@gitlab/ui'; import { mapActions, mapState } from 'vuex'; +import { __ } from '~/locale'; import { DEPENDENCY_LIST_TYPES } from '../store/constants'; import { SORT_FIELDS, SORT_ORDER } from '../store/modules/list/constants'; export default { + i18n: { + sortDirectionLabel: __('Sort direction'), + }, name: 'DependenciesActions', components: { GlButton, @@ -80,7 +84,8 @@ export default { </gl-dropdown> <gl-button v-gl-tooltip - :title="__('Sort direction')" + :title="$options.i18n.sortDirectionLabel" + :aria-label="$options.i18n.sortDirectionLabel" class="flex-grow-0 js-sort-order" @click="toggleSortOrder" > diff --git a/ee/app/assets/javascripts/related_items_tree/components/tree_item.vue b/ee/app/assets/javascripts/related_items_tree/components/tree_item.vue index ff9b19180e030604ffe03060575aeeafabc34e69..3d99267e1f80d8d0ad2d8727a403239b63284322 100644 --- a/ee/app/assets/javascripts/related_items_tree/components/tree_item.vue +++ b/ee/app/assets/javascripts/related_items_tree/components/tree_item.vue @@ -87,6 +87,7 @@ export default { v-if="!childrenFetchInProgress && hasChildren" v-gl-tooltip.viewport.hover :title="chevronTooltip" + :aria-label="chevronTooltip" :class="chevronType" variant="link" class="btn-svg btn-tree-item-chevron align-self-start" diff --git a/ee/app/services/ee/issuable/bulk_update_service.rb b/ee/app/services/ee/issuable/bulk_update_service.rb index a0c07f4c24f76bfbb6e539a0f0651ffe51876d09..1561f1ef5763fb24bc72c1a442cc957987261143 100644 --- a/ee/app/services/ee/issuable/bulk_update_service.rb +++ b/ee/app/services/ee/issuable/bulk_update_service.rb @@ -9,12 +9,9 @@ module BulkUpdateService override :find_issuables def find_issuables(parent, model_class, ids) - return super unless model_class == ::Epic + return model_class.id_in(ids).in_selected_groups(parent.self_and_descendants) if model_class == ::Epic - model_class - .id_in(ids) - .in_selected_groups(parent.self_and_descendants) - .includes_for_bulk_update + super end override :permitted_attrs diff --git a/ee/spec/frontend/dependencies/components/__snapshots__/dependencies_actions_spec.js.snap b/ee/spec/frontend/dependencies/components/__snapshots__/dependencies_actions_spec.js.snap index 12dfdb521618d22db1fa9bdc5a9ab352d4774643..b77e2f71babca8138f4b51bf8ea6763f6ec8ad86 100644 --- a/ee/spec/frontend/dependencies/components/__snapshots__/dependencies_actions_spec.js.snap +++ b/ee/spec/frontend/dependencies/components/__snapshots__/dependencies_actions_spec.js.snap @@ -83,6 +83,7 @@ exports[`DependenciesActions component matches the snapshot 1`] = ` </gl-dropdown-stub> <gl-button-stub + aria-label="Sort direction" buttontextclasses="" category="primary" class="flex-grow-0 js-sort-order" diff --git a/ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb b/ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb index 4f3075e128713eeffa8ff39a273027ddd7efc1c1..4bbb1ab82835eb983ade5ed687551f4968e52d21 100644 --- a/ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb +++ b/ee/spec/lib/gitlab/analytics/cycle_analytics/request_params_spec.rb @@ -204,11 +204,13 @@ def json_project(project) subject { described_class.new(params).to_data_attributes } - it { expect(subject[:milestone]).to eq('title') } - it { expect(subject[:assignees]).to eq('["username1"]') } - it { expect(subject[:labels]).to eq('["label1","label2"]') } - it { expect(subject[:author]).to eq('author') } - it { expect(subject[:stage]).to eq('{"id":1,"title":"Stage #1"}') } + it "has the correct attributes" do + expect(subject[:milestone]).to eq('title') + expect(subject[:assignees]).to eq('["username1"]') + expect(subject[:labels]).to eq('["label1","label2"]') + expect(subject[:author]).to eq('author') + expect(subject[:stage]).to eq(%Q|{"id":#{stage.id},"title":"#{stage.name}"}|) + end end describe 'sorting params' do diff --git a/ee/spec/models/concerns/ee/milestoneable_spec.rb b/ee/spec/models/concerns/ee/milestoneable_spec.rb index d072051b99f8eb9b89bf0c3c5e10f3883999a317..48b69fbb26d82804dadb320dcb0444e4a6ac9aaa 100644 --- a/ee/spec/models/concerns/ee/milestoneable_spec.rb +++ b/ee/spec/models/concerns/ee/milestoneable_spec.rb @@ -4,11 +4,11 @@ RSpec.describe EE::Milestoneable do describe '#milestone_available?' do - context 'for epics' do - let(:epic) { build(:epic) } + context 'no Epic' do + let(:issue) { create(:issue) } - it 'returns true' do - expect(epic.milestone_available?).to be(true) + it 'returns false' do + expect(issue.milestone_available?).to be_falsy end end end @@ -21,7 +21,7 @@ let(:epic) { build(:epic) } it 'returns false' do - expect(epic.supports_milestone?).to be(false) + expect(epic.supports_milestone?).to be_falsy end end end diff --git a/spec/frontend/vue_shared/components/help_popover_spec.js b/spec/frontend/vue_shared/components/help_popover_spec.js index cf5428ba4c3abd450e7691451db4815e7da50799..30c6fa040324e12ee92733401a7e97553676484f 100644 --- a/spec/frontend/vue_shared/components/help_popover_spec.js +++ b/spec/frontend/vue_shared/components/help_popover_spec.js @@ -34,7 +34,6 @@ describe('HelpPopover', () => { icon: 'question', variant: 'link', }); - expect(findQuestionButton().attributes().tabindex).toBe('0'); }); it('renders popover that uses the question button as target', () => { diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb index 14db9b530db6476abc4dbb77f852c718120d995b..1df70f387076948e022323de0aced28179a69608 100644 --- a/spec/models/concerns/issuable_spec.rb +++ b/spec/models/concerns/issuable_spec.rb @@ -65,23 +65,6 @@ it { expect(issuable_class).to respond_to(:opened) } it { expect(issuable_class).to respond_to(:closed) } it { expect(issuable_class).to respond_to(:assigned) } - - describe '.includes_for_bulk_update' do - before do - stub_const('Example', Class.new(ActiveRecord::Base)) - - Example.class_eval do - include Issuable # adds :labels and :metrics, among others - - belongs_to :author - has_many :assignees - end - end - - it 'includes available associations' do - expect(Example.includes_for_bulk_update.includes_values).to eq([:author, :assignees, :labels, :metrics]) - end - end end describe 'author_name' do diff --git a/spec/models/concerns/milestoneable_spec.rb b/spec/models/concerns/milestoneable_spec.rb index 961eac4710d1661724bb5e0b37010dceb21359e4..5fb3b39f734546432d11cdc56a741b574c47b247 100644 --- a/spec/models/concerns/milestoneable_spec.rb +++ b/spec/models/concerns/milestoneable_spec.rb @@ -50,13 +50,13 @@ def build_milestoneable(milestone_id) it 'returns true with a milestone from the issue project' do milestone = create(:milestone, project: project) - expect(build_milestoneable(milestone.id).milestone_available?).to be(true) + expect(build_milestoneable(milestone.id).milestone_available?).to be_truthy end it 'returns true with a milestone from the issue project group' do milestone = create(:milestone, group: group) - expect(build_milestoneable(milestone.id).milestone_available?).to be(true) + expect(build_milestoneable(milestone.id).milestone_available?).to be_truthy end it 'returns true with a milestone from the the parent of the issue project group' do @@ -64,23 +64,19 @@ def build_milestoneable(milestone_id) group.update!(parent: parent) milestone = create(:milestone, group: parent) - expect(build_milestoneable(milestone.id).milestone_available?).to be(true) - end - - it 'returns true with a blank milestone' do - expect(build_milestoneable('').milestone_available?).to be(true) + expect(build_milestoneable(milestone.id).milestone_available?).to be_truthy end it 'returns false with a milestone from another project' do milestone = create(:milestone) - expect(build_milestoneable(milestone.id).milestone_available?).to be(false) + expect(build_milestoneable(milestone.id).milestone_available?).to be_falsey end it 'returns false with a milestone from another group' do milestone = create(:milestone, group: create(:group)) - expect(build_milestoneable(milestone.id).milestone_available?).to be(false) + expect(build_milestoneable(milestone.id).milestone_available?).to be_falsey end end end