summaryrefslogtreecommitdiff
path: root/qa/qa/resource
diff options
context:
space:
mode:
Diffstat (limited to 'qa/qa/resource')
-rw-r--r--qa/qa/resource/fork.rb2
-rw-r--r--qa/qa/resource/issue.rb15
-rw-r--r--qa/qa/resource/project.rb9
-rw-r--r--qa/qa/resource/repository/commit.rb31
-rw-r--r--qa/qa/resource/repository/push.rb44
-rw-r--r--qa/qa/resource/repository/wiki_push.rb9
-rw-r--r--qa/qa/resource/runner.rb19
-rw-r--r--qa/qa/resource/sandbox.rb1
-rw-r--r--qa/qa/resource/tag.rb30
-rw-r--r--qa/qa/resource/user.rb7
-rw-r--r--qa/qa/resource/user_gpg.rb46
-rw-r--r--qa/qa/resource/wiki.rb9
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!