diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-01-26 09:09:07 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-01-26 09:09:07 +0300 |
commit | 71616b047edede613c469a72a4a92ed497845be0 (patch) | |
tree | 23154c2aad6839a4b83b30b3de19b65b8861101a | |
parent | c2807bf610d04d1ad102b73d861d35170942719c (diff) |
Add latest changes from gitlab-org/gitlab@master
8 files changed, 148 insertions, 23 deletions
diff --git a/app/assets/javascripts/jira_import/components/jira_import_form.vue b/app/assets/javascripts/jira_import/components/jira_import_form.vue index ab475c3c85a..6f2fb41ca15 100644 --- a/app/assets/javascripts/jira_import/components/jira_import_form.vue +++ b/app/assets/javascripts/jira_import/components/jira_import_form.vue @@ -15,10 +15,11 @@ import { GlTable, } from '@gitlab/ui'; import { debounce } from 'lodash'; -import axios from '~/lib/utils/axios_utils'; +import { getIdFromGraphQLId } from '~/graphql_shared/utils'; import { __ } from '~/locale'; import getJiraUserMappingMutation from '../queries/get_jira_user_mapping.mutation.graphql'; import initiateJiraImportMutation from '../queries/initiate_jira_import.mutation.graphql'; +import searchProjectMembersQuery from '../queries/search_project_members.query.graphql'; import { addInProgressImportToStore } from '../utils/cache_update'; import { debounceWait, @@ -155,19 +156,23 @@ export default { }); }, searchUsers() { - const params = { - active: true, - project_id: this.projectId, - search: this.searchTerm, - }; - this.isFetching = true; - return axios - .get('/-/autocomplete/users.json', { params }) + return this.$apollo + .query({ + query: searchProjectMembersQuery, + variables: { + fullPath: this.projectPath, + search: this.searchTerm, + }, + }) .then(({ data }) => { - this.users = data; - return data; + this.users = + data?.project?.projectMembers?.nodes?.map(({ user }) => ({ + ...user, + id: getIdFromGraphQLId(user.id), + })) || []; + return this.users; }) .finally(() => { this.isFetching = false; diff --git a/app/assets/javascripts/jira_import/queries/search_project_members.query.graphql b/app/assets/javascripts/jira_import/queries/search_project_members.query.graphql new file mode 100644 index 00000000000..06f119e75ed --- /dev/null +++ b/app/assets/javascripts/jira_import/queries/search_project_members.query.graphql @@ -0,0 +1,13 @@ +query searchProjectMembers($fullPath: ID!, $search: String) { + project(fullPath: $fullPath) { + projectMembers(search: $search) { + nodes { + user { + id + name + username + } + } + } + } +} diff --git a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue index d1bac078642..823ada133d2 100644 --- a/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue +++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipeline_url.vue @@ -77,6 +77,15 @@ export default { >{{ __('latest') }}</gl-badge > <gl-badge + v-if="pipeline.flags.merge_train_pipeline" + v-gl-tooltip + :title="__('This is a merge train pipeline')" + variant="info" + size="sm" + data-testid="pipeline-url-train" + >{{ __('train') }}</gl-badge + > + <gl-badge v-if="pipeline.flags.yaml_errors" v-gl-tooltip :title="pipeline.yaml_errors" diff --git a/app/serializers/ci/pipeline_entity.rb b/app/serializers/ci/pipeline_entity.rb index fabde59634e..86f93929a5d 100644 --- a/app/serializers/ci/pipeline_entity.rb +++ b/app/serializers/ci/pipeline_entity.rb @@ -120,3 +120,5 @@ class Ci::PipelineEntity < Grape::Entity end end end + +Ci::PipelineEntity.prepend_if_ee('EE::Ci::PipelineEntity') diff --git a/app/views/projects/pipelines/_info.html.haml b/app/views/projects/pipelines/_info.html.haml index 77aa537dfdb..4a10f6aee1c 100644 --- a/app/views/projects/pipelines/_info.html.haml +++ b/app/views/projects/pipelines/_info.html.haml @@ -28,6 +28,9 @@ - if @pipeline.latest? %span.js-pipeline-url-latest.badge.badge-pill.gl-badge.sm.badge-success.has-tooltip{ title: _("Latest pipeline for the most recent commit on this branch") } latest + - if @pipeline.merge_train_pipeline? + %span.js-pipeline-url-train.badge.badge-pill.gl-badge.sm.badge-info.has-tooltip{ title: _("This is a merge train pipeline") } + train - if @pipeline.has_yaml_errors? %span.js-pipeline-url-yaml.badge.badge-pill.gl-badge.sm.badge-danger.has-tooltip{ title: @pipeline.yaml_errors } yaml invalid diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 4c05ce63bf7..3608a930c2a 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -1361,6 +1361,9 @@ msgstr "" msgid "API Fuzzing" msgstr "" +msgid "API Fuzzing Configuration" +msgstr "" + msgid "API Help" msgstr "" @@ -4457,9 +4460,6 @@ msgstr "" msgid "BillingPlans|Congratulations, your free trial is activated." msgstr "" -msgid "BillingPlans|Current Plan" -msgstr "" - msgid "BillingPlans|Free upgrade!" msgstr "" @@ -29048,6 +29048,9 @@ msgstr "" msgid "This is a list of devices that have logged into your account. Revoke any sessions that you do not recognize." msgstr "" +msgid "This is a merge train pipeline" +msgstr "" + msgid "This is a security log of important events involving your account." msgstr "" @@ -34576,6 +34579,9 @@ msgstr "" msgid "toggle collapse" msgstr "" +msgid "train" +msgstr "" + msgid "triggered" msgstr "" diff --git a/spec/frontend/jira_import/components/jira_import_form_spec.js b/spec/frontend/jira_import/components/jira_import_form_spec.js index 00fb8f5435e..1cbd0f5ad30 100644 --- a/spec/frontend/jira_import/components/jira_import_form_spec.js +++ b/spec/frontend/jira_import/components/jira_import_form_spec.js @@ -1,4 +1,13 @@ -import { GlAlert, GlButton, GlDropdown, GlFormSelect, GlLabel, GlTable } from '@gitlab/ui'; +import { + GlAlert, + GlButton, + GlDropdown, + GlDropdownItem, + GlFormSelect, + GlLabel, + GlSearchBoxByType, + GlTable, +} from '@gitlab/ui'; import { getByRole } from '@testing-library/dom'; import { mount, shallowMount } from '@vue/test-utils'; import AxiosMockAdapter from 'axios-mock-adapter'; @@ -6,6 +15,7 @@ import axios from '~/lib/utils/axios_utils'; import JiraImportForm from '~/jira_import/components/jira_import_form.vue'; import getJiraUserMappingMutation from '~/jira_import/queries/get_jira_user_mapping.mutation.graphql'; import initiateJiraImportMutation from '~/jira_import/queries/initiate_jira_import.mutation.graphql'; +import searchProjectMembersQuery from '~/jira_import/queries/search_project_members.query.graphql'; import { imports, issuesPath, @@ -19,6 +29,7 @@ import { describe('JiraImportForm', () => { let axiosMock; let mutateSpy; + let querySpy; let wrapper; const currentUsername = 'mrgitlab'; @@ -72,6 +83,7 @@ describe('JiraImportForm', () => { $apollo: { loading, mutate, + query: querySpy, }, }, currentUsername, @@ -79,19 +91,21 @@ describe('JiraImportForm', () => { beforeEach(() => { axiosMock = new AxiosMockAdapter(axios); - mutateSpy = jest.fn(() => - Promise.resolve({ - data: { - jiraImportStart: { errors: [] }, - jiraImportUsers: { jiraUsers: [], errors: [] }, - }, - }), - ); + mutateSpy = jest.fn().mockResolvedValue({ + data: { + jiraImportStart: { errors: [] }, + jiraImportUsers: { jiraUsers: [], errors: [] }, + }, + }); + querySpy = jest.fn().mockResolvedValue({ + data: { project: { projectMembers: { nodes: [] } } }, + }); }); afterEach(() => { axiosMock.restore(); mutateSpy.mockRestore(); + querySpy.mockRestore(); wrapper.destroy(); wrapper = null; }); @@ -236,6 +250,53 @@ describe('JiraImportForm', () => { }); }); + describe('member search', () => { + describe('when searching for a member', () => { + beforeEach(() => { + querySpy = jest.fn().mockResolvedValue({ + data: { + project: { + projectMembers: { + nodes: [ + { + user: { + id: 7, + name: 'Frederic Chopin', + username: 'fchopin', + }, + }, + ], + }, + }, + }, + }); + + wrapper = mountComponent({ mountFunction: mount }); + + wrapper.find(GlSearchBoxByType).vm.$emit('input', 'fred'); + }); + + it('makes a GraphQL call', () => { + const queryArgument = { + query: searchProjectMembersQuery, + variables: { + fullPath: projectPath, + search: 'fred', + }, + }; + + expect(querySpy).toHaveBeenCalledWith(expect.objectContaining(queryArgument)); + }); + + it('updates the user list', () => { + expect(getUserDropdown().findAll(GlDropdownItem)).toHaveLength(1); + expect(getUserDropdown().find(GlDropdownItem).text()).toContain( + 'fchopin (Frederic Chopin)', + ); + }); + }); + }); + describe('buttons', () => { describe('"Continue" button', () => { it('is shown', () => { diff --git a/spec/frontend/pipelines/pipeline_url_spec.js b/spec/frontend/pipelines/pipeline_url_spec.js index 47315bd42e6..859db114293 100644 --- a/spec/frontend/pipelines/pipeline_url_spec.js +++ b/spec/frontend/pipelines/pipeline_url_spec.js @@ -17,6 +17,7 @@ describe('Pipeline Url Component', () => { const findStuckTag = () => wrapper.find('[data-testid="pipeline-url-stuck"]'); const findDetachedTag = () => wrapper.find('[data-testid="pipeline-url-detached"]'); const findForkTag = () => wrapper.find('[data-testid="pipeline-url-fork"]'); + const findTrainTag = () => wrapper.find('[data-testid="pipeline-url-train"]'); const defaultProps = { pipeline: { @@ -141,6 +142,7 @@ describe('Pipeline Url Component', () => { expect(findScheduledTag().exists()).toBe(true); expect(findScheduledTag().text()).toContain('Scheduled'); }); + it('should render the fork badge when the pipeline was run in a fork', () => { createComponent({ pipeline: { @@ -152,4 +154,28 @@ describe('Pipeline Url Component', () => { expect(findForkTag().exists()).toBe(true); expect(findForkTag().text()).toBe('fork'); }); + + it('should render the train badge when the pipeline is a merge train pipeline', () => { + createComponent({ + pipeline: { + flags: { + merge_train_pipeline: true, + }, + }, + }); + + expect(findTrainTag().text()).toContain('train'); + }); + + it('should not render the train badge when the pipeline is not a merge train pipeline', () => { + createComponent({ + pipeline: { + flags: { + merge_train_pipeline: false, + }, + }, + }); + + expect(findTrainTag().exists()).toBe(false); + }); }); |