1# frozen_string_literal: true
2
3module QA
4  RSpec.describe 'Package', :orchestrated, :packages, :object_storage, quarantine: {
5    only: { job: 'object_storage' },
6    issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/335981',
7    type: :bug
8  } do
9    describe 'Conan Repository' do
10      include Runtime::Fixtures
11
12      let(:project) do
13        Resource::Project.fabricate_via_api! do |project|
14          project.name = 'conan-package-project'
15        end
16      end
17
18      let(:package) do
19        Resource::Package.init do |package|
20          package.name = "conantest-#{SecureRandom.hex(8)}"
21          package.project = project
22        end
23      end
24
25      let!(:runner) do
26        Resource::Runner.fabricate! do |runner|
27          runner.name = "qa-runner-#{Time.now.to_i}"
28          runner.tags = ["runner-for-#{project.name}"]
29          runner.executor = :docker
30          runner.project = project
31        end
32      end
33
34      let(:gitlab_address_with_port) do
35        uri = URI.parse(Runtime::Scenario.gitlab_address)
36        "#{uri.scheme}://#{uri.host}:#{uri.port}"
37      end
38
39      after do
40        runner.remove_via_api!
41        package.remove_via_api!
42      end
43
44      it 'publishes, installs, and deletes a Conan package', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/348014' do
45        Flow::Login.sign_in
46
47        Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do
48          Resource::Repository::Commit.fabricate_via_api! do |commit|
49            commit.project = project
50            commit.commit_message = 'Add .gitlab-ci.yml'
51            commit.add_files([{
52                                  file_path: '.gitlab-ci.yml',
53                                  content:
54                                      <<~YAML
55                                        image: conanio/gcc7
56
57                                        test_package:
58                                          stage: deploy
59                                          script:
60                                            - "conan remote add gitlab #{gitlab_address_with_port}/api/v4/projects/#{project.id}/packages/conan"
61                                            - "conan new #{package.name}/0.1 -t"
62                                            - "conan create . mycompany/stable"
63                                            - "CONAN_LOGIN_USERNAME=ci_user CONAN_PASSWORD=${CI_JOB_TOKEN} conan upload #{package.name}/0.1@mycompany/stable --all --remote=gitlab"
64                                            - "conan install #{package.name}/0.1@mycompany/stable --remote=gitlab"
65                                          tags:
66                                            - "runner-for-#{project.name}"
67                                      YAML
68                              }])
69          end
70        end
71
72        project.visit!
73        Flow::Pipeline.visit_latest_pipeline
74
75        Page::Project::Pipeline::Show.perform do |pipeline|
76          pipeline.click_job('test_package')
77        end
78
79        Page::Project::Job::Show.perform do |job|
80          expect(job).to be_successful(timeout: 800)
81        end
82
83        Page::Project::Menu.perform(&:click_packages_link)
84
85        Page::Project::Packages::Index.perform do |index|
86          expect(index).to have_package(package.name)
87          index.click_package(package.name)
88        end
89
90        Page::Project::Packages::Show.perform(&:click_delete)
91
92        Page::Project::Packages::Index.perform do |index|
93          expect(index).to have_content("Package deleted successfully")
94          expect(index).not_to have_package(package.name)
95        end
96      end
97    end
98  end
99end
100