Commit 6d20fa5d authored by GitLab Bot's avatar GitLab Bot

Automatic merge of gitlab-org/gitlab master

parents a8028c6d cedcd442
...@@ -137,7 +137,6 @@ linters: ...@@ -137,7 +137,6 @@ linters:
- Style/ParenthesesAroundCondition - Style/ParenthesesAroundCondition
- Style/RedundantParentheses - Style/RedundantParentheses
- Style/SelfAssignment - Style/SelfAssignment
- Style/Semicolon
- Style/TernaryParentheses - Style/TernaryParentheses
- Style/TrailingCommaInHashLiteral - Style/TrailingCommaInHashLiteral
- Style/UnlessElse - Style/UnlessElse
......
<script> <script>
import { GlTooltipDirective, GlIcon, GlLink, GlSafeHtmlDirective } from '@gitlab/ui'; import { GlTooltipDirective, GlIcon, GlLink, GlSafeHtmlDirective } from '@gitlab/ui';
import { ApolloMutation } from 'vue-apollo'; import { ApolloMutation } from 'vue-apollo';
import { __ } from '~/locale';
import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue'; import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item.vue';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue'; import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.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 ...@@ -10,6 +11,9 @@ import { findNoteId, extractDesignNoteId } from '../../utils/design_management_u
import DesignReplyForm from './design_reply_form.vue'; import DesignReplyForm from './design_reply_form.vue';
export default { export default {
i18n: {
editCommentLabel: __('Edit comment'),
},
components: { components: {
UserAvatarLink, UserAvatarLink,
TimelineEntryItem, TimelineEntryItem,
...@@ -113,7 +117,8 @@ export default { ...@@ -113,7 +117,8 @@ export default {
v-if="isEditButtonVisible" v-if="isEditButtonVisible"
v-gl-tooltip v-gl-tooltip
type="button" 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" class="note-action-button js-note-edit btn btn-transparent qa-note-edit-button"
@click="isEditing = true" @click="isEditing = true"
> >
......
...@@ -68,6 +68,7 @@ export default { ...@@ -68,6 +68,7 @@ export default {
}" }"
type="button" type="button"
class="js-diff-notes-toggle" class="js-diff-notes-toggle"
:aria-label="__('Show comments')"
@click="toggleDiscussion({ discussionId: discussion.id })" @click="toggleDiscussion({ discussionId: discussion.id })"
> >
<gl-icon v-if="discussion.expanded" name="collapse" class="collapse-icon" /> <gl-icon v-if="discussion.expanded" name="collapse" class="collapse-icon" />
......
...@@ -122,6 +122,7 @@ export default { ...@@ -122,6 +122,7 @@ export default {
:disabled="!shouldToggleDiscussion" :disabled="!shouldToggleDiscussion"
class="js-image-badge" class="js-image-badge"
type="button" type="button"
:aria-label="__('Show comments')"
@click="clickedToggle(discussion)" @click="clickedToggle(discussion)"
> >
<gl-icon v-if="showCommentIcon" name="image-comment-dark" :size="24" /> <gl-icon v-if="showCommentIcon" name="image-comment-dark" :size="24" />
......
...@@ -146,6 +146,7 @@ export default { ...@@ -146,6 +146,7 @@ export default {
type="button" type="button"
class="add-diff-note note-button js-add-diff-note-button" class="add-diff-note note-button js-add-diff-note-button"
:disabled="line.commentsDisabled" :disabled="line.commentsDisabled"
:aria-label="addCommentTooltip"
@click="handleCommentButton" @click="handleCommentButton"
> >
<gl-icon :size="12" name="comment" /> <gl-icon :size="12" name="comment" />
......
...@@ -195,6 +195,7 @@ export default { ...@@ -195,6 +195,7 @@ export default {
type="button" type="button"
class="add-diff-note note-button js-add-diff-note-button qa-diff-comment" class="add-diff-note note-button js-add-diff-note-button qa-diff-comment"
:disabled="line.left.commentsDisabled" :disabled="line.left.commentsDisabled"
:aria-label="addCommentTooltipLeft"
@click="handleCommentButton(line.left)" @click="handleCommentButton(line.left)"
> >
<gl-icon :size="12" name="comment" /> <gl-icon :size="12" name="comment" />
...@@ -252,6 +253,7 @@ export default { ...@@ -252,6 +253,7 @@ export default {
type="button" type="button"
class="add-diff-note note-button js-add-diff-note-button qa-diff-comment" class="add-diff-note note-button js-add-diff-note-button qa-diff-comment"
:disabled="line.right.commentsDisabled" :disabled="line.right.commentsDisabled"
:aria-label="addCommentTooltipRight"
@click="handleCommentButton(line.right)" @click="handleCommentButton(line.right)"
> >
<gl-icon :size="12" name="comment" /> <gl-icon :size="12" name="comment" />
......
...@@ -105,6 +105,7 @@ export default { ...@@ -105,6 +105,7 @@ export default {
}" }"
type="button" 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" 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)" @click="scrollToCategory(category.name)"
> >
<gl-icon :name="category.icon" :size="12" /> <gl-icon :name="category.icon" :size="12" />
......
...@@ -51,6 +51,7 @@ export default { ...@@ -51,6 +51,7 @@ export default {
v-gl-tooltip.hover v-gl-tooltip.hover
class="gl-display-block gl-mb-4 mb-md-0 gl-w-full" class="gl-display-block gl-mb-4 mb-md-0 gl-w-full"
:title="ignoreBtn.title" :title="ignoreBtn.title"
:aria-label="ignoreBtn.title"
@click="$emit('update-issue-status', { errorId: error.id, status: ignoreBtn.status })" @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" /> <gl-icon class="gl-display-none d-md-inline gl-m-0" :name="ignoreBtn.icon" :size="12" />
...@@ -62,6 +63,7 @@ export default { ...@@ -62,6 +63,7 @@ export default {
v-gl-tooltip.hover v-gl-tooltip.hover
class="gl-display-block gl-mb-4 mb-md-0 gl-w-full" class="gl-display-block gl-mb-4 mb-md-0 gl-w-full"
:title="resolveBtn.title" :title="resolveBtn.title"
:aria-label="resolveBtn.title"
@click="$emit('update-issue-status', { errorId: error.id, status: resolveBtn.status })" @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" /> <gl-icon class="gl-display-none d-md-inline gl-m-0" :name="resolveBtn.icon" :size="12" />
......
...@@ -55,6 +55,7 @@ export default { ...@@ -55,6 +55,7 @@ export default {
:disabled="disabled" :disabled="disabled"
class="btn-scroll btn-transparent btn-blank" class="btn-scroll btn-transparent btn-blank"
type="button" type="button"
:aria-label="tooltipTitle"
@click="clickedScroll" @click="clickedScroll"
> >
<gl-icon :name="iconName" /> <gl-icon :name="iconName" />
......
...@@ -9,10 +9,13 @@ import { ...@@ -9,10 +9,13 @@ import {
GlSkeletonLoader, GlSkeletonLoader,
GlTooltipDirective, GlTooltipDirective,
} from '@gitlab/ui'; } from '@gitlab/ui';
import { __ } from '~/locale';
import { ANY_OPTION } from '../constants'; import { ANY_OPTION } from '../constants';
export default { export default {
i18n: {
clearLabel: __('Clear'),
},
name: 'SearchableDropdown', name: 'SearchableDropdown',
components: { components: {
GlDropdown, GlDropdown,
...@@ -96,7 +99,8 @@ export default { ...@@ -96,7 +99,8 @@ export default {
v-gl-tooltip v-gl-tooltip
name="clear" name="clear"
category="tertiary" category="tertiary"
:title="__('Clear')" :title="$options.i18n.clearLabel"
:aria-label="$options.i18n.clearLabel"
class="gl-p-0! gl-mr-2" class="gl-p-0! gl-mr-2"
@keydown.enter.stop="resetDropdown" @keydown.enter.stop="resetDropdown"
@click.stop="resetDropdown" @click.stop="resetDropdown"
......
...@@ -68,6 +68,7 @@ export default { ...@@ -68,6 +68,7 @@ export default {
category="primary" category="primary"
size="small" size="small"
:title="buttonTitle" :title="buttonTitle"
:aria-label="buttonTitle"
:loading="isLoading" :loading="isLoading"
:disabled="isActionInProgress" :disabled="isActionInProgress"
:class="`inline gl-ml-2 ${containerClasses}`" :class="`inline gl-ml-2 ${containerClasses}`"
......
...@@ -25,7 +25,7 @@ export default { ...@@ -25,7 +25,7 @@ export default {
</script> </script>
<template> <template>
<span> <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"> <gl-popover :target="() => $refs.popoverTrigger.$el" v-bind="options">
<template v-if="options.title" #title> <template v-if="options.title" #title>
<span v-safe-html="options.title"></span> <span v-safe-html="options.title"></span>
......
...@@ -21,7 +21,11 @@ export default { ...@@ -21,7 +21,11 @@ export default {
}; };
</script> </script>
<template> <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" /> <gl-icon class="gl-mx-auto gl-align-self-center" :name="icon" />
</button> </button>
</template> </template>
...@@ -137,14 +137,6 @@ module Issuable ...@@ -137,14 +137,6 @@ module Issuable
scope :references_project, -> { references(:project) } scope :references_project, -> { references(:project) }
scope :non_archived, -> { join_project.where(projects: { archived: false }) } 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 :title, pipeline: :single_line
attr_mentionable :description attr_mentionable :description
......
...@@ -39,13 +39,11 @@ module Milestoneable ...@@ -39,13 +39,11 @@ module Milestoneable
private private
def milestone_is_valid 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
end end
def milestone_available? def milestone_available?
return true if milestone_id.blank?
project_id == milestone&.project_id || project.ancestors_upto.compact.include?(milestone&.group) project_id == milestone&.project_id || project.ancestors_upto.compact.include?(milestone&.group)
end end
......
...@@ -15,7 +15,7 @@ module Issuable ...@@ -15,7 +15,7 @@ module Issuable
set_update_params(type) set_update_params(type)
items = update_issuables(type, ids) items = update_issuables(type, ids)
response_success(payload: { count: items.size }) response_success(payload: { count: items.count })
rescue ArgumentError => e rescue ArgumentError => e
response_error(e.message, 422) response_error(e.message, 422)
end end
...@@ -59,17 +59,10 @@ module Issuable ...@@ -59,17 +59,10 @@ module Issuable
def find_issuables(parent, model_class, ids) def find_issuables(parent, model_class, ids)
if parent.is_a?(Project) if parent.is_a?(Project)
projects = parent model_class.id_in(ids).of_projects(parent)
elsif parent.is_a?(Group) elsif parent.is_a?(Group)
projects = parent.all_projects model_class.id_in(ids).of_projects(parent.all_projects)
else
return
end end
model_class
.id_in(ids)
.of_projects(projects)
.includes_for_bulk_update
end end
def response_success(message: nil, payload: nil) def response_success(message: nil, payload: nil)
......
-# We currently only support `alert`, `notice`, `success`, 'toast' -# 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-container.flash-container-page.sticky{ data: { qa_selector: 'flash_container' } }
- flash.each do |key, value| - flash.each do |key, value|
- if key == 'toast' && value - if key == 'toast' && value
......
- modifier_key = client_js_flags[:isMac] ? '⌘' : s_('KeyboardKey|Ctrl+'); - modifier_key = client_js_flags[:isMac] ? '⌘' : s_('KeyboardKey|Ctrl+')
.md-header-toolbar.active .md-header-toolbar.active
= markdown_toolbar_button({ icon: "bold", = markdown_toolbar_button({ icon: "bold",
......
---
title: Optimize issuable updates
merge_request: 58114
author:
type: performance
---
title: Add aria labels to icon-only buttons
merge_request: 59037
author:
type: fixed
...@@ -177,7 +177,7 @@ Find where your version sits in the upgrade path below, and upgrade GitLab ...@@ -177,7 +177,7 @@ Find where your version sits in the upgrade path below, and upgrade GitLab
accordingly, while also consulting the accordingly, while also consulting the
[version-specific upgrade instructions](#version-specific-upgrading-instructions): [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 The following table, while not exhaustive, shows some examples of the supported
upgrade paths. upgrade paths.
......
...@@ -326,7 +326,12 @@ export default { ...@@ -326,7 +326,12 @@ export default {
</span> </span>
</gl-dropdown-item> </gl-dropdown-item>
</gl-dropdown> </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-icon :name="sortIcon" />
</gl-button> </gl-button>
</div> </div>
......
<script> <script>
import { GlButton, GlDropdown, GlDropdownItem, GlIcon, GlTooltipDirective } from '@gitlab/ui'; import { GlButton, GlDropdown, GlDropdownItem, GlIcon, GlTooltipDirective } from '@gitlab/ui';
import { mapActions, mapState } from 'vuex'; import { mapActions, mapState } from 'vuex';
import { __ } from '~/locale';
import { DEPENDENCY_LIST_TYPES } from '../store/constants'; import { DEPENDENCY_LIST_TYPES } from '../store/constants';
import { SORT_FIELDS, SORT_ORDER } from '../store/modules/list/constants'; import { SORT_FIELDS, SORT_ORDER } from '../store/modules/list/constants';
export default { export default {
i18n: {
sortDirectionLabel: __('Sort direction'),
},
name: 'DependenciesActions', name: 'DependenciesActions',
components: { components: {
GlButton, GlButton,
...@@ -80,7 +84,8 @@ export default { ...@@ -80,7 +84,8 @@ export default {
</gl-dropdown> </gl-dropdown>
<gl-button <gl-button
v-gl-tooltip v-gl-tooltip
:title="__('Sort direction')" :title="$options.i18n.sortDirectionLabel"
:aria-label="$options.i18n.sortDirectionLabel"
class="flex-grow-0 js-sort-order" class="flex-grow-0 js-sort-order"
@click="toggleSortOrder" @click="toggleSortOrder"
> >
......
...@@ -87,6 +87,7 @@ export default { ...@@ -87,6 +87,7 @@ export default {
v-if="!childrenFetchInProgress && hasChildren" v-if="!childrenFetchInProgress && hasChildren"
v-gl-tooltip.viewport.hover v-gl-tooltip.viewport.hover
:title="chevronTooltip" :title="chevronTooltip"
:aria-label="chevronTooltip"
:class="chevronType" :class="chevronType"
variant="link" variant="link"
class="btn-svg btn-tree-item-chevron align-self-start" class="btn-svg btn-tree-item-chevron align-self-start"
......
...@@ -9,12 +9,9 @@ module EE ...@@ -9,12 +9,9 @@ module EE
override :find_issuables override :find_issuables
def find_issuables(parent, model_class, ids) 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 super
.id_in(ids)
.in_selected_groups(parent.self_and_descendants)
.includes_for_bulk_update
end end
override :permitted_attrs override :permitted_attrs
......
...@@ -83,6 +83,7 @@ exports[`DependenciesActions component matches the snapshot 1`] = ` ...@@ -83,6 +83,7 @@ exports[`DependenciesActions component matches the snapshot 1`] = `
</gl-dropdown-stub> </gl-dropdown-stub>
<gl-button-stub <gl-button-stub
aria-label="Sort direction"
buttontextclasses="" buttontextclasses=""
category="primary" category="primary"
class="flex-grow-0 js-sort-order" class="flex-grow-0 js-sort-order"
......
...@@ -204,11 +204,13 @@ RSpec.describe Gitlab::Analytics::CycleAnalytics::RequestParams do ...@@ -204,11 +204,13 @@ RSpec.describe Gitlab::Analytics::CycleAnalytics::RequestParams do
subject { described_class.new(params).to_data_attributes } subject { described_class.new(params).to_data_attributes }
it { expect(subject[:milestone]).to eq('title') } it "has the correct attributes" do
it { expect(subject[:assignees]).to eq('["username1"]') } expect(subject[:milestone]).to eq('title')
it { expect(subject[:labels]).to eq('["label1","label2"]') } expect(subject[:assignees]).to eq('["username1"]')
it { expect(subject[:author]).to eq('author') } expect(subject[:labels]).to eq('["label1","label2"]')
it { expect(subject[:stage]).to eq('{"id":1,"title":"Stage #1"}') } expect(subject[:author]).to eq('author')
expect(subject[:stage]).to eq(%Q|{"id":#{stage.id},"title":"#{stage.name}"}|)
end
end end
describe 'sorting params' do describe 'sorting params' do
......
...@@ -4,11 +4,11 @@ require 'spec_helper' ...@@ -4,11 +4,11 @@ require 'spec_helper'
RSpec.describe EE::Milestoneable do RSpec.describe EE::Milestoneable do
describe '#milestone_available?' do describe '#milestone_available?' do
context 'for epics' do context 'no Epic' do
let(:epic) { build(:epic) } let(:issue) { create(:issue) }
it 'returns true' do it 'returns false' do
expect(epic.milestone_available?).to be(true) expect(issue.milestone_available?).to be_falsy
end end
end end
end end
...@@ -21,7 +21,7 @@ RSpec.describe EE::Milestoneable do ...@@ -21,7 +21,7 @@ RSpec.describe EE::Milestoneable do
let(:epic) { build(:epic) } let(:epic) { build(:epic) }
it 'returns false' do it 'returns false' do
expect(epic.supports_milestone?).to be(false) expect(epic.supports_milestone?).to be_falsy
end end
end end
end end
......
...@@ -34,7 +34,6 @@ describe('HelpPopover', () => { ...@@ -34,7 +34,6 @@ describe('HelpPopover', () => {
icon: 'question', icon: 'question',
variant: 'link', variant: 'link',
}); });
expect(findQuestionButton().attributes().tabindex).toBe('0');
}); });
it('renders popover that uses the question button as target', () => { it('renders popover that uses the question button as target', () => {
......
...@@ -65,23 +65,6 @@ RSpec.describe Issuable do ...@@ -65,23 +65,6 @@ RSpec.describe Issuable do
it { expect(issuable_class).to respond_to(:opened) } it { expect(issuable_class).to respond_to(:opened) }
it { expect(issuable_class).to respond_to(:closed) } it { expect(issuable_class).to respond_to(:closed) }
it { expect(issuable_class).to respond_to(:assigned) } 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 end
describe 'author_name' do describe 'author_name' do
......
...@@ -50,13 +50,13 @@ RSpec.describe Milestoneable do ...@@ -50,13 +50,13 @@ RSpec.describe Milestoneable do
it 'returns true with a milestone from the issue project' do it 'returns true with a milestone from the issue project' do
milestone = create(:milestone, project: project) 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 end
it 'returns true with a milestone from the issue project group' do it 'returns true with a milestone from the issue project group' do
milestone = create(:milestone, group: group) 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 end
it 'returns true with a milestone from the the parent of the issue project group' do it 'returns true with a milestone from the the parent of the issue project group' do
...@@ -64,23 +64,19 @@ RSpec.describe Milestoneable do ...@@ -64,23 +64,19 @@ RSpec.describe Milestoneable do
group.update!(parent: parent) group.update!(parent: parent)
milestone = create(:milestone, group: parent) milestone = create(:milestone, group: parent)
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 blank milestone' do
expect(build_milestoneable('').milestone_available?).to be(true)
end end
it 'returns false with a milestone from another project' do it 'returns false with a milestone from another project' do
milestone = create(:milestone) milestone = create(:milestone)
expect(build_milestoneable(milestone.id).milestone_available?).to be(false) expect(build_milestoneable(milestone.id).milestone_available?).to be_falsey
end end
it 'returns false with a milestone from another group' do it 'returns false with a milestone from another group' do
milestone = create(:milestone, group: create(:group)) 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 end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment