Commit cbb92929 authored by Andrejs Cunskis's avatar Andrejs Cunskis Committed by Mark Lapierre

Update all resource attributes when calling reload!

Refactor QA::Resource::Base class

Add ability to update existing attribute values on reload! call

Seperate class method declaration for better readability

Add attributes method for shorter multiple attribute declaration

Add init method to create new instance of class without performing
fabrication

Fix custom attribute tracking

Add reload capability to MergeRequest resource

Update id to iid to be in line with api response

Remove custom reload! overload

Add mr comments validation to github importer spec

Remove unnecessary evaluator

Remove attribute reference in initialize block

Remove unnecessary require of blank

Fix yard doc comments

Remove attribute method tracking via unused method variable

Refactor Resources to use init method instead of new.tap

Use more up to date variant of calling unbound method
parent f81cc1f1
...@@ -67,7 +67,7 @@ module QA ...@@ -67,7 +67,7 @@ module QA
end end
def sign_in_using_admin_credentials def sign_in_using_admin_credentials
admin = QA::Resource::User.new.tap do |user| admin = QA::Resource::User.init do |user|
user.username = QA::Runtime::User.admin_username user.username = QA::Runtime::User.admin_username
user.password = QA::Runtime::User.admin_password user.password = QA::Runtime::User.admin_password
end end
......
# frozen_string_literal: true # frozen_string_literal: true
require 'forwardable'
require 'capybara/dsl' require 'capybara/dsl'
require 'active_support/core_ext/array/extract_options' require 'active_support/core_ext/array/extract_options'
module QA module QA
module Resource module Resource
class Base class Base
extend SingleForwardable
include ApiFabricator include ApiFabricator
extend Capybara::DSL extend Capybara::DSL
NoValueError = Class.new(RuntimeError) NoValueError = Class.new(RuntimeError)
def_delegators :evaluator, :attribute class << self
# Initialize new instance of class without fabrication
#
# @param [Proc] prepare_block
def init(&prepare_block)
new.tap(&prepare_block)
end
def self.fabricate!(*args, &prepare_block) def fabricate!(*args, &prepare_block)
fabricate_via_api!(*args, &prepare_block) fabricate_via_api!(*args, &prepare_block)
rescue NotImplementedError rescue NotImplementedError
fabricate_via_browser_ui!(*args, &prepare_block) fabricate_via_browser_ui!(*args, &prepare_block)
end end
def self.fabricate_via_browser_ui!(*args, &prepare_block) def fabricate_via_browser_ui!(*args, &prepare_block)
options = args.extract_options! options = args.extract_options!
resource = options.fetch(:resource) { new } resource = options.fetch(:resource) { new }
parents = options.fetch(:parents) { [] } parents = options.fetch(:parents) { [] }
do_fabricate!(resource: resource, prepare_block: prepare_block, parents: parents) do do_fabricate!(resource: resource, prepare_block: prepare_block, parents: parents) do
log_fabrication(:browser_ui, resource, parents, args) { resource.fabricate!(*args) } log_fabrication(:browser_ui, resource, parents, args) { resource.fabricate!(*args) }
current_url current_url
end
end end
end
def self.fabricate_via_api!(*args, &prepare_block) def fabricate_via_api!(*args, &prepare_block)
options = args.extract_options! options = args.extract_options!
resource = options.fetch(:resource) { new } resource = options.fetch(:resource) { new }
parents = options.fetch(:parents) { [] } parents = options.fetch(:parents) { [] }
raise NotImplementedError unless resource.api_support?
resource.eager_load_api_client!
do_fabricate!(resource: resource, prepare_block: prepare_block, parents: parents) do
log_fabrication(:api, resource, parents, args) { resource.fabricate_via_api! }
end
end
def remove_via_api!(*args, &prepare_block)
options = args.extract_options!
resource = options.fetch(:resource) { new }
parents = options.fetch(:parents) { [] }
resource.eager_load_api_client!
do_fabricate!(resource: resource, prepare_block: prepare_block, parents: parents) do
log_fabrication(:api, resource, parents, args) { resource.remove_via_api! }
end
end
raise NotImplementedError unless resource.api_support? private
resource.eager_load_api_client! def do_fabricate!(resource:, prepare_block:, parents: [])
prepare_block.call(resource) if prepare_block
do_fabricate!(resource: resource, prepare_block: prepare_block, parents: parents) do resource_web_url = yield
log_fabrication(:api, resource, parents, args) { resource.fabricate_via_api! } resource.web_url = resource_web_url
resource
end
def log_fabrication(method, resource, parents, args)
return yield unless Runtime::Env.debug?
start = Time.now
prefix = "==#{'=' * parents.size}>"
msg = [prefix]
msg << "Built a #{name}"
msg << "as a dependency of #{parents.last}" if parents.any?
msg << "via #{method}"
yield.tap do
msg << "in #{Time.now - start} seconds"
puts msg.join(' ')
puts if parents.empty?
end
end
# Define custom attribute
#
# @param [Symbol] name
# @return [void]
def attribute(name, &block)
(@attribute_names ||= []).push(name) # save added attributes
attr_writer(name)
define_method(name) do
instance_variable_get("@#{name}") || instance_variable_set("@#{name}", populate_attribute(name, block))
end
end
# Define multiple custom attributes
#
# @param [Array] names
# @return [void]
def attributes(*names)
names.each { |name| attribute(name) }
end end
end end
def self.remove_via_api!(*args, &prepare_block) # Override api reload! and update custom attributes from api_resource
options = args.extract_options! #
resource = options.fetch(:resource) { new } api_reload = instance_method(:reload!)
parents = options.fetch(:parents) { [] } define_method(:reload!) do
api_reload.bind_call(self)
return self unless api_resource
resource.eager_load_api_client! all_attributes.each do |attribute_name|
api_value = api_resource[attribute_name]
do_fabricate!(resource: resource, prepare_block: prepare_block, parents: parents) do instance_variable_set("@#{attribute_name}", api_value) if api_value
log_fabrication(:api, resource, parents, args) { resource.remove_via_api! }
end end
self
end end
attribute :web_url
def fabricate!(*_args) def fabricate!(*_args)
raise NotImplementedError raise NotImplementedError
end end
def visit! def visit!
Runtime::Logger.debug(%Q[Visiting #{self.class.name} at "#{web_url}"]) Runtime::Logger.debug(%(Visiting #{self.class.name} at "#{web_url}"))
# Just in case an async action is not yet complete # Just in case an async action is not yet complete
Support::WaitForRequests.wait_for_requests Support::WaitForRequests.wait_for_requests
...@@ -78,14 +151,12 @@ module QA ...@@ -78,14 +151,12 @@ module QA
Support::WaitForRequests.wait_for_requests Support::WaitForRequests.wait_for_requests
end end
def populate(*attributes) def populate(*attribute_names)
attributes.each(&method(:public_send)) attribute_names.each { |attribute_name| public_send(attribute_name) }
end end
def wait_until(max_duration: 60, sleep_interval: 0.1) def wait_until(max_duration: 60, sleep_interval: 0.1, &block)
QA::Support::Waiter.wait_until(max_duration: max_duration, sleep_interval: sleep_interval) do QA::Support::Waiter.wait_until(max_duration: max_duration, sleep_interval: sleep_interval, &block)
yield
end
end end
private private
...@@ -101,70 +172,27 @@ module QA ...@@ -101,70 +172,27 @@ module QA
def attribute_value(name, block) def attribute_value(name, block)
api_value = api_resource&.dig(name) api_value = api_resource&.dig(name)
if api_value && block log_having_both_api_result_and_block(name, api_value) if api_value && block
log_having_both_api_result_and_block(name, api_value)
end
api_value || (block && instance_exec(&block)) api_value || (block && instance_exec(&block))
end end
def log_having_both_api_result_and_block(name, api_value) # Get all defined attributes across all parents
QA::Runtime::Logger.info "<#{self.class}> Attribute #{name.inspect} has both API response `#{api_value}` and a block. API response will be picked. Block will be ignored." #
# @return [Array<Symbol>]
def all_attributes
@all_attributes ||= self.class.ancestors
.select { |clazz| clazz <= QA::Resource::Base }
.map { |clazz| clazz.instance_variable_get(:@attribute_names) }
.flatten
.compact
end end
def self.do_fabricate!(resource:, prepare_block:, parents: []) def log_having_both_api_result_and_block(name, api_value)
prepare_block.call(resource) if prepare_block QA::Runtime::Logger.info(<<~MSG.strip)
<#{self.class}> Attribute #{name.inspect} has both API response `#{api_value}` and a block. API response will be picked. Block will be ignored.
resource_web_url = yield MSG
resource.web_url = resource_web_url
resource
end
private_class_method :do_fabricate!
def self.log_fabrication(method, resource, parents, args)
return yield unless Runtime::Env.debug?
start = Time.now
prefix = "==#{'=' * parents.size}>"
msg = [prefix]
msg << "Built a #{name}"
msg << "as a dependency of #{parents.last}" if parents.any?
msg << "via #{method}"
yield.tap do
msg << "in #{Time.now - start} seconds"
puts msg.join(' ')
puts if parents.empty?
end
end
private_class_method :log_fabrication
def self.evaluator
@evaluator ||= Base::DSL.new(self)
end
private_class_method :evaluator
class DSL
def initialize(base)
@base = base
end
def attribute(name, &block)
@base.module_eval do
attr_writer(name)
define_method(name) do
instance_variable_get("@#{name}") ||
instance_variable_set(
"@#{name}",
populate_attribute(name, block))
end
end
end
end end
attribute :web_url
end end
end end
end end
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
module QA module QA
module Resource module Resource
class Group < GroupBase class Group < GroupBase
attr_accessor :description attributes :require_two_factor_authentication, :description
attribute :full_path do attribute :full_path do
determine_full_path determine_full_path
...@@ -15,8 +15,6 @@ module QA ...@@ -15,8 +15,6 @@ module QA
end end
end end
attribute :require_two_factor_authentication
def initialize def initialize
@path = Runtime::Namespace.name @path = Runtime::Namespace.name
@description = "QA test run at #{Runtime::Namespace.time}" @description = "QA test run at #{Runtime::Namespace.time}"
......
...@@ -9,17 +9,17 @@ module QA ...@@ -9,17 +9,17 @@ module QA
attr_accessor :path attr_accessor :path
attribute :id attributes :id,
attribute :runners_token :runners_token,
attribute :name :name,
attribute :full_path :full_path
# Get group labels # Get group labels
# #
# @return [Array<QA::Resource::GroupLabel>] # @return [Array<QA::Resource::GroupLabel>]
def labels def labels
parse_body(api_get_from("#{api_get_path}/labels")).map do |label| parse_body(api_get_from("#{api_get_path}/labels")).map do |label|
GroupLabel.new.tap do |resource| GroupLabel.init do |resource|
resource.api_client = api_client resource.api_client = api_client
resource.group = self resource.group = self
resource.id = label[:id] resource.id = label[:id]
......
# frozen_string_literal: true # frozen_string_literal: true
require 'securerandom' require 'securerandom'
require 'active_support/core_ext/object/blank'
module QA module QA
module Resource module Resource
class MergeRequest < Base class MergeRequest < Base
attr_accessor :approval_rules, attr_accessor :approval_rules,
:id,
:title,
:description,
:source_branch, :source_branch,
:target_branch,
:target_new_branch, :target_new_branch,
:assignee, :assignee,
:milestone, :milestone,
...@@ -22,9 +17,12 @@ module QA ...@@ -22,9 +17,12 @@ module QA
:wait_for_merge, :wait_for_merge,
:template :template
attribute :merge_when_pipeline_succeeds attributes :iid,
attribute :merge_status :title,
attribute :state :description,
:merge_when_pipeline_succeeds,
:merge_status,
:state
attribute :project do attribute :project do
Project.fabricate! do |resource| Project.fabricate! do |resource|
...@@ -32,11 +30,15 @@ module QA ...@@ -32,11 +30,15 @@ module QA
end end
end end
attribute :target_branch do
project.default_branch
end
attribute :target do attribute :target do
Repository::ProjectPush.fabricate! do |resource| Repository::ProjectPush.fabricate! do |resource|
resource.project = project resource.project = project
resource.branch_name = target_branch resource.branch_name = target_branch
resource.new_branch = @target_new_branch resource.new_branch = target_new_branch
resource.remote_branch = target_branch resource.remote_branch = target_branch
end end
end end
...@@ -62,7 +64,6 @@ module QA ...@@ -62,7 +64,6 @@ module QA
@labels = [] @labels = []
@file_name = "added_file-#{SecureRandom.hex(8)}.txt" @file_name = "added_file-#{SecureRandom.hex(8)}.txt"
@file_content = "File Added" @file_content = "File Added"
@target_branch = project.default_branch
@target_new_branch = true @target_new_branch = true
@no_preparation = false @no_preparation = false
@wait_for_merge = true @wait_for_merge = true
...@@ -89,21 +90,19 @@ module QA ...@@ -89,21 +90,19 @@ module QA
end end
def fabricate_via_api! def fabricate_via_api!
raise ResourceNotFoundError unless id
resource_web_url(api_get) resource_web_url(api_get)
rescue ResourceNotFoundError rescue ResourceNotFoundError, NoValueError # rescue if iid not populated
populate_target_and_source_if_required populate_target_and_source_if_required
super super
end end
def api_merge_path def api_merge_path
"/projects/#{project.id}/merge_requests/#{id}/merge" "/projects/#{project.id}/merge_requests/#{iid}/merge"
end end
def api_get_path def api_get_path
"/projects/#{project.id}/merge_requests/#{id}" "/projects/#{project.id}/merge_requests/#{iid}"
end end
def api_post_path def api_post_path
...@@ -112,18 +111,22 @@ module QA ...@@ -112,18 +111,22 @@ module QA
def api_post_body def api_post_body
{ {
description: @description, description: description,
source_branch: @source_branch, source_branch: source_branch,
target_branch: @target_branch, target_branch: target_branch,
title: @title title: title
} }
end end
def api_comments_path
"#{api_get_path}/notes"
end
def merge_via_api! def merge_via_api!
Support::Waiter.wait_until(sleep_interval: 1) do Support::Waiter.wait_until(sleep_interval: 1) do
QA::Runtime::Logger.debug("Waiting until merge request with id '#{id}' can be merged") QA::Runtime::Logger.debug("Waiting until merge request with id '#{iid}' can be merged")
reload!.api_resource[:merge_status] == 'can_be_merged' reload!.merge_status == 'can_be_merged'
end end
Support::Retrier.retry_on_exception do Support::Retrier.retry_on_exception do
...@@ -141,12 +144,12 @@ module QA ...@@ -141,12 +144,12 @@ module QA
end end
end end
def reload! # Get MR comments
# Refabricate so that we can return a new object with updated attributes #
self.class.fabricate_via_api! do |resource| # @return [Array]
resource.project = project def comments
resource.id = api_resource[:iid] response = get(Runtime::API::Request.new(api_client, api_comments_path).url)
end parse_body(response)
end end
private private
...@@ -158,8 +161,6 @@ module QA ...@@ -158,8 +161,6 @@ module QA
end end
def populate_target_and_source_if_required def populate_target_and_source_if_required
@target_branch ||= project.default_branch
populate(:target, :source) unless @no_preparation populate(:target, :source) unless @no_preparation
end end
end end
......
...@@ -25,7 +25,7 @@ module QA ...@@ -25,7 +25,7 @@ module QA
end end
def self.default def self.default
Resource::User.new.tap do |user| Resource::User.init do |user|
user.username = Runtime::User.ldap_user? ? Runtime::User.ldap_username : Runtime::User.username user.username = Runtime::User.ldap_user? ? Runtime::User.ldap_username : Runtime::User.username
user.password = Runtime::User.ldap_user? ? Runtime::User.ldap_password : Runtime::User.password user.password = Runtime::User.ldap_user? ? Runtime::User.ldap_password : Runtime::User.password
end end
......
...@@ -9,7 +9,7 @@ module QA ...@@ -9,7 +9,7 @@ module QA
end end
def setup def setup
@k3s = Service::DockerRun::K3s.new.tap do |k3s| @k3s = Service::DockerRun::K3s.init do |k3s|
k3s.remove! k3s.remove!
k3s.register! k3s.register!
......
...@@ -64,7 +64,7 @@ module QA ...@@ -64,7 +64,7 @@ module QA
merge_request = Resource::MergeRequest.fabricate_via_api! do |mr| merge_request = Resource::MergeRequest.fabricate_via_api! do |mr|
mr.project = project mr.project = project
mr.id = merge_request[:iid] mr.iid = merge_request[:iid]
end end
expect(merge_request.state).to eq('opened') expect(merge_request.state).to eq('opened')
...@@ -109,7 +109,7 @@ module QA ...@@ -109,7 +109,7 @@ module QA
merge_request = Support::Waiter.wait_until(sleep_interval: 5) do merge_request = Support::Waiter.wait_until(sleep_interval: 5) do
mr = Resource::MergeRequest.fabricate_via_api! do |mr| mr = Resource::MergeRequest.fabricate_via_api! do |mr|
mr.project = project mr.project = project
mr.id = merge_request[:iid] mr.iid = merge_request[:iid]
end end
next unless mr.state == 'merged' next unless mr.state == 'merged'
......
...@@ -34,7 +34,7 @@ module QA ...@@ -34,7 +34,7 @@ module QA
merge_request = Resource::MergeRequest.fabricate_via_api! do |mr| merge_request = Resource::MergeRequest.fabricate_via_api! do |mr|
mr.project = project mr.project = project
mr.id = merge_request[:iid] mr.iid = merge_request[:iid]
end.merge_via_api! end.merge_via_api!
expect(merge_request[:state]).to eq('merged') expect(merge_request[:state]).to eq('merged')
......
...@@ -55,7 +55,7 @@ module QA ...@@ -55,7 +55,7 @@ module QA
merge_request = Resource::MergeRequest.fabricate_via_api! do |mr| merge_request = Resource::MergeRequest.fabricate_via_api! do |mr|
mr.project = project mr.project = project
mr.id = merge_request[:iid] mr.iid = merge_request[:iid]
end.merge_via_api! end.merge_via_api!
expect(merge_request[:state]).to eq('merged') expect(merge_request[:state]).to eq('merged')
......
...@@ -39,7 +39,7 @@ module QA ...@@ -39,7 +39,7 @@ module QA
merge_request = Resource::MergeRequest.fabricate_via_api! do |mr| merge_request = Resource::MergeRequest.fabricate_via_api! do |mr|
mr.project = project mr.project = project
mr.id = merge_request[:iid] mr.iid = merge_request[:iid]
end.merge_via_api! end.merge_via_api!
expect(merge_request[:state]).to eq('merged') expect(merge_request[:state]).to eq('merged')
......
...@@ -17,8 +17,8 @@ module QA ...@@ -17,8 +17,8 @@ module QA
end end
let(:registry) do let(:registry) do
Resource::RegistryRepository.new.tap do |repository| Resource::RegistryRepository.init do |repository|
repository.name = "#{project.path_with_namespace}" repository.name = project.path_with_namespace
repository.project = project repository.project = project
repository.tag_name = 'master' repository.tag_name = 'master'
end end
......
...@@ -36,7 +36,7 @@ module QA ...@@ -36,7 +36,7 @@ module QA
end end
let(:imported_group) do let(:imported_group) do
Resource::Group.new.tap do |group| Resource::Group.init do |group|
group.api_client = api_client group.api_client = api_client
group.sandbox = sandbox group.sandbox = sandbox
group.path = source_group.path group.path = source_group.path
...@@ -44,7 +44,7 @@ module QA ...@@ -44,7 +44,7 @@ module QA
end end
let(:imported_subgroup) do let(:imported_subgroup) do
Resource::Group.new.tap do |group| Resource::Group.init do |group|
group.api_client = api_client group.api_client = api_client
group.sandbox = imported_group group.sandbox = imported_group
group.path = subgroup.path group.path = subgroup.path
......
...@@ -6,7 +6,7 @@ module QA ...@@ -6,7 +6,7 @@ module QA
RSpec.describe 'Manage', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/212145', type: :stale } do RSpec.describe 'Manage', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/212145', type: :stale } do
describe 'Check for broken images', :requires_admin do describe 'Check for broken images', :requires_admin do
before(:context) do before(:context) do
admin = QA::Resource::User.new.tap do |user| admin = QA::Resource::User.init do |user|
user.username = QA::Runtime::User.admin_username user.username = QA::Runtime::User.admin_username
user.password = QA::Runtime::User.admin_password user.password = QA::Runtime::User.admin_password
end end
......
...@@ -105,9 +105,15 @@ module QA ...@@ -105,9 +105,15 @@ module QA
def verify_merge_requests_import def verify_merge_requests_import
merge_requests = imported_project.merge_requests merge_requests = imported_project.merge_requests
merge_request = Resource::MergeRequest.init do |mr|
mr.project = imported_project
mr.iid = merge_requests.first[:iid]
mr.api_client = api_client
end.reload!
mr_comments = merge_request.comments.map { |comment| comment[:body] } # rubocop:disable Rails/Pluck
expect(merge_requests.length).to eq(1) expect(merge_requests.length).to eq(1)
expect(merge_requests.first).to include( expect(merge_request.api_resource).to include(
title: 'Improve readme', title: 'Improve readme',
state: 'opened', state: 'opened',
target_branch: 'main', target_branch: 'main',
...@@ -117,6 +123,13 @@ module QA ...@@ -117,6 +123,13 @@ module QA
*Created by: gitlab-qa-github*\n\nThis improves the README file a bit.\r\n\r\nTODO:\r\n\r\n \r\n\r\n- [ ] Do foo\r\n- [ ] Make bar\r\n - [ ] Think about baz *Created by: gitlab-qa-github*\n\nThis improves the README file a bit.\r\n\r\nTODO:\r\n\r\n \r\n\r\n- [ ] Do foo\r\n- [ ] Make bar\r\n - [ ] Think about baz
DSC DSC
) )
expect(mr_comments).to eq(
[
"*Created by: gitlab-qa-github*\n\n[PR comment by @sliaquat] Nice work! ",
"*Created by: gitlab-qa-github*\n\n[Single diff comment] Nice addition",
"*Created by: gitlab-qa-github*\n\n[Single diff comment] Good riddance"
]
)
end end
end end
end end
......
...@@ -94,7 +94,7 @@ module QA ...@@ -94,7 +94,7 @@ module QA
end end
def run_jenkins_server def run_jenkins_server
Service::DockerRun::Jenkins.new.tap do |runner| Service::DockerRun::Jenkins.init do |runner|
runner.pull runner.pull
runner.register! runner.register!
end end
......
...@@ -8,7 +8,7 @@ module QA ...@@ -8,7 +8,7 @@ module QA
access_token = Resource::PersonalAccessToken.fabricate!.token access_token = Resource::PersonalAccessToken.fabricate!.token
user = Resource::User.new.tap do |user| user = Resource::User.init do |user|
user.username = Runtime::User.username user.username = Runtime::User.username
user.password = access_token user.password = access_token
end end
......
...@@ -14,7 +14,7 @@ module QA ...@@ -14,7 +14,7 @@ module QA
end end
let(:package) do let(:package) do
Resource::Package.new.tap do |package| Resource::Package.init do |package|
package.name = "my_package-#{SecureRandom.hex(4)}" package.name = "my_package-#{SecureRandom.hex(4)}"
package.project = project package.project = project
end end
......
...@@ -12,7 +12,7 @@ module QA ...@@ -12,7 +12,7 @@ module QA
end end
let(:package) do let(:package) do
Resource::Package.new.tap do |package| Resource::Package.init do |package|
package.name = 'conantest' package.name = 'conantest'
package.project = project package.project = project
end end
......
...@@ -10,7 +10,7 @@ module QA ...@@ -10,7 +10,7 @@ module QA
end end
let(:package) do let(:package) do
Resource::Package.new.tap do |package| Resource::Package.init do |package|
package.name = "my_package" package.name = "my_package"
package.project = project package.project = project
end end
......
...@@ -24,7 +24,7 @@ module QA ...@@ -24,7 +24,7 @@ module QA
end end
let(:package) do let(:package) do
Resource::Package.new.tap do |package| Resource::Package.init do |package|
package.name = package_name package.name = package_name
package.project = project package.project = project
end end
......
...@@ -33,7 +33,7 @@ module QA ...@@ -33,7 +33,7 @@ module QA
end end
let(:package) do let(:package) do
Resource::Package.new.tap do |package| Resource::Package.init do |package|
package.name = package_name package.name = package_name
package.project = project package.project = project
end end
......
...@@ -50,7 +50,7 @@ module QA ...@@ -50,7 +50,7 @@ module QA
stages: stages:
- deploy - deploy
deploy: deploy:
stage: deploy stage: deploy
script: script:
...@@ -72,7 +72,7 @@ module QA ...@@ -72,7 +72,7 @@ module QA
stages: stages:
- install - install
install: install:
stage: install stage: install
script: script:
...@@ -120,7 +120,7 @@ module QA ...@@ -120,7 +120,7 @@ module QA
end end
let(:package) do let(:package) do
Resource::Package.new.tap do |package| Resource::Package.init do |package|
package.name = "@#{registry_scope}/#{project.name}" package.name = "@#{registry_scope}/#{project.name}"
package.project = project package.project = project
end end
......
...@@ -14,7 +14,7 @@ module QA ...@@ -14,7 +14,7 @@ module QA
end end
let(:package) do let(:package) do
Resource::Package.new.tap do |package| Resource::Package.init do |package|
package.name = "dotnetcore-#{SecureRandom.hex(8)}" package.name = "dotnetcore-#{SecureRandom.hex(8)}"
package.project = project package.project = project
end end
......
...@@ -11,7 +11,7 @@ module QA ...@@ -11,7 +11,7 @@ module QA
end end
let(:package) do let(:package) do
Resource::Package.new.tap do |package| Resource::Package.init do |package|
package.name = 'mypypipackage' package.name = 'mypypipackage'
package.project = project package.project = project
end end
......
...@@ -12,7 +12,7 @@ module QA ...@@ -12,7 +12,7 @@ module QA
end end
let(:package) do let(:package) do
Resource::Package.new.tap do |package| Resource::Package.init do |package|
package.name = 'mygem' package.name = 'mygem'
package.project = project package.project = project
end end
......
...@@ -16,7 +16,7 @@ module QA ...@@ -16,7 +16,7 @@ module QA
# The user that signs in via the IDP with username `user3` and password `user3pass` # The user that signs in via the IDP with username `user3` and password `user3pass`
# will have `user_3` as username in GitLab # will have `user_3` as username in GitLab
let(:user) do let(:user) do
QA::Resource::User.new.tap do |user| QA::Resource::User.init do |user|
user.username = 'user_3' user.username = 'user_3'
user.email = 'user_3@example.com' user.email = 'user_3@example.com'
user.name = 'User Three' user.name = 'User Three'
......
...@@ -22,7 +22,7 @@ module QA ...@@ -22,7 +22,7 @@ module QA
context 'Failed sign in', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/736' do context 'Failed sign in', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/736' do
before do before do
Runtime::Browser.visit(:gitlab, Page::Main::Login) Runtime::Browser.visit(:gitlab, Page::Main::Login)
invalid_user = QA::Resource::User.new.tap do |user| invalid_user = Resource::User.init do |user|
user.username = 'bad_user_name' user.username = 'bad_user_name'
user.password = 'bad_pasword' user.password = 'bad_pasword'
end end
......
...@@ -114,7 +114,7 @@ module QA ...@@ -114,7 +114,7 @@ module QA
end end
it 'rejects non-member users', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1778', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/224465', type: :investigating } do it 'rejects non-member users', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1778', quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/224465', type: :investigating } do
non_member_user = Resource::User.new.tap do |user| non_member_user = Resource::User.init do |user|
user.username = '' user.username = ''
user.password = '' user.password = ''
user.name = 'non_member_user' user.name = 'non_member_user'
...@@ -205,7 +205,7 @@ module QA ...@@ -205,7 +205,7 @@ module QA
user.password = Runtime::User.password user.password = Runtime::User.password
end end
@root = Resource::User.new.tap do |user| @root = Resource::User.init do |user|
user.username = 'root' user.username = 'root'
user.name = 'GitLab QA' user.name = 'GitLab QA'
user.email = 'root@gitlab.com' user.email = 'root@gitlab.com'
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment