diff options
Diffstat (limited to 'spec/support/atlassian/jira_connect/schemata.rb')
-rw-r--r-- | spec/support/atlassian/jira_connect/schemata.rb | 337 |
1 files changed, 273 insertions, 64 deletions
diff --git a/spec/support/atlassian/jira_connect/schemata.rb b/spec/support/atlassian/jira_connect/schemata.rb index 91f8fe0bb41..d056c7cacf3 100644 --- a/spec/support/atlassian/jira_connect/schemata.rb +++ b/spec/support/atlassian/jira_connect/schemata.rb @@ -2,82 +2,291 @@ module Atlassian module Schemata - def self.build_info - { - 'type' => 'object', - 'required' => %w(schemaVersion pipelineId buildNumber updateSequenceNumber displayName url state issueKeys testInfo references), - 'properties' => { - 'schemaVersion' => { 'type' => 'string', 'pattern' => '1.0' }, - 'pipelineId' => { 'type' => 'string' }, - 'buildNumber' => { 'type' => 'integer' }, - 'updateSequenceNumber' => { 'type' => 'integer' }, - 'displayName' => { 'type' => 'string' }, - 'url' => { 'type' => 'string' }, - 'state' => { - 'type' => 'string', - 'pattern' => '(pending|in_progress|successful|failed|cancelled)' - }, - 'issueKeys' => { - 'type' => 'array', - 'items' => { 'type' => 'string' }, - 'minItems' => 1 - }, - 'testInfo' => { - 'type' => 'object', - 'required' => %w(totalNumber numberPassed numberFailed numberSkipped), - 'properties' => { - 'totalNumber' => { 'type' => 'integer' }, - 'numberFailed' => { 'type' => 'integer' }, - 'numberPassed' => { 'type' => 'integer' }, - 'numberSkipped' => { 'type' => 'integer' } - } - }, - 'references' => { - 'type' => 'array', - 'items' => { + class << self + def build_info + { + 'type' => 'object', + 'additionalProperties' => false, + 'required' => %w( + schemaVersion pipelineId buildNumber updateSequenceNumber + displayName url state issueKeys testInfo references + lastUpdated + ), + 'properties' => { + 'schemaVersion' => schema_version_type, + 'pipelineId' => { 'type' => 'string' }, + 'buildNumber' => { 'type' => 'integer' }, + 'updateSequenceNumber' => { 'type' => 'integer' }, + 'displayName' => { 'type' => 'string' }, + 'lastUpdated' => iso8601_type, + 'url' => { 'type' => 'string' }, + 'state' => state_type, + 'issueKeys' => issue_keys_type, + 'testInfo' => { 'type' => 'object', - 'required' => %w(commit ref), + 'required' => %w(totalNumber numberPassed numberFailed numberSkipped), 'properties' => { - 'commit' => { - 'type' => 'object', - 'required' => %w(id repositoryUri), - 'properties' => { - 'id' => { 'type' => 'string' }, - 'repositoryUri' => { 'type' => 'string' } + 'totalNumber' => { 'type' => 'integer' }, + 'numberFailed' => { 'type' => 'integer' }, + 'numberPassed' => { 'type' => 'integer' }, + 'numberSkipped' => { 'type' => 'integer' } + } + }, + 'references' => { + 'type' => 'array', + 'items' => { + 'type' => 'object', + 'required' => %w(commit ref), + 'properties' => { + 'commit' => { + 'type' => 'object', + 'required' => %w(id repositoryUri), + 'properties' => { + 'id' => { 'type' => 'string' }, + 'repositoryUri' => { 'type' => 'string' } + } + }, + 'ref' => { + 'type' => 'object', + 'required' => %w(name uri), + 'properties' => { + 'name' => { 'type' => 'string' }, + 'uri' => { 'type' => 'string' } + } } - }, - 'ref' => { - 'type' => 'object', - 'required' => %w(name uri), - 'properties' => { - 'name' => { 'type' => 'string' }, - 'uri' => { 'type' => 'string' } + } + } + } + } + } + end + + def deployment_info + { + 'type' => 'object', + 'additionalProperties' => false, + 'required' => %w( + deploymentSequenceNumber updateSequenceNumber + associations displayName url description lastUpdated + state pipeline environment + ), + 'properties' => { + 'deploymentSequenceNumber' => { 'type' => 'integer' }, + 'updateSequenceNumber' => { 'type' => 'integer' }, + 'associations' => { + 'type' => 'array', + 'items' => association_type, + 'minItems' => 1 + }, + 'displayName' => { 'type' => 'string' }, + 'description' => { 'type' => 'string' }, + 'label' => { 'type' => 'string' }, + 'url' => { 'type' => 'string' }, + 'lastUpdated' => iso8601_type, + 'state' => state_type, + 'pipeline' => pipeline_type, + 'environment' => environment_type, + 'schemaVersion' => schema_version_type + } + } + end + + def feature_flag_info + { + 'type' => 'object', + 'additionalProperties' => false, + 'required' => %w( + updateSequenceId id key issueKeys summary details + ), + 'properties' => { + 'id' => { 'type' => 'string' }, + 'key' => { 'type' => 'string' }, + 'displayName' => { 'type' => 'string' }, + 'issueKeys' => issue_keys_type, + 'summary' => summary_type, + 'details' => details_type, + 'updateSequenceId' => { 'type' => 'integer' }, + 'schemaVersion' => schema_version_type + } + } + end + + def details_type + { + 'type' => 'array', + 'items' => combine(summary_type, { + 'required' => ['environment'], + 'properties' => { + 'environment' => { + 'type' => 'object', + 'additionalProperties' => false, + 'required' => %w(name), + 'properties' => { + 'name' => { 'type' => 'string' }, + 'type' => { + 'type' => 'string', + 'pattern' => '^(development|testing|staging|production)$' } } } } + }) + } + end + + def combine(map_a, map_b) + map_a.merge(map_b) do |k, a, b| + a.respond_to?(:merge) ? a.merge(b) : a + b + end + end + + def summary_type + { + 'type' => 'object', + 'additionalProperties' => false, + 'required' => %w(url status lastUpdated), + 'properties' => { + 'lastUpdated' => iso8601_type, + 'url' => { 'type' => 'string' }, + 'status' => feature_status_type } } - } - end + end - def self.build_info_payload - { - 'type' => 'object', - 'required' => %w(providerMetadata builds), - 'properties' => { - 'providerMetadata' => provider_metadata, - 'builds' => { 'type' => 'array', 'items' => build_info } + def feature_status_type + { + 'type' => 'object', + 'additionalProperties' => false, + 'required' => %w(enabled), + 'properties' => { + 'enabled' => { 'type' => 'boolean' }, + 'defaultValue' => { 'type' => 'string' }, + 'rollout' => rollout_type + } } - } - end + end + + def rollout_type + { + 'type' => 'object', + 'additionalProperties' => false, + 'properties' => { + 'percentage' => { 'type' => 'number' }, + 'text' => { 'type' => 'string' }, + 'rules' => { 'type' => 'number' } + } + } + end - def self.provider_metadata - { - 'type' => 'object', - 'required' => %w(product), - 'properties' => { 'product' => { 'type' => 'string' } } - } + def environment_type + { + 'type' => 'object', + 'additionalProperties' => false, + 'required' => %w(id displayName type), + 'properties' => { + 'id' => { 'type' => 'string', 'maxLength' => 255 }, + 'displayName' => { 'type' => 'string', 'maxLength' => 255 }, + 'type' => { + 'type' => 'string', + 'pattern' => '(unmapped|development|testing|staging|production)' + } + } + } + end + + def pipeline_type + { + 'type' => 'object', + 'additionalProperties' => false, + 'required' => %w(id displayName url), + 'properties' => { + 'id' => { 'type' => 'string', 'maxLength' => 255 }, + 'displayName' => { 'type' => 'string', 'maxLength' => 255 }, + 'url' => { 'type' => 'string', 'maxLength' => 2000 } + } + } + end + + def schema_version_type + { 'type' => 'string', 'pattern' => '1.0' } + end + + def state_type + { + 'type' => 'string', + 'pattern' => '(pending|in_progress|successful|failed|cancelled)' + } + end + + def association_type + { + 'type' => 'object', + 'additionalProperties' => false, + 'required' => %w(associationType values), + 'properties' => { + 'associationType' => { + 'type' => 'string', + 'pattern' => '(issueKeys|issueIdOrKeys)' + }, + 'values' => issue_keys_type + } + } + end + + def issue_keys_type + { + 'type' => 'array', + 'items' => { 'type' => 'string' }, + 'minItems' => 1, + 'maxItems' => 100 + } + end + + def deploy_info_payload + payload('deployments', deployment_info) + end + + def build_info_payload + payload('builds', build_info) + end + + def ff_info_payload + pl = payload('flags', feature_flag_info) + pl['properties']['properties'] = { + 'type' => 'object', + 'additionalProperties' => { 'type' => 'string' }, + 'maxProperties' => 5, + 'propertyNames' => { 'pattern' => '^[^_][^:]+$' } + } + pl + end + + def payload(key, schema) + { + 'type' => 'object', + 'additionalProperties' => false, + 'required' => ['providerMetadata', key], + 'properties' => { + 'providerMetadata' => provider_metadata, + key => { 'type' => 'array', 'items' => schema } + } + } + end + + def provider_metadata + { + 'type' => 'object', + 'required' => %w(product), + 'properties' => { 'product' => { 'type' => 'string' } } + } + end + + def iso8601_type + { + 'type' => 'string', + 'pattern' => '^-?([1-9][0-9]*)?[0-9]{4}-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?(Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$' + } + end end end end |