Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
3f0848998e
commit
dbfcd56fcb
|
|
@ -1,22 +0,0 @@
|
|||
---
|
||||
# Cop supports --autocorrect.
|
||||
Rails/ActiveRecordCallbacksOrder:
|
||||
Exclude:
|
||||
- 'app/models/award_emoji.rb'
|
||||
- 'app/models/gpg_key.rb'
|
||||
- 'app/models/group.rb'
|
||||
- 'app/models/issue.rb'
|
||||
- 'app/models/key.rb'
|
||||
- 'app/models/merge_request.rb'
|
||||
- 'app/models/namespace.rb'
|
||||
- 'app/models/namespace_statistics.rb'
|
||||
- 'app/models/note.rb'
|
||||
- 'app/models/pages_domain.rb'
|
||||
- 'app/models/prometheus_alert.rb'
|
||||
- 'app/models/remote_mirror.rb'
|
||||
- 'app/models/resource_label_event.rb'
|
||||
- 'app/models/snippet_statistics.rb'
|
||||
- 'app/models/upload.rb'
|
||||
- 'app/models/user.rb'
|
||||
- 'ee/app/models/dast_site_profile.rb'
|
||||
- 'ee/app/models/geo_node.rb'
|
||||
|
|
@ -1 +1 @@
|
|||
52fb0853a49b14abddfc5a824d680bd255773d39
|
||||
06b92cf488942c6746795b581d27854339becc60
|
||||
|
|
|
|||
|
|
@ -336,10 +336,10 @@
|
|||
"include_item": {
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "Will infer the method based on the value. E.g. `https://...` strings will be of type `include:remote`, and `/templates/...` will be of type `include:local`.",
|
||||
"description": "Will infer the method based on the value. E.g. `https://...` strings will be of type `include:remote`, and `/templates/...` or `templates/...` will be of type `include:local`.",
|
||||
"type": "string",
|
||||
"format": "uri-reference",
|
||||
"pattern": "^(https?://|/).+\\.ya?ml$"
|
||||
"pattern": "^(https?://|/?.?-?(?!\\w+://)\\w).+\\.ya?ml$"
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
|
|
|
|||
|
|
@ -106,8 +106,25 @@ module Types
|
|||
end
|
||||
|
||||
def job_count
|
||||
# We limit to 1 above the JOB_COUNT_LIMIT to indicate that more items exist after JOB_COUNT_LIMIT
|
||||
runner.builds.limit(JOB_COUNT_LIMIT + 1).count
|
||||
BatchLoader::GraphQL.for(runner.id).batch(key: :job_count) do |runner_ids, loader, _args|
|
||||
# rubocop: disable CodeReuse/ActiveRecord
|
||||
# We limit to 1 above the JOB_COUNT_LIMIT to indicate that more items exist after JOB_COUNT_LIMIT
|
||||
builds_tbl = ::Ci::Build.arel_table
|
||||
runners_tbl = ::Ci::Runner.arel_table
|
||||
lateral_query = ::Ci::Build.select(1)
|
||||
.where(builds_tbl['runner_id'].eq(runners_tbl['id']))
|
||||
.limit(JOB_COUNT_LIMIT)
|
||||
counts = ::Ci::Runner.joins("JOIN LATERAL (#{lateral_query.to_sql}) builds_with_limit ON true")
|
||||
.id_in(runner_ids)
|
||||
.select(:id, Arel.star.count.as('count'))
|
||||
.group(:id)
|
||||
.index_by(&:id)
|
||||
# rubocop: enable CodeReuse/ActiveRecord
|
||||
|
||||
runner_ids.each do |runner_id|
|
||||
loader.call(runner_id, counts[runner_id]&.count || 0)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def admin_url
|
||||
|
|
|
|||
|
|
@ -26,8 +26,8 @@ class AwardEmoji < ApplicationRecord
|
|||
scope :named, ->(names) { where(name: names) }
|
||||
scope :awarded_by, ->(users) { where(user: users) }
|
||||
|
||||
after_save :expire_cache
|
||||
after_destroy :expire_cache
|
||||
after_save :expire_cache
|
||||
|
||||
class << self
|
||||
def votes_for_collection(ids, type)
|
||||
|
|
|
|||
|
|
@ -40,8 +40,8 @@ class GpgKey < ApplicationRecord
|
|||
unless: -> { errors.has_key?(:key) }
|
||||
|
||||
before_validation :extract_fingerprint, :extract_primary_keyid
|
||||
after_commit :update_invalid_gpg_signatures, on: :create
|
||||
after_create :generate_subkeys
|
||||
after_commit :update_invalid_gpg_signatures, on: :create
|
||||
|
||||
def primary_keyid
|
||||
super&.upcase
|
||||
|
|
|
|||
|
|
@ -155,10 +155,10 @@ class Group < Namespace
|
|||
prefix: RunnersTokenPrefixable::RUNNERS_TOKEN_PREFIX
|
||||
|
||||
after_create :post_create_hook
|
||||
after_create -> { create_or_load_association(:group_feature) }
|
||||
after_update :path_changed_hook, if: :saved_change_to_path?
|
||||
after_destroy :post_destroy_hook
|
||||
after_commit :update_two_factor_requirement
|
||||
after_update :path_changed_hook, if: :saved_change_to_path?
|
||||
after_create -> { create_or_load_association(:group_feature) }
|
||||
|
||||
scope :with_users, -> { includes(:users) }
|
||||
|
||||
|
|
|
|||
|
|
@ -216,8 +216,8 @@ class Issue < ApplicationRecord
|
|||
|
||||
before_validation :ensure_namespace_id, :ensure_work_item_type
|
||||
|
||||
after_commit :expire_etag_cache, unless: :importing?
|
||||
after_save :ensure_metrics, unless: :importing?
|
||||
after_commit :expire_etag_cache, unless: :importing?
|
||||
after_create_commit :record_create_action, unless: :importing?
|
||||
|
||||
attr_spammable :title, spam_title: true
|
||||
|
|
|
|||
|
|
@ -38,12 +38,12 @@ class Key < ApplicationRecord
|
|||
signing: 2
|
||||
}
|
||||
|
||||
after_commit :add_to_authorized_keys, on: :create
|
||||
after_create :post_create_hook
|
||||
after_create :refresh_user_cache
|
||||
after_commit :remove_from_authorized_keys, on: :destroy
|
||||
after_destroy :post_destroy_hook
|
||||
after_destroy :refresh_user_cache
|
||||
after_commit :add_to_authorized_keys, on: :create
|
||||
after_commit :remove_from_authorized_keys, on: :destroy
|
||||
|
||||
alias_attribute :fingerprint_md5, :fingerprint
|
||||
alias_attribute :name, :title
|
||||
|
|
|
|||
|
|
@ -140,6 +140,7 @@ class MergeRequest < ApplicationRecord
|
|||
after_create :ensure_merge_request_diff, unless: :skip_ensure_merge_request_diff
|
||||
after_update :clear_memoized_shas
|
||||
after_update :reload_diff_if_branch_changed
|
||||
after_save :keep_around_commit, unless: :importing?
|
||||
after_commit :ensure_metrics, on: [:create, :update], unless: :importing?
|
||||
after_commit :expire_etag_cache, unless: :importing?
|
||||
|
||||
|
|
@ -441,8 +442,6 @@ class MergeRequest < ApplicationRecord
|
|||
.pick(MergeRequest::Metrics.time_to_merge_expression)
|
||||
end
|
||||
|
||||
after_save :keep_around_commit, unless: :importing?
|
||||
|
||||
alias_attribute :project, :target_project
|
||||
alias_attribute :project_id, :target_project_id
|
||||
|
||||
|
|
|
|||
|
|
@ -139,21 +139,21 @@ class Namespace < ApplicationRecord
|
|||
:npm_package_requests_forwarding,
|
||||
to: :package_settings
|
||||
|
||||
after_save :reload_namespace_details
|
||||
|
||||
after_commit :refresh_access_of_projects_invited_groups, on: :update, if: -> { previous_changes.key?('share_with_group_lock') }
|
||||
|
||||
before_create :sync_share_with_group_lock_with_parent
|
||||
before_update :sync_share_with_group_lock_with_parent, if: :parent_changed?
|
||||
after_update :force_share_with_group_lock_on_descendants, if: -> { saved_change_to_share_with_group_lock? && share_with_group_lock? }
|
||||
after_update :expire_first_auto_devops_config_cache, if: -> { saved_change_to_auto_devops_enabled? }
|
||||
after_update :move_dir, if: :saved_change_to_path_or_parent?, unless: -> { is_a?(Namespaces::ProjectNamespace) }
|
||||
after_destroy :rm_dir
|
||||
after_save :reload_namespace_details
|
||||
|
||||
after_commit :refresh_access_of_projects_invited_groups, on: :update, if: -> { previous_changes.key?('share_with_group_lock') }
|
||||
|
||||
after_sync_traversal_ids :schedule_sync_event_worker # custom callback defined in Namespaces::Traversal::Linear
|
||||
|
||||
# Legacy Storage specific hooks
|
||||
|
||||
after_update :move_dir, if: :saved_change_to_path_or_parent?, unless: -> { is_a?(Namespaces::ProjectNamespace) }
|
||||
before_destroy(prepend: true) { prepare_for_destroy }
|
||||
after_destroy :rm_dir
|
||||
after_commit :expire_child_caches, on: :update, if: -> {
|
||||
Feature.enabled?(:cached_route_lookups, self, type: :ops) &&
|
||||
saved_change_to_name? || saved_change_to_path? || saved_change_to_parent_id?
|
||||
|
|
|
|||
|
|
@ -10,8 +10,8 @@ class NamespaceStatistics < ApplicationRecord # rubocop:disable Gitlab/Namespace
|
|||
scope :for_namespaces, -> (namespaces) { where(namespace: namespaces) }
|
||||
|
||||
before_save :update_storage_size
|
||||
after_save :update_root_storage_statistics, if: :saved_change_to_storage_size?
|
||||
after_destroy :update_root_storage_statistics
|
||||
after_save :update_root_storage_statistics, if: :saved_change_to_storage_size?
|
||||
|
||||
delegate :group_namespace?, to: :namespace
|
||||
|
||||
|
|
|
|||
|
|
@ -168,10 +168,10 @@ class Note < ApplicationRecord
|
|||
# Syncs `confidential` with `internal` as we rename the column.
|
||||
# https://gitlab.com/gitlab-org/gitlab/-/issues/367923
|
||||
before_create :set_internal_flag
|
||||
after_destroy :expire_etag_cache
|
||||
after_save :keep_around_commit, if: :for_project_noteable?, unless: -> { importing? || skip_keep_around_commits }
|
||||
after_save :expire_etag_cache, unless: :importing?
|
||||
after_save :touch_noteable, unless: :importing?
|
||||
after_destroy :expire_etag_cache
|
||||
after_commit :notify_after_create, on: :create
|
||||
after_commit :notify_after_destroy, on: :destroy
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ class PagesDomain < ApplicationRecord
|
|||
has_many :acme_orders, class_name: "PagesDomainAcmeOrder"
|
||||
has_many :serverless_domain_clusters, class_name: 'Serverless::DomainCluster', inverse_of: :pages_domain
|
||||
|
||||
after_initialize :set_verification_code
|
||||
before_validation :clear_auto_ssl_failure, unless: :auto_ssl_enabled
|
||||
|
||||
validates :domain, hostname: { allow_numeric_hostname: true }
|
||||
|
|
@ -44,8 +45,6 @@ class PagesDomain < ApplicationRecord
|
|||
key: Settings.attr_encrypted_db_key_base,
|
||||
algorithm: 'aes-256-cbc'
|
||||
|
||||
after_initialize :set_verification_code
|
||||
|
||||
scope :for_project, ->(project) { where(project: project) }
|
||||
|
||||
scope :enabled, -> { where('enabled_until >= ?', Time.current) }
|
||||
|
|
|
|||
|
|
@ -20,8 +20,8 @@ class PrometheusAlert < ApplicationRecord
|
|||
has_many :related_issues, through: :prometheus_alert_events
|
||||
has_many :alert_management_alerts, class_name: 'AlertManagement::Alert', inverse_of: :prometheus_alert
|
||||
|
||||
after_save :clear_prometheus_adapter_cache!
|
||||
after_destroy :clear_prometheus_adapter_cache!
|
||||
after_save :clear_prometheus_adapter_cache!
|
||||
|
||||
validates :environment, :project, :prometheus_metric, :threshold, :operator, presence: true
|
||||
validates :runbook_url, length: { maximum: 255 }, allow_blank: true,
|
||||
|
|
|
|||
|
|
@ -22,10 +22,9 @@ class RemoteMirror < ApplicationRecord
|
|||
|
||||
validates :url, presence: true, public_url: { schemes: Project::VALID_MIRROR_PROTOCOLS, allow_blank: true, enforce_user: true }
|
||||
|
||||
after_save :set_override_remote_mirror_available, unless: -> { Gitlab::CurrentSettings.current_application_settings.mirror_available }
|
||||
after_update :reset_fields, if: :saved_change_to_mirror_url?
|
||||
|
||||
before_validation :store_credentials
|
||||
after_update :reset_fields, if: :saved_change_to_mirror_url?
|
||||
after_save :set_override_remote_mirror_available, unless: -> { Gitlab::CurrentSettings.current_application_settings.mirror_available }
|
||||
|
||||
scope :enabled, -> { where(enabled: true) }
|
||||
scope :started, -> { with_update_status(:started) }
|
||||
|
|
|
|||
|
|
@ -14,8 +14,8 @@ class ResourceLabelEvent < ResourceEvent
|
|||
validates :label, presence: { unless: :importing? }, on: :create
|
||||
validate :exactly_one_issuable, unless: :importing?
|
||||
|
||||
after_save :expire_etag_cache
|
||||
after_destroy :expire_etag_cache
|
||||
after_save :expire_etag_cache
|
||||
|
||||
enum action: {
|
||||
add: 1,
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@ class SnippetStatistics < ApplicationRecord
|
|||
|
||||
delegate :repository, :project, :project_id, to: :snippet
|
||||
|
||||
after_save :update_author_root_storage_statistics, if: :update_author_root_storage_statistics?
|
||||
after_destroy :update_author_root_storage_statistics, unless: :project_snippet?
|
||||
after_save :update_author_root_storage_statistics, if: :update_author_root_storage_statistics?
|
||||
|
||||
def update_commit_count
|
||||
self.commit_count = repository.commit_count
|
||||
|
|
|
|||
|
|
@ -16,14 +16,13 @@ class Upload < ApplicationRecord
|
|||
scope :with_files_stored_locally, -> { where(store: ObjectStorage::Store::LOCAL) }
|
||||
scope :with_files_stored_remotely, -> { where(store: ObjectStorage::Store::REMOTE) }
|
||||
|
||||
before_save :calculate_checksum!, if: :foreground_checksummable?
|
||||
after_commit :schedule_checksum, if: :needs_checksum?
|
||||
|
||||
after_commit :update_project_statistics, on: [:create, :destroy], if: :project?
|
||||
|
||||
before_save :calculate_checksum!, if: :foreground_checksummable?
|
||||
# as the FileUploader is not mounted, the default CarrierWave ActiveRecord
|
||||
# hooks are not executed and the file will not be deleted
|
||||
after_destroy :delete_file!, if: -> { uploader_class <= FileUploader }
|
||||
after_commit :schedule_checksum, if: :needs_checksum?
|
||||
|
||||
after_commit :update_project_statistics, on: [:create, :destroy], if: :project?
|
||||
|
||||
class << self
|
||||
def inner_join_local_uploads_projects
|
||||
|
|
|
|||
|
|
@ -300,16 +300,17 @@ class User < ApplicationRecord
|
|||
|
||||
validates :website_url, allow_blank: true, url: true, if: :website_url_changed?
|
||||
|
||||
after_initialize :set_projects_limit
|
||||
before_validation :sanitize_attrs
|
||||
before_validation :ensure_namespace_correct
|
||||
after_validation :set_username_errors
|
||||
before_save :default_private_profile_to_false
|
||||
before_save :ensure_incoming_email_token
|
||||
before_save :ensure_user_rights_and_limits, if: ->(user) { user.new_record? || user.external_changed? }
|
||||
before_save :skip_reconfirmation!, if: ->(user) { user.email_changed? && user.read_only_attribute?(:email) }
|
||||
before_save :check_for_verified_email, if: ->(user) { user.email_changed? && !user.new_record? }
|
||||
before_validation :ensure_namespace_correct
|
||||
before_save :ensure_namespace_correct # in case validation is skipped
|
||||
before_save :ensure_user_detail_assigned
|
||||
after_validation :set_username_errors
|
||||
after_update :username_changed_hook, if: :saved_change_to_username?
|
||||
after_destroy :post_destroy_hook
|
||||
after_destroy :remove_key_cache
|
||||
|
|
@ -330,8 +331,6 @@ class User < ApplicationRecord
|
|||
update_invalid_gpg_signatures if previous_changes.key?('email')
|
||||
end
|
||||
|
||||
after_initialize :set_projects_limit
|
||||
|
||||
# User's Layout preference
|
||||
enum layout: { fixed: 0, fluid: 1 }
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
- title: "DAST API scans using DAST template is deprecated" # (required) Actionable title. e.g., The `confidential` field for a `Note` is deprecated. Use `internal` instead.
|
||||
announcement_milestone: "15.7" # (required) The milestone when this feature was first announced as deprecated.
|
||||
announcement_date: "2022-12-22" # (required) The date of the milestone release when this feature was first announced as deprecated. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
|
||||
removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
|
||||
removal_date: "2023-05-22" # (required) The date of the milestone release when this feature is planned to be removed. This should almost always be the 22nd of a month (YYYY-MM-22), unless you did an out of band blog post.
|
||||
breaking_change: true # (required) If this deprecation is a breaking change, set this value to true
|
||||
reporter: derekferguson # (required) GitLab username of the person reporting the deprecation
|
||||
stage: Secure # (required) String value of the stage that the feature was created in. e.g., Growth
|
||||
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/384198 # (required) Link to the deprecation issue in GitLab
|
||||
body: | # (required) Do not modify this line, instead modify the lines below.
|
||||
With the move to the new DAST API analyzer and the `DAST-API.gitlab-ci.yml` template for DAST API scans, we will be removing the ability to scan APIs with the DAST analyzer. Use of the `DAST.gitlab-ci.yml` or `DAST-latest.gitlab-ci.yml` templates for API scans is deprecated as of GitLab 15.7 and will no longer work in GitLab 16.0. Please use `DAST-API.gitlab-ci.yml` template and refer to the [DAST API analyzer](https://docs.gitlab.com/ee/user/application_security/dast_api/#configure-dast-api-with-an-openapi-specification) documentation for configuration details.
|
||||
|
|
@ -52,6 +52,20 @@ sole discretion of GitLab Inc.
|
|||
|
||||
<div class="deprecation removal-160 breaking-change">
|
||||
|
||||
### DAST API scans using DAST template is deprecated
|
||||
|
||||
Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
|
||||
|
||||
WARNING:
|
||||
This is a [breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/).
|
||||
Review the details carefully before upgrading.
|
||||
|
||||
With the move to the new DAST API analyzer and the `DAST-API.gitlab-ci.yml` template for DAST API scans, we will be removing the ability to scan APIs with the DAST analyzer. Use of the `DAST.gitlab-ci.yml` or `DAST-latest.gitlab-ci.yml` templates for API scans is deprecated as of GitLab 15.7 and will no longer work in GitLab 16.0. Please use `DAST-API.gitlab-ci.yml` template and refer to the [DAST API analyzer](https://docs.gitlab.com/ee/user/application_security/dast_api/#configure-dast-api-with-an-openapi-specification) documentation for configuration details.
|
||||
|
||||
</div>
|
||||
|
||||
<div class="deprecation removal-160 breaking-change">
|
||||
|
||||
### DAST API variables
|
||||
|
||||
Planned removal: GitLab <span class="removal-milestone">16.0</span> (2023-05-22)
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ module API
|
|||
expose :state, :created_at, :updated_at
|
||||
expose :due_date
|
||||
expose :start_date
|
||||
expose :expired?, as: :expired
|
||||
expose :expired
|
||||
|
||||
expose :web_url do |milestone, _options|
|
||||
Gitlab::UrlBuilder.build(milestone)
|
||||
|
|
|
|||
|
|
@ -31537,7 +31537,13 @@ msgstr ""
|
|||
msgid "Proceed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Product Analytics|Onboarding view"
|
||||
msgid "Product Analytics|Analyze your product with Product Analytics"
|
||||
msgstr ""
|
||||
|
||||
msgid "Product Analytics|Set up Product Analytics to track how your product is performing. Combine it with your GitLab data to better understand where you can improve your product and development processes."
|
||||
msgstr ""
|
||||
|
||||
msgid "Product Analytics|Set up product analytics..."
|
||||
msgstr ""
|
||||
|
||||
msgid "Product analytics"
|
||||
|
|
@ -36268,6 +36274,12 @@ msgstr ""
|
|||
msgid "ScanExecutionPolicy|A pipeline is run"
|
||||
msgstr ""
|
||||
|
||||
msgid "ScanExecutionPolicy|Ex, tag-name-1, tag-name-2"
|
||||
msgstr ""
|
||||
|
||||
msgid "ScanExecutionPolicy|If the field is empty, the runner will be automatically selected"
|
||||
msgstr ""
|
||||
|
||||
msgid "ScanExecutionPolicy|Scanner profile"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -36292,9 +36304,6 @@ msgstr ""
|
|||
msgid "ScanExecutionPolicy|Select site profile"
|
||||
msgstr ""
|
||||
|
||||
msgid "ScanExecutionPolicy|Select tags (if any)"
|
||||
msgstr ""
|
||||
|
||||
msgid "ScanExecutionPolicy|Site profile"
|
||||
msgstr ""
|
||||
|
||||
|
|
@ -37187,7 +37196,7 @@ msgstr ""
|
|||
msgid "SecurityOrchestration|Summary"
|
||||
msgstr ""
|
||||
|
||||
msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all branches to ensure the values are accurate before updating this policy."
|
||||
msgid "SecurityOrchestration|The following branches do not exist on this development project: %{branches}. Please review all protected branches to ensure the values are accurate before updating this policy."
|
||||
msgstr ""
|
||||
|
||||
msgid "SecurityOrchestration|There was a problem creating the new security policy"
|
||||
|
|
@ -37250,10 +37259,10 @@ msgstr ""
|
|||
msgid "SecurityOrchestration|a"
|
||||
msgstr ""
|
||||
|
||||
msgid "SecurityOrchestration|all branches"
|
||||
msgid "SecurityOrchestration|all namespaces"
|
||||
msgstr ""
|
||||
|
||||
msgid "SecurityOrchestration|all namespaces"
|
||||
msgid "SecurityOrchestration|all protected branches"
|
||||
msgstr ""
|
||||
|
||||
msgid "SecurityOrchestration|an"
|
||||
|
|
|
|||
|
|
@ -119,7 +119,12 @@ module QA
|
|||
end
|
||||
|
||||
def this_runner
|
||||
runners_list.find { |runner| runner[:description] == name }
|
||||
runner = nil
|
||||
Support::Retrier.retry_until(max_duration: 60, sleep_interval: 1) do
|
||||
runner = runners_list.find { |runner| runner[:description] == name }
|
||||
!runner.nil?
|
||||
end
|
||||
runner
|
||||
end
|
||||
|
||||
def populate_runner_attributes
|
||||
|
|
|
|||
|
|
@ -65,7 +65,11 @@ RSpec.describe 'Create GitLab branches from Jira', :js, feature_category: :integ
|
|||
end
|
||||
|
||||
click_on 'master'
|
||||
wait_for_requests
|
||||
|
||||
fill_in 'Search', with: source_branch
|
||||
wait_for_requests
|
||||
|
||||
within '[role="listbox"]' do
|
||||
find('li', text: source_branch).click
|
||||
end
|
||||
|
|
|
|||
|
|
@ -93,12 +93,31 @@
|
|||
"format": "date-time"
|
||||
},
|
||||
"due_date": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
],
|
||||
"format": [
|
||||
"date-time",
|
||||
"date"
|
||||
]
|
||||
},
|
||||
"start_date": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
],
|
||||
"format": [
|
||||
"date-time",
|
||||
"date"
|
||||
]
|
||||
},
|
||||
"expired": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"web_url": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
"format": "uri"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
{
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties" : {
|
||||
"$ref": "./issue.json"
|
||||
}
|
||||
"$ref": "./issue.json"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,25 +1,75 @@
|
|||
{
|
||||
"type": "object",
|
||||
"properties" : {
|
||||
"id": { "type": "integer" },
|
||||
"iid": { "type": "integer" },
|
||||
"project_id": { "type": "integer" },
|
||||
"title": { "type": "string" },
|
||||
"description": { "type": ["string", "null"] },
|
||||
"state": { "type": "string" },
|
||||
"merged_by": { "$ref": "user/basic.json" },
|
||||
"merge_user": { "$ref": "user/basic.json" },
|
||||
"merged_at": { "type": ["string", "null"] },
|
||||
"closed_by": { "$ref": "user/basic.json" },
|
||||
"closed_at": { "type": ["string", "null"], "format": "date-time" },
|
||||
"created_at": { "type": "string", "format": "date-time" },
|
||||
"updated_at": { "type": "string", "format": "date-time" },
|
||||
"target_branch": { "type": "string" },
|
||||
"source_branch": { "type": "string" },
|
||||
"upvotes": { "type": "integer" },
|
||||
"downvotes": { "type": "integer" },
|
||||
"author": { "$ref": "user/basic.json" },
|
||||
"assignee": { "$ref": "user/basic.json" },
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"iid": {
|
||||
"type": "integer"
|
||||
},
|
||||
"project_id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"title": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"state": {
|
||||
"type": "string"
|
||||
},
|
||||
"merged_by": {
|
||||
"$ref": "user/basic.json"
|
||||
},
|
||||
"merge_user": {
|
||||
"$ref": "user/basic.json"
|
||||
},
|
||||
"merged_at": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"closed_by": {
|
||||
"$ref": "user/basic.json"
|
||||
},
|
||||
"closed_at": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
],
|
||||
"format": "date-time"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"updated_at": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"target_branch": {
|
||||
"type": "string"
|
||||
},
|
||||
"source_branch": {
|
||||
"type": "string"
|
||||
},
|
||||
"upvotes": {
|
||||
"type": "integer"
|
||||
},
|
||||
"downvotes": {
|
||||
"type": "integer"
|
||||
},
|
||||
"author": {
|
||||
"$ref": "user/basic.json"
|
||||
},
|
||||
"assignee": {
|
||||
"$ref": "user/basic.json"
|
||||
},
|
||||
"assignees": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
|
|
@ -32,60 +82,159 @@
|
|||
"$ref": "user/basic.json"
|
||||
}
|
||||
},
|
||||
"source_project_id": { "type": "integer" },
|
||||
"target_project_id": { "type": "integer" },
|
||||
"source_project_id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"target_project_id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"labels": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"work_in_progress": { "type": "boolean" },
|
||||
"work_in_progress": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"milestone": {
|
||||
"oneOf": [
|
||||
{ "type": "null" },
|
||||
{ "$ref": "milestone.json" }
|
||||
{
|
||||
"type": "null"
|
||||
},
|
||||
{
|
||||
"$ref": "milestone.json"
|
||||
}
|
||||
]
|
||||
},
|
||||
"merge_when_pipeline_succeeds": { "type": "boolean" },
|
||||
"merge_status": { "type": "string" },
|
||||
"sha": { "type": "string" },
|
||||
"merge_commit_sha": { "type": ["string", "null"] },
|
||||
"user_notes_count": { "type": "integer" },
|
||||
"changes_count": { "type": "string" },
|
||||
"should_remove_source_branch": { "type": ["boolean", "null"] },
|
||||
"force_remove_source_branch": { "type": ["boolean", "null"] },
|
||||
"discussion_locked": { "type": ["boolean", "null"] },
|
||||
"web_url": { "type": "uri" },
|
||||
"squash": { "type": "boolean" },
|
||||
"time_stats": {
|
||||
"time_estimate": { "type": "integer" },
|
||||
"total_time_spent": { "type": "integer" },
|
||||
"human_time_estimate": { "type": ["string", "null"] },
|
||||
"human_total_time_spent": { "type": ["string", "null"] }
|
||||
"merge_when_pipeline_succeeds": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"merge_status": {
|
||||
"type": "string"
|
||||
},
|
||||
"sha": {
|
||||
"type": "string"
|
||||
},
|
||||
"merge_commit_sha": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"user_notes_count": {
|
||||
"type": "integer"
|
||||
},
|
||||
"changes_count": {
|
||||
"type": "string"
|
||||
},
|
||||
"should_remove_source_branch": {
|
||||
"type": [
|
||||
"boolean",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"force_remove_source_branch": {
|
||||
"type": [
|
||||
"boolean",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"discussion_locked": {
|
||||
"type": [
|
||||
"boolean",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"web_url": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
},
|
||||
"squash": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"time_stats": {
|
||||
"time_estimate": {
|
||||
"type": "integer"
|
||||
},
|
||||
"total_time_spent": {
|
||||
"type": "integer"
|
||||
},
|
||||
"human_time_estimate": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"human_total_time_spent": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
}
|
||||
},
|
||||
"allow_collaboration": {
|
||||
"type": [
|
||||
"boolean",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"allow_maintainer_to_push": {
|
||||
"type": [
|
||||
"boolean",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"allow_collaboration": { "type": ["boolean", "null"] },
|
||||
"allow_maintainer_to_push": { "type": ["boolean", "null"] },
|
||||
"references": {
|
||||
"short": {"type": "string"},
|
||||
"relative": {"type": "string"},
|
||||
"full": {"type": "string"}
|
||||
"short": {
|
||||
"type": "string"
|
||||
},
|
||||
"relative": {
|
||||
"type": "string"
|
||||
},
|
||||
"full": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id", "iid", "project_id", "title", "description",
|
||||
"state", "created_at", "updated_at", "target_branch",
|
||||
"source_branch", "upvotes", "downvotes", "author",
|
||||
"assignee", "source_project_id", "target_project_id",
|
||||
"labels", "work_in_progress", "milestone", "merge_when_pipeline_succeeds",
|
||||
"merge_status", "sha", "merge_commit_sha", "user_notes_count",
|
||||
"should_remove_source_branch", "force_remove_source_branch",
|
||||
"web_url", "squash"
|
||||
"id",
|
||||
"iid",
|
||||
"project_id",
|
||||
"title",
|
||||
"description",
|
||||
"state",
|
||||
"created_at",
|
||||
"updated_at",
|
||||
"target_branch",
|
||||
"source_branch",
|
||||
"upvotes",
|
||||
"downvotes",
|
||||
"author",
|
||||
"assignee",
|
||||
"source_project_id",
|
||||
"target_project_id",
|
||||
"labels",
|
||||
"work_in_progress",
|
||||
"milestone",
|
||||
"merge_when_pipeline_succeeds",
|
||||
"merge_status",
|
||||
"sha",
|
||||
"merge_commit_sha",
|
||||
"user_notes_count",
|
||||
"should_remove_source_branch",
|
||||
"force_remove_source_branch",
|
||||
"web_url",
|
||||
"squash"
|
||||
],
|
||||
"head_pipeline": {
|
||||
"oneOf": [
|
||||
{ "type": "null" },
|
||||
{ "$ref": "pipeline/detail.json" }
|
||||
{
|
||||
"type": "null"
|
||||
},
|
||||
{
|
||||
"$ref": "pipeline/detail.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,26 +1,59 @@
|
|||
{
|
||||
"type": "object",
|
||||
"properties" : {
|
||||
"properties" : {
|
||||
"id": { "type": "integer" },
|
||||
"iid": { "type": "integer" },
|
||||
"project_id": { "type": "integer" },
|
||||
"title": { "type": "string" },
|
||||
"description": { "type": ["string", "null"] },
|
||||
"state": { "type": "string" },
|
||||
"created_at": { "type": "string", "format": "date-time" },
|
||||
"updated_at": { "type": "string", "format": "date-time" },
|
||||
"web_url": { "type": "uri" }
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"iid": {
|
||||
"type": "integer"
|
||||
},
|
||||
"project_id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"title": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"state": {
|
||||
"type": "string"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"updated_at": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"web_url": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
},
|
||||
"required": [
|
||||
"id", "iid", "project_id", "title", "description",
|
||||
"state", "created_at", "updated_at", "web_url"
|
||||
],
|
||||
"head_pipeline": {
|
||||
"oneOf": [
|
||||
{ "type": "null" },
|
||||
{ "$ref": "pipeline/detail.json" }
|
||||
{
|
||||
"type": "null"
|
||||
},
|
||||
{
|
||||
"$ref": "pipeline/detail.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id",
|
||||
"iid",
|
||||
"project_id",
|
||||
"title",
|
||||
"description",
|
||||
"state",
|
||||
"created_at",
|
||||
"updated_at",
|
||||
"web_url"
|
||||
]
|
||||
}
|
||||
|
|
@ -1,24 +1,77 @@
|
|||
{
|
||||
"type": "object",
|
||||
"properties" : {
|
||||
"id": { "type": "integer" },
|
||||
"iid": { "type": "integer" },
|
||||
"project_id": { "type": ["integer", "null"] },
|
||||
"group_id": { "type": ["integer", "null"] },
|
||||
"title": { "type": "string" },
|
||||
"description": { "type": ["string", "null"] },
|
||||
"state": { "type": "string" },
|
||||
"created_at": { "type": "string" },
|
||||
"updated_at": { "type": "string" },
|
||||
"start_date": { "type": ["string", "null"], "format": "date-time" },
|
||||
"due_date": { "type": ["string", "null"], "format": "date-time" },
|
||||
"expired": { "type": ["boolean", "null"] },
|
||||
"web_url": { "type": "string" }
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"iid": {
|
||||
"type": "integer"
|
||||
},
|
||||
"project_id": {
|
||||
"type": [
|
||||
"integer",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"group_id": {
|
||||
"type": [
|
||||
"integer",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"title": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"state": {
|
||||
"type": "string"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string"
|
||||
},
|
||||
"updated_at": {
|
||||
"type": "string"
|
||||
},
|
||||
"start_date": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
],
|
||||
"format": "date-time"
|
||||
},
|
||||
"due_date": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
],
|
||||
"format": "date-time"
|
||||
},
|
||||
"expired": {
|
||||
"type": [
|
||||
"boolean",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"web_url": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id", "iid", "title", "description", "state",
|
||||
"state", "created_at", "updated_at", "start_date",
|
||||
"due_date", "expired"
|
||||
"id",
|
||||
"iid",
|
||||
"title",
|
||||
"description",
|
||||
"state",
|
||||
"created_at",
|
||||
"updated_at",
|
||||
"start_date",
|
||||
"due_date",
|
||||
"expired"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
|
|
@ -1,32 +1,95 @@
|
|||
{
|
||||
"type": "object",
|
||||
"properties" : {
|
||||
"id": { "type": "integer" },
|
||||
"iid": { "type": "integer" },
|
||||
"project_id": { "type": ["integer", "null"] },
|
||||
"group_id": { "type": ["integer", "null"] },
|
||||
"title": { "type": "string" },
|
||||
"description": { "type": ["string", "null"] },
|
||||
"state": { "type": "string" },
|
||||
"created_at": { "type": "string", "format": "date-time" },
|
||||
"updated_at": { "type": "string", "format": "date-time" },
|
||||
"start_date": { "type": ["string", "null"], "format": "date-time" },
|
||||
"due_date": { "type": ["string", "null"], "format": "date-time" },
|
||||
"expired": { "type": ["boolean", "null"] },
|
||||
"web_url": { "type": "string" },
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"iid": {
|
||||
"type": "integer"
|
||||
},
|
||||
"project_id": {
|
||||
"type": [
|
||||
"integer",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"group_id": {
|
||||
"type": [
|
||||
"integer",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"title": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"state": {
|
||||
"type": "string"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"updated_at": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"start_date": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
],
|
||||
"format": "date-time"
|
||||
},
|
||||
"due_date": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
],
|
||||
"format": "date-time"
|
||||
},
|
||||
"expired": {
|
||||
"type": [
|
||||
"boolean",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"web_url": {
|
||||
"type": "string"
|
||||
},
|
||||
"issue_stats": {
|
||||
"required": ["total", "closed"],
|
||||
"required": [
|
||||
"total",
|
||||
"closed"
|
||||
],
|
||||
"properties": {
|
||||
"total": { "type": "integer" },
|
||||
"closed": { "type": "integer" }
|
||||
"total": {
|
||||
"type": "integer"
|
||||
},
|
||||
"closed": {
|
||||
"type": "integer"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id", "iid", "title", "description", "state",
|
||||
"state", "created_at", "updated_at", "start_date",
|
||||
"due_date", "expired", "issue_stats"
|
||||
"id",
|
||||
"iid",
|
||||
"title",
|
||||
"description",
|
||||
"state",
|
||||
"created_at",
|
||||
"updated_at",
|
||||
"start_date",
|
||||
"due_date",
|
||||
"expired",
|
||||
"issue_stats"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
|
|
@ -2,43 +2,124 @@
|
|||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties" : {
|
||||
"id": { "type": "integer" },
|
||||
"type": { "type": ["string", "null"] },
|
||||
"body": { "type": "string" },
|
||||
"attachment": { "type": ["string", "null"] },
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"type": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"body": {
|
||||
"type": "string"
|
||||
},
|
||||
"attachment": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"author": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": { "type": "string" },
|
||||
"username": { "type": "string" },
|
||||
"id": { "type": "integer" },
|
||||
"state": { "type": "string" },
|
||||
"avatar_url": { "type": "uri" },
|
||||
"web_url": { "type": "uri" }
|
||||
"name": {
|
||||
"type": "string"
|
||||
},
|
||||
"username": {
|
||||
"type": "string"
|
||||
},
|
||||
"id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"state": {
|
||||
"type": "string"
|
||||
},
|
||||
"avatar_url": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
},
|
||||
"web_url": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
}
|
||||
},
|
||||
"required" : [
|
||||
"id", "name", "username", "state", "avatar_url", "web_url"
|
||||
"required": [
|
||||
"id",
|
||||
"name",
|
||||
"username",
|
||||
"state",
|
||||
"avatar_url",
|
||||
"web_url"
|
||||
]
|
||||
},
|
||||
"commands_changes": { "type": "object", "additionalProperties": true },
|
||||
"created_at": { "type": "string", "format": "date-time" },
|
||||
"updated_at": { "type": "string", "format": "date-time" },
|
||||
"system": { "type": "boolean" },
|
||||
"noteable_id": { "type": "integer" },
|
||||
"noteable_iid": { "type": "integer" },
|
||||
"noteable_type": { "type": "string" },
|
||||
"resolved": { "type": "boolean" },
|
||||
"resolvable": { "type": "boolean" },
|
||||
"resolved_by": { "type": ["string", "null"] },
|
||||
"resolved_at": { "type": ["string", "null"] },
|
||||
"confidential": { "type": ["boolean", "null"] },
|
||||
"internal": { "type": ["boolean", "null"] }
|
||||
"commands_changes": {
|
||||
"type": "object",
|
||||
"additionalProperties": true
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"updated_at": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"system": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"noteable_id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"noteable_iid": {
|
||||
"type": "integer"
|
||||
},
|
||||
"noteable_type": {
|
||||
"type": "string"
|
||||
},
|
||||
"resolved": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"resolvable": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"resolved_by": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"resolved_at": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"confidential": {
|
||||
"type": [
|
||||
"boolean",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"internal": {
|
||||
"type": [
|
||||
"boolean",
|
||||
"null"
|
||||
]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id", "body", "attachment", "author", "created_at", "updated_at",
|
||||
"system", "noteable_id", "noteable_type"
|
||||
"id",
|
||||
"body",
|
||||
"attachment",
|
||||
"author",
|
||||
"created_at",
|
||||
"updated_at",
|
||||
"system",
|
||||
"noteable_id",
|
||||
"noteable_type"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,23 +1,60 @@
|
|||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"domain": { "type": "string" },
|
||||
"url": { "type": "uri" },
|
||||
"project_id": { "type": "integer" },
|
||||
"verified": { "type": "boolean" },
|
||||
"verification_code": { "type": ["string", "null"] },
|
||||
"enabled_until": { "type": ["string", "null"], "format": "date-time" },
|
||||
"auto_ssl_enabled": { "type": "boolean" },
|
||||
"domain": {
|
||||
"type": "string"
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
},
|
||||
"project_id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"verified": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"verification_code": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"enabled_until": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
],
|
||||
"format": "date-time"
|
||||
},
|
||||
"auto_ssl_enabled": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"certificate_expiration": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"expired": { "type": "boolean" },
|
||||
"expiration": { "type": "string" }
|
||||
"expired": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"expiration": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": ["expired", "expiration"],
|
||||
"required": [
|
||||
"expired",
|
||||
"expiration"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["domain", "url", "project_id", "verified", "verification_code", "enabled_until", "auto_ssl_enabled"],
|
||||
"required": [
|
||||
"domain",
|
||||
"url",
|
||||
"project_id",
|
||||
"verified",
|
||||
"verification_code",
|
||||
"enabled_until",
|
||||
"auto_ssl_enabled"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
|
|
@ -1,24 +1,61 @@
|
|||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"domain": { "type": "string" },
|
||||
"url": { "type": "uri" },
|
||||
"verified": { "type": "boolean" },
|
||||
"verification_code": { "type": ["string", "null"] },
|
||||
"enabled_until": { "type": ["string", "null"] },
|
||||
"auto_ssl_enabled": { "type": "boolean" },
|
||||
"domain": {
|
||||
"type": "string"
|
||||
},
|
||||
"url": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
},
|
||||
"verified": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"verification_code": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"enabled_until": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"auto_ssl_enabled": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"certificate": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"subject": { "type": "string" },
|
||||
"expired": { "type": "boolean" },
|
||||
"certificate": { "type": "string" },
|
||||
"certificate_text": { "type": "string" }
|
||||
"subject": {
|
||||
"type": "string"
|
||||
},
|
||||
"expired": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"certificate": {
|
||||
"type": "string"
|
||||
},
|
||||
"certificate_text": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": ["subject", "expired"],
|
||||
"required": [
|
||||
"subject",
|
||||
"expired"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
},
|
||||
"required": ["domain", "url", "verified", "verification_code", "enabled_until", "auto_ssl_enabled"],
|
||||
"required": [
|
||||
"domain",
|
||||
"url",
|
||||
"verified",
|
||||
"verification_code",
|
||||
"enabled_until",
|
||||
"auto_ssl_enabled"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
|
|
@ -1,10 +1,6 @@
|
|||
{
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties" : {
|
||||
"$ref": "./project_hook.json"
|
||||
}
|
||||
"$ref": "./project_hook.json"
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -2,46 +2,107 @@
|
|||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties" : {
|
||||
"id": { "type": "integer" },
|
||||
"project_id": { "type": ["integer", "null"] },
|
||||
"title": { "type": "string" },
|
||||
"file_name": { "type": ["string", "null"] },
|
||||
"files" : {
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"project_id": {
|
||||
"type": [
|
||||
"integer",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"title": {
|
||||
"type": "string"
|
||||
},
|
||||
"file_name": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"files": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"path": { "type": "string" },
|
||||
"raw_url": { "type": "string" }
|
||||
"path": {
|
||||
"type": "string"
|
||||
},
|
||||
"raw_url": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"description": { "type": ["string", "null"] },
|
||||
"visibility": { "type": "string" },
|
||||
"web_url": { "type": "string" },
|
||||
"raw_url": { "type": "string" },
|
||||
"created_at": { "type": "string", "format": "date-time" },
|
||||
"updated_at": { "type": "string", "format": "date-time" },
|
||||
"description": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"visibility": {
|
||||
"type": "string"
|
||||
},
|
||||
"web_url": {
|
||||
"type": "string"
|
||||
},
|
||||
"raw_url": {
|
||||
"type": "string"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"updated_at": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"author": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": { "type": "string" },
|
||||
"username": { "type": "string" },
|
||||
"id": { "type": "integer" },
|
||||
"state": { "type": "string" },
|
||||
"avatar_url": { "type": "uri" },
|
||||
"web_url": { "type": "uri" }
|
||||
"name": {
|
||||
"type": "string"
|
||||
},
|
||||
"username": {
|
||||
"type": "string"
|
||||
},
|
||||
"id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"state": {
|
||||
"type": "string"
|
||||
},
|
||||
"avatar_url": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
},
|
||||
"web_url": {
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
}
|
||||
},
|
||||
"required" : [
|
||||
"id", "name", "username", "state", "avatar_url", "web_url"
|
||||
"required": [
|
||||
"id",
|
||||
"name",
|
||||
"username",
|
||||
"state",
|
||||
"avatar_url",
|
||||
"web_url"
|
||||
]
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id", "title", "file_name", "description", "web_url",
|
||||
"created_at", "updated_at", "author", "raw_url"
|
||||
"id",
|
||||
"title",
|
||||
"file_name",
|
||||
"description",
|
||||
"web_url",
|
||||
"created_at",
|
||||
"updated_at",
|
||||
"author",
|
||||
"raw_url"
|
||||
],
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,9 +1,6 @@
|
|||
{
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"properties" : {
|
||||
"$ref": "./system_hook.json"
|
||||
}
|
||||
"$ref": "./system_hook.json"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -28,32 +28,95 @@
|
|||
"external"
|
||||
],
|
||||
"properties": {
|
||||
"id": { "type": "integer" },
|
||||
"username": { "type": "string" },
|
||||
"id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"username": {
|
||||
"type": "string"
|
||||
},
|
||||
"email": {
|
||||
"type": "string",
|
||||
"pattern": "^[^@]+@[^@]+$"
|
||||
},
|
||||
"name": { "type": "string" },
|
||||
"name": {
|
||||
"type": "string"
|
||||
},
|
||||
"state": {
|
||||
"type": "string",
|
||||
"enum": ["active", "blocked"]
|
||||
"enum": [
|
||||
"active",
|
||||
"blocked"
|
||||
]
|
||||
},
|
||||
"avatar_url": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"web_url": {
|
||||
"type": "string"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"bio": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"location": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"skype": {
|
||||
"type": "string"
|
||||
},
|
||||
"linkedin": {
|
||||
"type": "string"
|
||||
},
|
||||
"twitter": {
|
||||
"type": "string"
|
||||
},
|
||||
"website_url": {
|
||||
"type": "string"
|
||||
},
|
||||
"organization": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"last_sign_in_at": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
],
|
||||
"format": "date-time"
|
||||
},
|
||||
"confirmed_at": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
},
|
||||
"color_scheme_id": {
|
||||
"type": "integer"
|
||||
},
|
||||
"projects_limit": {
|
||||
"type": "integer"
|
||||
},
|
||||
"current_sign_in_at": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
],
|
||||
"format": "date-time"
|
||||
},
|
||||
"avatar_url": { "type": [ "string", "null" ] },
|
||||
"web_url": { "type": "string" },
|
||||
"created_at": { "type": "string", "format": "date-time" },
|
||||
"bio": { "type": ["string", "null"] },
|
||||
"location": { "type": ["string", "null"] },
|
||||
"skype": { "type": "string" },
|
||||
"linkedin": { "type": "string" },
|
||||
"twitter": { "type": "string "},
|
||||
"website_url": { "type": "string" },
|
||||
"organization": { "type": ["string", "null"] },
|
||||
"last_sign_in_at": { "type": ["string", "null"], "format": "date-time" },
|
||||
"confirmed_at": { "type": ["string", "null"] },
|
||||
"color_scheme_id": { "type": "integer" },
|
||||
"projects_limit": { "type": "integer" },
|
||||
"current_sign_in_at": { "type": ["string", "null"], "format": "date-time" },
|
||||
"identities": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
|
|
@ -61,16 +124,35 @@
|
|||
"properties": {
|
||||
"provider": {
|
||||
"type": "string",
|
||||
"enum": ["github", "bitbucket", "google_oauth2"]
|
||||
"enum": [
|
||||
"github",
|
||||
"bitbucket",
|
||||
"google_oauth2"
|
||||
]
|
||||
},
|
||||
"extern_uid": { "type": ["number", "string"] }
|
||||
"extern_uid": {
|
||||
"type": [
|
||||
"number",
|
||||
"string"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"can_create_group": { "type": "boolean" },
|
||||
"can_create_project": { "type": "boolean" },
|
||||
"two_factor_enabled": { "type": "boolean" },
|
||||
"external": { "type": "boolean" },
|
||||
"commit_email": { "type": "string" }
|
||||
"can_create_group": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"can_create_project": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"two_factor_enabled": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"external": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"commit_email": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,12 @@
|
|||
{
|
||||
"type": "object",
|
||||
"required": ["id", "name", "path", "location", "created_at"],
|
||||
"required": [
|
||||
"id",
|
||||
"name",
|
||||
"path",
|
||||
"location",
|
||||
"created_at"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "integer"
|
||||
|
|
@ -18,10 +24,15 @@
|
|||
"type": "string"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "date-time"
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"cleanup_policy_started_at": {
|
||||
"type": "date-time"
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
],
|
||||
"format": "date-time"
|
||||
},
|
||||
"tags_path": {
|
||||
"type": "string"
|
||||
|
|
@ -31,14 +42,24 @@
|
|||
},
|
||||
"status": {
|
||||
"oneOf": [
|
||||
{ "type": "null" },
|
||||
{ "type": "string", "enum": ["delete_scheduled", "delete_failed"] }
|
||||
{
|
||||
"type": "null"
|
||||
},
|
||||
{
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"delete_scheduled",
|
||||
"delete_failed"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"tags": { "$ref": "tags.json" },
|
||||
"tags": {
|
||||
"$ref": "tags.json"
|
||||
},
|
||||
"tags_count": {
|
||||
"type": "integer"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
|
|
@ -2,12 +2,21 @@
|
|||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"type": "object",
|
||||
"required": [
|
||||
"type", "options"
|
||||
"type",
|
||||
"options"
|
||||
],
|
||||
"properties": {
|
||||
"type": { "enum": "metric_label_values" },
|
||||
"label": { "type": "string" },
|
||||
"options": { "$ref": "spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metric_label_values_variable_options.json" }
|
||||
"type": {
|
||||
"enum": [
|
||||
"metric_label_values"
|
||||
]
|
||||
},
|
||||
"label": {
|
||||
"type": "string"
|
||||
},
|
||||
"options": {
|
||||
"$ref": "spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metric_label_values_variable_options.json"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
}
|
||||
|
|
@ -232,6 +232,47 @@ RSpec.describe 'Query.runner(id)', feature_category: :runner_fleet do
|
|||
end
|
||||
end
|
||||
|
||||
describe 'jobCount' do
|
||||
let_it_be(:pipeline1) { create(:ci_pipeline, project: project1) }
|
||||
let_it_be(:pipeline2) { create(:ci_pipeline, project: project1) }
|
||||
let_it_be(:build1) { create(:ci_build, :running, runner: active_project_runner, pipeline: pipeline1) }
|
||||
let_it_be(:build2) { create(:ci_build, :running, runner: active_project_runner, pipeline: pipeline2) }
|
||||
|
||||
let(:runner_query_fragment) { 'id jobCount' }
|
||||
let(:query) do
|
||||
%(
|
||||
query {
|
||||
runner1: runner(id: "#{active_project_runner.to_global_id}") { #{runner_query_fragment} }
|
||||
runner2: runner(id: "#{inactive_instance_runner.to_global_id}") { #{runner_query_fragment} }
|
||||
}
|
||||
)
|
||||
end
|
||||
|
||||
it 'retrieves correct jobCount values' do
|
||||
post_graphql(query, current_user: user)
|
||||
|
||||
expect(graphql_data).to match a_hash_including(
|
||||
'runner1' => a_graphql_entity_for(active_project_runner, job_count: 2),
|
||||
'runner2' => a_graphql_entity_for(inactive_instance_runner, job_count: 0)
|
||||
)
|
||||
end
|
||||
|
||||
context 'when JOB_COUNT_LIMIT is in effect' do
|
||||
before do
|
||||
stub_const('Types::Ci::RunnerType::JOB_COUNT_LIMIT', 1)
|
||||
end
|
||||
|
||||
it 'retrieves correct capped jobCount values' do
|
||||
post_graphql(query, current_user: user)
|
||||
|
||||
expect(graphql_data).to match a_hash_including(
|
||||
'runner1' => a_graphql_entity_for(active_project_runner, job_count: 1),
|
||||
'runner2' => a_graphql_entity_for(inactive_instance_runner, job_count: 0)
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'ownerProject' do
|
||||
let_it_be(:project2) { create(:project) }
|
||||
let_it_be(:runner1) { create(:ci_runner, :project, projects: [project2, project1]) }
|
||||
|
|
@ -510,8 +551,8 @@ RSpec.describe 'Query.runner(id)', feature_category: :runner_fleet do
|
|||
let(:active_project_runner2) { create(:ci_runner, :project) }
|
||||
let(:active_group_runner2) { create(:ci_runner, :group) }
|
||||
|
||||
# Currently excluding known N+1 issues, see https://gitlab.com/gitlab-org/gitlab/-/issues/334759
|
||||
let(:excluded_fields) { %w[jobCount jobs groups projects ownerProject] }
|
||||
# Exclude fields that are already hardcoded above
|
||||
let(:excluded_fields) { %w[jobs groups projects ownerProject] }
|
||||
|
||||
let(:single_query) do
|
||||
<<~QUERY
|
||||
|
|
|
|||
|
|
@ -39,8 +39,6 @@ require 'test_prof/factory_default'
|
|||
require 'test_prof/factory_prof/nate_heckler'
|
||||
require 'parslet/rig/rspec'
|
||||
|
||||
warn_missing_feature_category = Gitlab::Utils.to_boolean(ENV['RSPEC_WARN_MISSING_FEATURE_CATEGORY'], default: true)
|
||||
|
||||
rspec_profiling_is_configured =
|
||||
ENV['RSPEC_PROFILING_POSTGRES_URL'].present? ||
|
||||
ENV['RSPEC_PROFILING']
|
||||
|
|
@ -463,13 +461,6 @@ RSpec.configure do |config|
|
|||
config.before(:each, :js) do
|
||||
allow_any_instance_of(VersionCheck).to receive(:response).and_return({ "severity" => "success" })
|
||||
end
|
||||
|
||||
# Add warning for example missing feature_category
|
||||
config.before do |example|
|
||||
if warn_missing_feature_category && example.metadata[:feature_category].blank? && !ENV['CI']
|
||||
warn "Missing metadata feature_category: #{example.location} See https://docs.gitlab.com/ee/development/testing_guide/best_practices.html#feature-category-metadata"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ActiveRecord::Migration.maintain_test_schema!
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ require_relative "helpers/stub_object_storage"
|
|||
require_relative "helpers/stub_env"
|
||||
require_relative "helpers/fast_rails_root"
|
||||
|
||||
require_relative "../../lib/gitlab/utils"
|
||||
|
||||
RSpec::Expectations.configuration.on_potential_false_positives = :raise
|
||||
|
||||
RSpec.configure do |config|
|
||||
|
|
@ -35,4 +37,13 @@ RSpec.configure do |config|
|
|||
config.include StubObjectStorage
|
||||
config.include StubENV
|
||||
config.include FastRailsRoot
|
||||
|
||||
warn_missing_feature_category = Gitlab::Utils.to_boolean(ENV['RSPEC_WARN_MISSING_FEATURE_CATEGORY'], default: true)
|
||||
|
||||
# Add warning for example missing feature_category
|
||||
config.before do |example|
|
||||
if warn_missing_feature_category && example.metadata[:feature_category].blank? && !ENV['CI']
|
||||
warn "Missing metadata feature_category: #{example.location} See https://docs.gitlab.com/ee/development/testing_guide/best_practices.html#feature-category-metadata"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Reference in New Issue