diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-07-20 09:55:51 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-07-20 09:55:51 +0000 |
commit | e8d2c2579383897a1dd7f9debd359abe8ae8373d (patch) | |
tree | c42be41678c2586d49a75cabce89322082698334 /qa/qa/specs/features/browser_ui | |
parent | fc845b37ec3a90aaa719975f607740c22ba6a113 (diff) | |
download | gitlab-ce-e8d2c2579383897a1dd7f9debd359abe8ae8373d.tar.gz |
Add latest changes from gitlab-org/gitlab@14-1-stable-eev14.1.0-rc42
Diffstat (limited to 'qa/qa/specs/features/browser_ui')
23 files changed, 548 insertions, 221 deletions
diff --git a/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb index d4c4ec5611a..6c2ff005f49 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb @@ -3,31 +3,33 @@ module QA RSpec.describe 'Manage', :requires_admin do describe 'Bulk group import' do - let!(:admin_api_client) { Runtime::API::Client.as_admin } - let!(:user) do + let!(:staging?) { Runtime::Scenario.gitlab_address.include?('staging.gitlab.com') } + + let(:admin_api_client) { Runtime::API::Client.as_admin } + let(:user) do Resource::User.fabricate_via_api! do |usr| usr.api_client = admin_api_client usr.hard_delete_on_api_removal = true end end - let!(:api_client) { Runtime::API::Client.new(user: user) } - let!(:personal_access_token) { api_client.personal_access_token } + let(:api_client) { Runtime::API::Client.new(user: user) } + let(:personal_access_token) { api_client.personal_access_token } - let!(:sandbox) do + let(:sandbox) do Resource::Sandbox.fabricate_via_api! do |group| group.api_client = admin_api_client end end - let!(:source_group) do + let(:source_group) do Resource::Sandbox.fabricate_via_api! do |group| group.api_client = api_client group.path = "source-group-for-import-#{SecureRandom.hex(4)}" end end - let!(:subgroup) do + let(:subgroup) do Resource::Group.fabricate_via_api! do |group| group.api_client = api_client group.sandbox = source_group @@ -36,7 +38,7 @@ module QA end let(:imported_group) do - Resource::Group.new.tap do |group| + Resource::Group.init do |group| group.api_client = api_client group.sandbox = sandbox group.path = source_group.path @@ -44,25 +46,23 @@ module QA end let(:imported_subgroup) do - Resource::Group.new.tap do |group| + Resource::Group.init do |group| group.api_client = api_client group.sandbox = imported_group group.path = subgroup.path end end - def staging? - Runtime::Scenario.gitlab_address.include?('staging.gitlab.com') - end - - before(:all) do + before do Runtime::Feature.enable(:bulk_import) unless staging? Runtime::Feature.enable(:top_level_group_creation_enabled) if staging? - end - before do sandbox.add_member(user, Resource::Members::AccessLevel::MAINTAINER) + # create groups explicitly before connecting gitlab instance + source_group + subgroup + Flow::Login.sign_in(as: user) Page::Main::Menu.perform(&:go_to_create_group) Page::Group::New.perform do |group| @@ -73,14 +73,10 @@ module QA # Non blocking issues: # https://gitlab.com/gitlab-org/gitlab/-/issues/331252 + # https://gitlab.com/gitlab-org/gitlab/-/issues/333678 <- can cause 500 when creating user and group back to back it( 'imports group with subgroups and labels', - testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1785', - quarantine: { - only: { job: 'relative_url' }, - issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/330344', - type: :bug - } + testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1785' ) do Resource::GroupLabel.fabricate_via_api! do |label| label.api_client = api_client @@ -96,9 +92,9 @@ module QA Page::Group::BulkImport.perform do |import_page| import_page.import_group(source_group.path, sandbox.path) - aggregate_failures do - expect(import_page).to have_imported_group(source_group.path, wait: 180) + expect(import_page).to have_imported_group(source_group.path, wait: 180) + aggregate_failures do expect { imported_group.reload! }.to eventually_eq(source_group).within(duration: 10) expect { imported_group.labels }.to eventually_include(*source_group.labels).within(duration: 10) @@ -111,9 +107,7 @@ module QA after do user.remove_via_api! - end - - after(:all) do + ensure Runtime::Feature.disable(:bulk_import) unless staging? Runtime::Feature.disable(:top_level_group_creation_enabled) if staging? end diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb index 23a21d70cc1..696bbc2a7b7 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/login/register_spec.rb @@ -143,7 +143,7 @@ module QA Page::Admin::Overview::Users::Show.perform do |show| user.id = show.user_id.to_i - show.approve_user + show.approve_user(user) end expect(page).to have_text('Successfully approved') diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb index e722710ee00..4fffc786c14 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/project/create_project_spec.rb @@ -4,7 +4,7 @@ module QA RSpec.describe 'Manage', :smoke do describe 'Project creation' do it 'user creates a new project', - testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1234' do + testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1857' do Flow::Login.sign_in created_project = Resource::Project.fabricate_via_browser_ui! do |project| diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb index 95092fe6ba6..6e0ed4adb63 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/project/dashboard_images_spec.rb @@ -6,7 +6,7 @@ module QA RSpec.describe 'Manage', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/212145', type: :stale } do describe 'Check for broken images', :requires_admin do before(:context) do - admin = QA::Resource::User.new.tap do |user| + admin = QA::Resource::User.init do |user| user.username = QA::Runtime::User.admin_username user.password = QA::Runtime::User.admin_password end diff --git a/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb index 55ad8baf872..4f85fa257a2 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/project/import_github_repo_spec.rb @@ -18,7 +18,6 @@ module QA project.group = group project.github_personal_access_token = Runtime::Env.github_access_token project.github_repository_path = 'gitlab-qa-github/test-project' - project.api_client = api_client end end @@ -33,91 +32,13 @@ module QA it 'imports a GitHub repo', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1762' do Flow::Login.sign_in(as: user) - imported_project.reload! # import the project and reload all fields + imported_project # import the project - aggregate_failures do - verify_repository_import - verify_commits_import - verify_labels_import - verify_issues_import - verify_milestones_import - verify_wikis_import - verify_merge_requests_import + Page::Project::Show.perform do |project| + expect(project).to have_content(imported_project.name) + expect(project).to have_content('This test project is used for automated GitHub import by GitLab QA.') end end - - def verify_repository_import - expect(imported_project.api_response).to include( - description: 'A new repo for test', - import_status: 'finished', - import_error: nil - ) - end - - def verify_commits_import - expect(imported_project.commits.length).to eq(20) - end - - def verify_labels_import - labels = imported_project.labels.map { |label| label.slice(:name, :color) } - - expect(labels).to eq( - [ - { name: 'bug', color: '#d73a4a' }, - { name: 'custom new label', color: '#fc8f91' }, - { name: 'documentation', color: '#0075ca' }, - { name: 'duplicate', color: '#cfd3d7' }, - { name: 'enhancement', color: '#a2eeef' }, - { name: 'good first issue', color: '#7057ff' }, - { name: 'help wanted', color: '#008672' }, - { name: 'invalid', color: '#e4e669' }, - { name: 'question', color: '#d876e3' }, - { name: 'wontfix', color: '#ffffff' } - ] - ) - end - - def verify_issues_import - issues = imported_project.issues - - expect(issues.length).to eq(1) - expect(issues.first).to include( - title: 'This is a sample issue', - description: "*Created by: gitlab-qa-github*\n\nThis is a sample first comment", - labels: ['custom new label', 'good first issue', 'help wanted'], - user_notes_count: 1 - ) - end - - def verify_milestones_import - milestones = imported_project.milestones - - expect(milestones.length).to eq(1) - expect(milestones.first).to include(title: 'v1.0', description: nil, state: 'active') - end - - def verify_wikis_import - wikis = imported_project.wikis - - expect(wikis.length).to eq(1) - expect(wikis.first).to include(title: 'Home', format: 'markdown') - end - - def verify_merge_requests_import - merge_requests = imported_project.merge_requests - - expect(merge_requests.length).to eq(1) - expect(merge_requests.first).to include( - title: 'Improve readme', - state: 'opened', - target_branch: 'main', - source_branch: 'improve-readme', - labels: %w[bug documentation], - description: <<~DSC.strip - *Created by: gitlab-qa-github*\n\nThis improves the README file a bit.\r\n\r\nTODO:\r\n\r\n \r\n\r\n- [ ] Do foo\r\n- [ ] Make bar\r\n - [ ] Think about baz - DSC - ) - end end end end diff --git a/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb index d352996f419..d561e5d113c 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb @@ -5,7 +5,7 @@ module QA describe 'Email Notification' do include Support::Api - let(:user) do + let!(:user) do Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) end diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb index 8c0b3da6004..2243437fc71 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb @@ -39,20 +39,23 @@ module QA end context 'when using attachments in comments', :object_storage do - let(:gif_file_name) { 'banana_sample.gif' } + let(:png_file_name) { 'testfile.png' } let(:file_to_attach) do - File.absolute_path(File.join('qa', 'fixtures', 'designs', gif_file_name)) + File.absolute_path(File.join('qa', 'fixtures', 'designs', png_file_name)) end before do Resource::Issue.fabricate_via_api!.visit! end - it 'comments on an issue with an attachment', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1742' do + # The following example is excluded from running in `review-qa-smoke` job + # as it proved to be flaky when running against Review App + # See https://gitlab.com/gitlab-com/www-gitlab-com/-/issues/11568#note_621999351 + it 'comments on an issue with an attachment', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1742', except: { job: 'review-qa-smoke' } do Page::Project::Issue::Show.perform do |show| - show.comment('See attached banana for scale', attachment: file_to_attach) + show.comment('See attached image for scale', attachment: file_to_attach) - expect(show.noteable_note_item.find("img[src$='#{gif_file_name}']")).to be_visible + expect(show.noteable_note_item.find("img[src$='#{png_file_name}']")).to be_visible end end end diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb index dd4b3276687..a2b011bc61c 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Create' do + RSpec.describe 'Create', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/332588', type: :investigating } do describe 'Merge request creation from fork' do # TODO: Please add this back to :smoke suite as soon as https://gitlab.com/gitlab-org/gitlab/-/issues/332588 is addressed it 'can merge feature branch fork to mainline', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1701' do diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb index 3574cdbe4ac..c05a3610b99 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb @@ -19,7 +19,7 @@ module QA Flow::Login.sign_in end - it 'can be reverted', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1745' do + it 'can be reverted', :can_use_large_setup, testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1745' do revertable_merge_request.visit! Page::MergeRequest::Show.perform do |merge_request| diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb index 67b48d254ac..41fc20cfa5c 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb @@ -8,7 +8,7 @@ module QA access_token = Resource::PersonalAccessToken.fabricate!.token - user = Resource::User.new.tap do |user| + user = Resource::User.init do |user| user.username = Runtime::User.username user.password = access_token end diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb new file mode 100644 index 00000000000..bb9b5feed2e --- /dev/null +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_branch_switcher_spec.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Verify' do + describe 'Pipeline editor', :requires_admin do + let(:project) do + Resource::Project.fabricate_via_api! do |project| + project.name = 'pipeline-editor-project' + end + end + + let!(:commit) do + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files( + [ + { + file_path: '.gitlab-ci.yml', + content: default_file_content + } + ] + ) + end + end + + let!(:production_push) do + Resource::Repository::Push.fabricate! do |push| + push.repository_http_uri = project.repository_http_location.uri + push.branch_name = 'production' + push.file_name = '.gitlab-ci.yml' + push.file_content = production_file_content + end + end + + let(:default_file_content) do + <<~YAML + stages: + - test + + initialize: + stage: test + script: + - echo "initialized in #{project.default_branch}" + YAML + end + + let(:production_file_content) do + <<~YAML + stages: + - test + + initialize: + stage: test + script: + - echo "initialized in production" + YAML + end + + before do + Runtime::Feature.enable(:pipeline_editor_branch_switcher) + Flow::Login.sign_in + project.visit! + Page::Project::Menu.perform(&:go_to_pipeline_editor) + end + + after do + Runtime::Feature.disable(:pipeline_editor_branch_switcher) + project.remove_via_api! + Page::Main::Menu.perform(&:sign_out) + end + + it 'can switch branches and target branch field updates accordingly', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1856' do + Page::Project::PipelineEditor::Show.perform do |show| + expect(show).to have_branch_selector_button + + show.click_branch_selector_button + show.select_branch_from_dropdown(production_push.branch_name) + + expect(show.target_branch_name).to eq(production_push.branch_name) + + show.click_branch_selector_button + show.select_branch_from_dropdown(project.default_branch) + + expect(show.target_branch_name).to eq(project.default_branch) + end + end + end + end +end diff --git a/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb index d6d8729114d..07484feb686 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/testing/view_code_coverage_spec.rb @@ -40,7 +40,7 @@ module QA Page::MergeRequest::Show.perform do |mr_widget| Support::Retrier.retry_until(max_attempts: 5, sleep_interval: 5) do - mr_widget.has_pipeline_status?(/Pipeline #\d+ passed/) + mr_widget.has_pipeline_status?('passed') end expect(mr_widget).to have_content('Test coverage 66.67%') end diff --git a/qa/qa/specs/features/browser_ui/5_package/composer_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/composer_registry_spec.rb index 2489545782a..61c71b062ae 100644 --- a/qa/qa/specs/features/browser_ui/5_package/composer_registry_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/composer_registry_spec.rb @@ -3,7 +3,7 @@ require 'securerandom' module QA - RSpec.describe 'Package', :orchestrated, :packages do + RSpec.describe 'Package', :orchestrated, :packages, :object_storage do describe 'Composer Repository' do include Runtime::Fixtures @@ -14,7 +14,7 @@ module QA end let(:package) do - Resource::Package.new.tap do |package| + Resource::Package.init do |package| package.name = "my_package-#{SecureRandom.hex(4)}" package.project = project end diff --git a/qa/qa/specs/features/browser_ui/5_package/conan_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/conan_repository_spec.rb index a1e2eb1046c..668a1524b1c 100644 --- a/qa/qa/specs/features/browser_ui/5_package/conan_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/conan_repository_spec.rb @@ -1,7 +1,11 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :orchestrated, :packages do + RSpec.describe 'Package', :orchestrated, :packages, :object_storage, quarantine: { + only: { job: 'object_storage' }, + issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/335981', + type: :bug + } do describe 'Conan Repository' do include Runtime::Fixtures @@ -12,7 +16,7 @@ module QA end let(:package) do - Resource::Package.new.tap do |package| + Resource::Package.init do |package| package.name = 'conantest' package.project = project end diff --git a/qa/qa/specs/features/browser_ui/5_package/container_registry_omnibus_spec.rb b/qa/qa/specs/features/browser_ui/5_package/container_registry_omnibus_spec.rb new file mode 100644 index 00000000000..4b7669810ec --- /dev/null +++ b/qa/qa/specs/features/browser_ui/5_package/container_registry_omnibus_spec.rb @@ -0,0 +1,88 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Package', :registry, :orchestrated do + describe 'Self-managed Container Registry' do + let(:project) do + Resource::Project.fabricate_via_api! do |project| + project.name = 'project-with-registry' + project.template_name = 'express' + end + end + + let!(:runner) do + Resource::Runner.fabricate! do |runner| + runner.name = "qa-runner-#{Time.now.to_i}" + runner.tags = ["runner-for-#{project.name}"] + runner.executor = :docker + runner.project = project + end + end + + before do + Flow::Login.sign_in + project.visit! + end + + after do + runner.remove_via_api! + end + + it "pushes image and deletes tag", testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1743' do + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files([{ + file_path: '.gitlab-ci.yml', + content: + <<~YAML + build: + image: docker:19.03.12 + stage: build + services: + - name: docker:19.03.12-dind + command: + - /bin/sh + - -c + - | + apk add --no-cache openssl + true | openssl s_client -showcerts -connect gitlab.test:5050 > /usr/local/share/ca-certificates/gitlab.test.crt + update-ca-certificates + dockerd-entrypoint.sh || exit + variables: + IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG + script: + - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD gitlab.test:5050 + - docker build -t $IMAGE_TAG . + - docker push $IMAGE_TAG + tags: + - "runner-for-#{project.name}" + YAML + }]) + end + + Flow::Pipeline.visit_latest_pipeline + + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('build') + end + + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + end + + Page::Project::Menu.perform(&:go_to_container_registry) + + Page::Project::Registry::Show.perform do |registry| + expect(registry).to have_registry_repository(project.path_with_namespace) + + registry.click_on_image(project.path_with_namespace) + expect(registry).to have_tag('master') + + registry.click_delete + expect(registry).not_to have_tag('master') + end + end + end + end +end diff --git a/qa/qa/specs/features/browser_ui/5_package/generic_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/generic_repository_spec.rb index bbf8ea8c05e..ef5965b29e5 100644 --- a/qa/qa/specs/features/browser_ui/5_package/generic_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/generic_repository_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :orchestrated, :packages do + RSpec.describe 'Package', :orchestrated, :packages, :object_storage do describe 'Generic Repository' do let(:project) do Resource::Project.fabricate_via_api! do |project| @@ -10,7 +10,7 @@ module QA end let(:package) do - Resource::Package.new.tap do |package| + Resource::Package.init do |package| package.name = "my_package" package.project = project end diff --git a/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb index 4d4f981f021..32a0670e342 100644 --- a/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/maven_gradle_repository_spec.rb @@ -1,41 +1,47 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :orchestrated, :packages do + RSpec.describe 'Package', :orchestrated, :packages, :object_storage do describe 'Maven Repository with Gradle' do + using RSpec::Parameterized::TableSyntax include Runtime::Fixtures let(:group_id) { 'com.gitlab.qa' } let(:artifact_id) { 'maven_gradle' } let(:package_name) { "#{group_id}/#{artifact_id}".tr('.', '/') } - let(:auth_token) do - unless Page::Main::Menu.perform(&:signed_in?) - Flow::Login.sign_in - end + let(:package_version) { '1.3.7' } - Resource::PersonalAccessToken.fabricate!.token - end + let(:personal_access_token) { Runtime::Env.personal_access_token } - let(:project) do + let(:package_project) do Resource::Project.fabricate_via_api! do |project| project.name = 'maven-with-gradle-project' project.initialize_with_readme = true + project.visibility = :private + end + end + + let(:client_project) do + Resource::Project.fabricate_via_api! do |client_project| + client_project.name = 'gradle_client' + client_project.initialize_with_readme = true + client_project.group = package_project.group end end let(:package) do - Resource::Package.new.tap do |package| + Resource::Package.init do |package| package.name = package_name - package.project = project + package.project = package_project end end - let!(:runner) do + let(:runner) do Resource::Runner.fabricate! do |runner| runner.name = "qa-runner-#{Time.now.to_i}" - runner.tags = ["runner-for-#{project.name}"] + runner.tags = ["runner-for-#{package_project.group.name}"] runner.executor = :docker - runner.project = project + runner.token = package_project.group.runners_token end end @@ -44,87 +50,200 @@ module QA "#{uri.scheme}://#{uri.host}:#{uri.port}" end + let(:project_deploy_token) do + Resource::DeployToken.fabricate_via_browser_ui! do |deploy_token| + deploy_token.name = 'maven-with-gradle-deploy-token' + deploy_token.project = package_project + end + end + + let(:package_gitlab_ci_file) do + { + file_path: '.gitlab-ci.yml', + content: + <<~YAML + deploy: + image: gradle:6.5-jdk11 + script: + - 'gradle publish' + only: + - "#{package_project.default_branch}" + tags: + - "runner-for-#{package_project.group.name}" + YAML + } + end + + let(:package_build_gradle_file) do + { + file_path: 'build.gradle', + content: + <<~EOF + plugins { + id 'java' + id 'maven-publish' + } + + publishing { + publications { + library(MavenPublication) { + groupId '#{group_id}' + artifactId '#{artifact_id}' + version '#{package_version}' + from components.java + } + } + repositories { + maven { + url "#{gitlab_address_with_port}/api/v4/projects/#{package_project.id}/packages/maven" + credentials(HttpHeaderCredentials) { + name = "Private-Token" + value = "#{personal_access_token}" + } + authentication { + header(HttpHeaderAuthentication) + } + } + } + } + EOF + } + end + + let(:client_gitlab_ci_file) do + { + file_path: '.gitlab-ci.yml', + content: + <<~YAML + build: + image: gradle:6.5-jdk11 + script: + - 'gradle build' + only: + - "#{client_project.default_branch}" + tags: + - "runner-for-#{client_project.group.name}" + YAML + } + end + + before do + Flow::Login.sign_in_unless_signed_in + runner + end + after do runner.remove_via_api! package.remove_via_api! + package_project.remove_via_api! + client_project.remove_via_api! end - it 'publishes a maven package via gradle', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1074' do - Resource::Repository::Commit.fabricate_via_api! do |commit| - commit.project = project - commit.commit_message = 'Add .gitlab-ci.yml' - commit.add_files([{ - file_path: '.gitlab-ci.yml', - content: - <<~YAML - deploy: - image: gradle:6.5-jdk11 - script: - - 'gradle publish' - only: - - "#{project.default_branch}" - tags: - - "runner-for-#{project.name}" - YAML - }, - { - file_path: 'build.gradle', - content: - <<~EOF - plugins { - id 'java' - id 'maven-publish' - } - - publishing { - publications { - library(MavenPublication) { - groupId '#{group_id}' - artifactId '#{artifact_id}' - from components.java - } - } - repositories { - maven { - url "#{gitlab_address_with_port}/api/v4/projects/#{project.id}/packages/maven" - credentials(HttpHeaderCredentials) { - name = "Private-Token" - value = "#{auth_token}" - } - authentication { - header(HttpHeaderAuthentication) - } - } - } - } - EOF - }]) - end - - project.visit! - Flow::Pipeline.visit_latest_pipeline + where(:authentication_token_type, :maven_header_name) do + :personal_access_token | 'Private-Token' + :ci_job_token | 'Job-Token' + :project_deploy_token | 'Deploy-Token' + end - Page::Project::Pipeline::Show.perform do |pipeline| - pipeline.click_job('deploy') + with_them do + let(:token) do + case authentication_token_type + when :personal_access_token + "\"#{personal_access_token}\"" + when :ci_job_token + 'System.getenv("CI_JOB_TOKEN")' + when :project_deploy_token + "\"#{project_deploy_token.password}\"" + end end - Page::Project::Job::Show.perform do |job| - expect(job).to be_successful(timeout: 800) + let(:client_build_gradle_file) do + { + file_path: 'build.gradle', + content: + <<~EOF + plugins { + id 'java' + id 'application' + } + + repositories { + jcenter() + maven { + url "#{gitlab_address_with_port}/api/v4/projects/#{package_project.id}/packages/maven" + name "GitLab" + credentials(HttpHeaderCredentials) { + name = '#{maven_header_name}' + value = #{token} + } + authentication { + header(HttpHeaderAuthentication) + } + } + } + + dependencies { + implementation group: '#{group_id}', name: '#{artifact_id}', version: '#{package_version}' + testImplementation 'junit:junit:4.12' + } + + application { + mainClassName = 'gradle_maven_app.App' + } + EOF + } end - Page::Project::Menu.perform(&:click_packages_link) + it "pushes and pulls a maven package via gradle using #{params[:authentication_token_type]}", testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1074' do + # pushing + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = package_project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files([package_gitlab_ci_file, package_build_gradle_file]) + end - Page::Project::Packages::Index.perform do |index| - expect(index).to have_package(package_name) + package_project.visit! - index.click_package(package_name) - end + Flow::Pipeline.visit_latest_pipeline + + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('deploy') + end + + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + end + + Page::Project::Menu.perform(&:click_packages_link) + + Page::Project::Packages::Index.perform do |index| + expect(index).to have_package(package_name) + + index.click_package(package_name) + end + + Page::Project::Packages::Show.perform do |show| + expect(show).to have_package_info(package_name, package_version) + end + + # pulling + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = client_project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files([client_gitlab_ci_file, client_build_gradle_file]) + end + + client_project.visit! + + Flow::Pipeline.visit_latest_pipeline - Page::Project::Packages::Show.perform(&:click_delete) + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('build') + end - Page::Project::Packages::Index.perform do |index| - expect(index).to have_content("Package deleted successfully") - expect(index).not_to have_package(package_name) + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + end end end end diff --git a/qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb index 9c00f1f6d17..fb92616ffc5 100644 --- a/qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/maven_repository_spec.rb @@ -3,7 +3,7 @@ require 'securerandom' module QA - RSpec.describe 'Package', :orchestrated, :packages, :reliable do + RSpec.describe 'Package', :orchestrated, :packages, :reliable, :object_storage do describe 'Maven Repository' do include Runtime::Fixtures @@ -33,7 +33,7 @@ module QA end let(:package) do - Resource::Package.new.tap do |package| + Resource::Package.init do |package| package.name = package_name package.project = project end diff --git a/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb index c4bfaacca11..2322d18a9ba 100644 --- a/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/npm_registry_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :orchestrated, :packages, :reliable do + RSpec.describe 'Package', :orchestrated, :packages, :reliable, :object_storage do describe 'npm registry' do include Runtime::Fixtures @@ -50,7 +50,7 @@ module QA stages: - deploy - + deploy: stage: deploy script: @@ -72,7 +72,7 @@ module QA stages: - install - + install: stage: install script: @@ -120,7 +120,7 @@ module QA end let(:package) do - Resource::Package.new.tap do |package| + Resource::Package.init do |package| package.name = "@#{registry_scope}/#{project.name}" package.project = project end diff --git a/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb index daf41f1c6ab..1f62b285798 100644 --- a/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/nuget_repository_spec.rb @@ -3,7 +3,7 @@ require 'securerandom' module QA - RSpec.describe 'Package', :orchestrated, :packages do + RSpec.describe 'Package', :orchestrated, :packages, :object_storage do describe 'NuGet Repository' do include Runtime::Fixtures let(:project) do @@ -14,7 +14,7 @@ module QA end let(:package) do - Resource::Package.new.tap do |package| + Resource::Package.init do |package| package.name = "dotnetcore-#{SecureRandom.hex(8)}" package.project = project end diff --git a/qa/qa/specs/features/browser_ui/5_package/online_garbage_collection_spec.rb b/qa/qa/specs/features/browser_ui/5_package/online_garbage_collection_spec.rb new file mode 100644 index 00000000000..65fc12545b7 --- /dev/null +++ b/qa/qa/specs/features/browser_ui/5_package/online_garbage_collection_spec.rb @@ -0,0 +1,108 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Package' do + describe 'Container Registry Online Garbage Collection', :registry_gc, only: { subdomain: %i[pre] } do + let(:group) { Resource::Group.fabricate_via_api! } + + let(:imported_project) do + Resource::ProjectImportedFromURL.fabricate_via_browser_ui! do |project| + project.name = 'container-registry' + project.group = group + project.gitlab_repository_path = 'https://gitlab.com/gitlab-org/container-registry.git' + end + end + + let!(:gitlab_ci_yaml) do + <<~YAML + variables: + GOPATH: $CI_PROJECT_DIR/.go + BUILD_CACHE: $CI_PROJECT_DIR/.online-gc-tester + STAGE_ONE_VALIDATION_DELAY: "6m" + STAGE_TWO_VALIDATION_DELAY: "12m" + STAGE_THREE_VALIDATION_DELAY: "6m" + STAGE_FOUR_VALIDATION_DELAY: "12m" + STAGE_FIVE_VALIDATION_DELAY: "12m" + + stages: + - generate + - build + - test + + .base: &base + image: docker:19 + services: + - docker:19-dind + variables: + DOCKER_HOST: tcp://docker:2376 + DOCKER_TLS_CERTDIR: "/certs" + DOCKER_TLS_VERIFY: 1 + DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client" + before_script: + - until docker info; do sleep 1; done + - mkdir -p $GOPATH + - mkdir -p $BUILD_CACHE + - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY + + test: + stage: generate + extends: .base + script: + - apk add go make git + - make binaries + - ./bin/online-gc-tester generate --base-dir=$BUILD_CACHE + - ./bin/online-gc-tester build --base-dir=$BUILD_CACHE + - ./bin/online-gc-tester push --base-dir=$BUILD_CACHE + - ./bin/online-gc-tester pull --base-dir=$BUILD_CACHE + - ./bin/online-gc-tester test --base-dir=$BUILD_CACHE --stage=1 --delay=$STAGE_ONE_VALIDATION_DELAY + - ./bin/online-gc-tester test --base-dir=$BUILD_CACHE --stage=2 --delay=$STAGE_TWO_VALIDATION_DELAY + - ./bin/online-gc-tester test --base-dir=$BUILD_CACHE --stage=3 --delay=$STAGE_THREE_VALIDATION_DELAY + - ./bin/online-gc-tester test --base-dir=$BUILD_CACHE --stage=4 --delay=$STAGE_FOUR_VALIDATION_DELAY + - ./bin/online-gc-tester test --base-dir=$BUILD_CACHE --stage=5 --delay=$STAGE_FIVE_VALIDATION_DELAY + timeout: 1h 30m + YAML + end + + before do + Flow::Login.sign_in + + imported_project + + Page::Project::Menu.perform(&:go_to_repository_settings) + + Page::Project::Settings::Repository.perform do |setting| + setting.expand_default_branch + end + + Page::Project::Settings::DefaultBranch.perform do |setting| + setting.set_default_branch('online-gc-test-builder-poc') + setting.click_save_changes_button + end + + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = imported_project + commit.branch = 'online-gc-test-builder-poc' + commit.commit_message = 'Update .gitlab-ci.yml' + commit.update_files([{ + file_path: '.gitlab-ci.yml', + content: gitlab_ci_yaml + }]) + end + end + + it 'runs the online garbage collector tool', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1854' do + imported_project.visit! + + Flow::Pipeline.visit_latest_pipeline + + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('test') + end + + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 3900) + end + end + end + end +end diff --git a/qa/qa/specs/features/browser_ui/5_package/pypi_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/pypi_repository_spec.rb index fb29af43da6..a9034174cab 100644 --- a/qa/qa/specs/features/browser_ui/5_package/pypi_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/pypi_repository_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :orchestrated, :packages do + RSpec.describe 'Package', :orchestrated, :packages, :object_storage do describe 'PyPI Repository' do include Runtime::Fixtures let(:project) do @@ -11,7 +11,7 @@ module QA end let(:package) do - Resource::Package.new.tap do |package| + Resource::Package.init do |package| package.name = 'mypypipackage' package.project = project end diff --git a/qa/qa/specs/features/browser_ui/5_package/rubygems_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/rubygems_registry_spec.rb index 5d15885cd67..530a3243766 100644 --- a/qa/qa/specs/features/browser_ui/5_package/rubygems_registry_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/rubygems_registry_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :orchestrated, :requires_admin, :packages do + RSpec.describe 'Package', :orchestrated, :requires_admin, :packages, :object_storage do describe 'RubyGems Repository' do include Runtime::Fixtures @@ -12,7 +12,7 @@ module QA end let(:package) do - Resource::Package.new.tap do |package| + Resource::Package.init do |package| package.name = 'mygem' package.project = project end |