Fix specs
This commit is contained in:
parent
3f6477fd1f
commit
c4094b7ec4
22 changed files with 93 additions and 58 deletions
|
@ -99,7 +99,7 @@ export default class FileTemplateMediator {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
selectTemplateType(item, el, e) {
|
selectTemplateType(item, e) {
|
||||||
if (e) {
|
if (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
|
@ -117,6 +117,10 @@ export default class FileTemplateMediator {
|
||||||
this.cacheToggleText();
|
this.cacheToggleText();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
selectTemplateTypeOptions(options) {
|
||||||
|
this.selectTemplateType(options.selectedObj, options.e);
|
||||||
|
}
|
||||||
|
|
||||||
selectTemplateFile(selector, query, data) {
|
selectTemplateFile(selector, query, data) {
|
||||||
selector.renderLoading();
|
selector.renderLoading();
|
||||||
// in case undo menu is already already there
|
// in case undo menu is already already there
|
||||||
|
|
|
@ -52,9 +52,17 @@ export default class FileTemplateSelector {
|
||||||
.removeClass('fa-spinner fa-spin');
|
.removeClass('fa-spinner fa-spin');
|
||||||
}
|
}
|
||||||
|
|
||||||
reportSelection(query, el, e, data) {
|
reportSelection(options) {
|
||||||
|
const { query, e, data } = options;
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
return this.mediator.selectTemplateFile(this, query, data);
|
return this.mediator.selectTemplateFile(this, query, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reportSelectionName(options) {
|
||||||
|
const opts = options;
|
||||||
|
opts.query = options.selectedObj.name;
|
||||||
|
|
||||||
|
this.reportSelection(opts);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ export default class BlobCiYamlSelector extends FileTemplateSelector {
|
||||||
search: {
|
search: {
|
||||||
fields: ['name'],
|
fields: ['name'],
|
||||||
},
|
},
|
||||||
clicked: (query, el, e) => this.reportSelection(query.name, el, e),
|
clicked: options => this.reportSelectionName(options),
|
||||||
text: item => item.name,
|
text: item => item.name,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ export default class DockerfileSelector extends FileTemplateSelector {
|
||||||
search: {
|
search: {
|
||||||
fields: ['name'],
|
fields: ['name'],
|
||||||
},
|
},
|
||||||
clicked: (query, el, e) => this.reportSelection(query.name, el, e),
|
clicked: options => this.reportSelectionName(options),
|
||||||
text: item => item.name,
|
text: item => item.name,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ export default class BlobGitignoreSelector extends FileTemplateSelector {
|
||||||
search: {
|
search: {
|
||||||
fields: ['name'],
|
fields: ['name'],
|
||||||
},
|
},
|
||||||
clicked: (query, el, e) => this.reportSelection(query.name, el, e),
|
clicked: options => this.reportSelectionName(options),
|
||||||
text: item => item.name,
|
text: item => item.name,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,13 +24,22 @@ export default class BlobLicenseSelector extends FileTemplateSelector {
|
||||||
search: {
|
search: {
|
||||||
fields: ['name'],
|
fields: ['name'],
|
||||||
},
|
},
|
||||||
clicked: (query, el, e) => {
|
clicked: (options) => {
|
||||||
|
const { e } = options;
|
||||||
|
const el = options.$el;
|
||||||
|
const query = options.selectedObj;
|
||||||
|
|
||||||
const data = {
|
const data = {
|
||||||
project: this.$dropdown.data('project'),
|
project: this.$dropdown.data('project'),
|
||||||
fullname: this.$dropdown.data('fullname'),
|
fullname: this.$dropdown.data('fullname'),
|
||||||
};
|
};
|
||||||
|
|
||||||
this.reportSelection(query.id, el, e, data);
|
this.reportSelection({
|
||||||
|
query: query.id,
|
||||||
|
el,
|
||||||
|
e,
|
||||||
|
data,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
text: item => item.name,
|
text: item => item.name,
|
||||||
});
|
});
|
||||||
|
|
|
@ -17,7 +17,7 @@ export default class FileTemplateTypeSelector extends FileTemplateSelector {
|
||||||
filterable: false,
|
filterable: false,
|
||||||
selectable: true,
|
selectable: true,
|
||||||
toggleLabel: item => item.name,
|
toggleLabel: item => item.name,
|
||||||
clicked: (item, el, e) => this.mediator.selectTemplateType(item, el, e),
|
clicked: options => this.mediator.selectTemplateTypeOptions(options),
|
||||||
text: item => item.name,
|
text: item => item.name,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,8 +17,8 @@ export default class ProtectedTagAccessDropdown {
|
||||||
}
|
}
|
||||||
return 'Select';
|
return 'Select';
|
||||||
},
|
},
|
||||||
clicked(item, $el, e) {
|
clicked(options) {
|
||||||
e.preventDefault();
|
options.e.preventDefault();
|
||||||
onSelect();
|
onSelect();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -39,8 +39,8 @@ export default class ProtectedTagDropdown {
|
||||||
return _.escape(protectedTag.id);
|
return _.escape(protectedTag.id);
|
||||||
},
|
},
|
||||||
onFilter: this.toggleCreateNewButton.bind(this),
|
onFilter: this.toggleCreateNewButton.bind(this),
|
||||||
clicked: (item, $el, e) => {
|
clicked: (options) => {
|
||||||
e.preventDefault();
|
options.e.preventDefault();
|
||||||
this.onSelect();
|
this.onSelect();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -77,7 +77,11 @@ import eventHub from './sidebar/event_hub';
|
||||||
input.value = _this.currentUser.id;
|
input.value = _this.currentUser.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
$dropdown.before(input);
|
if ($selectbox) {
|
||||||
|
$dropdown.parent().before(input);
|
||||||
|
} else {
|
||||||
|
$dropdown.after(input);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if ($block[0]) {
|
if ($block[0]) {
|
||||||
|
@ -95,6 +99,24 @@ import eventHub from './sidebar/event_hub';
|
||||||
.get();
|
.get();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const checkMaxSelect = function() {
|
||||||
|
const maxSelect = $dropdown.data('max-select');
|
||||||
|
if (maxSelect) {
|
||||||
|
const selected = getSelected();
|
||||||
|
|
||||||
|
if (selected.length > maxSelect) {
|
||||||
|
const firstSelectedId = selected[0];
|
||||||
|
const firstSelected = $dropdown.closest('.selectbox')
|
||||||
|
.find(`input[name='${$dropdown.data('field-name')}'][value=${firstSelectedId}]`);
|
||||||
|
|
||||||
|
firstSelected.remove();
|
||||||
|
eventHub.$emit('sidebar.removeAssignee', {
|
||||||
|
id: firstSelectedId,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const getMultiSelectDropdownTitle = function(selectedUser, isSelected) {
|
const getMultiSelectDropdownTitle = function(selectedUser, isSelected) {
|
||||||
const selectedUsers = getSelected()
|
const selectedUsers = getSelected()
|
||||||
.filter(u => u !== 0);
|
.filter(u => u !== 0);
|
||||||
|
@ -125,6 +147,7 @@ import eventHub from './sidebar/event_hub';
|
||||||
|
|
||||||
if ($dropdown.data('multiSelect')) {
|
if ($dropdown.data('multiSelect')) {
|
||||||
assignYourself();
|
assignYourself();
|
||||||
|
checkMaxSelect();
|
||||||
|
|
||||||
const currentUserInfo = $dropdown.data('currentUserInfo');
|
const currentUserInfo = $dropdown.data('currentUserInfo');
|
||||||
$dropdown.find('.dropdown-toggle-text').text(getMultiSelectDropdownTitle(currentUserInfo)).removeClass('is-default');
|
$dropdown.find('.dropdown-toggle-text').text(getMultiSelectDropdownTitle(currentUserInfo)).removeClass('is-default');
|
||||||
|
@ -333,21 +356,7 @@ import eventHub from './sidebar/event_hub';
|
||||||
|
|
||||||
// Enables support for limiting the number of users selected
|
// Enables support for limiting the number of users selected
|
||||||
// Automatically removes the first on the list if more users are selected
|
// Automatically removes the first on the list if more users are selected
|
||||||
const maxSelect = $dropdown.data('max-select');
|
checkMaxSelect();
|
||||||
if (maxSelect) {
|
|
||||||
const selected = getSelected();
|
|
||||||
|
|
||||||
if (selected.length > maxSelect) {
|
|
||||||
const firstSelectedId = selected[0];
|
|
||||||
const firstSelected = $dropdown.closest('.selectbox')
|
|
||||||
.find(`input[name='${$dropdown.data('field-name')}'][value=${firstSelectedId}]`);
|
|
||||||
|
|
||||||
firstSelected.remove();
|
|
||||||
eventHub.$emit('sidebar.removeAssignee', {
|
|
||||||
id: firstSelectedId,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user.beforeDivider && user.name.toLowerCase() === 'unassigned') {
|
if (user.beforeDivider && user.name.toLowerCase() === 'unassigned') {
|
||||||
// Unassigned selected
|
// Unassigned selected
|
||||||
|
|
|
@ -257,6 +257,10 @@
|
||||||
padding: 0 16px;
|
padding: 0 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.capitalize-header .dropdown-header {
|
||||||
|
text-transform: capitalize;
|
||||||
|
}
|
||||||
|
|
||||||
.separator + .dropdown-header {
|
.separator + .dropdown-header {
|
||||||
padding-top: 2px;
|
padding-top: 2px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ module FormHelper
|
||||||
|
|
||||||
def issue_dropdown_options(issuable, has_multiple_assignees = true)
|
def issue_dropdown_options(issuable, has_multiple_assignees = true)
|
||||||
options = {
|
options = {
|
||||||
toggle_class: 'js-user-search js-assignee-search',
|
toggle_class: 'js-user-search js-assignee-search js-multiselect js-save-user-data',
|
||||||
title: 'Select assignee',
|
title: 'Select assignee',
|
||||||
filter: true,
|
filter: true,
|
||||||
dropdown_class: 'dropdown-menu-user dropdown-menu-selectable dropdown-menu-assignee',
|
dropdown_class: 'dropdown-menu-user dropdown-menu-selectable dropdown-menu-assignee',
|
||||||
|
@ -32,16 +32,15 @@ module FormHelper
|
||||||
default_label: 'Assignee',
|
default_label: 'Assignee',
|
||||||
'max-select': 1,
|
'max-select': 1,
|
||||||
'dropdown-header': 'Assignee',
|
'dropdown-header': 'Assignee',
|
||||||
|
multi_select: true,
|
||||||
|
'input-meta': 'name',
|
||||||
|
'always-show-selectbox': true,
|
||||||
|
current_user_info: current_user.to_json(only: [:id, :name])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if has_multiple_assignees
|
if has_multiple_assignees
|
||||||
options[:toggle_class] += ' js-multiselect js-save-user-data'
|
|
||||||
options[:title] = 'Select assignee(s)'
|
options[:title] = 'Select assignee(s)'
|
||||||
options[:data][:multi_select] = true
|
|
||||||
options[:data][:'input-meta'] = 'name'
|
|
||||||
options[:data][:'always-show-selectbox'] = true
|
|
||||||
options[:data][:current_user_info] = current_user.to_json(only: [:id, :name])
|
|
||||||
options[:data][:'dropdown-header'] = 'Assignee(s)'
|
options[:data][:'dropdown-header'] = 'Assignee(s)'
|
||||||
options[:data].delete(:'max-select')
|
options[:data].delete(:'max-select')
|
||||||
end
|
end
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
.merge_access_levels-container
|
.merge_access_levels-container
|
||||||
= dropdown_tag('Select',
|
= dropdown_tag('Select',
|
||||||
options: { toggle_class: 'js-allowed-to-merge wide',
|
options: { toggle_class: 'js-allowed-to-merge wide',
|
||||||
dropdown_class: 'dropdown-menu-selectable',
|
dropdown_class: 'dropdown-menu-selectable capitalize-header',
|
||||||
data: { field_name: 'protected_branch[merge_access_levels_attributes][0][access_level]', input_id: 'merge_access_levels_attributes' }})
|
data: { field_name: 'protected_branch[merge_access_levels_attributes][0][access_level]', input_id: 'merge_access_levels_attributes' }})
|
||||||
.form-group
|
.form-group
|
||||||
%label.col-md-2.text-right{ for: 'push_access_levels_attributes' }
|
%label.col-md-2.text-right{ for: 'push_access_levels_attributes' }
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
.push_access_levels-container
|
.push_access_levels-container
|
||||||
= dropdown_tag('Select',
|
= dropdown_tag('Select',
|
||||||
options: { toggle_class: 'js-allowed-to-push wide',
|
options: { toggle_class: 'js-allowed-to-push wide',
|
||||||
dropdown_class: 'dropdown-menu-selectable',
|
dropdown_class: 'dropdown-menu-selectable capitalize-header',
|
||||||
data: { field_name: 'protected_branch[push_access_levels_attributes][0][access_level]', input_id: 'push_access_levels_attributes' }})
|
data: { field_name: 'protected_branch[push_access_levels_attributes][0][access_level]', input_id: 'push_access_levels_attributes' }})
|
||||||
|
|
||||||
.panel-footer
|
.panel-footer
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
%td
|
%td
|
||||||
= hidden_field_tag "allowed_to_merge_#{protected_branch.id}", protected_branch.merge_access_levels.first.access_level
|
= hidden_field_tag "allowed_to_merge_#{protected_branch.id}", protected_branch.merge_access_levels.first.access_level
|
||||||
= dropdown_tag( (protected_branch.merge_access_levels.first.humanize || 'Select') ,
|
= dropdown_tag( (protected_branch.merge_access_levels.first.humanize || 'Select') ,
|
||||||
options: { toggle_class: 'js-allowed-to-merge', dropdown_class: 'dropdown-menu-selectable js-allowed-to-merge-container',
|
options: { toggle_class: 'js-allowed-to-merge', dropdown_class: 'dropdown-menu-selectable js-allowed-to-merge-container capitalize-header',
|
||||||
data: { field_name: "allowed_to_merge_#{protected_branch.id}", access_level_id: protected_branch.merge_access_levels.first.id }})
|
data: { field_name: "allowed_to_merge_#{protected_branch.id}", access_level_id: protected_branch.merge_access_levels.first.id }})
|
||||||
%td
|
%td
|
||||||
= hidden_field_tag "allowed_to_push_#{protected_branch.id}", protected_branch.push_access_levels.first.access_level
|
= hidden_field_tag "allowed_to_push_#{protected_branch.id}", protected_branch.push_access_levels.first.access_level
|
||||||
= dropdown_tag( (protected_branch.push_access_levels.first.humanize || 'Select') ,
|
= dropdown_tag( (protected_branch.push_access_levels.first.humanize || 'Select') ,
|
||||||
options: { toggle_class: 'js-allowed-to-push', dropdown_class: 'dropdown-menu-selectable js-allowed-to-push-container',
|
options: { toggle_class: 'js-allowed-to-push', dropdown_class: 'dropdown-menu-selectable js-allowed-to-push-container capitalize-header',
|
||||||
data: { field_name: "allowed_to_push_#{protected_branch.id}", access_level_id: protected_branch.push_access_levels.first.id }})
|
data: { field_name: "allowed_to_push_#{protected_branch.id}", access_level_id: protected_branch.push_access_levels.first.id }})
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
= dropdown_tag('Select tag or create wildcard',
|
= dropdown_tag('Select tag or create wildcard',
|
||||||
options: { toggle_class: 'js-protected-tag-select js-filter-submit wide',
|
options: { toggle_class: 'js-protected-tag-select js-filter-submit wide',
|
||||||
filter: true, dropdown_class: "dropdown-menu-selectable", placeholder: "Search protected tag",
|
filter: true, dropdown_class: "dropdown-menu-selectable capitalize-header", placeholder: "Search protected tag",
|
||||||
footer_content: true,
|
footer_content: true,
|
||||||
data: { show_no: true, show_any: true, show_upcoming: true,
|
data: { show_no: true, show_any: true, show_upcoming: true,
|
||||||
selected: params[:protected_tag_name],
|
selected: params[:protected_tag_name],
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
%td
|
%td
|
||||||
= hidden_field_tag "allowed_to_create_#{protected_tag.id}", protected_tag.create_access_levels.first.access_level
|
= hidden_field_tag "allowed_to_create_#{protected_tag.id}", protected_tag.create_access_levels.first.access_level
|
||||||
= dropdown_tag( (protected_tag.create_access_levels.first.humanize || 'Select') ,
|
= dropdown_tag( (protected_tag.create_access_levels.first.humanize || 'Select') ,
|
||||||
options: { toggle_class: 'js-allowed-to-create', dropdown_class: 'dropdown-menu-selectable js-allowed-to-create-container',
|
options: { toggle_class: 'js-allowed-to-create', dropdown_class: 'dropdown-menu-selectable capitalize-header js-allowed-to-create-container',
|
||||||
data: { field_name: "allowed_to_create_#{protected_tag.id}", access_level_id: protected_tag.create_access_levels.first.id }})
|
data: { field_name: "allowed_to_create_#{protected_tag.id}", access_level_id: protected_tag.create_access_levels.first.id }})
|
||||||
|
|
|
@ -17,7 +17,10 @@
|
||||||
- issuable.assignees.each do |assignee|
|
- issuable.assignees.each do |assignee|
|
||||||
= hidden_field_tag "#{issuable.to_ability_name}[assignee_ids][]", assignee.id, id: nil, data: { meta: assignee.name }
|
= hidden_field_tag "#{issuable.to_ability_name}[assignee_ids][]", assignee.id, id: nil, data: { meta: assignee.name }
|
||||||
|
|
||||||
= dropdown_tag(users_dropdown_label(issuable.assignees), options: issue_dropdown_options(issuable, true))
|
- if issuable.assignees.length === 0
|
||||||
|
= hidden_field_tag "#{issuable.to_ability_name}[assignee_ids][]", 0, id: nil, data: { meta: '' }
|
||||||
|
|
||||||
|
= dropdown_tag(users_dropdown_label(issuable.assignees), options: issue_dropdown_options(issuable,false))
|
||||||
= link_to 'Assign to me', '#', class: "assign-to-me-link #{'hide' if issuable.assignees.include?(current_user)}"
|
= link_to 'Assign to me', '#', class: "assign-to-me-link #{'hide' if issuable.assignees.include?(current_user)}"
|
||||||
- else
|
- else
|
||||||
= form.label :assignee_id, "Assignee", class: "control-label #{"col-lg-4" if has_due_date}"
|
= form.label :assignee_id, "Assignee", class: "control-label #{"col-lg-4" if has_due_date}"
|
||||||
|
|
|
@ -77,11 +77,10 @@ describe 'New/edit issue', feature: true, js: true do
|
||||||
click_link 'Assign to me'
|
click_link 'Assign to me'
|
||||||
assignee_ids = page.all('input[name="issue[assignee_ids][]"]', visible: false)
|
assignee_ids = page.all('input[name="issue[assignee_ids][]"]', visible: false)
|
||||||
|
|
||||||
expect(assignee_ids[0].value).to match(user2.id.to_s)
|
expect(assignee_ids[0].value).to match(user.id.to_s)
|
||||||
expect(assignee_ids[1].value).to match(user.id.to_s)
|
|
||||||
|
|
||||||
page.within '.js-assignee-search' do
|
page.within '.js-assignee-search' do
|
||||||
expect(page).to have_content "#{user2.name} + 1 more"
|
expect(page).to have_content user.name
|
||||||
end
|
end
|
||||||
expect(find('a', text: 'Assign to me', visible: false)).not_to be_visible
|
expect(find('a', text: 'Assign to me', visible: false)).not_to be_visible
|
||||||
|
|
||||||
|
@ -109,7 +108,7 @@ describe 'New/edit issue', feature: true, js: true do
|
||||||
|
|
||||||
page.within '.issuable-sidebar' do
|
page.within '.issuable-sidebar' do
|
||||||
page.within '.assignee' do
|
page.within '.assignee' do
|
||||||
expect(page).to have_content "2 Assignees"
|
expect(page).to have_content "Assignee"
|
||||||
end
|
end
|
||||||
|
|
||||||
page.within '.milestone' do
|
page.within '.milestone' do
|
||||||
|
@ -148,12 +147,12 @@ describe 'New/edit issue', feature: true, js: true do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'correctly updates the selected user when changing assignee' do
|
it 'correctly updates the selected user when changing assignee' do
|
||||||
click_button 'Assignee'
|
click_button 'Unassigned'
|
||||||
page.within '.dropdown-menu-user' do
|
page.within '.dropdown-menu-user' do
|
||||||
click_link user.name
|
click_link user.name
|
||||||
end
|
end
|
||||||
|
|
||||||
expect(find('input[name="issue[assignee_id]"]', visible: false).value).to match(user.id.to_s)
|
expect(find('input[name="issue[assignee_ids][]"]', visible: false).value).to match(user.id.to_s)
|
||||||
|
|
||||||
click_button user.name
|
click_button user.name
|
||||||
|
|
||||||
|
@ -167,7 +166,7 @@ describe 'New/edit issue', feature: true, js: true do
|
||||||
click_link user2.name
|
click_link user2.name
|
||||||
end
|
end
|
||||||
|
|
||||||
expect(find('input[name="issue[assignee_id]"]', visible: false).value).to match(user2.id.to_s)
|
expect(find('input[name="issue[assignee_ids][]"]', visible: false).value).to match(user2.id.to_s)
|
||||||
|
|
||||||
click_button user2.name
|
click_button user2.name
|
||||||
|
|
||||||
|
|
|
@ -710,7 +710,7 @@ describe 'Issues', feature: true do
|
||||||
include WaitForVueResource
|
include WaitForVueResource
|
||||||
|
|
||||||
it 'updates the title', js: true do
|
it 'updates the title', js: true do
|
||||||
issue = create(:issue, author: @user, assignee: @user, project: project, title: 'new title')
|
issue = create(:issue, author: @user, assignees: [@user], project: project, title: 'new title')
|
||||||
|
|
||||||
visit namespace_project_issue_path(project.namespace, project, issue)
|
visit namespace_project_issue_path(project.namespace, project, issue)
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ describe IssuePolicy, models: true do
|
||||||
context 'a private project' do
|
context 'a private project' do
|
||||||
let(:non_member) { create(:user) }
|
let(:non_member) { create(:user) }
|
||||||
let(:project) { create(:empty_project, :private) }
|
let(:project) { create(:empty_project, :private) }
|
||||||
let(:issue) { create(:issue, project: project, assignee: assignee, author: author) }
|
let(:issue) { create(:issue, project: project, assignees: [assignee], author: author) }
|
||||||
let(:issue_no_assignee) { create(:issue, project: project) }
|
let(:issue_no_assignee) { create(:issue, project: project) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
@ -69,7 +69,7 @@ describe IssuePolicy, models: true do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with confidential issues' do
|
context 'with confidential issues' do
|
||||||
let(:confidential_issue) { create(:issue, :confidential, project: project, assignee: assignee, author: author) }
|
let(:confidential_issue) { create(:issue, :confidential, project: project, assignees: [assignee], author: author) }
|
||||||
let(:confidential_issue_no_assignee) { create(:issue, :confidential, project: project) }
|
let(:confidential_issue_no_assignee) { create(:issue, :confidential, project: project) }
|
||||||
|
|
||||||
it 'does not allow non-members to read confidential issues' do
|
it 'does not allow non-members to read confidential issues' do
|
||||||
|
@ -110,7 +110,7 @@ describe IssuePolicy, models: true do
|
||||||
|
|
||||||
context 'a public project' do
|
context 'a public project' do
|
||||||
let(:project) { create(:empty_project, :public) }
|
let(:project) { create(:empty_project, :public) }
|
||||||
let(:issue) { create(:issue, project: project, assignee: assignee, author: author) }
|
let(:issue) { create(:issue, project: project, assignees: [assignee], author: author) }
|
||||||
let(:issue_no_assignee) { create(:issue, project: project) }
|
let(:issue_no_assignee) { create(:issue, project: project) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
|
@ -157,7 +157,7 @@ describe IssuePolicy, models: true do
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with confidential issues' do
|
context 'with confidential issues' do
|
||||||
let(:confidential_issue) { create(:issue, :confidential, project: project, assignee: assignee, author: author) }
|
let(:confidential_issue) { create(:issue, :confidential, project: project, assignees: [assignee], author: author) }
|
||||||
let(:confidential_issue_no_assignee) { create(:issue, :confidential, project: project) }
|
let(:confidential_issue_no_assignee) { create(:issue, :confidential, project: project) }
|
||||||
|
|
||||||
it 'does not allow guests to read confidential issues' do
|
it 'does not allow guests to read confidential issues' do
|
||||||
|
|
|
@ -14,8 +14,8 @@ describe Members::AuthorizedDestroyService, services: true do
|
||||||
it "unassigns issues and merge requests" do
|
it "unassigns issues and merge requests" do
|
||||||
group.add_developer(member_user)
|
group.add_developer(member_user)
|
||||||
|
|
||||||
issue = create :issue, project: group_project, assignee: member_user
|
issue = create :issue, project: group_project, assignees: [member_user]
|
||||||
create :issue, assignee: member_user
|
create :issue, assignees: [member_user]
|
||||||
merge_request = create :merge_request, target_project: group_project, source_project: group_project, assignee: member_user
|
merge_request = create :merge_request, target_project: group_project, source_project: group_project, assignee: member_user
|
||||||
create :merge_request, target_project: project, source_project: project, assignee: member_user
|
create :merge_request, target_project: project, source_project: project, assignee: member_user
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ describe Members::AuthorizedDestroyService, services: true do
|
||||||
it "unassigns issues and merge requests" do
|
it "unassigns issues and merge requests" do
|
||||||
project.team << [member_user, :developer]
|
project.team << [member_user, :developer]
|
||||||
|
|
||||||
create :issue, project: project, assignee: member_user
|
create :issue, project: project, assignees: [member_user]
|
||||||
create :merge_request, target_project: project, source_project: project, assignee: member_user
|
create :merge_request, target_project: project, source_project: project, assignee: member_user
|
||||||
|
|
||||||
member = project.members.find_by(user_id: member_user.id)
|
member = project.members.find_by(user_id: member_user.id)
|
||||||
|
|
|
@ -47,7 +47,7 @@ describe Users::DestroyService, services: true do
|
||||||
end
|
end
|
||||||
|
|
||||||
context "for an issue the user was assigned to" do
|
context "for an issue the user was assigned to" do
|
||||||
let!(:issue) { create(:issue, project: project, assignee: user) }
|
let!(:issue) { create(:issue, project: project, assignees: [user]) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
service.execute(user)
|
service.execute(user)
|
||||||
|
@ -60,7 +60,7 @@ describe Users::DestroyService, services: true do
|
||||||
it 'migrates the issue so that it is "Unassigned"' do
|
it 'migrates the issue so that it is "Unassigned"' do
|
||||||
migrated_issue = Issue.find_by_id(issue.id)
|
migrated_issue = Issue.find_by_id(issue.id)
|
||||||
|
|
||||||
expect(migrated_issue.assignee).to be_nil
|
expect(migrated_issue.assignees).to be_nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue