diff options
Diffstat (limited to 'qa/qa/resource')
-rw-r--r-- | qa/qa/resource/fork.rb | 2 | ||||
-rw-r--r-- | qa/qa/resource/issue.rb | 15 | ||||
-rw-r--r-- | qa/qa/resource/project.rb | 9 | ||||
-rw-r--r-- | qa/qa/resource/repository/commit.rb | 31 | ||||
-rw-r--r-- | qa/qa/resource/repository/push.rb | 44 | ||||
-rw-r--r-- | qa/qa/resource/repository/wiki_push.rb | 9 | ||||
-rw-r--r-- | qa/qa/resource/runner.rb | 19 | ||||
-rw-r--r-- | qa/qa/resource/sandbox.rb | 1 | ||||
-rw-r--r-- | qa/qa/resource/tag.rb | 30 | ||||
-rw-r--r-- | qa/qa/resource/user.rb | 7 | ||||
-rw-r--r-- | qa/qa/resource/user_gpg.rb | 46 | ||||
-rw-r--r-- | qa/qa/resource/wiki.rb | 9 |
12 files changed, 179 insertions, 43 deletions
diff --git a/qa/qa/resource/fork.rb b/qa/qa/resource/fork.rb index 54b0c2d0059..d203e8eb264 100644 --- a/qa/qa/resource/fork.rb +++ b/qa/qa/resource/fork.rb @@ -30,7 +30,7 @@ module QA Page::Main::Menu.perform(&:sign_out) Runtime::Browser.visit(:gitlab, Page::Main::Login) Page::Main::Login.perform do |login| - login.sign_in_using_credentials(user) + login.sign_in_using_credentials(user: user) end upstream.project.visit! diff --git a/qa/qa/resource/issue.rb b/qa/qa/resource/issue.rb index a894e5c2033..0817a9de06f 100644 --- a/qa/qa/resource/issue.rb +++ b/qa/qa/resource/issue.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require 'securerandom' + module QA module Resource class Issue < Base @@ -13,11 +15,15 @@ module QA end attribute :id + attribute :iid + attribute :assignee_ids attribute :labels attribute :title def initialize + @assignee_ids = [] @labels = [] + @title = "Issue title #{SecureRandom.hex(8)}" end def fabricate! @@ -25,10 +31,10 @@ module QA Page::Project::Show.perform(&:go_to_new_issue) - Page::Project::Issue::New.perform do |page| # rubocop:disable QA/AmbiguousPageObjectName - page.add_title(@title) - page.add_description(@description) - page.create_new_issue + Page::Project::Issue::New.perform do |new_page| + new_page.add_title(@title) + new_page.add_description(@description) + new_page.create_new_issue end end @@ -42,6 +48,7 @@ module QA def api_post_body { + assignee_ids: assignee_ids, labels: labels, title: title }.tap do |hash| diff --git a/qa/qa/resource/project.rb b/qa/qa/resource/project.rb index a0389390c83..caaa766e982 100644 --- a/qa/qa/resource/project.rb +++ b/qa/qa/resource/project.rb @@ -88,6 +88,10 @@ module QA "#{api_get_path}/members" end + def api_runners_path + "#{api_get_path}/runners" + end + def api_post_path '/projects' end @@ -108,6 +112,11 @@ module QA post_body end + def runners + response = get Runtime::API::Request.new(api_client, api_runners_path).url + parse_body(response) + end + def share_with_group(invitee, access_level = Resource::Members::AccessLevel::DEVELOPER) post Runtime::API::Request.new(api_client, "/projects/#{id}/share").url, { group_id: invitee.id, group_access: access_level } end diff --git a/qa/qa/resource/repository/commit.rb b/qa/qa/resource/repository/commit.rb index 61c2ad6bfc0..4b5e8535ade 100644 --- a/qa/qa/resource/repository/commit.rb +++ b/qa/qa/resource/repository/commit.rb @@ -21,14 +21,16 @@ module QA @commit_message = 'QA Test - Commit message' end - def files=(files) - if !files.is_a?(Array) || - files.empty? || - files.any? { |file| !file.has_key?(:file_path) || !file.has_key?(:content) } - raise ArgumentError, "Please provide an array of hashes e.g.: [{file_path: 'file1', content: 'foo'}]" - end + def add_files(files) + validate_files!(files) + + @add_files = files + end + + def update_files(files) + validate_files!(files) - @files = files + @update_files = files end def resource_web_url(resource) @@ -56,8 +58,19 @@ module QA end def actions - @files.map do |file| - file.merge({ action: "create" }) + pending_actions = [] + pending_actions << @add_files.map { |file| file.merge({ action: "create" }) } if @add_files + pending_actions << @update_files.map { |file| file.merge({ action: "update" }) } if @update_files + pending_actions.flatten + end + + private + + def validate_files!(files) + if !files.is_a?(Array) || + files.empty? || + files.any? { |file| !file.has_key?(:file_path) || !file.has_key?(:content) } + raise ArgumentError, "Please provide an array of hashes e.g.: [{file_path: 'file1', content: 'foo'}]" end end end diff --git a/qa/qa/resource/repository/push.rb b/qa/qa/resource/repository/push.rb index a5827fb6e73..68674248be2 100644 --- a/qa/qa/resource/repository/push.rb +++ b/qa/qa/resource/repository/push.rb @@ -8,9 +8,9 @@ module QA class Push < Base attr_accessor :file_name, :file_content, :commit_message, :branch_name, :new_branch, :output, :repository_http_uri, - :repository_ssh_uri, :ssh_key, :user, :use_lfs + :repository_ssh_uri, :ssh_key, :user, :use_lfs, :tag_name - attr_writer :remote_branch + attr_writer :remote_branch, :gpg_key_id def initialize @file_name = 'file.txt' @@ -21,6 +21,8 @@ module QA @repository_http_uri = "" @ssh_key = nil @use_lfs = false + @tag_name = nil + @gpg_key_id = nil end def remote_branch @@ -67,29 +69,43 @@ module QA email = user.email end + unless @gpg_key_id.nil? + repository.gpg_key_id = @gpg_key_id + end + @output += repository.clone repository.configure_identity(username, email) @output += repository.checkout(branch_name, new_branch: new_branch) - if @directory - @directory.each_child do |f| - @output += repository.add_file(f.basename, f.read) if f.file? - end - elsif @files - @files.each do |f| - repository.add_file(f[:name], f[:content]) - end + if @tag_name + @output += repository.delete_tag(@tag_name) else - @output += repository.add_file(file_name, file_content) - end + if @directory + @directory.each_child do |f| + @output += repository.add_file(f.basename, f.read) if f.file? + end + elsif @files + @files.each do |f| + repository.add_file(f[:name], f[:content]) + end + else + @output += repository.add_file(file_name, file_content) + end - @output += repository.commit(commit_message) - @output += repository.push_changes("#{branch_name}:#{remote_branch}") + @output += commit_to repository + @output += repository.push_changes("#{branch_name}:#{remote_branch}") + end repository.delete_ssh_key end end + + private + + def commit_to(repository) + @gpg_key_id.nil? ? repository.commit(@commit_message) : repository.commit_with_gpg(@commit_message) + end end end end diff --git a/qa/qa/resource/repository/wiki_push.rb b/qa/qa/resource/repository/wiki_push.rb index 8edaff70ac6..e926c00d380 100644 --- a/qa/qa/resource/repository/wiki_push.rb +++ b/qa/qa/resource/repository/wiki_push.rb @@ -25,14 +25,7 @@ module QA end def repository_ssh_uri - @repository_ssh_uri ||= begin - wiki.visit! - Page::Project::Wiki::Show.act do - click_clone_repository - choose_repository_clone_ssh - repository_location.uri - end - end + @repository_ssh_uri ||= wiki.repository_ssh_location.uri end def fabricate! diff --git a/qa/qa/resource/runner.rb b/qa/qa/resource/runner.rb index 9c2e138bade..1be2429bc04 100644 --- a/qa/qa/resource/runner.rb +++ b/qa/qa/resource/runner.rb @@ -6,8 +6,9 @@ module QA module Resource class Runner < Base attr_writer :name, :tags, :image - attr_accessor :config + attr_accessor :config, :token + attribute :id attribute :project do Project.fabricate_via_api! do |resource| resource.name = 'project-with-ci-cd' @@ -28,9 +29,9 @@ module QA end def fabricate_via_api! - Service::Runner.new(name).tap do |runner| + Service::DockerRun::GitlabRunner.new(name).tap do |runner| runner.pull - runner.token = project.runners_token + runner.token = @token ||= project.runners_token runner.address = Runtime::Scenario.gitlab_address runner.tags = tags runner.image = image @@ -40,6 +41,18 @@ module QA end end + def remove_via_api! + @id = project.runners.find { |runner| runner[:description] == name }[:id] + + super + + Service::DockerRun::GitlabRunner.new(name).remove! + end + + def api_delete_path + "/runners/#{id}" + end + def api_get_path end diff --git a/qa/qa/resource/sandbox.rb b/qa/qa/resource/sandbox.rb index 47bd86440a0..6ee3dcf350f 100644 --- a/qa/qa/resource/sandbox.rb +++ b/qa/qa/resource/sandbox.rb @@ -10,6 +10,7 @@ module QA attr_accessor :path attribute :id + attribute :runners_token def initialize @path = Runtime::Namespace.sandbox_name diff --git a/qa/qa/resource/tag.rb b/qa/qa/resource/tag.rb new file mode 100644 index 00000000000..ac4fccec525 --- /dev/null +++ b/qa/qa/resource/tag.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module QA + module Resource + class Tag < Base + attr_accessor :project, :name, :ref + + def resource_web_url(resource) + super + rescue ResourceURLMissingError + # this particular resource does not expose a web_url property + end + + def api_get_path + "/projects/#{project.id}/repository/tags/#{name}" + end + + def api_post_path + "/projects/#{project.id}/repository/tags" + end + + def api_post_body + { + tag_name: name, + ref: ref + } + end + end + end +end diff --git a/qa/qa/resource/user.rb b/qa/qa/resource/user.rb index 911d2b2f506..dcf145c9882 100644 --- a/qa/qa/resource/user.rb +++ b/qa/qa/resource/user.rb @@ -26,7 +26,7 @@ module QA end def name - @name ||= api_resource&.dig(:name) || username + @name ||= api_resource&.dig(:name) || "QA User #{unique_id}" end def email @@ -53,7 +53,7 @@ module QA if credentials_given? Page::Main::Login.perform do |login| - login.sign_in_using_credentials(self) + login.sign_in_using_credentials(user: self) end else Page::Main::Login.perform do |login| @@ -91,9 +91,8 @@ module QA def self.fabricate_or_use(username = nil, password = nil) if Runtime::Env.signup_disabled? - self.new.tap do |user| + self.fabricate_via_api! do |user| user.username = username - user.password = password end else self.fabricate! diff --git a/qa/qa/resource/user_gpg.rb b/qa/qa/resource/user_gpg.rb new file mode 100644 index 00000000000..25d74ad8ce5 --- /dev/null +++ b/qa/qa/resource/user_gpg.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +module QA + module Resource + class UserGPG < Base + attr_accessor :id, :gpg + attr_reader :key_id + + def initialize + @gpg = Runtime::GPG.new + @key_id = @gpg.key_id + end + + def fabricate_via_api! + super + @id = self.api_response[:id] + rescue ResourceFabricationFailedError => error + if error.message.include? 'has already been taken' + self + else + raise ResourceFabricationFailedError error + end + end + + def resource_web_url(resource) + super + rescue ResourceURLMissingError + # this particular resource does not expose a web_url property + end + + def api_get_path + "/user/gpg_keys/#{@id}" + end + + def api_post_path + '/user/gpg_keys' + end + + def api_post_body + { + key: @gpg.key + } + end + end + end +end diff --git a/qa/qa/resource/wiki.rb b/qa/qa/resource/wiki.rb index 6e3648dba0b..45d5da9346d 100644 --- a/qa/qa/resource/wiki.rb +++ b/qa/qa/resource/wiki.rb @@ -21,6 +21,15 @@ module QA end end + attribute :repository_ssh_location do + Page::Project::Wiki::Show.perform(&:click_clone_repository) + + Page::Project::Wiki::GitAccess.perform do |git_access| + git_access.choose_repository_clone_ssh + git_access.repository_location + end + end + def fabricate! project.visit! |