summaryrefslogtreecommitdiff
path: root/spec/support/atlassian/jira_connect/schemata.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/support/atlassian/jira_connect/schemata.rb')
-rw-r--r--spec/support/atlassian/jira_connect/schemata.rb337
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