diff options
Diffstat (limited to 'qa/qa/specs/features')
142 files changed, 998 insertions, 1440 deletions
diff --git a/qa/qa/specs/features/api/12_systems/gitaly/changing_repository_storage_spec.rb b/qa/qa/specs/features/api/12_systems/gitaly/changing_repository_storage_spec.rb index 425ab0fa162..6990aa0e08e 100644 --- a/qa/qa/specs/features/api/12_systems/gitaly/changing_repository_storage_spec.rb +++ b/qa/qa/specs/features/api/12_systems/gitaly/changing_repository_storage_spec.rb @@ -34,11 +34,7 @@ module QA let(:source_storage) { { type: :gitaly, name: 'default' } } let(:destination_storage) { { type: :gitaly, name: QA::Runtime::Env.additional_repository_storage } } let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'repo-storage-move-status' - project.initialize_with_readme = true - project.api_client = Runtime::API::Client.as_admin - end + create(:project, :with_readme, name: 'repo-storage-move-status', api_client: Runtime::API::Client.as_admin) end before do @@ -56,12 +52,11 @@ module QA let(:source_storage) { { type: :gitaly, name: QA::Runtime::Env.non_cluster_repository_storage } } let(:destination_storage) { { type: :praefect, name: QA::Runtime::Env.praefect_repository_storage } } let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'repo-storage-move' - project.initialize_with_readme = true - project.repository_storage = source_storage[:name] - project.api_client = Runtime::API::Client.as_admin - end + create(:project, + :with_readme, + name: 'repo-storage-move', + repository_storage: source_storage[:name], + api_client: Runtime::API::Client.as_admin) end before do @@ -79,12 +74,11 @@ module QA let(:source_storage) { { type: :praefect, name: QA::Runtime::Env.praefect_repository_storage } } let(:destination_storage) { { type: :gitaly, name: QA::Runtime::Env.non_cluster_repository_storage } } let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'repo-storage-move' - project.initialize_with_readme = true - project.repository_storage = source_storage[:name] - project.api_client = Runtime::API::Client.as_admin - end + create(:project, + :with_readme, + name: 'repo-storage-move', + repository_storage: source_storage[:name], + api_client: Runtime::API::Client.as_admin) end before do diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_group_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_group_spec.rb index ac85795b2bb..75203584edd 100644 --- a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_group_spec.rb +++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_group_spec.rb @@ -7,11 +7,10 @@ module QA describe "Gitlab migration" do context 'with subgroups and labels' do let(:subgroup) do - Resource::Group.fabricate_via_api! do |group| - group.api_client = source_admin_api_client - group.sandbox = source_group - group.path = "subgroup-for-import-#{SecureRandom.hex(4)}" - end + create(:group, + path: "subgroup-for-import-#{SecureRandom.hex(4)}", + sandbox: source_group, + api_client: source_admin_api_client) end let(:imported_subgroup) do diff --git a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb index 7cbccf9be44..100b50abfdb 100644 --- a/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb +++ b/qa/qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb @@ -13,19 +13,14 @@ module QA # do not use top level group (sandbox) to avoid issues when applying permissions etc. because it will contain # a lot subgroups and projects on live envs - let!(:source_sandbox) do - Resource::Group.fabricate_via_api! do |group| - group.api_client = admin_api_client - end - end + let!(:source_sandbox) { create(:group, api_client: admin_api_client) } let!(:source_group) do - Resource::Group.fabricate_via_api! do |group| - group.api_client = admin_api_client - group.sandbox = source_sandbox - group.path = "source-group-for-import-#{SecureRandom.hex(4)}" - group.avatar = File.new(Runtime::Path.fixture('designs', 'tanuki.jpg'), 'r') - end + create(:group, + api_client: admin_api_client, + sandbox: source_sandbox, + path: "source-group-for-import-#{SecureRandom.hex(4)}", + avatar: File.new(Runtime::Path.fixture('designs', 'tanuki.jpg'), 'r')) end let!(:target_sandbox) { source_sandbox } diff --git a/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb b/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb index eeeb78e17d7..af0eef290f7 100644 --- a/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb +++ b/qa/qa/specs/features/api/1_manage/project_access_token_spec.rb @@ -5,9 +5,7 @@ module QA describe 'Project access token', product_group: :authentication_and_authorization do before(:all) do @project_access_token = QA::Resource::ProjectAccessToken.fabricate_via_api! do |pat| - pat.project = Resource::Project.fabricate_via_api! do |project| - project.initialize_with_readme = true - end + pat.project = create(:project, :with_readme) end @user_api_client = Runtime::API::Client.new(:gitlab, personal_access_token: @project_access_token.token) diff --git a/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb b/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb index 8759c36f43f..578891b2722 100644 --- a/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb +++ b/qa/qa/specs/features/api/1_manage/user_access_termination_spec.rb @@ -13,23 +13,13 @@ module QA @user_api_client = Runtime::API::Client.new(:gitlab, user: @user) - @sandbox = Resource::Sandbox.fabricate! do |sandbox_group| - sandbox_group.path = "sandbox-for-access-termination-#{SecureRandom.hex(4)}" - sandbox_group.api_client = admin_api_client - end + @sandbox = create(:sandbox, path: "sandbox-for-access-termination-#{SecureRandom.hex(4)}", api_client: admin_api_client) - group = QA::Resource::Group.fabricate_via_api! do |group| - group.path = "group-to-test-access-termination-#{SecureRandom.hex(8)}" - group.sandbox = @sandbox - end + group = create(:group, path: "group-to-test-access-termination-#{SecureRandom.hex(8)}", sandbox: @sandbox) @sandbox.add_member(@user) - @project = Resource::Project.fabricate_via_api! do |project| - project.group = group - project.name = "project-for-user-group-access-termination" - project.initialize_with_readme = true - end + @project = create(:project, :with_readme, name: 'project-for-user-group-access-termination', group: group) end context 'after parent group membership termination' do diff --git a/qa/qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb b/qa/qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb index fc00d851087..1edf1d942be 100644 --- a/qa/qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb +++ b/qa/qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb @@ -2,7 +2,7 @@ module QA RSpec.describe 'Create' do - describe 'Merge request push options', product_group: :code_review do + describe 'Merge request push options', :reliable, product_group: :code_review do # If run locally on GDK, push options need to be enabled on the host with the following command: # # git config --global receive.advertisepushoptions true @@ -10,11 +10,7 @@ module QA let(:branch) { "push-options-test-#{SecureRandom.hex(8)}" } let(:title) { "MR push options test #{SecureRandom.hex(8)}" } let(:commit_message) { 'Add README.md' } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme) } def create_new_mr_via_push Resource::Repository::ProjectPush.fabricate! do |push| diff --git a/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb b/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb index 9fed6787ade..5c4fc8cef56 100644 --- a/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb +++ b/qa/qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb @@ -10,12 +10,7 @@ module QA let(:branch) { "push-options-test-#{SecureRandom.hex(8)}" } let(:title) { "MR push options test #{SecureRandom.hex(8)}" } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'merge-request-push-options' - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'merge-request-push-options') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| @@ -74,7 +69,14 @@ module QA end end - it 'merges when pipeline succeeds', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347842' do + it( + 'merges when pipeline succeeds', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347842', + quarantine: { + type: :flaky, + issue: "https://gitlab.com/gitlab-org/gitlab/-/issues/346425" + } + ) do Resource::Repository::Commit.fabricate_via_api! do |commit| commit.project = project commit.commit_message = 'Add .gitlab-ci.yml' diff --git a/qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb b/qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb index 11328c2f517..9c27793a52d 100644 --- a/qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb +++ b/qa/qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb @@ -2,20 +2,14 @@ module QA RSpec.describe 'Create' do - describe 'Merge request push options', product_group: :code_review do + describe 'Merge request push options', :reliable, product_group: :code_review do # If run locally on GDK, push options need to be enabled on the host with the following command: # # git config --global receive.advertisepushoptions true let(:branch) { "push-options-test-#{SecureRandom.hex(8)}" } let(:title) { "MR push options test #{SecureRandom.hex(8)}" } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'merge-request-push-options' - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'merge-request-push-options') } it 'removes the source branch', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347841' do Resource::Repository::ProjectPush.fabricate! do |push| diff --git a/qa/qa/specs/features/api/3_create/merge_request/push_options_target_branch_spec.rb b/qa/qa/specs/features/api/3_create/merge_request/push_options_target_branch_spec.rb index eb7d3da0f97..1a5b6f88f4f 100644 --- a/qa/qa/specs/features/api/3_create/merge_request/push_options_target_branch_spec.rb +++ b/qa/qa/specs/features/api/3_create/merge_request/push_options_target_branch_spec.rb @@ -2,19 +2,14 @@ module QA RSpec.describe 'Create' do - describe 'Merge request push options', product_group: :code_review do + describe 'Merge request push options', :reliable, product_group: :code_review do # If run locally on GDK, push options need to be enabled on the host with the following command: # # git config --global receive.advertisepushoptions true let(:title) { "MR push options test #{SecureRandom.hex(8)}" } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'merge-request-push-options' - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'merge-request-push-options') } it 'sets a target branch', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347726' do target_branch = "push-options-test-target-#{SecureRandom.hex(8)}" diff --git a/qa/qa/specs/features/api/3_create/merge_request/push_options_title_description_spec.rb b/qa/qa/specs/features/api/3_create/merge_request/push_options_title_description_spec.rb index dd297f47975..4e8a5a426d4 100644 --- a/qa/qa/specs/features/api/3_create/merge_request/push_options_title_description_spec.rb +++ b/qa/qa/specs/features/api/3_create/merge_request/push_options_title_description_spec.rb @@ -2,17 +2,12 @@ module QA RSpec.describe 'Create' do - describe 'Merge request push options', product_group: :code_review do + describe 'Merge request push options', :reliable, product_group: :code_review do # If run locally on GDK, push options need to be enabled on the host with the following command: # # git config --global receive.advertisepushoptions true - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'merge-request-push-options' - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'merge-request-push-options') } it 'sets title and description', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347844' do description = "This is a test of MR push options" diff --git a/qa/qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb b/qa/qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb index f69a8a4dfa5..2f7cef2112e 100644 --- a/qa/qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb +++ b/qa/qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb @@ -2,12 +2,7 @@ module QA RSpec.describe 'Create' do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-qa-test' - project.description = 'project for qa test' - end - end + let(:project) { create(:project, name: 'project-qa-test', description: 'project for qa test') } describe 'Create, Retrieve and Delete branches via API', :requires_admin, product_group: :source_code do created_branch = 'create-branch' diff --git a/qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb b/qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb index 4ee436a597a..74d1c9e3e94 100644 --- a/qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb +++ b/qa/qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb @@ -3,12 +3,7 @@ module QA RSpec.describe 'Create' do describe 'Create a new project from a template', product_group: :source_code do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'templated-project' - project.template_name = 'dotnetcore' - end - end + let(:project) { create(:project, name: 'templated-project', template_name: 'dotnetcore') } it 'commits via the api', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/357234' do expect do diff --git a/qa/qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb b/qa/qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb index 123a4a625ab..a512bb76560 100644 --- a/qa/qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb +++ b/qa/qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb @@ -12,10 +12,7 @@ module QA end it 'sets the default branch name for a new project', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347837' do - project = Resource::Project.fabricate_via_api! do |project| - project.name = "default-branch-name" - project.initialize_with_readme = true - end + project = create(:project, :with_readme, name: 'default-branch-name') # It takes a moment to create the project. We wait until we # know it exists before we try to clone it @@ -32,7 +29,7 @@ module QA it 'allows a project to be created via the CLI with a different default branch name', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347838' do project_name = "default-branch-name-via-cli-#{SecureRandom.hex(8)}" - group = Resource::Group.fabricate_via_api! + group = create(:group) Git::Repository.perform do |repository| repository.init_repository diff --git a/qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb b/qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb index d72672e2104..87faec86947 100644 --- a/qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb +++ b/qa/qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb @@ -46,12 +46,7 @@ module QA end def create_project(user, api_client, project_name) - project = Resource::Project.fabricate_via_api! do |project| - project.personal_namespace = user.username - project.add_name_uuid = false - project.name = project_name - project.api_client = api_client - end + project = create(:project, name: project_name, api_client: api_client, add_name_uuid: false, personal_namespace: user.username) Resource::Repository::Commit.fabricate_via_api! do |commit| commit.project = project diff --git a/qa/qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb b/qa/qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb index 1d41184df98..df61dd43bb0 100644 --- a/qa/qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb +++ b/qa/qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb @@ -6,12 +6,7 @@ module QA # Tests that a push does not result in multiple changes from repeated PostReceive executions. # One of the consequences would be duplicate push events - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'push-postreceive-idempotent' - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'push-postreceive-idempotent') } after do project&.remove_via_api! diff --git a/qa/qa/specs/features/api/3_create/repository/storage_size_spec.rb b/qa/qa/specs/features/api/3_create/repository/storage_size_spec.rb index 8c7a58be43a..72ce2dda053 100644 --- a/qa/qa/specs/features/api/3_create/repository/storage_size_spec.rb +++ b/qa/qa/specs/features/api/3_create/repository/storage_size_spec.rb @@ -30,9 +30,7 @@ module QA # attempt to detect large differences that could indicate a regression to previous behavior. it 'matches cloned repo usage to reported usage', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/365196' do - project = Resource::Project.fabricate_via_api! do |project| - project.name = project_name - end + project = create(:project, name: project_name) shared_data = SecureRandom.random_bytes(500000) diff --git a/qa/qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb b/qa/qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb index 700cf69da80..d0f1ee66488 100644 --- a/qa/qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb +++ b/qa/qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb @@ -3,11 +3,7 @@ module QA RSpec.describe 'Create' do describe 'Prereceive hook', product_group: :source_code do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme) } context 'when creating a tag for a ref' do context 'when it triggers a prereceive hook configured with a custom error' do diff --git a/qa/qa/specs/features/api/4_verify/cancel_pipeline_when_block_user_spec.rb b/qa/qa/specs/features/api/4_verify/cancel_pipeline_when_block_user_spec.rb index a360c662cf8..5b0e0573016 100644 --- a/qa/qa/specs/features/api/4_verify/cancel_pipeline_when_block_user_spec.rb +++ b/qa/qa/specs/features/api/4_verify/cancel_pipeline_when_block_user_spec.rb @@ -12,11 +12,7 @@ module QA end end - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-for-canceled-schedule' - end - end + let(:project) { create(:project, name: 'project-for-canceled-schedule') } before do project.add_member(user, Resource::Members::AccessLevel::MAINTAINER) diff --git a/qa/qa/specs/features/api/4_verify/file_variable_downstream_pipeline_spec.rb b/qa/qa/specs/features/api/4_verify/file_variable_downstream_pipeline_spec.rb new file mode 100644 index 00000000000..289133b33cc --- /dev/null +++ b/qa/qa/specs/features/api/4_verify/file_variable_downstream_pipeline_spec.rb @@ -0,0 +1,231 @@ +# frozen_string_literal: true + +module QA + RSpec.describe 'Verify', :runner, product_group: :pipeline_security, feature_flag: { + name: 'ci_prevent_file_var_expansion_downstream_pipeline', + scope: :project + } do + describe 'Pipeline with file variables and downstream pipelines' do + let(:random_string) { Faker::Alphanumeric.alphanumeric(number: 8) } + let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" } + let!(:project) { create(:project, name: 'upstream-project-with-file-variables') } + let!(:downstream_project) { create(:project, name: 'downstream-project') } + + let!(:project_runner) do + Resource::ProjectRunner.fabricate! do |runner| + runner.project = project + runner.name = executor + runner.tags = [executor] + end + end + + let!(:downstream_project_runner) do + Resource::ProjectRunner.fabricate! do |runner| + runner.project = downstream_project + runner.name = "#{executor}-downstream" + runner.tags = [executor] + end + end + + let(:add_ci_file) do + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = project + commit.commit_message = 'Add .gitlab-ci.yml and child.yml' + commit.add_files( + [ + { + file_path: '.gitlab-ci.yml', + content: <<~YAML + default: + tags: [#{executor}] + + variables: + EXTRA_ARGS: "-f $TEST_PROJECT_FILE" + DOCKER_REMOTE_ARGS: --tlscacert="$DOCKER_CA_CERT" + EXTRACTED_CRT_FILE: ${DOCKER_CA_CERT}.crt + MY_FILE_VAR: $TEST_PROJECT_FILE + + trigger_child: + trigger: + strategy: depend + include: + - local: child.yml + + trigger_downstream_project: + trigger: + strategy: depend + project: #{downstream_project.path_with_namespace} + + YAML + }, + { + file_path: 'child.yml', + content: <<~YAML + default: + tags: [#{executor}] + + child_job_echo: + script: + - echo "run something $EXTRA_ARGS" + - echo "docker run $DOCKER_REMOTE_ARGS" + - echo "run --output=$EXTRACTED_CRT_FILE" + - echo "Will read private key from $MY_FILE_VAR" + + child_job_cat: + script: + - cat "$MY_FILE_VAR" + - cat "$DOCKER_CA_CERT" + YAML + } + ] + ) + end + end + + let(:add_downstream_project_ci_file) do + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = downstream_project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files( + [ + { + file_path: '.gitlab-ci.yml', + content: <<~YAML + default: + tags: [#{executor}] + + downstream_job_echo: + script: + - echo "run something $EXTRA_ARGS" + - echo "docker run $DOCKER_REMOTE_ARGS" + - echo "run --output=$EXTRACTED_CRT_FILE" + - echo "Will read private key from $MY_FILE_VAR" + + downstream_job_cat: + script: + - cat "$MY_FILE_VAR" + - cat "$DOCKER_CA_CERT" + YAML + } + ] + ) + end + end + + let(:add_project_file_variables) do + { + 'TEST_PROJECT_FILE' => "hello, this is test\n", + 'DOCKER_CA_CERT' => "This is secret\n" + }.each do |file_name, content| + add_file_variable_to_project(project, file_name, content) + end + end + + let(:upstream_pipeline) do + Resource::Pipeline.fabricate_via_api! do |pipeline| + pipeline.project = project + end + end + + def child_pipeline + Resource::Pipeline.fabricate_via_api! do |pipeline| + pipeline.project = project + pipeline.id = upstream_pipeline.downstream_pipeline_id(bridge_name: 'trigger_child') + end + end + + def downstream_project_pipeline + Resource::Pipeline.fabricate_via_api! do |pipeline| + pipeline.project = downstream_project + pipeline.id = upstream_pipeline.downstream_pipeline_id(bridge_name: 'trigger_downstream_project') + end + end + + around do |example| + Runtime::Feature.enable(:ci_prevent_file_var_expansion_downstream_pipeline, project: project) + example.run + Runtime::Feature.disable(:ci_prevent_file_var_expansion_downstream_pipeline, project: project) + end + + before do + add_project_file_variables + add_downstream_project_ci_file + add_ci_file + upstream_pipeline + wait_for_pipelines + end + + after do + project_runner.remove_via_api! + downstream_project_runner.remove_via_api! + end + + it( + 'creates variable with file path in downstream pipelines and can read file variable content', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/416337' + ) do + child_echo_job = Resource::Job.fabricate_via_api! do |job| + job.project = project + job.id = project.job_by_name('child_job_echo')[:id] + end + + child_cat_job = Resource::Job.fabricate_via_api! do |job| + job.project = project + job.id = project.job_by_name('child_job_cat')[:id] + end + + downstream_project_echo_job = Resource::Job.fabricate_via_api! do |job| + job.project = downstream_project + job.id = downstream_project.job_by_name('downstream_job_echo')[:id] + end + + downstream_project_cat_job = Resource::Job.fabricate_via_api! do |job| + job.project = downstream_project + job.id = downstream_project.job_by_name('downstream_job_cat')[:id] + end + + aggregate_failures do + trace = child_echo_job.trace + expect(trace).to include('run something -f', "#{project.name}.tmp/TEST_PROJECT_FILE") + expect(trace).to include('docker run --tlscacert=', "#{project.name}.tmp/DOCKER_CA_CERT") + expect(trace).to include('run --output=', "#{project.name}.tmp/DOCKER_CA_CERT.crt") + expect(trace).to include('Will read private key from', "#{project.name}.tmp/TEST_PROJECT_FILE") + + trace = child_cat_job.trace + expect(trace).to have_content('hello, this is test') + expect(trace).to have_content('This is secret') + + trace = downstream_project_echo_job.trace + expect(trace).to include('run something -f', "#{downstream_project.name}.tmp/TEST_PROJECT_FILE") + expect(trace).to include('docker run --tlscacert=', "#{downstream_project.name}.tmp/DOCKER_CA_CERT") + expect(trace).to include('run --output=', "#{downstream_project.name}.tmp/DOCKER_CA_CERT.crt") + expect(trace).to include('Will read private key from', "#{downstream_project.name}.tmp/TEST_PROJECT_FILE") + + trace = downstream_project_cat_job.trace + expect(trace).to have_content('hello, this is test') + expect(trace).to have_content('This is secret') + end + end + + private + + def add_file_variable_to_project(project, key, value) + Resource::CiVariable.fabricate_via_api! do |ci_variable| + ci_variable.project = project + ci_variable.key = key + ci_variable.value = value + ci_variable.variable_type = 'file' + end + end + + def wait_for_pipelines + Support::Waiter.wait_until(max_duration: 300, sleep_interval: 10) do + upstream_pipeline.reload! + upstream_pipeline.status == 'success' && + child_pipeline.status == 'success' && + downstream_project_pipeline.status == 'success' + end + end + end + end +end diff --git a/qa/qa/specs/features/api/4_verify/file_variable_spec.rb b/qa/qa/specs/features/api/4_verify/file_variable_spec.rb index 2d9deec399c..d7adc1d8454 100644 --- a/qa/qa/specs/features/api/4_verify/file_variable_spec.rb +++ b/qa/qa/specs/features/api/4_verify/file_variable_spec.rb @@ -4,12 +4,7 @@ module QA RSpec.describe 'Verify', :runner, product_group: :pipeline_security do describe 'Pipeline with project file variables' do let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-file-variables' - end - end + let(:project) { create(:project, name: 'project-with-file-variables') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| diff --git a/qa/qa/specs/features/api/5_package/container_registry/saas/container_registry_spec.rb b/qa/qa/specs/features/api/5_package/container_registry/saas/container_registry_spec.rb index 23d8585d07a..d2b1cbd2c95 100644 --- a/qa/qa/specs/features/api/5_package/container_registry/saas/container_registry_spec.rb +++ b/qa/qa/specs/features/api/5_package/container_registry/saas/container_registry_spec.rb @@ -12,11 +12,7 @@ module QA let(:api_client) { Runtime::API::Client.new(:gitlab) } let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-registry-api' - project.template_name = 'express' - project.api_client = api_client - end + create(:project, name: 'project-with-registry-api', template_name: 'express', api_client: api_client) end let!(:runner) do diff --git a/qa/qa/specs/features/api/9_data_stores/user_inherited_access_spec.rb b/qa/qa/specs/features/api/9_data_stores/user_inherited_access_spec.rb index 48e9d3dc164..6f8b6df6658 100644 --- a/qa/qa/specs/features/api/9_data_stores/user_inherited_access_spec.rb +++ b/qa/qa/specs/features/api/9_data_stores/user_inherited_access_spec.rb @@ -5,17 +5,10 @@ module QA describe 'User', :requires_admin, product_group: :tenant_scale do let(:admin_api_client) { Runtime::API::Client.as_admin } - let!(:parent_group) do - QA::Resource::Group.fabricate_via_api! do |group| - group.path = "parent-group-to-test-user-access-#{SecureRandom.hex(8)}" - end - end + let!(:parent_group) { create(:group, path: "parent-group-to-test-user-access-#{SecureRandom.hex(8)}") } let!(:sub_group) do - QA::Resource::Group.fabricate_via_api! do |group| - group.path = "sub-group-to-test-user-access-#{SecureRandom.hex(8)}" - group.sandbox = parent_group - end + create(:group, path: "sub-group-to-test-user-access-#{SecureRandom.hex(8)}", sandbox: parent_group) end context 'when added to parent group' do @@ -30,11 +23,7 @@ module QA end let!(:sub_group_project) do - Resource::Project.fabricate_via_api! do |project| - project.group = sub_group - project.name = "sub-group-project-to-test-user-access" - project.initialize_with_readme = true - end + create(:project, :with_readme, name: 'sub-groupd-project-to-test-user-access', group: sub_group) end before do @@ -106,11 +95,7 @@ module QA context 'when added to sub-group' do let!(:parent_group_project) do - Resource::Project.fabricate_via_api! do |project| - project.group = parent_group - project.name = "parent-group-project-to-test-user-access" - project.initialize_with_readme = true - end + create(:project, :with_readme, name: 'parent-group-project-to-test-user-access', group: parent_group) end let!(:sub_group_user) do diff --git a/qa/qa/specs/features/browser_ui/1_manage/integrations/jenkins/jenkins_build_status_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/integrations/jenkins/jenkins_build_status_spec.rb index 63c57ad455b..f40d953acd2 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/integrations/jenkins/jenkins_build_status_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/integrations/jenkins/jenkins_build_status_spec.rb @@ -15,18 +15,9 @@ module QA end let(:jenkins_project_name) { "gitlab_jenkins_#{SecureRandom.hex(5)}" } - let(:connection_name) { 'gitlab-connection' } - let(:project_name) { "project_with_jenkins_#{SecureRandom.hex(4)}" } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = project_name - project.initialize_with_readme = true - project.auto_devops_enabled = false - end - end + let(:project) { create(:project, :with_readme, name: project_name) } let(:access_token) do Runtime::Env.personal_access_token ||= fabricate_access_token diff --git a/qa/qa/specs/features/browser_ui/1_manage/integrations/jira/jira_basic_integration_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/integrations/jira/jira_basic_integration_spec.rb index 1bd819ad87d..f336a0d5d82 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/integrations/jira/jira_basic_integration_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/integrations/jira/jira_basic_integration_spec.rb @@ -6,11 +6,7 @@ module QA describe 'Jira integration', :jira, :orchestrated, :requires_admin, product_group: :import_and_integrate do let(:jira_project_key) { 'JITP' } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = "project_with_jira_integration" - end - end + let(:project) { create(:project, name: 'project_with_jira_integration') } before do page.visit Vendor::Jira::JiraAPI.perform(&:base_url) diff --git a/qa/qa/specs/features/browser_ui/1_manage/integrations/jira/jira_issue_import_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/integrations/jira/jira_issue_import_spec.rb index 02224406e6d..15b6d74c7f1 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/integrations/jira/jira_issue_import_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/integrations/jira/jira_issue_import_spec.rb @@ -8,11 +8,7 @@ module QA let(:jira_issue_description) { "This issue is for testing importing Jira issues to GitLab." } let(:jira_issue_label_1) { "jira-import::#{jira_project_key}-1" } let(:jira_issue_label_2) { "QA" } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = "jira_issue_import" - end - end + let(:project) { create(:project, name: "jira_issue_import") } it 'imports issues from Jira', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347966' do set_up_jira_integration diff --git a/qa/qa/specs/features/browser_ui/1_manage/integrations/pipeline_status_emails_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/integrations/pipeline_status_emails_spec.rb index 1ea19144a74..c19ebd9f7a7 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/integrations/pipeline_status_emails_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/integrations/pipeline_status_emails_spec.rb @@ -28,12 +28,7 @@ module QA describe 'Pipeline status emails' do let(:executor) { "qa-runner-#{Time.now.to_i}" } let(:emails) { %w[foo@bar.com baz@buzz.com] } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'pipeline-status-project' - end - end + let(:project) { create(:project, name: 'pipeline-status-project') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| diff --git a/qa/qa/specs/features/browser_ui/1_manage/integrations/slash_commands_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/integrations/slash_commands_spec.rb index f5e33cb5b1e..99be4e87251 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/integrations/slash_commands_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/integrations/slash_commands_spec.rb @@ -10,13 +10,7 @@ module QA # state to be used in the GitLab API let(:project_name) { "project_with_slack" } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = project_name - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: project_name) } before(:context) do Runtime::Env.require_slack_env! @@ -101,12 +95,7 @@ module QA end context 'with target project' do - let(:target) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'target_slack_project' - project.initialize_with_readme = true - end - end + let(:target) { create(:project, :with_readme, name: 'target_slack_project') } after do target.remove_via_api! diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb index 0f3d6a104a7..f2582d47723 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/login/2fa_recovery_spec.rb @@ -23,11 +23,7 @@ module QA end let(:group) do - QA::Resource::Group.fabricate_via_api! do |group| - group.sandbox = sandbox_group - group.api_client = owner_api_client - group.require_two_factor_authentication = true - end + create(:group, :require_2fa, sandbox: sandbox_group, api_client: owner_api_client) end before do diff --git a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb index 84664cb8b94..89f15759b54 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/login/log_in_with_2fa_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Manage', :requires_admin, :skip_live_env, product_group: :authentication_and_authorization do + RSpec.describe 'Manage', :requires_admin, product_group: :authentication_and_authorization do describe '2FA' do let(:admin_api_client) { Runtime::API::Client.as_admin } let(:owner_api_client) { Runtime::API::Client.new(:gitlab, user: owner_user) } @@ -14,6 +14,7 @@ module QA end let(:sandbox_group) do + Flow::Login.sign_in(as: owner_user) Resource::Sandbox.fabricate! do |sandbox_group| sandbox_group.path = "gitlab-qa-2fa-sandbox-group-#{SecureRandom.hex(8)}" sandbox_group.api_client = owner_api_client @@ -21,11 +22,7 @@ module QA end let(:group) do - QA::Resource::Group.fabricate_via_api! do |group| - group.sandbox = sandbox_group - group.api_client = owner_api_client - group.path = "group-with-2fa-#{SecureRandom.hex(8)}" - end + create(:group, sandbox: sandbox_group, api_client: owner_api_client, path: "group-with-2fa-#{SecureRandom.hex(8)}") end let(:developer_user) do @@ -46,7 +43,7 @@ module QA testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347931', quarantine: { type: :bug, - only: { condition: -> { !QA::Runtime::Env.super_sidebar_enabled? } }, + only: { condition: -> { QA::Runtime::Env.super_sidebar_enabled? } }, issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/409336' } ) do 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 1a53fda4cdb..afc7e8202e2 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 @@ -9,11 +9,7 @@ module QA Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) end - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'email-notification-test' - end - end + let(:project) { create(:project, name: 'email-notification-test') } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb index 2f177d12389..5d8f9f7d7b3 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb @@ -10,11 +10,7 @@ module QA end end - let!(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'xss-test-for-mentions-project' - end - end + let!(:project) { create(:project, name: 'xss-test-for-mentions-project') } describe 'check xss occurence in @mentions in issues', :requires_admin do before do diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb index f7dc9157275..2fe88c543de 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb @@ -6,7 +6,7 @@ module QA before do Flow::Login.sign_in - Resource::Issue.fabricate_via_api!.visit! + create(:issue).visit! end it 'comments on an issue and edits the comment', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347978' do diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/custom_issue_template_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/custom_issue_template_spec.rb index bad312bb392..c489a61ca2a 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/issue/custom_issue_template_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/issue/custom_issue_template_spec.rb @@ -7,10 +7,7 @@ module QA let(:template_content) { 'This is a custom issue template test' } let(:template_project) do - Resource::Project.fabricate_via_api! do |project| - project.name = "custom-issue-template-project" - project.initialize_with_readme = true - end + create(:project, :with_readme, name: 'custom-issue-template-project') end before do diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/export_as_csv_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/export_as_csv_spec.rb index 5e989cdb03f..45c7f307834 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/issue/export_as_csv_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/issue/export_as_csv_spec.rb @@ -3,11 +3,7 @@ module QA RSpec.describe 'Plan', :reliable, product_group: :project_management do describe 'Issues list' do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-to-test-export-issues-as-csv' - end - end + let(:project) { create(:project, name: 'project-to-test-export-issues-as-csv') } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb index 060e52276a9..d282b0dbbd5 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb @@ -5,11 +5,7 @@ module QA describe 'Assignees' do let(:user1) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) } let(:user2) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2) } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-to-test-assignees' - end - end + let(:project) { create(:project, name: 'project-to-test-assignees') } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/2_plan/issue_boards/focus_mode_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/issue_boards/focus_mode_spec.rb index 7377b0ff8af..92a67437d06 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/issue_boards/focus_mode_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/issue_boards/focus_mode_spec.rb @@ -3,11 +3,7 @@ module QA RSpec.describe 'Plan', :reliable, product_group: :project_management do describe 'Issue board focus mode' do - let(:project) do - QA::Resource::Project.fabricate_via_api! do |project| - project.name = 'sample-project-issue-board-focus-mode' - end - end + let(:project) { create(:project, name: 'sample-project-issue-board-focus-mode') } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb index 56e110e6f61..c3c2ad68abf 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb @@ -8,18 +8,9 @@ module QA let(:start_date) { current_date_yyyy_mm_dd } let(:due_date) { next_month_yyyy_mm_dd } - let(:group) do - Resource::Group.fabricate_via_api! do |group| - group.name = "group-to-test-milestones-#{SecureRandom.hex(4)}" - end - end + let(:group) { create(:group, name: "group-to-test-milestones-#{SecureRandom.hex(4)}") } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = "project-to-test-milestones-#{SecureRandom.hex(4)}" - project.group = group - end - end + let(:project) { create(:project, name: "project-to-test-milestones-#{SecureRandom.hex(4)}", group: group) } let(:issue) do Resource::Issue.fabricate_via_api! do |issue| diff --git a/qa/qa/specs/features/browser_ui/2_plan/pages/new_static_page_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/pages/new_static_page_spec.rb index 919b4b2c46e..3d4ec8a422e 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/pages/new_static_page_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/pages/new_static_page_spec.rb @@ -12,13 +12,7 @@ module QA feature_flag: { name: 'show_pages_in_deployments_menu' } do # TODO: Convert back to :smoke once proved to be stable. Related issue: https://gitlab.com/gitlab-org/gitlab/-/issues/300906 describe 'Pages', product_group: :knowledge do - let!(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'gitlab-pages-project' - project.template_name = :plainhtml - end - end - + let!(:project) { create(:project, name: 'gitlab-pages-projects', template_name: :plainhtml) } let(:pipeline) do Resource::Pipeline.fabricate_via_api! do |pipeline| pipeline.project = project diff --git a/qa/qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_creation_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_creation_spec.rb index e1f73acd375..19c9ac6c238 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_creation_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_creation_spec.rb @@ -7,7 +7,7 @@ module QA let(:new_wiki_content) { "this content is changed or added" } let(:commit_message) { "this is a new addition to the wiki" } - let(:project) { Resource::Project.fabricate_via_api! } + let(:project) { create(:project) } let(:wiki) { Resource::Wiki::ProjectPage.fabricate_via_api! } before do diff --git a/qa/qa/specs/features/browser_ui/2_plan/related_issues/related_issues_spec.rb b/qa/qa/specs/features/browser_ui/2_plan/related_issues/related_issues_spec.rb index 197e283c93b..87a0cf1b310 100644 --- a/qa/qa/specs/features/browser_ui/2_plan/related_issues/related_issues_spec.rb +++ b/qa/qa/specs/features/browser_ui/2_plan/related_issues/related_issues_spec.rb @@ -3,12 +3,7 @@ module QA RSpec.describe 'Plan', :reliable, product_group: :project_management do describe 'Related issues' do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-to-test-related-issues' - end - end - + let(:project) { create(:project, name: 'project-to-test-related-issues') } let(:issue_1) do Resource::Issue.fabricate_via_api! do |issue| issue.project = project diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_a_merge_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_a_merge_spec.rb index 8f99644bd24..0e5806a00ff 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_a_merge_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_a_merge_spec.rb @@ -2,14 +2,8 @@ module QA RSpec.describe 'Create' do - describe 'Cherry picking from a merge request', product_group: :code_review do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project' - project.initialize_with_readme = true - end - end - + describe 'Cherry picking from a merge request', :reliable, product_group: :code_review do + let(:project) { create(:project, :with_readme) } let(:feature_mr) do Resource::MergeRequest.fabricate_via_api! do |merge_request| merge_request.project = project diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_commit_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_commit_spec.rb index 111adf32a69..fa4a1293025 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_commit_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_commit_spec.rb @@ -2,16 +2,9 @@ module QA RSpec.describe 'Create' do - describe 'Cherry picking a commit', product_group: :code_review do + describe 'Cherry picking a commit', :reliable, product_group: :code_review do let(:file_name) { "secret_file.md" } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project' - project.initialize_with_readme = true - end - end - + let(:project) { create(:project, :with_readme) } let(:commit) do Resource::Repository::Commit.fabricate_via_api! do |commit| commit.project = project diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_from_push_notification_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_from_push_notification_spec.rb index 509714fb5a4..ed44017db75 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_from_push_notification_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_from_push_notification_spec.rb @@ -2,14 +2,11 @@ module QA RSpec.describe 'Create' do - describe 'Create a new merge request from the event notification after a push', product_group: :code_review do + describe 'Create a new merge request from the event notification after a push', :reliable, + product_group: :code_review do let(:branch_name) { "merge-request-test-#{SecureRandom.hex(8)}" } let(:title) { "Merge from push event notification test #{SecureRandom.hex(8)}" } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme) } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb index fcce6bb291c..89b43e88bde 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb @@ -3,12 +3,7 @@ module QA RSpec.describe 'Create' do describe 'Create a new merge request', product_group: :code_review do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project' - end - end - + let(:project) { create(:project) } let(:merge_request_title) { 'One merge request to rule them all' } let(:merge_request_description) { '... to find them, to bring them all, and in the darkness bind them' } diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb index 1ce9430290f..4072416374a 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb @@ -5,13 +5,7 @@ module QA describe 'Merge request custom templates' do let(:template_name) { 'custom_merge_request_template' } let(:template_content) { 'This is a custom merge request template test' } - let(:template_project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'custom-mr-template-project' - project.initialize_with_readme = true - end - end - + let(:template_project) { create(:project, :with_readme, name: 'custom-mr-template-project') } let(:merge_request_title) { 'One merge request to rule them all' } before do diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb index 38831f6f158..cad50fc032b 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/merge_when_pipeline_succeeds_spec.rb @@ -5,14 +5,7 @@ module QA describe 'Merge requests' do shared_examples 'merge when pipeline succeeds' do |repeat: 1| let(:runner_name) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'merge-when-pipeline-succeeds' - project.initialize_with_readme = true - end - end - + let(:project) { create(:project, :with_readme, name: 'merge-when-pipeline-succeeds') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| runner.project = project diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb index a79c56bd051..5e3260fb44f 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb @@ -4,14 +4,7 @@ module QA RSpec.describe 'Create', :reliable, product_group: :code_review do describe 'Reverting a commit' do let(:file_name) { "secret_file.md" } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project' - project.initialize_with_readme = true - end - end - + let(:project) { create(:project, :with_readme) } let(:commit) do Resource::Repository::Commit.fabricate_via_api! do |commit| commit.project = project 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 a7071d5fe1b..8f85bab8677 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 @@ -3,12 +3,7 @@ module QA RSpec.describe 'Create' do describe 'Merged merge request', :requires_admin, product_group: :code_review do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'revert' - end - end - + let(:project) { create(:project) } let(:revertible_merge_request) do Resource::MergeRequest.fabricate_via_api! do |merge_request| merge_request.project = project diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb index a127b846eb9..33d5a5b050e 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb @@ -2,13 +2,8 @@ module QA RSpec.describe 'Create' do - describe 'Merge request squashing', product_group: :code_review do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = "squash-before-merge" - end - end - + describe 'Merge request squashing', :reliable, product_group: :code_review do + let(:project) { create(:project, name: 'squash-before-merge') } let(:merge_request) do Resource::MergeRequest.fabricate_via_api! do |merge_request| merge_request.project = project diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb index 297f91be0bb..c69db9cf7b5 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb @@ -2,13 +2,8 @@ module QA RSpec.describe 'Create', :reliable, product_group: :code_review do - context 'with merge request batch suggestions' do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'suggestions_project' - end - end - + describe 'Merge request batch suggestions' do + let(:project) { create(:project, name: 'batch-suggestions-project') } let(:merge_request) do Resource::MergeRequest.fabricate_via_api! do |merge_request| merge_request.project = project diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb index ce32f4aadca..8a7fb2021e6 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb @@ -2,15 +2,9 @@ module QA RSpec.describe 'Create' do - context 'with merge request suggestions', product_group: :code_review do + describe 'Merge request suggestions', :reliable, product_group: :code_review do let(:commit_message) { 'Applying suggested change for testing purposes.' } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'suggestions_project' - end - end - + let(:project) { create(:project, name: 'mr-suggestions-project') } let(:merge_request) do Resource::MergeRequest.fabricate_via_api! do |merge_request| merge_request.project = project diff --git a/qa/qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb b/qa/qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb index 3b332e6b9f5..09967b05ffa 100644 --- a/qa/qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb @@ -2,7 +2,7 @@ module QA RSpec.describe 'Create' do - describe 'Download merge request patch and diff', :requires_admin, product_group: :code_review do + describe 'Download merge request patch and diff', :reliable, :requires_admin, product_group: :code_review do let(:merge_request) do Resource::MergeRequest.fabricate_via_api! do |merge_request| merge_request.title = 'This is a merge request' diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb index 7d21c635347..0a311a42863 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb @@ -6,11 +6,10 @@ module QA include Runtime::Fixtures let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'file-template-project' - project.description = 'Add file templates via the Files view' - project.initialize_with_readme = true - end + create(:project, + :with_readme, + name: 'file-template-project', + description: 'Add file templates via the Files view') end templates = [ diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb index 1d9dccbddf6..6e508ba5206 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb @@ -6,12 +6,7 @@ module QA let(:branch_name) { 'new-branch' } let(:allowed_to_push_role) { Resource::ProtectedBranch::Roles::NO_ONE } let(:allowed_to_merge_role) { Resource::ProtectedBranch::Roles::MAINTAINERS } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'branch-rule-project' - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'branch-rule-project') } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/branch_with_unusual_name_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/branch_with_unusual_name_spec.rb index afa9be034eb..368ac1f8cdb 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/branch_with_unusual_name_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/branch_with_unusual_name_spec.rb @@ -4,12 +4,7 @@ module QA RSpec.describe 'Create' do describe 'Branch with unusual name', product_group: :source_code do let(:branch_name) { 'unUsually/named#br--anch' } - let(:project) do - Resource::Project.fabricate_via_api! do |resource| - resource.name = 'unusually-named-branch-project' - resource.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'unusually-named-branch-project') } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb index b7df22fc2c2..15bd324da7c 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/clone_spec.rb @@ -3,12 +3,7 @@ module QA RSpec.describe 'Create' do describe 'Git clone over HTTP', product_group: :source_code do - let(:project) do - Resource::Project.fabricate_via_api! do |scenario| - scenario.name = 'project-with-code' - scenario.description = 'project for git clone tests' - end - end + let(:project) { create(:project, name: 'project-with-code', description: 'project for git clone tests') } before do Git::Repository.perform do |repository| diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/file/file_with_unusual_name_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/file/file_with_unusual_name_spec.rb index d7da29219e6..5e221d06815 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/file/file_with_unusual_name_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/file/file_with_unusual_name_spec.rb @@ -4,12 +4,7 @@ module QA RSpec.describe 'Create' do describe 'File with unusual name', product_group: :source_code do let(:file_name) { '-un:usually;named#file?.md' } - let(:project) do - Resource::Project.fabricate_via_api! do |resource| - resource.name = 'unusually-named-file-project' - resource.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'unusually-named-file-project') } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb index f00ef65fab4..8c8834b44a0 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb @@ -7,7 +7,7 @@ module QA project.remove_via_api! end - let(:project) { Resource::Project.fabricate_via_api! } + let(:project) { create(:project) } shared_examples 'project license detection' do it 'displays the name of the license on the repository' do diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb index a13b1517740..781096323d2 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/move_project_create_fork_spec.rb @@ -4,13 +4,7 @@ module QA RSpec.describe 'Create', :orchestrated, :repository_storage, :requires_admin, product_group: :source_code do describe 'Gitaly repository storage' do let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) } - let(:parent_project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'parent-project' - project.initialize_with_readme = true - end - end - + let(:parent_project) { create(:project, :with_readme, name: 'parent-project') } let(:fork_project) do Resource::Fork.fabricate_via_api! do |fork| fork.user = user diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/protected_tags_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/protected_tags_spec.rb index 479c5816938..0b55ea8241e 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/protected_tags_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/protected_tags_spec.rb @@ -3,13 +3,7 @@ module QA RSpec.describe 'Create' do describe 'Repository tags', :reliable, product_group: :source_code do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-for-tags' - project.initialize_with_readme = true - end - end - + let(:project) { create(:project, :with_readme, name: 'project-for-tags') } let(:developer_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/3_create/repository/protocol_v2_push_http_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb index 557a27c002d..2cf8c4ae154 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb @@ -7,9 +7,7 @@ module QA Flow::Login.sign_in # Create a project to push to - project = Resource::Project.fabricate_via_api! do |project| - project.name = 'git-protocol-project' - end + project = create(:project, name: 'git-protocol-project') file_name = 'README.md' file_content = 'Test Git protocol v2' diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb index 2472d1cdf25..1f60eb16b01 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb @@ -28,9 +28,7 @@ module QA end it 'user pushes to the repository', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347734' do - project = Resource::Project.fabricate_via_api! do |project| - project.name = 'git-protocol-project' - end + project = create(:project, name: 'git-protocol-project') file_name = 'README.md' file_content = 'Test Git protocol v2' diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb index b8a018552c6..4f45feb1b0a 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb @@ -7,9 +7,7 @@ module QA Runtime::Browser.visit(:gitlab, Page::Main::Login) Page::Main::Login.perform(&:sign_in_using_credentials) - target_project = Resource::Project.fabricate_via_api! do |project| - project.name = 'push-mirror-target-project' - end + target_project = create(:project, name: 'push-mirror-target-project') target_project_uri = target_project.repository_http_location.uri target_project_uri.user = Runtime::User.username diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb index b87c47761bd..4cd371b524d 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb @@ -7,9 +7,7 @@ module QA Runtime::Browser.visit(:gitlab, Page::Main::Login) Page::Main::Login.perform(&:sign_in_using_credentials) - target_project = Resource::Project.fabricate_via_api! do |project| - project.name = 'push-mirror-target-project' - end + target_project = create(:project, name: 'push-mirror-target-project') target_project_uri = target_project.repository_http_location.uri target_project_uri.user = Runtime::User.username diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb index 324dbbc46ef..76aba401aaa 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb @@ -7,12 +7,7 @@ module QA describe 'push after setting the file size limit via admin/application_settings' do include Support::API - let!(:project) do - Resource::Project.fabricate_via_api! do |p| - p.name = 'project-test-push-limit' - p.initialize_with_readme = true - end - end + let!(:project) { create(:project, :with_readme, name: 'project-test-push-limit') } after(:context) do set_file_size_limit(nil) diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb index edc85849356..0b689081b7f 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb @@ -23,10 +23,9 @@ module QA :requires_praefect, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347789' do Flow::Login.sign_in_as_admin - project = Resource::Project.fabricate_via_api! do |storage_project| - storage_project.name = 'specific-repository-storage' - storage_project.repository_storage = QA::Runtime::Env.praefect_repository_storage - end + project = create(:project, + name: 'specific-repository-storage', + repository_storage: Runtime::Env.praefect_repository_storage) Resource::Repository::Push.fabricate! do |push| push.repository_http_uri = project.repository_http_location.uri diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb index e097e1fd2bb..b06879e9140 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb @@ -5,12 +5,7 @@ module QA describe 'Protected branch support' do let(:branch_name) { 'protected-branch' } let(:commit_message) { 'Protected push commit message' } - let(:project) do - Resource::Project.fabricate_via_api! do |resource| - resource.name = 'protected-branch-project' - resource.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'protected-branch-project') } before do Runtime::Browser.visit(:gitlab, Page::Main::Login) diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/push_to_canary_gitaly_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/push_to_canary_gitaly_spec.rb index d95a880c305..b20b1f8cd92 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/push_to_canary_gitaly_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/push_to_canary_gitaly_spec.rb @@ -6,10 +6,7 @@ module QA it 'pushes to a project using a canary specific Gitaly repository storage', :smoke, :requires_admin, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/351116' do Flow::Login.sign_in_as_admin - project = Resource::Project.fabricate_via_api! do |storage_project| - storage_project.name = 'canary-specific-repository-storage' - storage_project.repository_storage = 'nfs-file-cny01' # TODO: move to ENV var - end + project = create(:project, name: 'canary-specific-repository-storage', repository_storage: 'nfs-file-cny01') # TODO: move to ENV var Resource::Repository::Push.fabricate! do |push| push.repository_http_uri = project.repository_http_location.uri diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb index 64858287285..a2fe79ae65d 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/ssh_key_support_spec.rb @@ -29,7 +29,7 @@ module QA ssh_keys.remove_key(key.title) end - expect(page).not_to have_content("Title: #{key.title}") + expect(page).not_to have_content(key.title) expect(page).not_to have_content(key.sha256_fingerprint) end end diff --git a/qa/qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb b/qa/qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb index 13b42209114..4f2e657fada 100644 --- a/qa/qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb @@ -2,7 +2,7 @@ module QA RSpec.describe 'Create' do - describe 'Commit data', product_group: :source_code do + describe 'Commit data', :reliable, product_group: :source_code do before(:context) do # Get the user's details to confirm they're included in the email patch @user = Resource::User.fabricate_via_api! do |user| diff --git a/qa/qa/specs/features/browser_ui/3_create/source_editor/source_editor_toolbar_spec.rb b/qa/qa/specs/features/browser_ui/3_create/source_editor/source_editor_toolbar_spec.rb index 9b1df337065..bd98cb17332 100644 --- a/qa/qa/specs/features/browser_ui/3_create/source_editor/source_editor_toolbar_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/source_editor/source_editor_toolbar_spec.rb @@ -3,13 +3,7 @@ module QA RSpec.describe 'Create' do describe 'Source editor toolbar preview', product_group: :source_code do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'empty-project-with-md' - project.initialize_with_readme = true - end - end - + let(:project) { create(:project, :with_readme, name: 'empty-project-with-md') } let(:edited_readme_content) { 'Here is the edited content.' } before do diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb index 3e8f9307cec..4172aa03a72 100644 --- a/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb @@ -8,12 +8,7 @@ module QA type: :flaky } do describe 'Add a directory in Web IDE' do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'add-directory-project' - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'add-directory-project') } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb index 336d32bcc35..afed95e18f9 100644 --- a/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb @@ -9,13 +9,7 @@ module QA } do describe 'Upload a file in Web IDE' do let(:file_path) { File.absolute_path(File.join('qa', 'fixtures', 'web_ide', file_name)) } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'upload-file-project' - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'upload-file-project') } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/add_file_template_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/add_file_template_spec.rb index 3e24fb496e7..18dd4d912d8 100644 --- a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/add_file_template_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/add_file_template_spec.rb @@ -11,11 +11,10 @@ module QA include Runtime::Fixtures before(:all) do - @project = Resource::Project.fabricate_via_api! do |project| - project.name = 'file-template-project' - project.description = 'Add file templates via the Web IDE' - project.initialize_with_readme = true - end + @project = create(:project, + :with_readme, + name: 'file-template-project', + description: 'Add file templates via Web IDE') end templates = [ diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/create_first_file_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/create_first_file_in_web_ide_spec.rb index 775e14500d5..8fe58078393 100644 --- a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/create_first_file_in_web_ide_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/create_first_file_in_web_ide_spec.rb @@ -8,13 +8,7 @@ module QA end describe 'First file using Web IDE' do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'empty-project' - project.initialize_with_readme = false - end - end - + let(:project) { create(:project, :with_readme, name: 'empty-project') } let(:file_name) { 'the very first file.txt' } before do diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/link_to_line_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/link_to_line_in_web_ide_spec.rb index bea2e906d5e..57c8945d5c4 100644 --- a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/link_to_line_in_web_ide_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/link_to_line_in_web_ide_spec.rb @@ -9,11 +9,7 @@ module QA describe 'Link to line in Web IDE' do let(:user) { Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.template_name = 'express' - end - end + let(:project) { create(:project, template_name: 'express') } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/open_web_ide_from_diff_tab_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/open_web_ide_from_diff_tab_spec.rb index c4ed2038f4c..10483a7cbee 100644 --- a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/open_web_ide_from_diff_tab_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/open_web_ide_from_diff_tab_spec.rb @@ -23,12 +23,7 @@ module QA } ] - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.initialize_with_readme = true - end - end - + let(:project) { create(:project, :with_readme) } let(:source) do Resource::Repository::Commit.fabricate_via_api! do |commit| commit.project = project diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/review_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/review_merge_request_spec.rb index 1043e9051e3..4044494d3da 100644 --- a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/review_merge_request_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/review_merge_request_spec.rb @@ -11,13 +11,7 @@ module QA let(:new_file) { 'awesome_new_file.txt' } let(:original_text) { 'Text' } let(:review_text) { 'Reviewed ' } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'review-merge-request-spec-project' - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'review-mr-spec-project') } let(:merge_request) do Resource::MergeRequest.fabricate_via_api! do |mr| diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/server_hooks_custom_error_message_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/server_hooks_custom_error_message_spec.rb index 05925505610..42fcbf5352f 100644 --- a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/server_hooks_custom_error_message_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/server_hooks_custom_error_message_spec.rb @@ -10,13 +10,9 @@ module QA describe 'Git Server Hooks' do let(:file_path) { Runtime::Path.fixture('web_ide', 'README.md') } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - # Projects that have names that include pattern 'reject-prereceive' trigger a server hook on orchestrated env - # that returns an error string using GL-HOOK-ERR - project.name = "project-reject-prereceive-#{SecureRandom.hex(8)}" - end - end + # Projects that have names that include pattern 'reject-prereceive' trigger a server hook on orchestrated env + # that returns an error string using GL-HOOK-ERR + let(:project) { create(:project, name: "project-reject-prereceive-#{SecureRandom.hex(8)}") } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/upload_new_file_in_web_ide_spec.rb b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/upload_new_file_in_web_ide_spec.rb index c557f2fa8a6..ab035d3b52c 100644 --- a/qa/qa/specs/features/browser_ui/3_create/web_ide_old/upload_new_file_in_web_ide_spec.rb +++ b/qa/qa/specs/features/browser_ui/3_create/web_ide_old/upload_new_file_in_web_ide_spec.rb @@ -9,12 +9,7 @@ module QA describe 'Upload a file in Web IDE' do let(:file_path) { Runtime::Path.fixture('web_ide', file_name) } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'upload-file-project' - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'upload-file-project') } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_parent_child_pipelines_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_parent_child_pipelines_spec.rb index b08a36b0d43..d5de93fdee6 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_parent_child_pipelines_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_parent_child_pipelines_spec.rb @@ -2,15 +2,9 @@ module QA RSpec.describe 'Verify', :runner, product_group: :pipeline_security do - describe "Unlocking job artifacts across parent-child pipelines" do + describe 'Unlocking job artifacts across parent-child pipelines' do let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'unlock-job-artifacts-parent-child-project' - end - end - + let(:project) { create(:project, name: 'unlock-job-artifacts-parent-child-project') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| runner.project = project @@ -249,6 +243,8 @@ module QA private def update_parent_child_ci_files(parent_job_name:, parent_script:, child_job_name:, child_script:) + original_pipeline_count = pipeline_count + Resource::Repository::Commit.fabricate_via_api! do |commit| commit.project = project commit.commit_message = 'Update parent and child pipelines CI files.' @@ -259,9 +255,13 @@ module QA ] ) end + + wait_for_pipeline_creation(original_pipeline_count) end def add_parent_child_ci_files(parent_job_name:, parent_script:, child_job_name:, child_script:) + original_pipeline_count = pipeline_count + Resource::Repository::Commit.fabricate_via_api! do |commit| commit.project = project commit.commit_message = 'Add parent and child pipelines CI files.' @@ -272,6 +272,8 @@ module QA ] ) end + + wait_for_pipeline_creation(original_pipeline_count) end def parent_ci_file(job_name, script) @@ -316,6 +318,16 @@ module QA job.id = project.job_by_name(job_name)[:id] end end + + def wait_for_pipeline_creation(original_pipeline_count) + Support::Waiter.wait_until(sleep_interval: 1, message: 'Wait for pipeline creation') do + pipeline_count > original_pipeline_count + end + end + + def pipeline_count + project.pipelines.length + end end end end diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb index 41ce868f0d6..91e62dfba9b 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb @@ -4,12 +4,7 @@ module QA RSpec.describe 'Verify', :runner, product_group: :pipeline_security do describe "Unlocking job artifacts across pipelines" do let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'unlock-job-artifacts-project' - end - end + let(:project) { create(:project, name: 'unlock-job-artifacts-project') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb index 4515353dfc5..4ec9360be24 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb @@ -6,13 +6,7 @@ module QA let(:executor) { "qa-runner-#{Time.now.to_i}" } let(:pipeline_job_name) { 'customizable-variable' } let(:variable_custom_value) { 'Custom Foo' } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-customizable-variable-pipeline' - end - end - + let(:project) { create(:project, name: 'project-with-customizable-variable-pipeline') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| runner.project = project diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb index e2d25e64687..8e168ef80f6 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb @@ -5,13 +5,7 @@ module QA describe 'Pipeline with protected variable' do let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" } let(:protected_value) { Faker::Alphanumeric.alphanumeric(number: 8) } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-ci-variables' - project.description = 'project with CI variables' - end - end + let(:project) { create(:project, name: 'project-with-ci-vars', description: 'project with CI vars') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/prefill_variables_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/prefill_variables_spec.rb index b62ae85436f..8d315f66034 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/prefill_variables_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/prefill_variables_spec.rb @@ -8,12 +8,7 @@ module QA let(:prefill_variable_value5) { Faker::Lorem.word } let(:prefill_variable_description2) { Faker::Lorem.sentence } let(:prefill_variable_description5) { Faker::Lorem.sentence } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-prefill-variables' - end - end - + let(:project) { create(:project, name: 'project-with-prefill-variables') } let!(:commit) do Resource::Repository::Commit.fabricate_via_api! do |commit| commit.project = project diff --git a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb index 15959721935..f47949e0024 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb @@ -5,12 +5,7 @@ module QA describe 'Pipeline with raw variables in YAML', product_group: :pipeline_security do let(:executor) { "qa-runner-#{Time.now.to_i}" } let(:pipeline_job_name) { 'rspec' } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-raw-variable-pipeline' - end - end + let(:project) { create(:project, name: 'project-with-raw-variable-pipeline') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_local_config_file_paths_with_wildcard_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_local_config_file_paths_with_wildcard_spec.rb index 027383550a7..8cf923f543b 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_local_config_file_paths_with_wildcard_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_local_config_file_paths_with_wildcard_spec.rb @@ -3,11 +3,7 @@ module QA RSpec.describe 'Verify' do describe 'Include local config file paths with wildcard', :reliable, product_group: :pipeline_authoring do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-pipeline' - end - end + let(:project) { create(:project, name: 'project-with-pipeline') } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb index 5bbe09b3fb0..fe655f41992 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb @@ -7,17 +7,8 @@ module QA let(:expected_text) { Faker::Lorem.sentence } let(:unexpected_text) { Faker::Lorem.sentence } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-pipeline-1' - end - end - - let(:other_project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-pipeline-2' - end - end + let(:project) { create(:project, name: 'project-with-pipeline-1') } + let(:other_project) { create(:project, name: 'project-with-pipeline-2') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_multiple_projects_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_multiple_projects_spec.rb index 59591fbe1cd..da7b7ec720f 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_multiple_projects_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_multiple_projects_spec.rb @@ -4,25 +4,9 @@ module QA RSpec.describe 'Verify', :runner, product_group: :pipeline_authoring do describe 'Include multiple files from multiple projects' do let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" } - - let(:main_project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-pipeline' - end - end - - let(:project1) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'external-project-1' - end - end - - let(:project2) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'external-project-2' - end - end - + let(:main_project) { create(:project, name: 'project-with-pipeline') } + let(:project1) { create(:project, name: 'external-project-1') } + let(:project2) { create(:project, name: 'external-project-2') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| runner.project = main_project diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/merge_mr_when_pipline_is_blocked_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/merge_mr_when_pipline_is_blocked_spec.rb index ecf4826262b..3e1e2bc5b5b 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/merge_mr_when_pipline_is_blocked_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/merge_mr_when_pipline_is_blocked_spec.rb @@ -8,13 +8,7 @@ module QA } do context 'when pipeline is blocked' do let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-blocked-pipeline' - end - end - + let(:project) { create(:project, name: 'project-with-blocked-pipeline') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| runner.project = project diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb index fef90a7c8fc..52efacfd407 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb @@ -3,12 +3,7 @@ module QA RSpec.describe 'Verify', :runner, :reliable, product_group: :pipeline_execution do describe 'Parent-child pipelines independent relationship' do - let!(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'pipeline-independent-relationship' - end - end - + let!(:project) { create(:project, name: 'pipeline-independent-relationship') } let!(:runner) do Resource::ProjectRunner.fabricate_via_api! do |runner| runner.project = project diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb index 6295c596dda..f9a3856f810 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb @@ -5,21 +5,9 @@ module QA describe 'Pass dotenv variables to downstream via bridge' do let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" } let(:upstream_var) { Faker::Alphanumeric.alphanumeric(number: 8) } - let(:group) { Resource::Group.fabricate_via_api! } - - let(:upstream_project) do - Resource::Project.fabricate_via_api! do |project| - project.group = group - project.name = 'upstream-project-with-bridge' - end - end - - let(:downstream_project) do - Resource::Project.fabricate_via_api! do |project| - project.group = group - project.name = 'downstream-project-with-bridge' - end - end + let(:group) { create(:group) } + let(:upstream_project) { create(:project, group: group, name: 'upstream-project-with-bridge') } + let(:downstream_project) { create(:project, group: group, name: 'downstream-project-with-bridge') } let!(:runner) do Resource::GroupRunner.fabricate! do |runner| diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb index 1f7871b0900..f4847a9ec99 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_editor_can_create_merge_request_spec.rb @@ -3,12 +3,7 @@ module QA RSpec.describe 'Verify' do describe 'Pipeline editor', product_group: :pipeline_authoring do - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'pipeline-editor-project' - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'pipeline-editor-project') } before do Flow::Login.sign_in @@ -27,13 +22,6 @@ module QA Page::Project::PipelineEditor::New.perform(&:create_new_ci) Page::Project::PipelineEditor::Show.perform do |show| - # Editor should display default content when project does not have CI file yet - # New MR checkbox should not be rendered when a new target branch is yet to be provided - aggregate_failures 'check editor default conditions' do - expect(show.editing_content).not_to be_empty - expect(show).to have_no_new_mr_checkbox - end - # The new MR checkbox is visible after a new branch name is set show.set_source_branch(SecureRandom.hex(10)) expect(show).to have_new_mr_checkbox diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb index 1abe1df5964..69d8467e6ea 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/pipeline_with_image_pull_policy_spec.rb @@ -5,13 +5,7 @@ module QA describe 'Pipeline with image:pull_policy' do let(:runner_name) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" } let(:job_name) { "test-job-#{pull_policies.join('-')}" } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'pipeline-with-image-pull-policy' - end - end - + let(:project) { create(:project, name: 'pipeline-with-image-pull-policy') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| runner.project = project diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_via_web_only_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_via_web_only_spec.rb index 9f43471035f..b96869658c9 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_via_web_only_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_via_web_only_spec.rb @@ -5,12 +5,7 @@ module QA describe 'Run pipeline', :reliable, product_group: :pipeline_execution do context 'with web only rule' do let(:job_name) { 'test_job' } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'web-only-pipeline' - end - end - + let(:project) { create(:project, name: 'web-only-pipeline') } let!(:ci_file) do Resource::Repository::Commit.fabricate_via_api! do |commit| commit.project = project diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb index d733ac9ba72..019228da130 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb @@ -6,10 +6,7 @@ module QA let(:executor) { "qa-runner-#{SecureRandom.hex(4)}" } let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'pipeline-with-manual-job' - project.description = 'Project for pipeline with manual job' - end + create(:project, name: 'pipeline-with-manual-job', description: 'Project for pipeline with manual job') end let!(:runner) do diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb index 3361ab98bda..09d1fd331cd 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb @@ -4,13 +4,7 @@ module QA RSpec.describe 'Verify', :runner, product_group: :pipeline_execution do describe "Trigger child pipeline with 'when:manual'" do let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-pipeline' - end - end - + let(:project) { create(:project, name: 'project-with-pipeline') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| runner.project = project diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb index bd656142989..6eea6756ee7 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb @@ -4,13 +4,7 @@ module QA RSpec.describe 'Verify', :runner, product_group: :pipeline_authoring do describe 'Trigger matrix' do let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-pipeline' - end - end - + let(:project) { create(:project, name: 'project-with-pipeline') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| runner.project = project diff --git a/qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb index a749da4608a..5c0e2a9d668 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb @@ -4,13 +4,7 @@ module QA RSpec.describe 'Verify' do describe 'Update CI file with pipeline editor', product_group: :pipeline_authoring do let(:random_test_string) { SecureRandom.hex(10) } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'pipeline-editor-project' - end - end - + let(:project) { create(:project, name: 'pipeline-editor-project') } let!(:runner) do Resource::ProjectRunner.fabricate_via_api! do |runner| runner.project = project diff --git a/qa/qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb b/qa/qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb index e2bb6c33513..da7a6c537b8 100644 --- a/qa/qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb +++ b/qa/qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb @@ -11,12 +11,7 @@ module QA # User views pipeline succeeds (Web read) RSpec.describe 'Verify', :runner, product_group: :pipeline_security do context 'Endpoint Coverage' do - let!(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'endpoint-coverage' - end - end - + let!(:project) { create(:project, name: 'endpoint-coverage') } let!(:runner) do Resource::ProjectRunner.fabricate_via_api! do |runner| runner.project = project diff --git a/qa/qa/specs/features/browser_ui/5_package/container_registry/saas/container_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/container_registry/saas/container_registry_spec.rb index 4b2d9f96cd2..49d1434035f 100644 --- a/qa/qa/specs/features/browser_ui/5_package/container_registry/saas/container_registry_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/container_registry/saas/container_registry_spec.rb @@ -4,50 +4,46 @@ module QA RSpec.describe 'Package' do describe 'SaaS Container Registry', only: { subdomain: %i[staging staging-canary pre] }, product_group: :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(:registry_repository) do - Resource::RegistryRepository.fabricate! do |repository| - repository.name = project.path_with_namespace.to_s - repository.project = project - end - end - + let(:project) { create(:project, name: 'project-with-registry', template_name: 'express') } let!(:gitlab_ci_yaml) do <<~YAML - build: - image: docker:24.0.1 - stage: build - services: - - docker:24.0.1-dind - variables: - IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG - DOCKER_HOST: tcp://docker:2376 - DOCKER_TLS_CERTDIR: "/certs" - DOCKER_TLS_VERIFY: 1 - DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client" - before_script: - - | - echo "Waiting for docker to start..." - for i in $(seq 1 30) - do - docker info && break - sleep 1s - done - script: - - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - - docker build -t $IMAGE_TAG . - - docker push $IMAGE_TAG - YAML - end + stages: + - test + - build - after do - registry_repository&.remove_via_api! + test: + image: registry.gitlab.com/gitlab-ci-utils/curl-jq:latest + stage: test + script: + - 'status_code=$(curl --header "Authorization: Bearer $CI_JOB_TOKEN" "https://${CI_SERVER_HOST}/gitlab/v1")' + - | + if [ "$status_code" -eq 404 ]; then + echo "The registry implements this API specification, but it is unavailable because the metadata database is disabled." + exit 1 + fi + build: + image: docker:24.0.1 + stage: build + services: + - docker:24.0.1-dind + variables: + IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG + DOCKER_HOST: tcp://docker:2376 + DOCKER_TLS_CERTDIR: "/certs" + DOCKER_TLS_VERIFY: 1 + DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client" + before_script: + - | + echo "Waiting for docker to start..." + for i in $(seq 1 30); do + docker info && break + sleep 1s + done + script: + - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY + - docker build -t $IMAGE_TAG . + - docker push $IMAGE_TAG + YAML end it 'pushes project image to the container registry and deletes tag', @@ -69,11 +65,20 @@ module QA 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: 200) + + job.click_element(:pipeline_path) + end + + 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) + expect(job).to be_successful(timeout: 500) end Page::Project::Menu.perform(&:go_to_container_registry) diff --git a/qa/qa/specs/features/browser_ui/5_package/container_registry/saas/pull_container_registry_image_spec.rb b/qa/qa/specs/features/browser_ui/5_package/container_registry/saas/pull_container_registry_image_spec.rb index 85a88b54cc2..3c656d9ca75 100644 --- a/qa/qa/specs/features/browser_ui/5_package/container_registry/saas/pull_container_registry_image_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/container_registry/saas/pull_container_registry_image_spec.rb @@ -2,16 +2,18 @@ module QA RSpec.describe 'Package' do - describe 'SaaS Container Registry', only: { subdomain: %i[staging] }, product_group: :container_registry do - let(:project) do - Resource::Project.init do |project| - project.path_with_namespace = 'gitlab-qa/container-registry-sanity' - end.reload! + describe 'SaaS Container Registry', :smoke, + only: { subdomain: :staging }, product_group: :container_registry do + before do + Flow::Login.sign_in end it 'pulls an image from an existing repository', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/412799' do - Flow::Login.sign_in + project = Resource::Project.init do |project| + project.path_with_namespace = 'gitlab-qa/container-registry-sanity' + end.reload! + project.visit! Page::Project::Menu.perform(&:go_to_pipelines) diff --git a/qa/qa/specs/features/browser_ui/5_package/container_registry/self_managed/container_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/container_registry/self_managed/container_registry_spec.rb index 800b3a01dc6..e4d6ba9c4db 100644 --- a/qa/qa/specs/features/browser_ui/5_package/container_registry/self_managed/container_registry_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/container_registry/self_managed/container_registry_spec.rb @@ -5,14 +5,7 @@ module QA describe 'Self-managed Container Registry' do include Support::Helpers::MaskToken - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-with-registry' - project.template_name = 'express' - project.visibility = :private - end - end - + let(:project) { create(:project, :private, name: 'project-with-registry', template_name: 'express') } let(:project_deploy_token) do Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token| deploy_token.name = 'registry-deploy-token' @@ -43,10 +36,6 @@ module QA project.visit! end - after do - runner.remove_via_api! - end - context "when tls is disabled" do where do { @@ -200,27 +189,27 @@ module QA file_path: '.gitlab-ci.yml', content: <<~YAML - build: - image: docker:23.0.6 - stage: build - services: + build: + image: docker:23.0.6 + stage: build + services: - name: docker:23.0.6-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}" + - /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 } ] @@ -234,7 +223,11 @@ module QA pipeline.click_job('build') end - Support::Retrier.retry_until(max_duration: 800, sleep_interval: 10) do + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 200) + end + + Support::Retrier.retry_until(max_duration: 500, sleep_interval: 10) do project.pipelines.last[:status] == 'success' end diff --git a/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb b/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb index 235c3604523..dae0e17746c 100644 --- a/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb @@ -6,13 +6,7 @@ module QA using RSpec::Parameterized::TableSyntax include Support::Helpers::MaskToken - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'dependency-proxy-project' - project.visibility = :private - end - end - + let(:project) { create(:project, :private, name: 'dependency-proxy-project') } let!(:runner) do Resource::ProjectRunner.fabricate! do |runner| runner.name = "qa-runner-#{Time.now.to_i}" @@ -35,8 +29,7 @@ module QA let(:personal_access_token) { Runtime::Env.personal_access_token } - let(:uri) { URI.parse(Runtime::Scenario.gitlab_address) } - let(:gitlab_host_with_port) { "#{uri.host}:#{uri.port}" } + let(:gitlab_host_with_port) { Support::GitlabAddress.host_with_port } let(:dependency_proxy_url) { "#{gitlab_host_with_port}/#{project.group.full_path}/dependency_proxy/containers" } let(:image_sha) { 'alpine@sha256:c3d45491770c51da4ef58318e3714da686bc7165338b7ab5ac758e75c7455efb' } diff --git a/qa/qa/specs/features/browser_ui/5_package/infrastructure_registry/terraform_module_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/infrastructure_registry/terraform_module_registry_spec.rb index 8dc9fb6db36..05c6694e69a 100644 --- a/qa/qa/specs/features/browser_ui/5_package/infrastructure_registry/terraform_module_registry_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/infrastructure_registry/terraform_module_registry_spec.rb @@ -10,7 +10,7 @@ module QA } do include Runtime::Fixtures - let(:group) { Resource::Group.fabricate_via_api! } + let(:group) { create(:group) } let(:imported_project) do Resource::ProjectImportedFromURL.fabricate_via_browser_ui! do |project| diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb index 58eb63de21d..6e52208004f 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb @@ -1,17 +1,11 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry do - describe 'Composer Repository' do + RSpec.describe 'Package', :object_storage, product_group: :package_registry do + describe 'Composer Repository', :external_api_calls do include Runtime::Fixtures - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'composer-package-project' - project.visibility = :private - end - end - + let(:project) { create(:project, :privtae, name: 'composer-package-project') } let(:package) do Resource::Package.init do |package| package.name = "my_package-#{SecureRandom.hex(4)}" @@ -28,10 +22,7 @@ module QA end end - let!(:gitlab_address_with_port) do - uri = URI.parse(Runtime::Scenario.gitlab_address) - "#{uri.scheme}://#{uri.host}:#{uri.port}" - end + let(:gitlab_host_with_port) { Support::GitlabAddress.host_with_port } before do Flow::Login.sign_in @@ -71,7 +62,14 @@ module QA package.remove_via_api! end - it 'publishes a composer package and deletes it', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348016' do + it( + 'publishes a composer package and deletes it', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348016', + quarantine: { + type: :broken, + issue: "https://gitlab.com/gitlab-org/gitlab/-/issues/421885" + } + ) do Page::Project::Menu.perform(&:go_to_package_registry) Page::Project::Packages::Index.perform do |index| diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb index 83662e04fab..f2e19068f18 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb @@ -1,21 +1,15 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :object_storage, product_group: :package_registry, quarantine: { - only: { job: %w[object_storage relative_url airgapped], condition: -> { QA::Support::FIPS.enabled? } }, + RSpec.describe 'Package', :object_storage, :external_api_calls, product_group: :package_registry, quarantine: { + only: { job: 'object_storage', condition: -> { QA::Support::FIPS.enabled? } }, issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417584', type: :bug } do describe 'Conan Repository' do include Runtime::Fixtures - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'conan-package-project' - project.visibility = :private - end - end - + let(:project) { create(:project, :private, name: 'conan-package-project') } let(:package) do Resource::Package.init do |package| package.name = "conantest-#{SecureRandom.hex(8)}" @@ -33,8 +27,7 @@ module QA end let(:gitlab_address_with_port) do - uri = URI.parse(Runtime::Scenario.gitlab_address) - "#{uri.scheme}://#{uri.host}:#{uri.port}" + Support::GitlabAddress.address_with_port end after do diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb index 1253dc91ca3..3c43e97e21e 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb @@ -1,17 +1,11 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry do - describe 'Generic Repository' do + RSpec.describe 'Package', :object_storage, product_group: :package_registry do + describe 'Generic Repository', :external_api_calls do include Runtime::Fixtures - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'generic-package-project' - project.visibility = :private - end - end - + let(:project) { create(:project, :private, name: 'generic-package-project') } let(:package) do Resource::Package.init do |package| package.name = "my_package-#{SecureRandom.hex(8)}" diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb index 7bfda7f5956..42635a9e59f 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb @@ -2,12 +2,7 @@ module QA RSpec.describe 'Package', :object_storage, product_group: :package_registry do - describe 'Helm Registry', - quarantine: { - only: { job: %w[relative_url airgapped] }, - issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417590', - type: :investigating - } do + describe 'Helm Registry', :external_api_calls do using RSpec::Parameterized::TableSyntax include Runtime::Fixtures include Support::Helpers::MaskToken diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb index ce6c54b6ed8..3cbc78ab806 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb @@ -2,12 +2,7 @@ module QA RSpec.describe 'Package', :object_storage, product_group: :package_registry do - describe 'Maven group level endpoint', - quarantine: { - only: { job: %w[relative_url airgapped] }, - issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417600', - type: :investigating - } do + describe 'Maven group level endpoint', :external_api_calls do include Runtime::Fixtures include Support::Helpers::MaskToken include_context 'packages registry qa scenario' diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb index 35f80f8d447..d1663f075e0 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb @@ -1,12 +1,7 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :object_storage, - quarantine: { - only: { job: %w[relative_url airgapped] }, - issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417600', - type: :investigating - } do + RSpec.describe 'Package', :object_storage, :external_api_calls do describe 'Maven project level endpoint', product_group: :package_registry do include Runtime::Fixtures include Support::Helpers::MaskToken @@ -17,15 +12,7 @@ module QA let(:package_version) { '1.3.7' } let(:package_type) { 'maven' } let(:personal_access_token) { Runtime::Env.personal_access_token } - - let(:package_project) do - Resource::Project.fabricate_via_api! do |project| - project.name = "#{package_type}_package_project" - project.initialize_with_readme = true - project.visibility = :private - end - end - + let(:package_project) { create(:project, :with_readme, :private, name: "#{package_type}_package_project") } let(:package) do Resource::Package.init do |package| package.name = package_name @@ -43,8 +30,7 @@ module QA end let(:gitlab_address_with_port) do - uri = URI.parse(Runtime::Scenario.gitlab_address) - "#{uri.scheme}://#{uri.host}:#{uri.port}" + Support::GitlabAddress.address_with_port end let(:project_deploy_token) do diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb index f24466ed003..28037391aeb 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb @@ -1,9 +1,9 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :object_storage, + RSpec.describe 'Package', :object_storage, :external_api_calls, quarantine: { - only: { job: 'relative_url', condition: -> { QA::Support::FIPS.enabled? } }, + only: { condition: -> { QA::Support::FIPS.enabled? } }, issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417600', type: :investigating }, product_group: :package_registry do @@ -17,15 +17,7 @@ module QA let(:package_name) { "#{group_id}/#{artifact_id}".tr('.', '/') } let(:package_version) { '1.3.7' } let(:package_type) { 'maven_gradle' } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = "#{package_type}_project" - project.initialize_with_readme = true - project.visibility = :private - end - end - + let(:project) { create(:project, :private, :with_readme, name: "#{package_type}_project") } let(:runner) do Resource::ProjectRunner.fabricate! do |runner| runner.name = "qa-runner-#{Time.now.to_i}" @@ -36,8 +28,7 @@ module QA end let(:gitlab_address_with_port) do - uri = URI.parse(Runtime::Scenario.gitlab_address) - "#{uri.scheme}://#{uri.host}:#{uri.port}" + Support::GitlabAddress.address_with_port end let(:project_deploy_token) do diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb index 1b97f7d0a6a..0550c3373da 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb @@ -2,170 +2,156 @@ module QA RSpec.describe 'Package' do - describe 'Package Registry', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry do - describe 'npm group level endpoint' do - using RSpec::Parameterized::TableSyntax - include Runtime::Fixtures - include Support::Helpers::MaskToken + describe 'npm Registry group level endpoint', :object_storage, :external_api_calls, + product_group: :package_registry do + using RSpec::Parameterized::TableSyntax + include Runtime::Fixtures + include Support::Helpers::MaskToken - let!(:registry_scope) { Runtime::Namespace.sandbox_name } - let!(:personal_access_token) do - Flow::Login.sign_in unless Page::Main::Menu.perform(&:signed_in?) + let!(:registry_scope) { Runtime::Namespace.sandbox_name } + let!(:personal_access_token) do + Flow::Login.sign_in unless Page::Main::Menu.perform(&:signed_in?) - Resource::PersonalAccessToken.fabricate!.token - end - - let(:project_deploy_token) do - Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token| - deploy_token.name = 'npm-deploy-token' - deploy_token.project = project - deploy_token.scopes = %w[ - read_repository - read_package_registry - write_package_registry - ] - end - end - - let(:uri) { URI.parse(Runtime::Scenario.gitlab_address) } - let(:gitlab_address_with_port) { "#{uri.scheme}://#{uri.host}:#{uri.port}" } - let(:gitlab_host_with_port) { "#{uri.host}:#{uri.port}" } + Resource::PersonalAccessToken.fabricate!.token + end - let!(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'npm-group-level-publish' - end + let(:project_deploy_token) do + Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token| + deploy_token.name = 'npm-deploy-token' + deploy_token.project = project + deploy_token.scopes = %w[ + read_repository + read_package_registry + write_package_registry + ] end + end - let!(:another_project) do - Resource::Project.fabricate_via_api! do |another_project| - another_project.name = 'npm-group-level-install' - another_project.group = project.group - end + let(:gitlab_address_without_port) { Support::GitlabAddress.address_with_port(with_default_port: false) } + let(:gitlab_host_without_port) { Support::GitlabAddress.host_with_port(with_default_port: false) } + let!(:project) { create(:project, name: 'npm-group-level-publish') } + let!(:another_project) { create(:project, name: 'npm-group-level-install', group: project.group) } + let!(:runner) do + Resource::GroupRunner.fabricate! do |runner| + runner.name = "qa-runner-#{Time.now.to_i}" + runner.tags = ["runner-for-#{project.group.name}"] + runner.executor = :docker + runner.group = project.group end + end - let!(:runner) do - Resource::GroupRunner.fabricate! do |runner| - runner.name = "qa-runner-#{Time.now.to_i}" - runner.tags = ["runner-for-#{project.group.name}"] - runner.executor = :docker - runner.group = project.group - end + let(:package) do + Resource::Package.init do |package| + package.name = "@#{registry_scope}/#{project.name}-#{SecureRandom.hex(8)}" + package.project = project end + end - let(:package) do - Resource::Package.init do |package| - package.name = "@#{registry_scope}/#{project.name}-#{SecureRandom.hex(8)}" - package.project = project - end - end + after do + package.remove_via_api! + runner.remove_via_api! + project.remove_via_api! + another_project.remove_via_api! + end - after do - package.remove_via_api! - runner.remove_via_api! - project.remove_via_api! - another_project.remove_via_api! - end + where(:case_name, :authentication_token_type, :token_name, :testcase) do + 'using personal access token' | :personal_access_token | 'Personal Access Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/413760' + 'using ci job token' | :ci_job_token | 'CI Job Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/413761' + 'using project deploy token' | :project_deploy_token | 'Deploy Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/413762' + end - where(:case_name, :authentication_token_type, :token_name, :testcase) do - 'using personal access token' | :personal_access_token | 'Personal Access Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/413760' - 'using ci job token' | :ci_job_token | 'CI Job Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/413761' - 'using project deploy token' | :project_deploy_token | 'Deploy Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/413762' + with_them do + let(:auth_token) do + case authentication_token_type + when :personal_access_token + use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: project) + use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: another_project) + when :ci_job_token + '${CI_JOB_TOKEN}' + when :project_deploy_token + use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project) + use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: another_project) + end end - with_them do - let(:auth_token) do - case authentication_token_type - when :personal_access_token - use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: project) - use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: another_project) - when :ci_job_token - '${CI_JOB_TOKEN}' - when :project_deploy_token - use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project) - use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: another_project) + it 'push and pull a npm package via CI', testcase: params[:testcase] do + Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do + npm_upload_yaml = ERB.new(read_fixture('package_managers/npm', + 'npm_upload_package_group.yaml.erb')).result(binding) + package_json = ERB.new(read_fixture('package_managers/npm', 'package.json.erb')).result(binding) + + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = project + commit.commit_message = 'Add files' + commit.add_files([ + { + file_path: '.gitlab-ci.yml', + content: npm_upload_yaml + }, + { + file_path: 'package.json', + content: package_json + } + ]) end end - it 'push and pull a npm package via CI', testcase: params[:testcase] do - Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do - npm_upload_yaml = ERB.new(read_fixture('package_managers/npm', - 'npm_upload_package_group.yaml.erb')).result(binding) - package_json = ERB.new(read_fixture('package_managers/npm', 'package.json.erb')).result(binding) - - Resource::Repository::Commit.fabricate_via_api! do |commit| - commit.project = project - commit.commit_message = 'Add files' - commit.add_files([ - { - file_path: '.gitlab-ci.yml', - content: npm_upload_yaml - }, - { - file_path: 'package.json', - content: package_json - } - ]) - end - end - - project.visit! - Flow::Pipeline.visit_latest_pipeline + project.visit! + Flow::Pipeline.visit_latest_pipeline - Page::Project::Pipeline::Show.perform do |pipeline| - pipeline.click_job('deploy') - end + 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::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + end - Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do - Resource::Repository::Commit.fabricate_via_api! do |commit| - npm_install_yaml = ERB.new(read_fixture('package_managers/npm', - 'npm_install_package_group.yaml.erb')).result(binding) - - commit.project = another_project - commit.commit_message = 'Add .gitlab-ci.yml' - commit.add_files([ - { - file_path: '.gitlab-ci.yml', - content: npm_install_yaml - } - ]) - end + Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do + Resource::Repository::Commit.fabricate_via_api! do |commit| + npm_install_yaml = ERB.new(read_fixture('package_managers/npm', + 'npm_install_package_group.yaml.erb')).result(binding) + + commit.project = another_project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files([ + { + file_path: '.gitlab-ci.yml', + content: npm_install_yaml + } + ]) end + end - another_project.visit! - Flow::Pipeline.visit_latest_pipeline + another_project.visit! + Flow::Pipeline.visit_latest_pipeline - Page::Project::Pipeline::Show.perform do |pipeline| - pipeline.click_job('install') - end + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('install') + end - Page::Project::Job::Show.perform do |job| - expect(job).to be_successful(timeout: 800) - job.click_browse_button - end + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + job.click_browse_button + end - Page::Project::Artifact::Show.perform do |artifacts| - artifacts.go_to_directory('node_modules') - artifacts.go_to_directory("@#{registry_scope}") - expect(artifacts).to have_content(project.name.to_s) - end + Page::Project::Artifact::Show.perform do |artifacts| + artifacts.go_to_directory('node_modules') + artifacts.go_to_directory("@#{registry_scope}") + expect(artifacts).to have_content(project.name.to_s) + end - project.visit! - Page::Project::Menu.perform(&:go_to_package_registry) + project.visit! + Page::Project::Menu.perform(&:go_to_package_registry) - Page::Project::Packages::Index.perform do |index| - expect(index).to have_package(package.name) + Page::Project::Packages::Index.perform do |index| + expect(index).to have_package(package.name) - index.click_package(package.name) - end + index.click_package(package.name) + end - Page::Project::Packages::Show.perform do |show| - expect(show).to have_package_info(package.name, "1.0.0") - end + Page::Project::Packages::Show.perform do |show| + expect(show).to have_package_info(package.name, "1.0.0") end end end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb index b0702b3f089..f8e526a01b0 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb @@ -2,168 +2,154 @@ module QA RSpec.describe 'Package' do - describe 'Package Registry', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry do - describe 'npm instance level endpoint' do - using RSpec::Parameterized::TableSyntax - include Runtime::Fixtures - include Support::Helpers::MaskToken + describe 'npm Registry instance level endpoint', :object_storage, :external_api_calls, + product_group: :package_registry do + using RSpec::Parameterized::TableSyntax + include Runtime::Fixtures + include Support::Helpers::MaskToken - let!(:registry_scope) { Runtime::Namespace.sandbox_name } - let!(:personal_access_token) do - Flow::Login.sign_in unless Page::Main::Menu.perform(&:signed_in?) + let!(:registry_scope) { Runtime::Namespace.sandbox_name } + let!(:personal_access_token) do + Flow::Login.sign_in unless Page::Main::Menu.perform(&:signed_in?) - Resource::PersonalAccessToken.fabricate!.token - end - - let(:project_deploy_token) do - Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token| - deploy_token.name = 'npm-deploy-token' - deploy_token.project = project - deploy_token.scopes = %w[ - read_repository - read_package_registry - write_package_registry - ] - end - end - - let(:uri) { URI.parse(Runtime::Scenario.gitlab_address) } - let(:gitlab_address_with_port) { "#{uri.scheme}://#{uri.host}:#{uri.port}" } - let(:gitlab_host_with_port) { "#{uri.host}:#{uri.port}" } + Resource::PersonalAccessToken.fabricate!.token + end - let!(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'npm-instace-level-publish' - end + let(:project_deploy_token) do + Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token| + deploy_token.name = 'npm-deploy-token' + deploy_token.project = project + deploy_token.scopes = %w[ + read_repository + read_package_registry + write_package_registry + ] end + end - let!(:another_project) do - Resource::Project.fabricate_via_api! do |another_project| - another_project.name = 'npm-instance-level-install' - another_project.group = project.group - end + let(:gitlab_address_without_port) { Support::GitlabAddress.address_with_port(with_default_port: false) } + let(:gitlab_host_without_port) { Support::GitlabAddress.host_with_port(with_default_port: false) } + let!(:project) { create(:project, name: 'npm-instance-level-publish') } + let!(:another_project) { create(:project, name: 'npm-instance-level-install', group: project.group) } + let!(:runner) do + Resource::GroupRunner.fabricate! do |runner| + runner.name = "qa-runner-#{Time.now.to_i}" + runner.tags = ["runner-for-#{project.group.name}"] + runner.executor = :docker + runner.group = project.group end + end - let!(:runner) do - Resource::GroupRunner.fabricate! do |runner| - runner.name = "qa-runner-#{Time.now.to_i}" - runner.tags = ["runner-for-#{project.group.name}"] - runner.executor = :docker - runner.group = project.group - end + let(:package) do + Resource::Package.init do |package| + package.name = "@#{registry_scope}/#{project.name}-#{SecureRandom.hex(8)}" + package.project = project end + end - let(:package) do - Resource::Package.init do |package| - package.name = "@#{registry_scope}/#{project.name}-#{SecureRandom.hex(8)}" - package.project = project - end - end + after do + package.remove_via_api! + runner.remove_via_api! + project.remove_via_api! + another_project.remove_via_api! + end - after do - package.remove_via_api! - runner.remove_via_api! - project.remove_via_api! - another_project.remove_via_api! - end + where(:case_name, :authentication_token_type, :token_name, :testcase) do + 'using personal access token' | :personal_access_token | 'Personal Access Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347600' + 'using ci job token' | :ci_job_token | 'CI Job Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347599' + 'using project deploy token' | :project_deploy_token | 'Deploy Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347598' + end - where(:case_name, :authentication_token_type, :token_name, :testcase) do - 'using personal access token' | :personal_access_token | 'Personal Access Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347600' - 'using ci job token' | :ci_job_token | 'CI Job Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347599' - 'using project deploy token' | :project_deploy_token | 'Deploy Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347598' + with_them do + let(:auth_token) do + case authentication_token_type + when :personal_access_token + use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: project) + use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: another_project) + when :ci_job_token + '${CI_JOB_TOKEN}' + when :project_deploy_token + use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project) + use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: another_project) + end end - with_them do - let(:auth_token) do - case authentication_token_type - when :personal_access_token - use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: project) - use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: another_project) - when :ci_job_token - '${CI_JOB_TOKEN}' - when :project_deploy_token - use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project) - use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: another_project) + it 'push and pull a npm package via CI', testcase: params[:testcase] do + Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do + npm_upload_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_upload_package_instance.yaml.erb')).result(binding) + package_json = ERB.new(read_fixture('package_managers/npm', 'package.json.erb')).result(binding) + + Resource::Repository::Commit.fabricate_via_api! do |commit| + commit.project = project + commit.commit_message = 'Add files' + commit.add_files([ + { + file_path: '.gitlab-ci.yml', + content: npm_upload_yaml + }, + { + file_path: 'package.json', + content: package_json + } + ]) end end - it 'push and pull a npm package via CI', testcase: params[:testcase] do - Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do - npm_upload_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_upload_package_instance.yaml.erb')).result(binding) - package_json = ERB.new(read_fixture('package_managers/npm', 'package.json.erb')).result(binding) - - Resource::Repository::Commit.fabricate_via_api! do |commit| - commit.project = project - commit.commit_message = 'Add files' - commit.add_files([ - { - file_path: '.gitlab-ci.yml', - content: npm_upload_yaml - }, - { - file_path: 'package.json', - content: package_json - } - ]) - end - end - - project.visit! - Flow::Pipeline.visit_latest_pipeline + project.visit! + Flow::Pipeline.visit_latest_pipeline - Page::Project::Pipeline::Show.perform do |pipeline| - pipeline.click_job('deploy') - end + 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::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + end - Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do - Resource::Repository::Commit.fabricate_via_api! do |commit| - npm_install_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_install_package_instance.yaml.erb')).result(binding) - - commit.project = another_project - commit.commit_message = 'Add .gitlab-ci.yml' - commit.add_files([ - { - file_path: '.gitlab-ci.yml', - content: npm_install_yaml - } - ]) - end + Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do + Resource::Repository::Commit.fabricate_via_api! do |commit| + npm_install_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_install_package_instance.yaml.erb')).result(binding) + + commit.project = another_project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files([ + { + file_path: '.gitlab-ci.yml', + content: npm_install_yaml + } + ]) end + end - another_project.visit! - Flow::Pipeline.visit_latest_pipeline + another_project.visit! + Flow::Pipeline.visit_latest_pipeline - Page::Project::Pipeline::Show.perform do |pipeline| - pipeline.click_job('install') - end + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('install') + end - Page::Project::Job::Show.perform do |job| - expect(job).to be_successful(timeout: 800) - job.click_browse_button - end + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + job.click_browse_button + end - Page::Project::Artifact::Show.perform do |artifacts| - artifacts.go_to_directory('node_modules') - artifacts.go_to_directory("@#{registry_scope}") - expect(artifacts).to have_content(project.name.to_s) - end + Page::Project::Artifact::Show.perform do |artifacts| + artifacts.go_to_directory('node_modules') + artifacts.go_to_directory("@#{registry_scope}") + expect(artifacts).to have_content(project.name.to_s) + end - project.visit! - Page::Project::Menu.perform(&:go_to_package_registry) + project.visit! + Page::Project::Menu.perform(&:go_to_package_registry) - Page::Project::Packages::Index.perform do |index| - expect(index).to have_package(package.name) + Page::Project::Packages::Index.perform do |index| + expect(index).to have_package(package.name) - index.click_package(package.name) - end + index.click_package(package.name) + end - Page::Project::Packages::Show.perform do |show| - expect(show).to have_package_info(package.name, "1.0.0") - end + Page::Project::Packages::Show.perform do |show| + expect(show).to have_package_info(package.name, "1.0.0") end end end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb index 1eed68d1b88..11df6dcb303 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/npm/npm_project_level_spec.rb @@ -2,141 +2,132 @@ module QA RSpec.describe 'Package' do - describe 'Package Registry', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry do - describe 'npm project level endpoint' do - using RSpec::Parameterized::TableSyntax - include Runtime::Fixtures - include Support::Helpers::MaskToken + describe 'npm Registry project level endpoint', :object_storage, :external_api_calls, + product_group: :package_registry do + using RSpec::Parameterized::TableSyntax + include Runtime::Fixtures + include Support::Helpers::MaskToken - let!(:registry_scope) { Runtime::Namespace.sandbox_name } - let!(:personal_access_token) do - Flow::Login.sign_in unless Page::Main::Menu.perform(&:signed_in?) + let!(:registry_scope) { Runtime::Namespace.sandbox_name } + let!(:personal_access_token) do + Flow::Login.sign_in unless Page::Main::Menu.perform(&:signed_in?) - Resource::PersonalAccessToken.fabricate!.token + Resource::PersonalAccessToken.fabricate!.token + end + + let(:project_deploy_token) do + Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token| + deploy_token.name = 'npm-deploy-token' + deploy_token.project = project + deploy_token.scopes = %w[ + read_repository + read_package_registry + write_package_registry + ] end + end - let(:project_deploy_token) do - Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token| - deploy_token.name = 'npm-deploy-token' - deploy_token.project = project - deploy_token.scopes = %w[ - read_repository - read_package_registry - write_package_registry - ] - end + let(:gitlab_address_without_port) { Support::GitlabAddress.address_with_port(with_default_port: false) } + let(:gitlab_host_without_port) { Support::GitlabAddress.host_with_port(with_default_port: false) } + let!(:project) { create(:project, :private, name: 'npm-project-level') } + let!(:runner) do + Resource::ProjectRunner.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 - let(:uri) { URI.parse(Runtime::Scenario.gitlab_address) } - let(:gitlab_address_with_port) { "#{uri.scheme}://#{uri.host}:#{uri.port}" } - let(:gitlab_host_with_port) { "#{uri.host}:#{uri.port}" } + let(:package) do + Resource::Package.init do |package| + package.name = "@#{registry_scope}/mypackage-#{SecureRandom.hex(8)}" + package.project = project + end + end - let!(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'npm-project-level' - project.visibility = :private + after do + package.remove_via_api! + runner.remove_via_api! + project.remove_via_api! + end + + where(:case_name, :authentication_token_type, :token_name, :testcase) do + 'using personal access token' | :personal_access_token | 'Personal Access Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347592' + 'using ci job token' | :ci_job_token | 'CI Job Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347594' + 'using project deploy token' | :project_deploy_token | 'Deploy Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347593' + end + + with_them do + let(:auth_token) do + case authentication_token_type + when :personal_access_token + use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: project) + when :ci_job_token + '${CI_JOB_TOKEN}' + when :project_deploy_token + use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project) end end - let!(:runner) do - Resource::ProjectRunner.fabricate! do |runner| - runner.name = "qa-runner-#{Time.now.to_i}" - runner.tags = ["runner-for-#{project.name}"] - runner.executor = :docker - runner.project = project + it 'push and pull a npm package via CI', testcase: params[:testcase] do + Resource::Repository::Commit.fabricate_via_api! do |commit| + npm_upload_install_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_upload_install_package_project.yaml.erb')).result(binding) + package_json = ERB.new(read_fixture('package_managers/npm', 'package.json.erb')).result(binding) + + commit.project = project + commit.commit_message = 'Add .gitlab-ci.yml' + commit.add_files([ + { + file_path: '.gitlab-ci.yml', + content: npm_upload_install_yaml + }, + { + file_path: 'package.json', + content: package_json + } + ]) end - end - let(:package) do - Resource::Package.init do |package| - package.name = "@#{registry_scope}/mypackage-#{SecureRandom.hex(8)}" - package.project = project + project.visit! + Flow::Pipeline.visit_latest_pipeline + + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('deploy') end - end - after do - package.remove_via_api! - runner.remove_via_api! - project.remove_via_api! - end + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + end - where(:case_name, :authentication_token_type, :token_name, :testcase) do - 'using personal access token' | :personal_access_token | 'Personal Access Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347592' - 'using ci job token' | :ci_job_token | 'CI Job Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347594' - 'using project deploy token' | :project_deploy_token | 'Deploy Token' | 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347593' - end + Flow::Pipeline.visit_latest_pipeline + + Page::Project::Pipeline::Show.perform do |pipeline| + pipeline.click_job('install') + end + + Page::Project::Job::Show.perform do |job| + expect(job).to be_successful(timeout: 800) + job.click_browse_button + end + + Page::Project::Artifact::Show.perform do |artifacts| + artifacts.go_to_directory('node_modules') + artifacts.go_to_directory("@#{registry_scope}") + expect(artifacts).to have_content('mypackage') + end + + project.visit! + Page::Project::Menu.perform(&:go_to_package_registry) + + Page::Project::Packages::Index.perform do |index| + expect(index).to have_package(package.name) - with_them do - let(:auth_token) do - case authentication_token_type - when :personal_access_token - use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: personal_access_token, project: project) - when :ci_job_token - '${CI_JOB_TOKEN}' - when :project_deploy_token - use_ci_variable(name: 'PROJECT_DEPLOY_TOKEN', value: project_deploy_token.token, project: project) - end + index.click_package(package.name) end - it 'push and pull a npm package via CI', testcase: params[:testcase] do - Resource::Repository::Commit.fabricate_via_api! do |commit| - npm_upload_install_yaml = ERB.new(read_fixture('package_managers/npm', 'npm_upload_install_package_project.yaml.erb')).result(binding) - package_json = ERB.new(read_fixture('package_managers/npm', 'package.json.erb')).result(binding) - - commit.project = project - commit.commit_message = 'Add .gitlab-ci.yml' - commit.add_files([ - { - file_path: '.gitlab-ci.yml', - content: npm_upload_install_yaml - }, - { - file_path: 'package.json', - content: package_json - } - ]) - end - - project.visit! - 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 - - Flow::Pipeline.visit_latest_pipeline - - Page::Project::Pipeline::Show.perform do |pipeline| - pipeline.click_job('install') - end - - Page::Project::Job::Show.perform do |job| - expect(job).to be_successful(timeout: 800) - job.click_browse_button - end - - Page::Project::Artifact::Show.perform do |artifacts| - artifacts.go_to_directory('node_modules') - artifacts.go_to_directory("@#{registry_scope}") - expect(artifacts).to have_content('mypackage') - end - - project.visit! - Page::Project::Menu.perform(&:go_to_package_registry) - - 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, "1.0.0") - end + Page::Project::Packages::Show.perform do |show| + expect(show).to have_package_info(package.name, "1.0.0") end end end diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb index 5413ae85dcd..04e020178ee 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_group_level_spec.rb @@ -1,20 +1,13 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry do - describe 'NuGet group level endpoint' do + RSpec.describe 'Package', :object_storage, product_group: :package_registry do + describe 'NuGet group level endpoint', :external_api_calls do using RSpec::Parameterized::TableSyntax include Runtime::Fixtures include Support::Helpers::MaskToken - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'nuget-package-project' - project.template_name = 'dotnetcore' - project.visibility = :private - end - end - + let(:project) { create(:project, :private, name: 'nuget-package-project', template_name: 'dotnetcore') } let(:personal_access_token) do unless Page::Main::Menu.perform(&:signed_in?) Flow::Login.sign_in @@ -42,14 +35,7 @@ module QA end end - let(:another_project) do - Resource::Project.fabricate_via_api! do |another_project| - another_project.name = 'nuget-package-install-project' - another_project.template_name = 'dotnetcore' - another_project.group = project.group - end - end - + let(:another_project) { create(:project, name: 'nuget-package-install-project', template_name: 'dotnetcore', group: project.group) } let(:package_project_inbound_job_token_disabled) do Resource::CICDSettings.fabricate_via_api! do |settings| settings.project_path = project.full_path diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb index 9a192bc005f..b4cac8af1dc 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/nuget/nuget_project_level_spec.rb @@ -1,20 +1,12 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' }, product_group: :package_registry do - describe 'NuGet project level endpoint' do + RSpec.describe 'Package', :object_storage, product_group: :package_registry do + describe 'NuGet project level endpoint', :external_api_calls do include Support::Helpers::MaskToken - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'nuget-package-project' - project.template_name = 'dotnetcore' - project.visibility = :private - end - end - + let(:project) { create(:project, :private, name: 'nuget-package-project', template_name: 'dotnetcore') } let(:personal_access_token) { Resource::PersonalAccessToken.fabricate! } - let(:project_deploy_token) do Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token| deploy_token.name = 'package-deploy-token' diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb index 7e2885d3724..80439501299 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb @@ -2,22 +2,11 @@ module QA RSpec.describe 'Package', :object_storage, product_group: :package_registry do - describe 'PyPI Repository', - quarantine: { - only: { job: %w[relative_url airgapped] }, - issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/417592', - type: :investigating - } do + describe 'PyPI Repository', :external_api_calls do include Runtime::Fixtures include Support::Helpers::MaskToken - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'pypi-package-project' - project.visibility = :private - end - end - + let(:project) { create(:project, :private, name: 'pypi-package-project') } let(:package) do Resource::Package.init do |package| package.name = "mypypipackage-#{SecureRandom.hex(8)}" @@ -40,15 +29,8 @@ module QA use_ci_variable(name: 'PERSONAL_ACCESS_TOKEN', value: Runtime::Env.personal_access_token, project: project) end - let(:gitlab_address_with_port) { "#{uri.scheme}://#{uri.host}:#{uri.port}" } - let(:gitlab_host_with_port) do - # Don't specify port if it is a standard one - if uri.port == 80 || uri.port == 443 - uri.host - else - "#{uri.host}:#{uri.port}" - end - end + let(:gitlab_address_with_port) { Support::GitlabAddress.address_with_port } + let(:gitlab_host_with_port) { Support::GitlabAddress.host_with_port(with_default_port: false) } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb b/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb index 0c58d41d96e..c77bb9b1b4b 100644 --- a/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb +++ b/qa/qa/specs/features/browser_ui/5_package/package_registry/rubygems_registry_spec.rb @@ -1,18 +1,12 @@ # frozen_string_literal: true module QA - RSpec.describe 'Package', :object_storage, except: { job: 'relative-url' }, + RSpec.describe 'Package', :object_storage, :external_api_calls, feature_flag: { name: 'rubygem_packages', scope: :project } do describe 'RubyGems Repository', product_group: :package_registry do include Runtime::Fixtures - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'rubygems-package-project' - project.visibility = :private - end - end - + let(:project) { create(:project, :private, name: 'rubygems-package-project') } let(:package) do Resource::Package.init do |package| package.name = "mygem-#{SecureRandom.hex(8)}" @@ -30,8 +24,7 @@ module QA end let(:gitlab_address_with_port) do - uri = URI.parse(Runtime::Scenario.gitlab_address) - "#{uri.scheme}://#{uri.host}:#{uri.port}" + Support::GitlabAddress.address_with_port end before do diff --git a/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb b/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb index 51006dd1e38..d9a1f1cd4a6 100644 --- a/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb +++ b/qa/qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb @@ -7,13 +7,7 @@ module QA describe 'Git clone using a deploy key' do let(:runner_name) { "qa-runner-#{SecureRandom.hex(4)}" } let(:repository_location) { project.repository_ssh_location } - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'deploy-key-clone-project' - end - end - + let(:project) { create(:project, name: 'deploy-key-clone-project') } let!(:runner) do Resource::ProjectRunner.fabricate_via_api! do |resource| resource.project = project diff --git a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/auto_devops_templates_spec.rb b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/auto_devops_templates_spec.rb index 42a64099a3d..7e941a135f1 100644 --- a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/auto_devops_templates_spec.rb +++ b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/auto_devops_templates_spec.rb @@ -25,12 +25,11 @@ module QA with_them do let!(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = "#{template}-autodevops-project-template" - project.template_name = template - project.description = "Let's see if the #{template} project works..." - project.auto_devops_enabled = true - end + create(:project, + :auto_devops, + name: "#{template}-autodevops-project-template", + template_name: template, + description: "Let's see if the #{template} project works") end let(:pipeline) do diff --git a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb index 0a9f30f0529..8ee77f5c054 100644 --- a/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb +++ b/qa/qa/specs/features/browser_ui/7_configure/auto_devops/create_project_with_auto_devops_spec.rb @@ -4,16 +4,8 @@ module QA RSpec.describe 'Configure', only: { pipeline: %i[staging staging-canary canary production] }, product_group: :configure do describe 'Auto DevOps with a Kubernetes Agent' do - let!(:app_project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'autodevops-app-project' - project.template_name = 'express' - project.auto_devops_enabled = true - end - end - + let!(:app_project) { create(:project, :auto_devops, name: 'autodevops-app-project', template_name: 'express') } let!(:cluster) { Service::KubernetesCluster.new(provider_class: Service::ClusterProvider::Gcloud).create! } - let!(:kubernetes_agent) do Resource::Clusters::Agent.fabricate_via_api! do |agent| agent.name = 'agent1' @@ -28,7 +20,7 @@ module QA end before do - cluster.install_kubernetes_agent(agent_token.token) + cluster.install_kubernetes_agent(agent_token.token, kubernetes_agent.name) upload_agent_config(app_project, kubernetes_agent.name) set_kube_ingress_base_domain(app_project) diff --git a/qa/qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb index b44020ddfce..79739006928 100644 --- a/qa/qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb +++ b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb @@ -12,13 +12,7 @@ module QA end end - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-for-alerts' - project.description = 'Project for alerts' - end - end - + let(:project) { create(:project, name: 'project-for-alerts', description: 'Project for alerts') } let(:alert_title) { Faker::Lorem.word } before do diff --git a/qa/qa/specs/features/browser_ui/8_monitor/alert_management/automatically_creates_incident_for_alert_spec.rb b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/automatically_creates_incident_for_alert_spec.rb index 565f56b90ec..dff130a5793 100644 --- a/qa/qa/specs/features/browser_ui/8_monitor/alert_management/automatically_creates_incident_for_alert_spec.rb +++ b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/automatically_creates_incident_for_alert_spec.rb @@ -12,12 +12,7 @@ module QA end end - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-for-alerts' - project.description = 'Project for alerts' - end - end + let(:project) { create(:project, name: 'project-for-alerts', description: 'Project for alerts') } before do Flow::Login.sign_in diff --git a/qa/qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb index 96db10c1683..dfc41fdad85 100644 --- a/qa/qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb +++ b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb @@ -28,15 +28,8 @@ module QA end end - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-for-alerts' - project.description = 'Project for alerts' - end - end - + let(:project) { create(:project, name: 'project-for-alerts', description: 'Project for alerts') } let(:alert_title) { Faker::Lorem.word } - let(:credentials) do Flow::AlertSettings.integration_credentials end diff --git a/qa/qa/specs/features/browser_ui/8_monitor/alert_management/email_notification_for_alert_spec.rb b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/email_notification_for_alert_spec.rb index 008d8f808b3..85aa12062d5 100644 --- a/qa/qa/specs/features/browser_ui/8_monitor/alert_management/email_notification_for_alert_spec.rb +++ b/qa/qa/specs/features/browser_ui/8_monitor/alert_management/email_notification_for_alert_spec.rb @@ -19,13 +19,7 @@ module QA end end - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'project-for-alerts' - project.description = 'Project for alerts' - end - end - + let(:project) { create(:project, name: 'project-for-alerts', description: 'Project for alerts') } let(:alert_title) { Faker::Lorem.word } let(:mail_hog_api) { Vendor::MailHog::API.new } let(:alert_email_subject) { "#{project.name} | Alert: #{alert_title}" } diff --git a/qa/qa/specs/features/browser_ui/9_data_stores/group/group_member_access_request_spec.rb b/qa/qa/specs/features/browser_ui/9_data_stores/group/group_member_access_request_spec.rb index 1206898431a..0c977e5259c 100644 --- a/qa/qa/specs/features/browser_ui/9_data_stores/group/group_member_access_request_spec.rb +++ b/qa/qa/specs/features/browser_ui/9_data_stores/group/group_member_access_request_spec.rb @@ -12,10 +12,7 @@ module QA end let!(:group) do - Resource::Group.fabricate_via_api! do |group| - group.path = "group-for-access-request-#{SecureRandom.hex(8)}" - group.api_client = admin_api_client - end + create(:group, path: "group-for-access-request-#{SecureRandom.hex(8)}", api_client: admin_api_client) end before do @@ -27,7 +24,7 @@ module QA Flow::Login.sign_in_as_admin Page::Main::Menu.perform do |menu| - menu.go_to_page_by_shortcut(:todos_shortcut_button) + menu.go_to_page_by_shortcut('todos-shortcut-button') end Page::Dashboard::Todos.perform do |todos| diff --git a/qa/qa/specs/features/browser_ui/9_data_stores/group/transfer_group_spec.rb b/qa/qa/specs/features/browser_ui/9_data_stores/group/transfer_group_spec.rb index 2f14e2c10da..2a1f8a58108 100644 --- a/qa/qa/specs/features/browser_ui/9_data_stores/group/transfer_group_spec.rb +++ b/qa/qa/specs/features/browser_ui/9_data_stores/group/transfer_group_spec.rb @@ -3,23 +3,12 @@ module QA RSpec.describe 'Data Stores' do describe 'Subgroup transfer', product_group: :tenant_scale do - let(:source_group) do - Resource::Group.fabricate_via_api! do |group| - group.path = "source-group-for-transfer_#{SecureRandom.hex(8)}" - end - end + let(:source_group) { create(:group, path: "source-group-for-transfer_#{SecureRandom.hex(8)}") } - let!(:target_group) do - Resource::Group.fabricate_via_api! do |group| - group.path = "target-group-for-transfer_#{SecureRandom.hex(8)}" - end - end + let!(:target_group) { create(:group, path: "target-group-for-transfer_#{SecureRandom.hex(8)}") } let(:sub_group_for_transfer) do - Resource::Group.fabricate_via_api! do |group| - group.path = "subgroup-for-transfer_#{SecureRandom.hex(8)}" - group.sandbox = source_group - end + create(:group, path: "subgroup-for-transfer_#{SecureRandom.hex(8)}", sandbox: source_group) end before do diff --git a/qa/qa/specs/features/browser_ui/9_data_stores/group/transfer_project_spec.rb b/qa/qa/specs/features/browser_ui/9_data_stores/group/transfer_project_spec.rb index 02e1598d6e7..6de1d08e674 100644 --- a/qa/qa/specs/features/browser_ui/9_data_stores/group/transfer_project_spec.rb +++ b/qa/qa/specs/features/browser_ui/9_data_stores/group/transfer_project_spec.rb @@ -2,26 +2,10 @@ module QA RSpec.describe 'Data Stores' do - describe 'Project transfer between groups', :reliable, product_group: :tenant_scale do - let(:source_group) do - Resource::Group.fabricate_via_api! do |group| - group.path = "source-group-#{SecureRandom.hex(8)}" - end - end - - let!(:target_group) do - Resource::Group.fabricate_via_api! do |group| - group.path = "target-group-for-transfer_#{SecureRandom.hex(8)}" - end - end - - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.group = source_group - project.name = 'transfer-project' - end - end - + describe 'Project transfer', :reliable, product_group: :tenant_scale do + let(:project) { create(:project, name: 'transfer-project', group: source_group) } + let(:source_group) { create(:group, path: "source-group-#{SecureRandom.hex(8)}") } + let!(:target_group) { create(:group, path: "target-group-for-transfer_#{SecureRandom.hex(8)}") } let(:readme_content) { 'Here is the edited content.' } before do diff --git a/qa/qa/specs/features/browser_ui/9_data_stores/project/add_project_member_spec.rb b/qa/qa/specs/features/browser_ui/9_data_stores/project/add_project_member_spec.rb index 0beb297ffdb..7fb970c3f25 100644 --- a/qa/qa/specs/features/browser_ui/9_data_stores/project/add_project_member_spec.rb +++ b/qa/qa/specs/features/browser_ui/9_data_stores/project/add_project_member_spec.rb @@ -2,16 +2,13 @@ module QA RSpec.describe 'Data Stores', :reliable, product_group: :tenant_scale do - describe 'Add project member' do - it 'user adds project member', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347887' do + describe 'Project Member' do + it 'adds a project member', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347887' do Flow::Login.sign_in user = Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_1, Runtime::Env.gitlab_qa_password_1) - project = Resource::Project.fabricate_via_api! do |project| - project.name = 'add-member-project' - end - + project = create(:project, name: 'add-member-project') project.visit! Page::Project::Menu.perform(&:click_members) diff --git a/qa/qa/specs/features/browser_ui/9_data_stores/project/create_project_badge_spec.rb b/qa/qa/specs/features/browser_ui/9_data_stores/project/create_project_badge_spec.rb index 87492af089e..22f8cc93737 100644 --- a/qa/qa/specs/features/browser_ui/9_data_stores/project/create_project_badge_spec.rb +++ b/qa/qa/specs/features/browser_ui/9_data_stores/project/create_project_badge_spec.rb @@ -2,26 +2,21 @@ module QA RSpec.describe 'Data Stores' do - describe 'Create project badge', :reliable, product_group: :tenant_scale do + describe 'Project badge', :reliable, product_group: :tenant_scale do let(:badge_name) { "project-badge-#{SecureRandom.hex(8)}" } let(:expected_badge_link_url) { "#{Runtime::Scenario.gitlab_address}/#{project.path_with_namespace}" } let(:expected_badge_image_url) do "#{Runtime::Scenario.gitlab_address}/#{project.path_with_namespace}/badges/main/pipeline.svg" end - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'badge-test-project' - project.initialize_with_readme = true - end - end + let(:project) { create(:project, :with_readme, name: 'badge-test-project') } before do Flow::Login.sign_in project.visit! end - it 'creates project badge successfully', + it 'creates project badge', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/350065' do Resource::ProjectBadge.fabricate! do |badge| badge.name = badge_name diff --git a/qa/qa/specs/features/browser_ui/9_data_stores/project/dashboard_images_spec.rb b/qa/qa/specs/features/browser_ui/9_data_stores/project/dashboard_images_spec.rb index f2136773f59..2ea96dfef95 100644 --- a/qa/qa/specs/features/browser_ui/9_data_stores/project/dashboard_images_spec.rb +++ b/qa/qa/specs/features/browser_ui/9_data_stores/project/dashboard_images_spec.rb @@ -16,7 +16,7 @@ module QA user.remove_via_api! end - it 'loads all images' do + it do Flow::Login.sign_in(as: user) Page::Dashboard::Welcome.perform do |welcome| @@ -32,14 +32,14 @@ module QA describe 'Check for broken images', :requires_admin, :reliable do context( - 'when logged in as a new user', + 'when a new user logs in', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347885' ) do it_behaves_like 'loads all images', false end context( - 'when logged in as a new admin', + 'when a new admin logs in', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347884' ) do it_behaves_like 'loads all images', true diff --git a/qa/qa/specs/features/browser_ui/9_data_stores/project/invite_group_to_project_spec.rb b/qa/qa/specs/features/browser_ui/9_data_stores/project/invite_group_to_project_spec.rb index c7501d437eb..29e39d48c67 100644 --- a/qa/qa/specs/features/browser_ui/9_data_stores/project/invite_group_to_project_spec.rb +++ b/qa/qa/specs/features/browser_ui/9_data_stores/project/invite_group_to_project_spec.rb @@ -4,7 +4,7 @@ module QA RSpec.describe 'Data Stores' do describe 'Invite group', :reliable, product_group: :tenant_scale do shared_examples 'invites group to project' do - it 'verifies group is added and members can access project with correct access level' do + it 'grants group and members correct access level' do Page::Project::Menu.perform(&:click_members) Page::Project::Members.perform do |project_members| project_members.invite_group(group.path, 'Developer') @@ -40,19 +40,14 @@ module QA context 'with a personal namespace project', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349223' do - let(:group) do - Resource::Group.fabricate_via_api! do |group| - group.path = "group-for-personal-project-#{SecureRandom.hex(8)}" - end - end + let(:group) { create(:group, path: "group-for-personal-project-#{SecureRandom.hex(8)}") } let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'personal-namespace-project' - project.personal_namespace = Runtime::User.username - project.visibility = :private - project.description = 'test personal namespace project' - end + create(:project, + :private, + name: 'personal-namespace-project', + description: 'test personal namespace project', + personal_namespace: Runtime::User.username) end after do @@ -64,19 +59,9 @@ module QA end context 'with a group project', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/349340' do - let(:group) do - Resource::Group.fabricate_via_api! do |group| - group.path = "group-for-group-project-#{SecureRandom.hex(8)}" - end - end + let(:group) { create(:group, path: "group-for-group-project-#{SecureRandom.hex(8)}") } - let(:project) do - Resource::Project.fabricate_via_api! do |project| - project.name = 'group-project' - project.visibility = :private - project.description = 'test group project' - end - end + let(:project) { create(:project, :private, name: 'group-project', description: 'test group project') } after do project.remove_via_api! diff --git a/qa/qa/specs/features/browser_ui/9_data_stores/project/project_owner_permissions_spec.rb b/qa/qa/specs/features/browser_ui/9_data_stores/project/project_owner_permissions_spec.rb index 2793b0440a4..310b8747584 100644 --- a/qa/qa/specs/features/browser_ui/9_data_stores/project/project_owner_permissions_spec.rb +++ b/qa/qa/specs/features/browser_ui/9_data_stores/project/project_owner_permissions_spec.rb @@ -13,7 +13,7 @@ module QA Resource::User.fabricate_or_use(Runtime::Env.gitlab_qa_username_2, Runtime::Env.gitlab_qa_password_2) end - shared_examples 'when user is added as owner' do |project_type, testcase| + shared_examples 'adds user as owner' do |project_type, testcase| let!(:issue) do Resource::Issue.fabricate_via_api! do |issue| issue.api_client = owner_api_client @@ -27,7 +27,7 @@ module QA Flow::Login.sign_in(as: owner) end - it "has owner role with owner permissions", testcase: testcase do + it "has owner role and permissions", testcase: testcase do Page::Dashboard::Projects.perform do |projects| projects.filter_by_name(project.name) @@ -44,7 +44,7 @@ module QA end end - shared_examples 'when user is added as maintainer' do |testcase| + shared_examples 'adds user as maintainer' do |testcase| let!(:issue) do Resource::Issue.fabricate_via_api! do |issue| issue.api_client = owner_api_client @@ -82,12 +82,12 @@ module QA end end - it_behaves_like 'when user is added as owner', :personal_project, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352542' - it_behaves_like 'when user is added as maintainer', 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352607' + it_behaves_like 'adds user as owner', :personal_project, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352542' + it_behaves_like 'adds user as maintainer', 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/352607' end context 'for group projects' do - let!(:group) { Resource::Group.fabricate_via_api! } + let!(:group) { create(:group) } let!(:project) do Resource::Project.fabricate_via_api! do |project| @@ -96,8 +96,8 @@ module QA end end - it_behaves_like 'when user is added as owner', :group_project, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366436' - it_behaves_like 'when user is added as maintainer', 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366435' + it_behaves_like 'adds user as owner', :group_project, 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366436' + it_behaves_like 'adds user as maintainer', 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/366435' end end end diff --git a/qa/qa/specs/features/browser_ui/9_data_stores/project/view_project_activity_spec.rb b/qa/qa/specs/features/browser_ui/9_data_stores/project/view_project_activity_spec.rb index 4945ef533a4..5cdb88407fb 100644 --- a/qa/qa/specs/features/browser_ui/9_data_stores/project/view_project_activity_spec.rb +++ b/qa/qa/specs/features/browser_ui/9_data_stores/project/view_project_activity_spec.rb @@ -3,22 +3,24 @@ module QA RSpec.describe 'Data Stores' do describe 'Project activity', :reliable, product_group: :tenant_scale do - it 'user creates an event in the activity page upon Git push', - testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347879' do - Flow::Login.sign_in + context 'with git push' do + it 'creates an event in the activity page', + testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347879' do + Flow::Login.sign_in - project = Resource::Repository::ProjectPush.fabricate! do |push| - push.file_name = 'README.md' - push.file_content = '# This is a test project' - push.commit_message = 'Add README.md' - end.project + project = Resource::Repository::ProjectPush.fabricate! do |push| + push.file_name = 'README.md' + push.file_content = '# This is a test project' + push.commit_message = 'Add README.md' + end.project - project.visit! - Page::Project::Menu.perform(&:click_activity) - Page::Project::Activity.perform do |activity| - activity.click_push_events + project.visit! + Page::Project::Menu.perform(&:click_activity) + Page::Project::Activity.perform do |activity| + activity.click_push_events - expect(activity).to have_content("pushed new branch #{project.default_branch}") + expect(activity).to have_content("pushed new branch #{project.default_branch}") + end end end end diff --git a/qa/qa/specs/features/browser_ui/9_data_stores/user/follow_user_activity_spec.rb b/qa/qa/specs/features/browser_ui/9_data_stores/user/follow_user_activity_spec.rb index c78151b94b7..a119d600667 100644 --- a/qa/qa/specs/features/browser_ui/9_data_stores/user/follow_user_activity_spec.rb +++ b/qa/qa/specs/features/browser_ui/9_data_stores/user/follow_user_activity_spec.rb @@ -22,10 +22,9 @@ module QA end let(:group) do - group = QA::Resource::Group.fabricate_via_api! do |group| - group.path = "group_for_follow_user_activity_#{SecureRandom.hex(8)}" - group.api_client = admin_api_client - end + group = create(:group, + path: "group_for_follow_user_activity_#{SecureRandom.hex(8)}", + api_client: admin_api_client) group.add_member(followed_user, Resource::Members::AccessLevel::MAINTAINER) group end diff --git a/qa/qa/specs/features/browser_ui/9_data_stores/user/parent_group_access_termination_spec.rb b/qa/qa/specs/features/browser_ui/9_data_stores/user/parent_group_access_termination_spec.rb index 7e88f3a9ac3..562bd1b1aa1 100644 --- a/qa/qa/specs/features/browser_ui/9_data_stores/user/parent_group_access_termination_spec.rb +++ b/qa/qa/specs/features/browser_ui/9_data_stores/user/parent_group_access_termination_spec.rb @@ -11,11 +11,7 @@ module QA end end - let!(:group) do - QA::Resource::Group.fabricate_via_api! do |group| - group.path = "group-to-test-access-termination-#{SecureRandom.hex(8)}" - end - end + let!(:group) { create(:group, path: "group-to-test-access-termination-#{SecureRandom.hex(8)}") } let!(:project) do Resource::Project.fabricate_via_api! do |project| @@ -25,7 +21,7 @@ module QA end end - context 'when parent group membership is terminated' do + context 'with terminated parent group membership' do before do group.add_member(user) @@ -40,7 +36,7 @@ module QA end end - it 'is not allowed to edit the project files', + it 'can not edit the project files', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347866' do Flow::Login.sign_in(as: user) project.visit! diff --git a/qa/qa/specs/features/browser_ui/9_data_stores/user/user_inherited_access_spec.rb b/qa/qa/specs/features/browser_ui/9_data_stores/user/user_inherited_access_spec.rb index 78baba403fd..8553e1739ce 100644 --- a/qa/qa/specs/features/browser_ui/9_data_stores/user/user_inherited_access_spec.rb +++ b/qa/qa/specs/features/browser_ui/9_data_stores/user/user_inherited_access_spec.rb @@ -6,16 +6,11 @@ module QA let(:admin_api_client) { Runtime::API::Client.as_admin } let!(:parent_group) do - QA::Resource::Group.fabricate_via_api! do |group| - group.path = "parent-group-to-test-user-access-#{SecureRandom.hex(8)}" - end + create(:group, path: "parent-group-to-test-user-access-#{SecureRandom.hex(8)}") end let!(:sub_group) do - QA::Resource::Group.fabricate_via_api! do |group| - group.path = "sub-group-to-test-user-access-#{SecureRandom.hex(8)}" - group.sandbox = parent_group - end + create(:group, path: "sub-group-to-test-user-access-#{SecureRandom.hex(8)}", sandbox: parent_group) end context 'when added to parent group' do diff --git a/qa/qa/specs/features/shared_contexts/import/github_import_shared_context.rb b/qa/qa/specs/features/shared_contexts/import/github_import_shared_context.rb index 55ed9abb0da..445586d31ac 100644 --- a/qa/qa/specs/features/shared_contexts/import/github_import_shared_context.rb +++ b/qa/qa/specs/features/shared_contexts/import/github_import_shared_context.rb @@ -10,10 +10,7 @@ module QA let!(:api_client) { Runtime::API::Client.as_admin } let!(:group) do - Resource::Group.fabricate_via_api! do |resource| - resource.api_client = api_client - resource.path = "destination-group-for-import-#{SecureRandom.hex(4)}" - end + create(:group, api_client: api_client, path: "destination-group-for-import-#{SecureRandom.hex(4)}") end let!(:user) do diff --git a/qa/qa/specs/features/shared_contexts/packages_registry_shared_context.rb b/qa/qa/specs/features/shared_contexts/packages_registry_shared_context.rb index 5ab7bb331c0..3905a05633f 100644 --- a/qa/qa/specs/features/shared_contexts/packages_registry_shared_context.rb +++ b/qa/qa/specs/features/shared_contexts/packages_registry_shared_context.rb @@ -51,8 +51,7 @@ module QA end let(:gitlab_address_with_port) do - uri = URI.parse(Runtime::Scenario.gitlab_address) - "#{uri.scheme}://#{uri.host}:#{uri.port}" + Support::GitlabAddress.address_with_port end let(:project_deploy_token) do diff --git a/qa/qa/specs/features/shared_contexts/variable_inheritance_shared_context.rb b/qa/qa/specs/features/shared_contexts/variable_inheritance_shared_context.rb index 2219031e9c6..69786c55be8 100644 --- a/qa/qa/specs/features/shared_contexts/variable_inheritance_shared_context.rb +++ b/qa/qa/specs/features/shared_contexts/variable_inheritance_shared_context.rb @@ -5,12 +5,7 @@ module QA let(:key) { 'TEST_VAR' } let(:value) { 'This is great!' } let(:random_string) { Faker::Alphanumeric.alphanumeric(number: 8) } - - let(:group) do - Resource::Group.fabricate_via_api! do |group| - group.path = "group-for-variable-inheritance-#{random_string}" - end - end + let(:group) { create(:group, path: "group-for-variable-inheritance-#{random_string}") } let(:upstream_project) do Resource::Project.fabricate_via_api! do |project| diff --git a/qa/qa/specs/features/shared_examples/create_and_terminate_workspace_shared_examples.rb b/qa/qa/specs/features/shared_examples/create_and_terminate_workspace_shared_examples.rb new file mode 100644 index 00000000000..7a9a485d611 --- /dev/null +++ b/qa/qa/specs/features/shared_examples/create_and_terminate_workspace_shared_examples.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module QA + RSpec.shared_examples 'workspaces actions' do + it 'creates a new workspace and then stops and terminates it' do + QA::Page::Main::Menu.perform(&:go_to_workspaces) + workspace_name = "" + + QA::EE::Page::Workspace::List.perform do |list| + existing_workspaces = list.get_workspaces_list + list.create_workspace(kubernetes_agent.name, devfile_project.name) + updated_workspaces = list.get_workspaces_list + workspace_name = (updated_workspaces - existing_workspaces).fetch(0, '').to_s + raise "Workspace name is empty" if workspace_name == '' + + expect(list).to have_workspace_state(workspace_name, "Creating") + list.wait_for_workspaces_creation(workspace_name) + expect(list).to have_workspace_state(workspace_name, "Running") + end + + QA::EE::Page::Workspace::Action.perform do |workspace| + workspace.click_workspace_action(workspace_name, "stop") + end + + QA::EE::Page::Workspace::List.perform do |list_item| + expect(list_item).to have_workspace_state(workspace_name, "Stopped") + end + + QA::EE::Page::Workspace::Action.perform do |workspace| + workspace.click_workspace_action(workspace_name, "terminate") + end + + QA::EE::Page::Workspace::List.perform do |list_item| + expect(list_item).to have_workspace_state(workspace_name, "Terminated") + end + end + end +end |