Skip to content
Snippets Groups Projects
Commit b3a736ed authored by GitLab Bot's avatar GitLab Bot
Browse files

Add latest changes from gitlab-org/gitlab@master

parent 5366964a
No related branches found
No related tags found
No related merge requests found
Showing
with 278 additions and 139 deletions
Loading
Loading
@@ -2,62 +2,92 @@ import Vue from 'vue';
import { trimText } from 'spec/helpers/text_helper';
import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
import NavDropdownButton from '~/ide/components/nav_dropdown_button.vue';
import store from '~/ide/stores';
import { resetStore } from '../helpers';
import { createStore } from '~/ide/stores';
 
describe('NavDropdown', () => {
const TEST_BRANCH_ID = 'lorem-ipsum-dolar';
const TEST_MR_ID = '12345';
const Component = Vue.extend(NavDropdownButton);
let store;
let vm;
 
beforeEach(() => {
vm = mountComponentWithStore(Component, { store });
vm.$mount();
store = createStore();
});
 
afterEach(() => {
vm.$destroy();
resetStore(store);
});
 
it('renders empty placeholders, if state is falsey', () => {
expect(trimText(vm.$el.textContent)).toEqual('- -');
});
const createComponent = (props = {}) => {
vm = mountComponentWithStore(Vue.extend(NavDropdownButton), { props, store });
vm.$mount();
};
 
it('renders branch name, if state has currentBranchId', done => {
vm.$store.state.currentBranchId = TEST_BRANCH_ID;
const findIcon = name => vm.$el.querySelector(`.ic-${name}`);
const findMRIcon = () => findIcon('merge-request');
const findBranchIcon = () => findIcon('branch');
 
vm.$nextTick()
.then(() => {
expect(trimText(vm.$el.textContent)).toEqual(`${TEST_BRANCH_ID} -`);
})
.then(done)
.catch(done.fail);
});
describe('normal', () => {
beforeEach(() => {
createComponent();
});
it('renders empty placeholders, if state is falsey', () => {
expect(trimText(vm.$el.textContent)).toEqual('- -');
});
 
it('renders mr id, if state has currentMergeRequestId', done => {
vm.$store.state.currentMergeRequestId = TEST_MR_ID;
it('renders branch name, if state has currentBranchId', done => {
vm.$store.state.currentBranchId = TEST_BRANCH_ID;
 
vm.$nextTick()
.then(() => {
expect(trimText(vm.$el.textContent)).toEqual(`- !${TEST_MR_ID}`);
})
.then(done)
.catch(done.fail);
vm.$nextTick()
.then(() => {
expect(trimText(vm.$el.textContent)).toEqual(`${TEST_BRANCH_ID} -`);
})
.then(done)
.catch(done.fail);
});
it('renders mr id, if state has currentMergeRequestId', done => {
vm.$store.state.currentMergeRequestId = TEST_MR_ID;
vm.$nextTick()
.then(() => {
expect(trimText(vm.$el.textContent)).toEqual(`- !${TEST_MR_ID}`);
})
.then(done)
.catch(done.fail);
});
it('renders branch and mr, if state has both', done => {
vm.$store.state.currentBranchId = TEST_BRANCH_ID;
vm.$store.state.currentMergeRequestId = TEST_MR_ID;
vm.$nextTick()
.then(() => {
expect(trimText(vm.$el.textContent)).toEqual(`${TEST_BRANCH_ID} !${TEST_MR_ID}`);
})
.then(done)
.catch(done.fail);
});
it('shows icons', () => {
expect(findBranchIcon()).toBeTruthy();
expect(findMRIcon()).toBeTruthy();
});
});
 
it('renders branch and mr, if state has both', done => {
vm.$store.state.currentBranchId = TEST_BRANCH_ID;
vm.$store.state.currentMergeRequestId = TEST_MR_ID;
describe('with showMergeRequests false', () => {
beforeEach(() => {
createComponent({ showMergeRequests: false });
});
it('shows single empty placeholder, if state is falsey', () => {
expect(trimText(vm.$el.textContent)).toEqual('-');
});
 
vm.$nextTick()
.then(() => {
expect(trimText(vm.$el.textContent)).toEqual(`${TEST_BRANCH_ID} !${TEST_MR_ID}`);
})
.then(done)
.catch(done.fail);
it('shows only branch icon', () => {
expect(findBranchIcon()).toBeTruthy();
expect(findMRIcon()).toBe(null);
});
});
});
Loading
Loading
@@ -3,6 +3,9 @@ import Vue from 'vue';
import { mountComponentWithStore } from 'spec/helpers/vue_mount_component_helper';
import store from '~/ide/stores';
import NavDropdown from '~/ide/components/nav_dropdown.vue';
import { PERMISSION_READ_MR } from '~/ide/constants';
const TEST_PROJECT_ID = 'lorem-ipsum';
 
describe('IDE NavDropdown', () => {
const Component = Vue.extend(NavDropdown);
Loading
Loading
@@ -10,6 +13,12 @@ describe('IDE NavDropdown', () => {
let $dropdown;
 
beforeEach(() => {
store.state.currentProjectId = TEST_PROJECT_ID;
Vue.set(store.state.projects, TEST_PROJECT_ID, {
userPermissions: {
[PERMISSION_READ_MR]: true,
},
});
vm = mountComponentWithStore(Component, { store });
$dropdown = $(vm.$el);
 
Loading
Loading
@@ -21,6 +30,9 @@ describe('IDE NavDropdown', () => {
vm.$destroy();
});
 
const findIcon = name => vm.$el.querySelector(`.ic-${name}`);
const findMRIcon = () => findIcon('merge-request');
it('renders nothing initially', () => {
expect(vm.$el).not.toContainElement('.ide-nav-form');
});
Loading
Loading
@@ -47,4 +59,22 @@ describe('IDE NavDropdown', () => {
.then(done)
.catch(done.fail);
});
it('renders merge request icon', () => {
expect(findMRIcon()).not.toBeNull();
});
describe('when user cannot read merge requests', () => {
beforeEach(done => {
store.state.projects[TEST_PROJECT_ID].userPermissions = {};
vm.$nextTick()
.then(done)
.catch(done.fail);
});
it('does not render merge requests', () => {
expect(findMRIcon()).toBeNull();
});
});
});
Loading
Loading
@@ -8,7 +8,7 @@ import actions, {
openMergeRequest,
} from '~/ide/stores/actions/merge_request';
import service from '~/ide/services';
import { activityBarViews } from '~/ide/constants';
import { activityBarViews, PERMISSION_READ_MR } from '~/ide/constants';
import { resetStore } from '../../helpers';
 
const TEST_PROJECT = 'abcproject';
Loading
Loading
@@ -23,6 +23,9 @@ describe('IDE store merge request actions', () => {
store.state.projects[TEST_PROJECT] = {
id: TEST_PROJECT_ID,
mergeRequests: {},
userPermissions: {
[PERMISSION_READ_MR]: true,
},
};
});
 
Loading
Loading
@@ -79,6 +82,19 @@ describe('IDE store merge request actions', () => {
})
.catch(done.fail);
});
it('does nothing if user cannot read MRs', done => {
store.state.projects[TEST_PROJECT].userPermissions[PERMISSION_READ_MR] = false;
store
.dispatch('getMergeRequestsForBranch', { projectId: TEST_PROJECT, branchId: 'bar' })
.then(() => {
expect(service.getProjectMergeRequests).not.toHaveBeenCalled();
expect(store.state.currentMergeRequestId).toBe('');
})
.then(done)
.catch(done.fail);
});
});
 
describe('no merge requests for branch available case', () => {
Loading
Loading
Loading
Loading
@@ -7,7 +7,7 @@ import eventHub from '~/ide/eventhub';
import consts from '~/ide/stores/modules/commit/constants';
import * as mutationTypes from '~/ide/stores/modules/commit/mutation_types';
import * as actions from '~/ide/stores/modules/commit/actions';
import { commitActionTypes } from '~/ide/constants';
import { commitActionTypes, PERMISSION_CREATE_MR } from '~/ide/constants';
import testAction from '../../../../helpers/vuex_action_helper';
 
const TEST_COMMIT_SHA = '123456789';
Loading
Loading
@@ -313,6 +313,9 @@ describe('IDE commit module actions', () => {
},
},
},
userPermissions: {
[PERMISSION_CREATE_MR]: true,
},
},
},
});
Loading
Loading
Loading
Loading
@@ -125,4 +125,31 @@ describe Gitlab::ImportExport::GroupTreeRestorer do
end
end
end
context 'group visibility levels' do
let(:user) { create(:user) }
let(:shared) { Gitlab::ImportExport::Shared.new(group) }
let(:group_tree_restorer) { described_class.new(user: user, shared: shared, group: group, group_hash: nil) }
before do
setup_import_export_config(filepath)
group_tree_restorer.restore
end
shared_examples 'with visibility level' do |visibility_level, expected_visibilities|
context "when visibility level is #{visibility_level}" do
let(:group) { create(:group, visibility_level) }
let(:filepath) { "group_exports/visibility_levels/#{visibility_level}" }
it "imports all subgroups as #{visibility_level}" do
expect(group.children.map(&:visibility_level)).to eq(expected_visibilities)
end
end
end
include_examples 'with visibility level', :public, [20, 10, 0]
include_examples 'with visibility level', :private, [0, 0, 0]
include_examples 'with visibility level', :internal, [10, 10, 0]
end
end
Loading
Loading
@@ -80,7 +80,7 @@ describe Gitlab::ImportExport::GroupTreeSaver do
end
 
it 'saves the correct json' do
expect(saved_group_json).to include({ 'description' => 'description', 'visibility_level' => 20 })
expect(saved_group_json).to include({ 'description' => 'description' })
end
 
it 'has milestones' do
Loading
Loading
Loading
Loading
@@ -45,6 +45,14 @@ describe API::GroupImport do
expect(response).to have_gitlab_http_status(202)
end
 
it 'creates private group' do
expect { subject }.to change { Group.count }.by(1)
group = Group.find_by(name: 'test-import-group')
expect(group.visibility_level).to eq(Gitlab::VisibilityLevel::PRIVATE)
end
context 'when importing to a parent group' do
before do
group.add_owner(user)
Loading
Loading
@@ -59,6 +67,34 @@ describe API::GroupImport do
expect(group.children.count).to eq(1)
end
 
context 'when parent group is private or internal' do
let(:public_parent_group) { create(:group, :public) }
let(:internal_parent_group) { create(:group, :internal) }
before do
public_parent_group.add_owner(user)
internal_parent_group.add_owner(user)
end
it 'imports public group' do
params[:parent_id] = public_parent_group.id
subject
expect(response).to have_gitlab_http_status(202)
expect(public_parent_group.children.first.visibility_level).to eq(Gitlab::VisibilityLevel::PUBLIC)
end
it 'imports internal group' do
params[:parent_id] = internal_parent_group.id
subject
expect(response).to have_gitlab_http_status(202)
expect(internal_parent_group.children.first.visibility_level).to eq(Gitlab::VisibilityLevel::INTERNAL)
end
end
context 'when parent group is invalid' do
it 'returns 404 and does not create new group' do
params[:parent_id] = 99999
Loading
Loading
Loading
Loading
@@ -61,7 +61,11 @@ describe API::LsifData do
'end_line' => 8,
'start_char' => 13,
'start_line' => 8,
'definition_url' => project_blob_path(project, "#{commit.id}/morestrings/reverse.go", anchor: 'L5')
'definition_url' => project_blob_path(project, "#{commit.id}/morestrings/reverse.go", anchor: 'L5'),
'hover' => [{
'language' => 'go',
'value' => Gitlab::Highlight.highlight(nil, 'func Func2(i int) string', language: 'go')
}]
})
end
 
Loading
Loading
Loading
Loading
@@ -267,8 +267,7 @@ describe API::MergeRequests do
it 'returns an array of merge requests with any label when filtering by any label' do
get api(endpoint_path, user), params: { labels: [" #{label.title} ", " #{label2.title} "] }
 
expect_successful_response_with_paginated_array
expect(json_response.length).to eq(1)
expect_paginated_array_response([merge_request.id])
expect(json_response.first['labels']).to eq([label2.title, label.title])
expect(json_response.first['id']).to eq(merge_request.id)
end
Loading
Loading
@@ -276,8 +275,7 @@ describe API::MergeRequests do
it 'returns an array of merge requests with any label when filtering by any label' do
get api(endpoint_path, user), params: { labels: ["#{label.title} , #{label2.title}"] }
 
expect_successful_response_with_paginated_array
expect(json_response.length).to eq(1)
expect_paginated_array_response([merge_request.id])
expect(json_response.first['labels']).to eq([label2.title, label.title])
expect(json_response.first['id']).to eq(merge_request.id)
end
Loading
Loading
@@ -285,17 +283,16 @@ describe API::MergeRequests do
it 'returns an array of merge requests with any label when filtering by any label' do
get api(endpoint_path, user), params: { labels: IssuesFinder::FILTER_ANY }
 
expect_successful_response_with_paginated_array
expect(json_response.length).to eq(1)
expect_paginated_array_response([merge_request.id])
expect(json_response.first['id']).to eq(merge_request.id)
end
 
it 'returns an array of merge requests without a label when filtering by no label' do
get api(endpoint_path, user), params: { labels: IssuesFinder::FILTER_NONE }
 
expect_paginated_array_response([
expect_response_contain_exactly(
merge_request_merged.id, merge_request_locked.id, merge_request_closed.id
])
)
end
end
 
Loading
Loading
@@ -315,7 +312,7 @@ describe API::MergeRequests do
 
get api(path, user)
 
expect_paginated_array_response([mr2.id])
expect_response_contain_exactly(mr2.id)
end
 
context 'with ordering' do
Loading
Loading
@@ -413,9 +410,9 @@ describe API::MergeRequests do
it 'returns merge requests with the given source branch' do
get api(endpoint_path, user), params: { source_branch: merge_request_closed.source_branch, state: 'all' }
 
expect_paginated_array_response([
expect_response_contain_exactly(
merge_request_merged.id, merge_request_locked.id, merge_request_closed.id
])
)
end
end
 
Loading
Loading
@@ -423,9 +420,9 @@ describe API::MergeRequests do
it 'returns merge requests with the given target branch' do
get api(endpoint_path, user), params: { target_branch: merge_request_closed.target_branch, state: 'all' }
 
expect_paginated_array_response([
expect_response_contain_exactly(
merge_request_merged.id, merge_request_locked.id, merge_request_closed.id
])
)
end
end
end
Loading
Loading
@@ -448,10 +445,10 @@ describe API::MergeRequests do
it 'returns an array of all merge requests' do
get api('/merge_requests', user), params: { scope: 'all' }
 
expect_paginated_array_response([
expect_response_contain_exactly(
merge_request_merged.id, merge_request_locked.id,
merge_request_closed.id, merge_request.id
])
)
end
 
it "returns authentication error without any scope" do
Loading
Loading
@@ -487,9 +484,10 @@ describe API::MergeRequests do
it 'returns an array of all merge requests except unauthorized ones' do
get api('/merge_requests', user), params: { scope: :all }
 
expect_paginated_array_response([
merge_request_merged.id, merge_request2.id, merge_request_locked.id, merge_request_closed.id, merge_request.id
])
expect_response_contain_exactly(
merge_request_merged.id, merge_request2.id, merge_request_locked.id,
merge_request_closed.id, merge_request.id
)
end
 
it "returns an array of no merge_requests when wip=yes" do
Loading
Loading
@@ -501,9 +499,10 @@ describe API::MergeRequests do
it "returns an array of no merge_requests when wip=no" do
get api("/merge_requests", user), params: { wip: 'no' }
 
expect_paginated_array_response([
merge_request_merged.id, merge_request2.id, merge_request_locked.id, merge_request_closed.id, merge_request.id
])
expect_response_contain_exactly(
merge_request_merged.id, merge_request2.id, merge_request_locked.id,
merge_request_closed.id, merge_request.id
)
end
 
it 'does not return unauthorized merge requests' do
Loading
Loading
@@ -512,9 +511,10 @@ describe API::MergeRequests do
 
get api('/merge_requests', user), params: { scope: :all }
 
expect_paginated_array_response([
merge_request_merged.id, merge_request2.id, merge_request_locked.id, merge_request_closed.id, merge_request.id
])
expect_response_contain_exactly(
merge_request_merged.id, merge_request2.id, merge_request_locked.id,
merge_request_closed.id, merge_request.id
)
expect(json_response.map { |mr| mr['id'] }).not_to include(merge_request3.id)
end
 
Loading
Loading
@@ -523,7 +523,7 @@ describe API::MergeRequests do
 
get api('/merge_requests', user2)
 
expect_paginated_array_response([merge_request3.id])
expect_response_contain_exactly(merge_request3.id)
end
 
it 'returns an array of merge requests authored by the given user' do
Loading
Loading
@@ -531,7 +531,7 @@ describe API::MergeRequests do
 
get api('/merge_requests', user), params: { author_id: user2.id, scope: :all }
 
expect_paginated_array_response([merge_request3.id])
expect_response_contain_exactly(merge_request3.id)
end
 
it 'returns an array of merge requests assigned to the given user' do
Loading
Loading
@@ -539,7 +539,7 @@ describe API::MergeRequests do
 
get api('/merge_requests', user), params: { assignee_id: user2.id, scope: :all }
 
expect_paginated_array_response([merge_request3.id])
expect_response_contain_exactly(merge_request3.id)
end
 
it 'returns an array of merge requests with no assignee' do
Loading
Loading
@@ -547,7 +547,7 @@ describe API::MergeRequests do
 
get api('/merge_requests', user), params: { assignee_id: 'None', scope: :all }
 
expect_paginated_array_response([merge_request3.id])
expect_response_contain_exactly(merge_request3.id)
end
 
it 'returns an array of merge requests with any assignee' do
Loading
Loading
@@ -556,10 +556,10 @@ describe API::MergeRequests do
 
get api('/merge_requests', user), params: { assignee_id: 'Any', scope: :all }
 
expect_paginated_array_response([
expect_response_contain_exactly(
merge_request_merged.id, merge_request2.id, merge_request_locked.id,
merge_request_closed.id, merge_request.id
])
)
end
 
it 'returns an array of merge requests assigned to me' do
Loading
Loading
@@ -567,7 +567,7 @@ describe API::MergeRequests do
 
get api('/merge_requests', user2), params: { scope: 'assigned_to_me' }
 
expect_paginated_array_response([merge_request3.id])
expect_response_contain_exactly(merge_request3.id)
end
 
it 'returns an array of merge requests assigned to me (kebab-case)' do
Loading
Loading
@@ -575,7 +575,7 @@ describe API::MergeRequests do
 
get api('/merge_requests', user2), params: { scope: 'assigned-to-me' }
 
expect_paginated_array_response([merge_request3.id])
expect_response_contain_exactly(merge_request3.id)
end
 
it 'returns an array of merge requests created by me' do
Loading
Loading
@@ -583,7 +583,7 @@ describe API::MergeRequests do
 
get api('/merge_requests', user2), params: { scope: 'created_by_me' }
 
expect_paginated_array_response([merge_request3.id])
expect_response_contain_exactly(merge_request3.id)
end
 
it 'returns an array of merge requests created by me (kebab-case)' do
Loading
Loading
@@ -591,7 +591,7 @@ describe API::MergeRequests do
 
get api('/merge_requests', user2), params: { scope: 'created-by-me' }
 
expect_paginated_array_response([merge_request3.id])
expect_response_contain_exactly(merge_request3.id)
end
 
it 'returns merge requests reacted by the authenticated user by the given emoji' do
Loading
Loading
@@ -600,16 +600,16 @@ describe API::MergeRequests do
 
get api('/merge_requests', user2), params: { my_reaction_emoji: award_emoji.name, scope: 'all' }
 
expect_paginated_array_response([merge_request3.id])
expect_response_contain_exactly(merge_request3.id)
end
 
context 'source_branch param' do
it 'returns merge requests with the given source branch' do
get api('/merge_requests', user), params: { source_branch: merge_request_closed.source_branch, state: 'all' }
 
expect_paginated_array_response([
expect_response_contain_exactly(
merge_request_merged.id, merge_request_locked.id, merge_request_closed.id
])
)
end
end
 
Loading
Loading
@@ -617,9 +617,9 @@ describe API::MergeRequests do
it 'returns merge requests with the given target branch' do
get api('/merge_requests', user), params: { target_branch: merge_request_closed.target_branch, state: 'all' }
 
expect_paginated_array_response([
expect_response_contain_exactly(
merge_request_merged.id, merge_request_locked.id, merge_request_closed.id
])
)
end
end
 
Loading
Loading
@@ -628,7 +628,7 @@ describe API::MergeRequests do
 
get api('/merge_requests?created_before=2000-01-02T00:00:00.060Z', user)
 
expect_paginated_array_response([merge_request2.id])
expect_response_contain_exactly(merge_request2.id)
end
 
it 'returns merge requests created after a specific date' do
Loading
Loading
@@ -636,7 +636,7 @@ describe API::MergeRequests do
 
get api("/merge_requests?created_after=#{merge_request2.created_at}", user)
 
expect_paginated_array_response([merge_request2.id])
expect_response_contain_exactly(merge_request2.id)
end
 
it 'returns merge requests updated before a specific date' do
Loading
Loading
@@ -644,7 +644,7 @@ describe API::MergeRequests do
 
get api('/merge_requests?updated_before=2000-01-02T00:00:00.060Z', user)
 
expect_paginated_array_response([merge_request2.id])
expect_response_contain_exactly(merge_request2.id)
end
 
it 'returns merge requests updated after a specific date' do
Loading
Loading
@@ -652,7 +652,7 @@ describe API::MergeRequests do
 
get api("/merge_requests?updated_after=#{merge_request2.updated_at}", user)
 
expect_paginated_array_response([merge_request2.id])
expect_response_contain_exactly(merge_request2.id)
end
 
context 'search params' do
Loading
Loading
@@ -663,13 +663,13 @@ describe API::MergeRequests do
it 'returns merge requests matching given search string for title' do
get api("/merge_requests", user), params: { search: merge_request.title }
 
expect_paginated_array_response([merge_request.id])
expect_response_contain_exactly(merge_request.id)
end
 
it 'returns merge requests matching given search string for title and scoped in title' do
get api("/merge_requests", user), params: { search: merge_request.title, in: 'title' }
 
expect_paginated_array_response([merge_request.id])
expect_response_contain_exactly(merge_request.id)
end
 
it 'returns an empty array if no merge request matches given search string for description and scoped in title' do
Loading
Loading
@@ -681,7 +681,7 @@ describe API::MergeRequests do
it 'returns merge requests for project matching given search string for description' do
get api("/merge_requests", user), params: { project_id: project.id, search: merge_request.description }
 
expect_paginated_array_response([merge_request.id])
expect_response_contain_exactly(merge_request.id)
end
end
 
Loading
Loading
@@ -689,7 +689,7 @@ describe API::MergeRequests do
it 'returns merge requests with the given state' do
get api('/merge_requests', user), params: { state: 'locked' }
 
expect_paginated_array_response([merge_request_locked.id])
expect_response_contain_exactly(merge_request_locked.id)
end
end
end
Loading
Loading
@@ -792,10 +792,10 @@ describe API::MergeRequests do
it 'returns an array excluding merge_requests from archived projects' do
get api(endpoint_path, user)
 
expect_paginated_array_response([
expect_response_contain_exactly(
merge_request_merged.id, merge_request_locked.id,
merge_request_closed.id, merge_request.id
])
)
end
 
context 'with non_archived param set as false' do
Loading
Loading
@@ -804,10 +804,10 @@ describe API::MergeRequests do
 
get api(path, user)
 
expect_paginated_array_response([
expect_response_contain_exactly(
merge_request_merged.id, merge_request_archived.id, merge_request_locked.id,
merge_request_closed.id, merge_request.id
])
)
end
end
end
Loading
Loading
Loading
Loading
@@ -17,11 +17,7 @@ describe 'Self-Monitoring project requests' do
login_as(admin)
end
 
context 'with feature flag disabled' do
it_behaves_like 'not accessible if feature flag is disabled'
end
context 'with feature flag enabled' do
context 'when the self monitoring project is created' do
let(:status_api) { status_create_self_monitoring_project_admin_application_settings_path }
 
it_behaves_like 'triggers async worker, returns sidekiq job_id with response accepted'
Loading
Loading
@@ -45,11 +41,7 @@ describe 'Self-Monitoring project requests' do
login_as(admin)
end
 
context 'with feature flag disabled' do
it_behaves_like 'not accessible if feature flag is disabled'
end
context 'with feature flag enabled' do
context 'when the self monitoring project is being created' do
it_behaves_like 'handles invalid job_id'
 
context 'when job is in progress' do
Loading
Loading
@@ -129,11 +121,7 @@ describe 'Self-Monitoring project requests' do
login_as(admin)
end
 
context 'with feature flag disabled' do
it_behaves_like 'not accessible if feature flag is disabled'
end
context 'with feature flag enabled' do
context 'when the self monitoring project is deleted' do
let(:status_api) { status_delete_self_monitoring_project_admin_application_settings_path }
 
it_behaves_like 'triggers async worker, returns sidekiq job_id with response accepted'
Loading
Loading
@@ -157,11 +145,7 @@ describe 'Self-Monitoring project requests' do
login_as(admin)
end
 
context 'with feature flag disabled' do
it_behaves_like 'not accessible if feature flag is disabled'
end
context 'with feature flag enabled' do
context 'when the self monitoring project is being deleted' do
it_behaves_like 'handles invalid job_id'
 
context 'when job is in progress' do
Loading
Loading
Loading
Loading
@@ -12,6 +12,10 @@ describe Projects::LsifDataService do
let(:service) { described_class.new(artifact.file, project, params) }
 
describe '#execute' do
def highlighted_value(value)
[{ language: 'go', value: Gitlab::Highlight.highlight(nil, value, language: 'go') }]
end
context 'fetched lsif file', :use_clean_rails_memory_store_caching do
it 'is cached' do
service.execute
Loading
Loading
@@ -32,42 +36,48 @@ describe Projects::LsifDataService do
end_line: 6,
start_char: 5,
start_line: 6,
definition_url: "#{path_prefix}/main.go#L7"
definition_url: "#{path_prefix}/main.go#L7",
hover: highlighted_value('func main()')
},
{
end_char: 36,
end_line: 3,
start_char: 1,
start_line: 3,
definition_url: "#{path_prefix}/main.go#L4"
definition_url: "#{path_prefix}/main.go#L4",
hover: highlighted_value('package "github.com/user/hello/morestrings" ("github.com/user/hello/morestrings")')
},
{
end_char: 12,
end_line: 7,
start_char: 1,
start_line: 7,
definition_url: "#{path_prefix}/main.go#L4"
definition_url: "#{path_prefix}/main.go#L4",
hover: highlighted_value('package "github.com/user/hello/morestrings" ("github.com/user/hello/morestrings")')
},
{
end_char: 20,
end_line: 7,
start_char: 13,
start_line: 7,
definition_url: "#{path_prefix}/morestrings/reverse.go#L11"
definition_url: "#{path_prefix}/morestrings/reverse.go#L11",
hover: highlighted_value('func Reverse(s string) string') + [{ value: "This method reverses a string \n\n" }]
},
{
end_char: 12,
end_line: 8,
start_char: 1,
start_line: 8,
definition_url: "#{path_prefix}/main.go#L4"
definition_url: "#{path_prefix}/main.go#L4",
hover: highlighted_value('package "github.com/user/hello/morestrings" ("github.com/user/hello/morestrings")')
},
{
end_char: 18,
end_line: 8,
start_char: 13,
start_line: 8,
definition_url: "#{path_prefix}/morestrings/reverse.go#L5"
definition_url: "#{path_prefix}/morestrings/reverse.go#L5",
hover: highlighted_value('func Func2(i int) string')
}
])
end
Loading
Loading
@@ -82,7 +92,8 @@ describe Projects::LsifDataService do
end_line: 11,
start_char: 1,
start_line: 11,
definition_url: "/#{project.full_path}/-/blob/#{commit_id}/morestrings/reverse.go#L12"
definition_url: "/#{project.full_path}/-/blob/#{commit_id}/morestrings/reverse.go#L12",
hover: highlighted_value('var a string')
})
end
end
Loading
Loading
Loading
Loading
@@ -58,6 +58,13 @@ module ApiHelpers
expect(json_response.map { |item| item['id'] }).to eq(Array(items))
end
 
def expect_response_contain_exactly(*items)
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to be_an Array
expect(json_response.length).to eq(items.size)
expect(json_response.map { |item| item['id'] }).to contain_exactly(*items)
end
def stub_last_activity_update
allow_any_instance_of(Users::ActivityService).to receive(:execute)
end
Loading
Loading
# frozen_string_literal: true
 
RSpec.shared_examples 'not accessible if feature flag is disabled' do
before do
stub_feature_flags(self_monitoring_project: false)
end
it 'returns not_implemented' do
subject
aggregate_failures do
expect(response).to have_gitlab_http_status(:not_implemented)
expect(json_response).to eq(
'message' => _('Self-monitoring is not enabled on this GitLab server, contact your administrator.'),
'documentation_url' => help_page_path('administration/monitoring/gitlab_self_monitoring_project/index')
)
end
end
end
RSpec.shared_examples 'not accessible to non-admin users' do
context 'with unauthenticated user' do
it 'redirects to signin page' do
Loading
Loading
Loading
Loading
@@ -19,12 +19,12 @@ describe 'projects/tree/_tree_header' do
allow(view).to receive(:can_collaborate_with_project?) { true }
end
 
it 'does not render the WebIDE button when user cannot create fork or cannot open MR' do
it 'renders the WebIDE button when user can collaborate but not create fork or MR' do
allow(view).to receive(:can?) { false }
 
render
 
expect(rendered).not_to have_link('Web IDE')
expect(rendered).to have_link('Web IDE')
end
 
it 'renders the WebIDE button when user can create fork and can open MR in project' do
Loading
Loading
@@ -43,4 +43,13 @@ describe 'projects/tree/_tree_header' do
 
expect(rendered).to have_link('Web IDE', href: '#modal-confirm-fork')
end
it 'does not render the WebIDE button when user cannot collaborate or create mr' do
allow(view).to receive(:can?) { false }
allow(view).to receive(:can_collaborate_with_project?) { false }
render
expect(rendered).not_to have_link('Web IDE')
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment