diff --git a/.rubocop.yml b/.rubocop.yml index 62f5af0a8dd..6b8fb30b961 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -217,13 +217,11 @@ Gitlab/DuplicateSpecLocation: - ee/spec/helpers/auth_helper_spec.rb - ee/spec/lib/gitlab/gl_repository_spec.rb - ee/spec/models/namespace_spec.rb - - ee/spec/services/issues/create_service_spec.rb - ee/spec/services/merge_requests/create_service_spec.rb - ee/spec/services/merge_requests/refresh_service_spec.rb - ee/spec/services/merge_requests/update_service_spec.rb - ee/spec/helpers/ee/auth_helper_spec.rb - ee/spec/models/ee/namespace_spec.rb - - ee/spec/services/ee/issues/create_service_spec.rb - ee/spec/services/ee/merge_requests/create_service_spec.rb - ee/spec/services/ee/merge_requests/refresh_service_spec.rb - ee/spec/services/ee/merge_requests/update_service_spec.rb diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb index ff65f040335..af512ac6f07 100644 --- a/app/controllers/projects/pipelines_controller.rb +++ b/app/controllers/projects/pipelines_controller.rb @@ -172,9 +172,15 @@ class Projects::PipelinesController < Projects::ApplicationController if pipeline_test_report == :error render json: { status: :error_parsing_report } else + test_reports = if params[:scope] == "with_attachment" + pipeline_test_report.with_attachment! + else + pipeline_test_report + end + render json: TestReportSerializer .new(current_user: @current_user) - .represent(pipeline_test_report) + .represent(test_reports) end end end diff --git a/app/views/projects/imports/show.html.haml b/app/views/projects/imports/show.html.haml index 87b027a1802..09624b771ea 100644 --- a/app/views/projects/imports/show.html.haml +++ b/app/views/projects/imports/show.html.haml @@ -4,7 +4,7 @@ .save-project-loader .center %h2 - %i.fa.fa-spinner.fa-spin + %i.loading.spinner.spinner-sm = import_in_progress_title - if !has_ci_cd_only_params? && @project.external_import? %p.monospace git clone --bare #{@project.safe_import_url} diff --git a/changelogs/unreleased/dblessing-ldap-username-uid-fix.yml b/changelogs/unreleased/dblessing-ldap-username-uid-fix.yml new file mode 100644 index 00000000000..7a8001c8554 --- /dev/null +++ b/changelogs/unreleased/dblessing-ldap-username-uid-fix.yml @@ -0,0 +1,5 @@ +--- +title: Include LDAP UID attribute in default attributes for all LDAP lookups +merge_request: 28148 +author: +type: fixed diff --git a/changelogs/unreleased/fix-approvals-naming.yml b/changelogs/unreleased/fix-approvals-naming.yml new file mode 100644 index 00000000000..64caa309411 --- /dev/null +++ b/changelogs/unreleased/fix-approvals-naming.yml @@ -0,0 +1,5 @@ +--- +title: Fix name of approvals column in merge requests +merge_request: 28274 +author: Steffen Köhler +type: fixed diff --git a/changelogs/unreleased/updated-spinner-forking-message.yml b/changelogs/unreleased/updated-spinner-forking-message.yml new file mode 100644 index 00000000000..7333922b1c7 --- /dev/null +++ b/changelogs/unreleased/updated-spinner-forking-message.yml @@ -0,0 +1,5 @@ +--- +title: Updated spinner next to forking message +merge_request: 28506 +author: Victor Wu +type: other diff --git a/lib/gitlab/auth/ldap/config.rb b/lib/gitlab/auth/ldap/config.rb index 709cd0d787a..b8874e18a0b 100644 --- a/lib/gitlab/auth/ldap/config.rb +++ b/lib/gitlab/auth/ldap/config.rb @@ -178,7 +178,7 @@ module Gitlab def default_attributes { - 'username' => %w(uid sAMAccountName userid), + 'username' => %W(#{uid} uid sAMAccountName userid).uniq, 'email' => %w(mail email userPrincipalName), 'name' => 'cn', 'first_name' => 'givenName', diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 7dbdf40d831..9dc66b5b27a 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -12185,15 +12185,15 @@ msgstr "" msgid "MR widget|The pipeline will now run automatically every time you commit code. Pipelines are useful for deploying static web pages, detecting vulnerabilities in dependencies, static or dynamic application security testing (SAST and DAST), and so much more!" msgstr "" +msgid "MRApprovals|Approvals" +msgstr "" + msgid "MRApprovals|Approved by" msgstr "" msgid "MRApprovals|Approvers" msgstr "" -msgid "MRApprovals|Pending approvals" -msgstr "" - msgid "MRDiff|Show changes only" msgstr "" diff --git a/spec/controllers/projects/pipelines_controller_spec.rb b/spec/controllers/projects/pipelines_controller_spec.rb index 0368130118f..d9345cfaced 100644 --- a/spec/controllers/projects/pipelines_controller_spec.rb +++ b/spec/controllers/projects/pipelines_controller_spec.rb @@ -788,6 +788,28 @@ describe Projects::PipelinesController do expect(json_response['status']).to eq('error_parsing_report') end end + + context 'when test_report contains attachment and scope is with_attachment as a URL param' do + let(:pipeline) { create(:ci_pipeline, :with_test_reports_attachment, project: project) } + + it 'returns a test reports with attachment' do + get_test_report_json(scope: 'with_attachment') + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response["test_suites"]).to be_present + end + end + + context 'when test_report does not contain attachment and scope is with_attachment as a URL param' do + let(:pipeline) { create(:ci_pipeline, :with_test_reports, project: project) } + + it 'returns a test reports with empty values' do + get_test_report_json(scope: 'with_attachment') + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response["test_suites"]).to be_empty + end + end end context 'when feature is disabled' do @@ -805,13 +827,18 @@ describe Projects::PipelinesController do end end - def get_test_report_json - get :test_report, params: { + def get_test_report_json(**args) + params = { namespace_id: project.namespace, project_id: project, id: pipeline.id - }, - format: :json + } + + params.merge!(args) if args + + get :test_report, + params: params, + format: :json end def clear_controller_memoization diff --git a/spec/factories/ci/builds.rb b/spec/factories/ci/builds.rb index 5bb7853a154..ccaf0dd997b 100644 --- a/spec/factories/ci/builds.rb +++ b/spec/factories/ci/builds.rb @@ -311,6 +311,12 @@ FactoryBot.define do end end + trait :test_reports_with_attachment do + after(:build) do |build| + build.job_artifacts << create(:ci_job_artifact, :junit_with_attachment, job: build) + end + end + trait :coverage_reports do after(:build) do |build| build.job_artifacts << create(:ci_job_artifact, :cobertura, job: build) diff --git a/spec/factories/ci/job_artifacts.rb b/spec/factories/ci/job_artifacts.rb index 8fbf242a607..82383cfa2b0 100644 --- a/spec/factories/ci/job_artifacts.rb +++ b/spec/factories/ci/job_artifacts.rb @@ -99,6 +99,16 @@ FactoryBot.define do end end + trait :junit_with_attachment do + file_type { :junit } + file_format { :gzip } + + after(:build) do |artifact, evaluator| + artifact.file = fixture_file_upload( + Rails.root.join('spec/fixtures/junit/junit_with_attachment.xml.gz'), 'application/x-gzip') + end + end + trait :junit_with_ant do file_type { :junit } file_format { :gzip } diff --git a/spec/factories/ci/pipelines.rb b/spec/factories/ci/pipelines.rb index f2c342f76d0..e0478097148 100644 --- a/spec/factories/ci/pipelines.rb +++ b/spec/factories/ci/pipelines.rb @@ -67,6 +67,14 @@ FactoryBot.define do end end + trait :with_test_reports_attachment do + status { :success } + + after(:build) do |pipeline, evaluator| + pipeline.builds << build(:ci_build, :test_reports_with_attachment, pipeline: pipeline, project: pipeline.project) + end + end + trait :with_coverage_reports do status { :success } diff --git a/spec/fixtures/junit/junit_with_attachment.xml.gz b/spec/fixtures/junit/junit_with_attachment.xml.gz new file mode 100644 index 00000000000..75a92fada2c Binary files /dev/null and b/spec/fixtures/junit/junit_with_attachment.xml.gz differ diff --git a/spec/lib/gitlab/auth/ldap/config_spec.rb b/spec/lib/gitlab/auth/ldap/config_spec.rb index 0967c45d36b..124f072ebe6 100644 --- a/spec/lib/gitlab/auth/ldap/config_spec.rb +++ b/spec/lib/gitlab/auth/ldap/config_spec.rb @@ -502,6 +502,20 @@ AtlErSqafbECNDSwS5BX8yDpu5yRBJ4xegO/rNlmb8ICRYkuJapD1xXicFOsmfUK end end + describe '#default_attributes' do + it 'includes the configured uid attribute in the username attributes' do + stub_ldap_config(options: { 'uid' => 'my_uid_attr' }) + + expect(config.default_attributes['username']).to include('my_uid_attr') + end + + it 'only includes unique values for username attributes' do + stub_ldap_config(options: { 'uid' => 'uid' }) + + expect(config.default_attributes['username']).to contain_exactly('uid', 'sAMAccountName', 'userid') + end + end + describe '#base' do context 'when the configured base is not normalized' do it 'returns the normalized base' do