summaryrefslogtreecommitdiff
path: root/spec/fixtures
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-07-20 12:26:25 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-07-20 12:26:25 +0000
commita09983ae35713f5a2bbb100981116d31ce99826e (patch)
tree2ee2af7bd104d57086db360a7e6d8c9d5d43667a /spec/fixtures
parent18c5ab32b738c0b6ecb4d0df3994000482f34bd8 (diff)
downloadgitlab-ce-a09983ae35713f5a2bbb100981116d31ce99826e.tar.gz
Add latest changes from gitlab-org/gitlab@13-2-stable-ee
Diffstat (limited to 'spec/fixtures')
-rw-r--r--spec/fixtures/api/graphql/introspection.graphql16
-rw-r--r--spec/fixtures/api/schemas/entities/dag_job.json10
-rw-r--r--spec/fixtures/api/schemas/entities/dag_job_group.json13
-rw-r--r--spec/fixtures/api/schemas/entities/dag_pipeline.json11
-rw-r--r--spec/fixtures/api/schemas/entities/dag_stage.json11
-rw-r--r--spec/fixtures/api/schemas/evidences/build_artifact.json10
-rw-r--r--spec/fixtures/api/schemas/evidences/release.json4
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/composer/index.json29
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/composer/package.json65
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/composer/provider.json25
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/group_package.json33
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/group_packages.json4
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/npm_package.json8
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/npm_package_tags.json7
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/npm_package_version.json46
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/nuget/dependency_group.json22
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/nuget/download_versions.json10
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/nuget/package_metadata.json28
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/nuget/packages_metadata.json54
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/nuget/search.json39
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/nuget/service_index.json19
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/package.json41
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/package_files.json13
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/package_version.json19
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/package_with_build.json10
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/packages/packages.json4
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/pipeline.json27
-rw-r--r--spec/fixtures/api/schemas/public_api/v4/snippets.json10
-rw-r--r--spec/fixtures/clusters/ca_certificate.pem23
-rw-r--r--spec/fixtures/clusters/chain_certificates.pem100
-rw-r--r--spec/fixtures/clusters/intermediate_certificate.pem28
-rw-r--r--spec/fixtures/clusters/root_certificate.pem49
-rw-r--r--spec/fixtures/emails/service_desk.eml28
-rw-r--r--spec/fixtures/emails/service_desk_custom_address.eml27
-rw-r--r--spec/fixtures/emails/service_desk_forwarded.eml30
-rw-r--r--spec/fixtures/emails/service_desk_forwarded_new_issue.eml29
-rw-r--r--spec/fixtures/emails/service_desk_legacy.eml28
-rw-r--r--spec/fixtures/emails/service_desk_sender_and_from.eml27
-rw-r--r--spec/fixtures/emails/valid_reply_with_quick_actions.eml45
-rw-r--r--spec/fixtures/gitlab/import_export/corrupted_project_export.tar.gzbin4352 -> 3846 bytes
-rw-r--r--spec/fixtures/gitlab/import_export/lightweight_project_export.tar.gzbin3837 -> 3647 bytes
-rw-r--r--spec/fixtures/helm/helm_list_v2_cilium_deployed.json.gzbin0 -> 302 bytes
-rw-r--r--spec/fixtures/helm/helm_list_v2_cilium_failed.json.gzbin0 -> 304 bytes
-rw-r--r--spec/fixtures/helm/helm_list_v2_cilium_missing.json.gzbin0 -> 320 bytes
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/project.json389
-rw-r--r--spec/fixtures/lib/gitlab/import_export/complex/tree/project/services.ndjson38
-rw-r--r--spec/fixtures/lib/gitlab/import_export/designs/project.json3
-rw-r--r--spec/fixtures/lib/gitlab/import_export/light/project.json44
-rw-r--r--spec/fixtures/lib/gitlab/import_export/light/tree/project/services.ndjson4
-rw-r--r--spec/fixtures/lib/gitlab/import_export/with_invalid_records/project.json1
-rw-r--r--spec/fixtures/lib/gitlab/metrics/dashboard/sample_dashboard.yml17
-rw-r--r--spec/fixtures/lib/gitlab/metrics/dashboard/schemas/custom_variable_full_syntax.json12
-rw-r--r--spec/fixtures/lib/gitlab/metrics/dashboard/schemas/custom_variable_options.json11
-rw-r--r--spec/fixtures/lib/gitlab/metrics/dashboard/schemas/custom_variable_values.json10
-rw-r--r--spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metric_label_values_variable_full_syntax.json12
-rw-r--r--spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metric_label_values_variable_options.json12
-rw-r--r--spec/fixtures/lib/gitlab/metrics/dashboard/schemas/text_variable_full_syntax.json2
-rw-r--r--spec/fixtures/lib/gitlab/metrics/dashboard/schemas/variables.json8
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/blockquote.json24
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/blockquote.md2
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/bullet_list.json72
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/bullet_list.md8
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/code_block.json89
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/code_block.md38
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/code_mark.json24
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/code_mark.md2
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/complex_document.json964
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/complex_document.md223
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/emoji.json66
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/emoji.md4
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/hard_break.json22
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/hard_break.md3
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/heading.json91
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/heading.md12
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/inline_card.json46
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/inline_card.md13
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/invalid_json.json16
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/invalid_no_doc.json13
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/invalid_node_type.json28
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/link_mark.json44
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/link_mark.md6
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/media_group.json59
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/media_group.md10
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/media_single.json42
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/media_single.md4
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/mention.json44
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/mention.md4
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/ordered_list.json170
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/ordered_list.md25
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/panel.json117
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/panel.md12
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/paragraph.json28
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/paragraph.md4
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/rule.json9
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/rule.md2
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/strike_sup_sub_mark.json56
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/strike_sup_sub_mark.md3
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/strong_em_mark.json53
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/strong_em_mark.md2
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/table.json55
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/table.md18
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/underline_text_color_mark.json40
-rw-r--r--spec/fixtures/lib/kramdown/atlassian_document_format/underline_text_color_mark.md2
-rw-r--r--spec/fixtures/pager_duty/webhook_incident_trigger.json239
-rw-r--r--spec/fixtures/product_analytics/event.json16
-rw-r--r--spec/fixtures/sentry/issue_sample_response.json25
106 files changed, 3949 insertions, 465 deletions
diff --git a/spec/fixtures/api/graphql/introspection.graphql b/spec/fixtures/api/graphql/introspection.graphql
index 7b712068fcd..6b6de2efbaf 100644
--- a/spec/fixtures/api/graphql/introspection.graphql
+++ b/spec/fixtures/api/graphql/introspection.graphql
@@ -1,9 +1,15 @@
# pulled from GraphiQL query
query IntrospectionQuery {
__schema {
- queryType { name }
- mutationType { name }
- subscriptionType { name }
+ queryType {
+ name
+ }
+ mutationType {
+ name
+ }
+ subscriptionType {
+ name
+ }
types {
...FullType
}
@@ -54,7 +60,9 @@ fragment FullType on __Type {
fragment InputValue on __InputValue {
name
description
- type { ...TypeRef }
+ type {
+ ...TypeRef
+ }
defaultValue
}
diff --git a/spec/fixtures/api/schemas/entities/dag_job.json b/spec/fixtures/api/schemas/entities/dag_job.json
new file mode 100644
index 00000000000..171ac23ca06
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/dag_job.json
@@ -0,0 +1,10 @@
+{
+ "type": "object",
+ "required": ["name", "scheduling_type"],
+ "properties": {
+ "name": { "type": "string" },
+ "scheduling_type": { "type": ["string", null] },
+ "needs": { "type": "array" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/entities/dag_job_group.json b/spec/fixtures/api/schemas/entities/dag_job_group.json
new file mode 100644
index 00000000000..69a4e69fc63
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/dag_job_group.json
@@ -0,0 +1,13 @@
+{
+ "type": "object",
+ "required": ["name", "size", "jobs"],
+ "properties": {
+ "name": { "type": "string" },
+ "size": { "type": "integer" },
+ "jobs": {
+ "type": "array",
+ "items": { "$ref": "dag_job.json" }
+ }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/entities/dag_pipeline.json b/spec/fixtures/api/schemas/entities/dag_pipeline.json
new file mode 100644
index 00000000000..a661577d040
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/dag_pipeline.json
@@ -0,0 +1,11 @@
+{
+ "type": "object",
+ "required": ["stages"],
+ "properties": {
+ "stages": {
+ "type": "array",
+ "items": { "$ref": "dag_stage.json" }
+ }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/entities/dag_stage.json b/spec/fixtures/api/schemas/entities/dag_stage.json
new file mode 100644
index 00000000000..6a7b1424ec5
--- /dev/null
+++ b/spec/fixtures/api/schemas/entities/dag_stage.json
@@ -0,0 +1,11 @@
+{
+ "type": "object",
+ "required": ["name", "groups"],
+ "properties": {
+ "name": { "type": "string" },
+ "groups": {
+ "type": "array",
+ "items": { "$ref": "dag_job_group.json" }
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/evidences/build_artifact.json b/spec/fixtures/api/schemas/evidences/build_artifact.json
new file mode 100644
index 00000000000..850fb8c45a8
--- /dev/null
+++ b/spec/fixtures/api/schemas/evidences/build_artifact.json
@@ -0,0 +1,10 @@
+{
+ "type": "object",
+ "required": [
+ "url"
+ ],
+ "properties": {
+ "url": { "type": "string" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/evidences/release.json b/spec/fixtures/api/schemas/evidences/release.json
index 37eb9a9b5c0..529abfe490e 100644
--- a/spec/fixtures/api/schemas/evidences/release.json
+++ b/spec/fixtures/api/schemas/evidences/release.json
@@ -19,6 +19,10 @@
"milestones": {
"type": "array",
"items": { "$ref": "milestone.json" }
+ },
+ "report_artifacts": {
+ "type": "array",
+ "items": { "$ref": "build_artifact.json" }
}
},
"additionalProperties": false
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/composer/index.json b/spec/fixtures/api/schemas/public_api/v4/packages/composer/index.json
new file mode 100644
index 00000000000..2245b39cabe
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/composer/index.json
@@ -0,0 +1,29 @@
+{
+ "type": "object",
+ "required": ["packages", "provider-includes", "providers-url"],
+ "properties": {
+ "packages": {
+ "type": "array",
+ "items": { "type": "integer" }
+ },
+ "providers-url": {
+ "type": "string"
+ },
+ "provider-includes": {
+ "type": "object",
+ "required": ["p/%hash%.json"],
+ "properties": {
+ "p/%hash%.json": {
+ "type": "object",
+ "required": ["sha256"],
+ "properties": {
+ "sha256": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/composer/package.json b/spec/fixtures/api/schemas/public_api/v4/packages/composer/package.json
new file mode 100644
index 00000000000..324a8a4e00c
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/composer/package.json
@@ -0,0 +1,65 @@
+{
+ "type": "object",
+ "required": [
+ "packages"
+ ],
+ "properties": {
+ "packages": {
+ "type": "object",
+ "propertyNames": {
+ "pattern": "^[A-Za-z_]+"
+ },
+ "patternProperties": {
+ "^[A-Za-z_]+": {
+ "type": "object",
+ "propertyNames": {
+ "pattern": "^[A-Za-z_0-9.]+"
+ },
+ "patternProperties": {
+ "^[A-Za-z_0-9.]+": {
+ "type": "object",
+ "required": [
+ "dist",
+ "uid",
+ "version"
+ ],
+ "properties": {
+ "uid": {
+ "type": "integer"
+ },
+ "version": {
+ "type": "string"
+ },
+ "dist": {
+ "type": "object",
+ "required": [
+ "type",
+ "url",
+ "reference",
+ "shasum"
+ ],
+ "properties": {
+ "type": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ },
+ "reference": {
+ "type": "string"
+ },
+ "shasum": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/composer/provider.json b/spec/fixtures/api/schemas/public_api/v4/packages/composer/provider.json
new file mode 100644
index 00000000000..5335fa9ad64
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/composer/provider.json
@@ -0,0 +1,25 @@
+{
+ "type": "object",
+ "required": ["providers"],
+ "properties": {
+ "providers": {
+ "type": "object",
+ "propertyNames": {
+ "pattern": "^[A-Za-z_]+"
+ },
+ "patternProperties": {
+ "^[A-Za-z_]+": {
+ "type": "object",
+ "required": ["sha256"],
+ "properties": {
+ "sha256": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/group_package.json b/spec/fixtures/api/schemas/public_api/v4/packages/group_package.json
new file mode 100644
index 00000000000..f18e314a287
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/group_package.json
@@ -0,0 +1,33 @@
+{
+ "type": "object",
+ "required": ["name", "version", "package_type", "_links", "project_id", "project_path"],
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ },
+ "package_type": {
+ "type": "string"
+ },
+ "_links": {
+ "type": "object",
+ "required": ["web_path"],
+ "properties": {
+ "details": {
+ "type": "string"
+ }
+ }
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "project_id": {
+ "type": "integer"
+ },
+ "project_path": {
+ "type": "string"
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/group_packages.json b/spec/fixtures/api/schemas/public_api/v4/packages/group_packages.json
new file mode 100644
index 00000000000..3169bbc8f25
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/group_packages.json
@@ -0,0 +1,4 @@
+{
+ "type": "array",
+ "items": { "$ref": "./group_package.json" }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/npm_package.json b/spec/fixtures/api/schemas/public_api/v4/packages/npm_package.json
new file mode 100644
index 00000000000..d7e8a872abe
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/npm_package.json
@@ -0,0 +1,8 @@
+{
+ "type": "object",
+ "required" : ["name", "versions"],
+ "properties" : {
+ "name": { "type": "string" },
+ "versions": { "type": "object" }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/npm_package_tags.json b/spec/fixtures/api/schemas/public_api/v4/packages/npm_package_tags.json
new file mode 100644
index 00000000000..db64fe1de23
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/npm_package_tags.json
@@ -0,0 +1,7 @@
+{
+ "type": "object",
+ "properties" : {
+ "$tag": { "type": "string" },
+ "$version": { "type": "string" }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/npm_package_version.json b/spec/fixtures/api/schemas/public_api/v4/packages/npm_package_version.json
new file mode 100644
index 00000000000..3e74dc0a1c2
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/npm_package_version.json
@@ -0,0 +1,46 @@
+{
+ "type": "object",
+ "required": ["name", "version", "dist"],
+ "properties" : {
+ "name": { "type": "string" },
+ "version": { "type": "string" },
+ "dist": {
+ "type": "object",
+ "required": ["shasum", "tarball"],
+ "properties" : {
+ "shasum": { "type": "string" },
+ "tarball": { "type": "string" }
+ }
+ },
+ "dependencies": {
+ "type": "object",
+ "patternProperties": {
+ ".{1,}": { "type": "string" }
+ }
+ },
+ "devDependencies": {
+ "type": "object",
+ "patternProperties": {
+ ".{1,}": { "type": "string" }
+ }
+ },
+ "bundleDependencies": {
+ "type": "object",
+ "patternProperties": {
+ ".{1,}": { "type": "string" }
+ }
+ },
+ "peerDependencies": {
+ "type": "object",
+ "patternProperties": {
+ ".{1,}": { "type": "string" }
+ }
+ },
+ "deprecated": {
+ "type": "object",
+ "patternProperties": {
+ ".{1,}": { "type": "string" }
+ }
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/nuget/dependency_group.json b/spec/fixtures/api/schemas/public_api/v4/packages/nuget/dependency_group.json
new file mode 100644
index 00000000000..87dc2794b61
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/nuget/dependency_group.json
@@ -0,0 +1,22 @@
+{
+ "type": "object",
+ "required": ["@id", "@type", "dependencies"],
+ "properties": {
+ "@id": { "type": "string" },
+ "@type": { "const": "PackageDependencyGroup" },
+ "targetFramework": { "type": "string" },
+ "dependencies": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": ["@id", "@type", "id", "range"],
+ "properties": {
+ "@id": { "type": "string" },
+ "@type": { "const": "PackageDependency" },
+ "id": { "type": "string" },
+ "range": { "type": "string" }
+ }
+ }
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/nuget/download_versions.json b/spec/fixtures/api/schemas/public_api/v4/packages/nuget/download_versions.json
new file mode 100644
index 00000000000..ab40dfbbc4c
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/nuget/download_versions.json
@@ -0,0 +1,10 @@
+{
+ "type": "object",
+ "required": ["versions"],
+ "properties": {
+ "versions": {
+ "type": "array",
+ "items": { "type": "string" }
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/nuget/package_metadata.json b/spec/fixtures/api/schemas/public_api/v4/packages/nuget/package_metadata.json
new file mode 100644
index 00000000000..1244cbe474e
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/nuget/package_metadata.json
@@ -0,0 +1,28 @@
+{
+ "type": "object",
+ "required": ["@id", "packageContent", "catalogEntry"],
+ "properties": {
+ "@id": { "type": "string" },
+ "packageContent": { "type": "string" },
+ "catalogEntry": {
+ "type": "object",
+ "required": ["@id", "authors", "dependencyGroups", "id", "packageContent", "summary", "version"],
+ "properties": {
+ "@id": { "type": "string" },
+ "authors": { "const": "" },
+ "id": { "type": "string" },
+ "packageContent": { "type": "string" },
+ "summary": { "const": "" },
+ "tags": { "type": "string" },
+ "projectUrl": { "type": "string" },
+ "licenseUrl": { "type": "string" },
+ "iconUrl": { "type": "string" },
+ "version": { "type": "string" },
+ "dependencyGroups": {
+ "type": "array",
+ "items": { "$ref": "./dependency_group.json" }
+ }
+ }
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/nuget/packages_metadata.json b/spec/fixtures/api/schemas/public_api/v4/packages/nuget/packages_metadata.json
new file mode 100644
index 00000000000..724df5a437d
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/nuget/packages_metadata.json
@@ -0,0 +1,54 @@
+{
+ "type": "object",
+ "required": ["count", "items"],
+ "properties": {
+ "count": { "const": 0 },
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": ["lower", "upper", "count", "items"],
+ "properties": {
+ "lower": { "type": "string" },
+ "upper": { "type": "string" },
+ "count": { "type": "integer" },
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": ["@id", "packageContent", "catalogEntry"],
+ "properties": {
+ "@id": { "type": "string" },
+ "packageContent": { "type": "string" },
+ "catalogEntry": {
+ "type": "object",
+ "required": ["@id", "authors", "dependencyGroups", "id", "packageContent", "summary", "version"],
+ "properties": {
+ "@id": { "type": "string" },
+ "authors": { "const": "" },
+ "id": { "type": "string" },
+ "packageContent": { "type": "string" },
+ "summary": { "const": "" },
+ "tags": { "type": "string" },
+ "projectUrl": { "type": "string" },
+ "licenseUrl": { "type": "string" },
+ "iconUrl": { "type": "string" },
+ "version": { "type": "string" },
+ "dependencyGroups": {
+ "type": "array",
+ "items": { "$ref": "./dependency_group.json" }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+
+
+
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/nuget/search.json b/spec/fixtures/api/schemas/public_api/v4/packages/nuget/search.json
new file mode 100644
index 00000000000..73d0927e24c
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/nuget/search.json
@@ -0,0 +1,39 @@
+{
+ "type": "object",
+ "required": ["totalHits", "data"],
+ "properties": {
+ "totalHits": { "type": "integer" },
+ "data": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": ["@type", "authors", "id", "summary", "title", "totalDownloads", "verified", "versions"],
+ "properties": {
+ "@type": { "const": "Package" },
+ "authors": { "const": "" },
+ "id": { "type": "string" },
+ "summary": { "const": "" },
+ "title": { "type": "string" },
+ "totalDownloads": { "const": 0 },
+ "verified": { "const": true },
+ "tags": { "type": "string" },
+ "projectUrl": { "type": "string" },
+ "licenseUrl": { "type": "string" },
+ "iconUrl": { "type": "string" },
+ "versions": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": ["@id", "version", "downloads"],
+ "properties": {
+ "@id": { "type": "string" },
+ "version": { "type": "string" },
+ "downloads": { "const": 0 }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/nuget/service_index.json b/spec/fixtures/api/schemas/public_api/v4/packages/nuget/service_index.json
new file mode 100644
index 00000000000..405018f8c37
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/nuget/service_index.json
@@ -0,0 +1,19 @@
+{
+ "type": "object",
+ "required": ["version", "resources"],
+ "properties": {
+ "version": { "const": "3.0.0" },
+ "resources": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required": ["@id", "@type", "comment"],
+ "properties": {
+ "@id": { "type": "string" },
+ "@type": { "type": "string" },
+ "comment": { "type": "string" }
+ }
+ }
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/package.json b/spec/fixtures/api/schemas/public_api/v4/packages/package.json
new file mode 100644
index 00000000000..757e5fd26b6
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/package.json
@@ -0,0 +1,41 @@
+{
+ "type": "object",
+ "required": [
+ "name",
+ "version",
+ "package_type",
+ "_links",
+ "versions"
+ ],
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ },
+ "package_type": {
+ "type": "string"
+ },
+ "_links": {
+ "type": "object",
+ "required": [
+ "web_path"
+ ],
+ "properties": {
+ "details": {
+ "type": "string"
+ }
+ }
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "versions": {
+ "type": "array",
+ "items": {
+ "$ref": "package_version.json"
+ }
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/package_files.json b/spec/fixtures/api/schemas/public_api/v4/packages/package_files.json
new file mode 100644
index 00000000000..f057adba65c
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/package_files.json
@@ -0,0 +1,13 @@
+{
+ "type": "array",
+ "items": {
+ "type": "object",
+ "required" : ["id", "package_id", "file_name"],
+ "properties" : {
+ "id": { "type": "integer" },
+ "package_id": { "type": "integer" },
+ "file_name": { "type": "string" },
+ "file_sha1": { "type": "string" }
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/package_version.json b/spec/fixtures/api/schemas/public_api/v4/packages/package_version.json
new file mode 100644
index 00000000000..72f2a2121ad
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/package_version.json
@@ -0,0 +1,19 @@
+{
+ "type": "object",
+ "required": [
+ "version",
+ "created_at",
+ "pipeline"
+ ],
+ "properties": {
+ "version": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "pipeline": {
+ "$ref": "../pipeline.json"
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/package_with_build.json b/spec/fixtures/api/schemas/public_api/v4/packages/package_with_build.json
new file mode 100644
index 00000000000..de3ef94138e
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/package_with_build.json
@@ -0,0 +1,10 @@
+{
+ "type": "object",
+ "required": ["name", "version", "package_type", "pipeline"],
+ "properties": {
+ "name": { "type": "string" },
+ "version": { "type": "string" },
+ "package_type": { "type": "string" },
+ "pipeline": { "$ref": "../pipeline.json" }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/packages/packages.json b/spec/fixtures/api/schemas/public_api/v4/packages/packages.json
new file mode 100644
index 00000000000..66364da4fdb
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/packages/packages.json
@@ -0,0 +1,4 @@
+{
+ "type": "array",
+ "items": { "$ref": "./package.json" }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/pipeline.json b/spec/fixtures/api/schemas/public_api/v4/pipeline.json
new file mode 100644
index 00000000000..f83844a115d
--- /dev/null
+++ b/spec/fixtures/api/schemas/public_api/v4/pipeline.json
@@ -0,0 +1,27 @@
+{
+ "type": "object",
+ "required": ["id", "sha", "ref", "status", "created_at", "updated_at", "web_url"],
+ "properties": {
+ "id": {
+ "type": "integer"
+ },
+ "sha": {
+ "type": "string"
+ },
+ "ref": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ },
+ "created_at": {
+ "type": "string"
+ },
+ "updated_at": {
+ "type": "string"
+ },
+ "web_url": {
+ "type": "string"
+ }
+ }
+}
diff --git a/spec/fixtures/api/schemas/public_api/v4/snippets.json b/spec/fixtures/api/schemas/public_api/v4/snippets.json
index 7baa24a6f1f..de658e01657 100644
--- a/spec/fixtures/api/schemas/public_api/v4/snippets.json
+++ b/spec/fixtures/api/schemas/public_api/v4/snippets.json
@@ -7,6 +7,16 @@
"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" }
+ }
+ }
+ },
"description": { "type": ["string", "null"] },
"visibility": { "type": "string" },
"web_url": { "type": "string" },
diff --git a/spec/fixtures/clusters/ca_certificate.pem b/spec/fixtures/clusters/ca_certificate.pem
new file mode 100644
index 00000000000..9e6810ab70c
--- /dev/null
+++ b/spec/fixtures/clusters/ca_certificate.pem
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
+RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
+PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
+xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
+Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
+hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
+EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
+FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
+nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
+eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
+hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
+Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
++OkuE6N36B9K
+-----END CERTIFICATE-----
diff --git a/spec/fixtures/clusters/chain_certificates.pem b/spec/fixtures/clusters/chain_certificates.pem
new file mode 100644
index 00000000000..b8e64d58ee7
--- /dev/null
+++ b/spec/fixtures/clusters/chain_certificates.pem
@@ -0,0 +1,100 @@
+-----BEGIN CERTIFICATE-----
+MIIItjCCB56gAwIBAgIQCu5Ga1hR41iahM0SWhyeNjANBgkqhkiG9w0BAQsFADB1
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMTQwMgYDVQQDEytEaWdpQ2VydCBTSEEyIEV4dGVuZGVk
+IFZhbGlkYXRpb24gU2VydmVyIENBMB4XDTE5MTIwNDAwMDAwMFoXDTIxMTIwODEy
+MDAwMFowgb0xHTAbBgNVBA8MFFByaXZhdGUgT3JnYW5pemF0aW9uMRMwEQYLKwYB
+BAGCNzwCAQMTAlVTMRUwEwYLKwYBBAGCNzwCAQITBFV0YWgxFTATBgNVBAUTDDUy
+OTk1MzctMDE0MjELMAkGA1UEBhMCVVMxDTALBgNVBAgTBFV0YWgxDTALBgNVBAcT
+BExlaGkxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMRUwEwYDVQQDEwxkaWdpY2Vy
+dC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAeRYb/RLbljGZ
+IB//DrEdyKYMQqqaJwBlrr3t2paAWNuDJizvVkTMIzdJesI1pA58Myenxp5Dp8GJ
+u/VhBf//v/HAZHUE4xwu104Fg6A1BwUEKgVKERf+7kTt17Lf9fcMIjMyL+FeyPXb
+DOFbH+ej/nYaneFLch2j2xWZg1+Thk0qBlGE8WWAK+fvbEuM0SOeH9RkYFCNGPRS
+KsLn0GvaCnnD4LfNDyMqYop0IpaqXoREEnkRv1MVSOw+hBj497wnnO+/GZegfzwU
+iS60h+PjlDfmdCP18qOS7tRd0qnfU3N3S+PYEd3R63LMcIfbgXNEEWBNKpiH9+8f
+eXq6bXKPAgMBAAGjggT3MIIE8zAfBgNVHSMEGDAWgBQ901Cl1qCt7vNKYApl0yHU
++PjWDzAdBgNVHQ4EFgQUTx0XO7HqD5DOhwlm2p+70uYPBmgwggGjBgNVHREEggGa
+MIIBloIMZGlnaWNlcnQuY29tggl0aGF3dGUuZGWCC2ZyZWVzc2wuY29tggxyYXBp
+ZHNzbC5jb22CDGdlb3RydXN0LmNvbYIJdGhhd3RlLmZyggp0aGF3dGUuY29tghB3
+d3cucmFwaWRzc2wuY29tghB3d3cuZ2VvdHJ1c3QuY29tgg13d3cudGhhd3RlLmZy
+gg13d3cudGhhd3RlLmRlgg53d3cudGhhd3RlLmNvbYIQd3d3LmRpZ2ljZXJ0LmNv
+bYIYa2ItaW50ZXJuYWwuZGlnaWNlcnQuY29tghprbm93bGVkZ2ViYXNlLmRpZ2lj
+ZXJ0LmNvbYIWa25vd2xlZGdlLmRpZ2ljZXJ0LmNvbYIPa2guZGlnaWNlcnQuY29t
+ghlrbm93bGVkZ2VodWIuZGlnaWNlcnQuY29tghh3ZWJzZWN1cml0eS5kaWdpY2Vy
+dC5jb22CFGNvbnRlbnQuZGlnaWNlcnQuY29tgg93d3cuZnJlZXNzbC5jb22CHHd3
+dy53ZWJzZWN1cml0eS5kaWdpY2VydC5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1Ud
+JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjB1BgNVHR8EbjBsMDSgMqAwhi5odHRw
+Oi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1ldi1zZXJ2ZXItZzIuY3JsMDSgMqAw
+hi5odHRwOi8vY3JsNC5kaWdpY2VydC5jb20vc2hhMi1ldi1zZXJ2ZXItZzIuY3Js
+MEsGA1UdIAREMEIwNwYJYIZIAYb9bAIBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8v
+d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwBwYFZ4EMAQEwgYgGCCsGAQUFBwEBBHwwejAk
+BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFIGCCsGAQUFBzAC
+hkZodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRTSEEyRXh0ZW5k
+ZWRWYWxpZGF0aW9uU2VydmVyQ0EuY3J0MAwGA1UdEwEB/wQCMAAwggF8BgorBgEE
+AdZ5AgQCBIIBbASCAWgBZgB1AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3zQ7I
+DdwQAAABbtLkOs4AAAQDAEYwRAIgQ7gh393PInhYfPOhg/lF9yZNRdvjBeufFoG8
+VnBuPNMCIBP8YGC83ig5ttw3ipSRjH0bKj4Ak5O4rynoql9Dy8x3AHYAVhQGmi/X
+wuzT9eG9RLI+x0Z2ubyZEVzA75SYVdaJ0N0AAAFu0uQ7VgAABAMARzBFAiEAhzE7
+1c48wn3s/30IB4WgxfpLburH0Ku8cchv8QeqcgACIBrWpUlDD18AOfkPCOcB2kWU
+vRXsdptVm3jPeU5TtDSoAHUAu9nfvB+KcbWTlCOXqpJ7RzhXlQqrUugakJZkNo4e
+0YUAAAFu0uQ60gAABAMARjBEAiBBpH5m7ntGKFTOFgSLcFXRDg66xJqerMy0gOHj
+4TIBYAIgfFABPNy6P61hjiOWwjq73lvoEdAyh18GeFHIp0BgsWEwDQYJKoZIhvcN
+AQELBQADggEBAInaSEqteyQA1zUKiXVqgffhHKZsUq9UnMows6X+UoFPoby9xqm6
+IaY/77zaFZYwXJlP/SvrlbgTLHAdir3y38uhAlfPX4iRuwggOpFFF5hqDckzCm91
+ocGnoG6sUY5mOqKu2vIcZkUQDe+K5gOxI6ME/4YwzWCIcTmBPQ6NQmqiFLPoQty1
+gdbGCcLQNFCuNq4n5OK2NmBjcbtyT4gglat7C4+KV8RkEubZ+MkXzyDkpEXjjzsK
+7iuNB0hRgyyhGzHrlZ/l0OLoT0Cb4I5PzzRSseFEyPKCC1WSF7aE9rFfUqhpqSAT
+7NV7SEijYyFFtuZfz9RGglcqnRlAfgTy+tU=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEtjCCA56gAwIBAgIQDHmpRLCMEZUgkmFf4msdgzANBgkqhkiG9w0BAQsFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowdTEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTE0MDIGA1UEAxMrRGlnaUNlcnQgU0hBMiBFeHRlbmRlZCBW
+YWxpZGF0aW9uIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBANdTpARR+JmmFkhLZyeqk0nQOe0MsLAAh/FnKIaFjI5j2ryxQDji0/XspQUY
+uD0+xZkXMuwYjPrxDKZkIYXLBxA0sFKIKx9om9KxjxKws9LniB8f7zh3VFNfgHk/
+LhqqqB5LKw2rt2O5Nbd9FLxZS99RStKh4gzikIKHaq7q12TWmFXo/a8aUGxUvBHy
+/Urynbt/DvTVvo4WiRJV2MBxNO723C3sxIclho3YIeSwTQyJ3DkmF93215SF2AQh
+cJ1vb/9cuhnhRctWVyh+HA1BV6q3uCe7seT6Ku8hI3UarS2bhjWMnHe1c63YlC3k
+8wyd7sFOYn4XwHGeLN7x+RAoGTMCAwEAAaOCAUkwggFFMBIGA1UdEwEB/wQIMAYB
+Af8CAQAwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
+BQcDAjA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
+Z2ljZXJ0LmNvbTBLBgNVHR8ERDBCMECgPqA8hjpodHRwOi8vY3JsNC5kaWdpY2Vy
+dC5jb20vRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3JsMD0GA1UdIAQ2
+MDQwMgYEVR0gADAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5j
+b20vQ1BTMB0GA1UdDgQWBBQ901Cl1qCt7vNKYApl0yHU+PjWDzAfBgNVHSMEGDAW
+gBSxPsNpA/i/RwHUmCYaCALvY2QrwzANBgkqhkiG9w0BAQsFAAOCAQEAnbbQkIbh
+hgLtxaDwNBx0wY12zIYKqPBKikLWP8ipTa18CK3mtlC4ohpNiAexKSHc59rGPCHg
+4xFJcKx6HQGkyhE6V6t9VypAdP3THYUYUN9XR3WhfVUgLkc3UHKMf4Ib0mKPLQNa
+2sPIoc4sUqIAY+tzunHISScjl2SFnjgOrWNoPLpSgVh5oywM395t6zHyuqB8bPEs
+1OG9d4Q3A84ytciagRpKkk47RpqF/oOi+Z6Mo8wNXrM9zwR4jxQUezKcxwCmXMS1
+oVWNWlZopCJwqjyBcdmdqEU79OX2olHdx3ti6G8MdOu42vi/hw15UJGQmxg7kVkn
+8TUoE6smftX3eg==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
+RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
+PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
+xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
+Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
+hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
+EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
+FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
+nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
+eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
+hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
+Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
++OkuE6N36B9K
+-----END CERTIFICATE-----
diff --git a/spec/fixtures/clusters/intermediate_certificate.pem b/spec/fixtures/clusters/intermediate_certificate.pem
new file mode 100644
index 00000000000..8a81175b746
--- /dev/null
+++ b/spec/fixtures/clusters/intermediate_certificate.pem
@@ -0,0 +1,28 @@
+-----BEGIN CERTIFICATE-----
+MIIEtjCCA56gAwIBAgIQDHmpRLCMEZUgkmFf4msdgzANBgkqhkiG9w0BAQsFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowdTEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTE0MDIGA1UEAxMrRGlnaUNlcnQgU0hBMiBFeHRlbmRlZCBW
+YWxpZGF0aW9uIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBANdTpARR+JmmFkhLZyeqk0nQOe0MsLAAh/FnKIaFjI5j2ryxQDji0/XspQUY
+uD0+xZkXMuwYjPrxDKZkIYXLBxA0sFKIKx9om9KxjxKws9LniB8f7zh3VFNfgHk/
+LhqqqB5LKw2rt2O5Nbd9FLxZS99RStKh4gzikIKHaq7q12TWmFXo/a8aUGxUvBHy
+/Urynbt/DvTVvo4WiRJV2MBxNO723C3sxIclho3YIeSwTQyJ3DkmF93215SF2AQh
+cJ1vb/9cuhnhRctWVyh+HA1BV6q3uCe7seT6Ku8hI3UarS2bhjWMnHe1c63YlC3k
+8wyd7sFOYn4XwHGeLN7x+RAoGTMCAwEAAaOCAUkwggFFMBIGA1UdEwEB/wQIMAYB
+Af8CAQAwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
+BQcDAjA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
+Z2ljZXJ0LmNvbTBLBgNVHR8ERDBCMECgPqA8hjpodHRwOi8vY3JsNC5kaWdpY2Vy
+dC5jb20vRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3JsMD0GA1UdIAQ2
+MDQwMgYEVR0gADAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5j
+b20vQ1BTMB0GA1UdDgQWBBQ901Cl1qCt7vNKYApl0yHU+PjWDzAfBgNVHSMEGDAW
+gBSxPsNpA/i/RwHUmCYaCALvY2QrwzANBgkqhkiG9w0BAQsFAAOCAQEAnbbQkIbh
+hgLtxaDwNBx0wY12zIYKqPBKikLWP8ipTa18CK3mtlC4ohpNiAexKSHc59rGPCHg
+4xFJcKx6HQGkyhE6V6t9VypAdP3THYUYUN9XR3WhfVUgLkc3UHKMf4Ib0mKPLQNa
+2sPIoc4sUqIAY+tzunHISScjl2SFnjgOrWNoPLpSgVh5oywM395t6zHyuqB8bPEs
+1OG9d4Q3A84ytciagRpKkk47RpqF/oOi+Z6Mo8wNXrM9zwR4jxQUezKcxwCmXMS1
+oVWNWlZopCJwqjyBcdmdqEU79OX2olHdx3ti6G8MdOu42vi/hw15UJGQmxg7kVkn
+8TUoE6smftX3eg==
+-----END CERTIFICATE-----
diff --git a/spec/fixtures/clusters/root_certificate.pem b/spec/fixtures/clusters/root_certificate.pem
new file mode 100644
index 00000000000..40107bd837d
--- /dev/null
+++ b/spec/fixtures/clusters/root_certificate.pem
@@ -0,0 +1,49 @@
+-----BEGIN CERTIFICATE-----
+MIIItjCCB56gAwIBAgIQCu5Ga1hR41iahM0SWhyeNjANBgkqhkiG9w0BAQsFADB1
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMTQwMgYDVQQDEytEaWdpQ2VydCBTSEEyIEV4dGVuZGVk
+IFZhbGlkYXRpb24gU2VydmVyIENBMB4XDTE5MTIwNDAwMDAwMFoXDTIxMTIwODEy
+MDAwMFowgb0xHTAbBgNVBA8MFFByaXZhdGUgT3JnYW5pemF0aW9uMRMwEQYLKwYB
+BAGCNzwCAQMTAlVTMRUwEwYLKwYBBAGCNzwCAQITBFV0YWgxFTATBgNVBAUTDDUy
+OTk1MzctMDE0MjELMAkGA1UEBhMCVVMxDTALBgNVBAgTBFV0YWgxDTALBgNVBAcT
+BExlaGkxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMRUwEwYDVQQDEwxkaWdpY2Vy
+dC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAeRYb/RLbljGZ
+IB//DrEdyKYMQqqaJwBlrr3t2paAWNuDJizvVkTMIzdJesI1pA58Myenxp5Dp8GJ
+u/VhBf//v/HAZHUE4xwu104Fg6A1BwUEKgVKERf+7kTt17Lf9fcMIjMyL+FeyPXb
+DOFbH+ej/nYaneFLch2j2xWZg1+Thk0qBlGE8WWAK+fvbEuM0SOeH9RkYFCNGPRS
+KsLn0GvaCnnD4LfNDyMqYop0IpaqXoREEnkRv1MVSOw+hBj497wnnO+/GZegfzwU
+iS60h+PjlDfmdCP18qOS7tRd0qnfU3N3S+PYEd3R63LMcIfbgXNEEWBNKpiH9+8f
+eXq6bXKPAgMBAAGjggT3MIIE8zAfBgNVHSMEGDAWgBQ901Cl1qCt7vNKYApl0yHU
++PjWDzAdBgNVHQ4EFgQUTx0XO7HqD5DOhwlm2p+70uYPBmgwggGjBgNVHREEggGa
+MIIBloIMZGlnaWNlcnQuY29tggl0aGF3dGUuZGWCC2ZyZWVzc2wuY29tggxyYXBp
+ZHNzbC5jb22CDGdlb3RydXN0LmNvbYIJdGhhd3RlLmZyggp0aGF3dGUuY29tghB3
+d3cucmFwaWRzc2wuY29tghB3d3cuZ2VvdHJ1c3QuY29tgg13d3cudGhhd3RlLmZy
+gg13d3cudGhhd3RlLmRlgg53d3cudGhhd3RlLmNvbYIQd3d3LmRpZ2ljZXJ0LmNv
+bYIYa2ItaW50ZXJuYWwuZGlnaWNlcnQuY29tghprbm93bGVkZ2ViYXNlLmRpZ2lj
+ZXJ0LmNvbYIWa25vd2xlZGdlLmRpZ2ljZXJ0LmNvbYIPa2guZGlnaWNlcnQuY29t
+ghlrbm93bGVkZ2VodWIuZGlnaWNlcnQuY29tghh3ZWJzZWN1cml0eS5kaWdpY2Vy
+dC5jb22CFGNvbnRlbnQuZGlnaWNlcnQuY29tgg93d3cuZnJlZXNzbC5jb22CHHd3
+dy53ZWJzZWN1cml0eS5kaWdpY2VydC5jb20wDgYDVR0PAQH/BAQDAgWgMB0GA1Ud
+JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjB1BgNVHR8EbjBsMDSgMqAwhi5odHRw
+Oi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1ldi1zZXJ2ZXItZzIuY3JsMDSgMqAw
+hi5odHRwOi8vY3JsNC5kaWdpY2VydC5jb20vc2hhMi1ldi1zZXJ2ZXItZzIuY3Js
+MEsGA1UdIAREMEIwNwYJYIZIAYb9bAIBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8v
+d3d3LmRpZ2ljZXJ0LmNvbS9DUFMwBwYFZ4EMAQEwgYgGCCsGAQUFBwEBBHwwejAk
+BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFIGCCsGAQUFBzAC
+hkZodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRTSEEyRXh0ZW5k
+ZWRWYWxpZGF0aW9uU2VydmVyQ0EuY3J0MAwGA1UdEwEB/wQCMAAwggF8BgorBgEE
+AdZ5AgQCBIIBbASCAWgBZgB1AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3zQ7I
+DdwQAAABbtLkOs4AAAQDAEYwRAIgQ7gh393PInhYfPOhg/lF9yZNRdvjBeufFoG8
+VnBuPNMCIBP8YGC83ig5ttw3ipSRjH0bKj4Ak5O4rynoql9Dy8x3AHYAVhQGmi/X
+wuzT9eG9RLI+x0Z2ubyZEVzA75SYVdaJ0N0AAAFu0uQ7VgAABAMARzBFAiEAhzE7
+1c48wn3s/30IB4WgxfpLburH0Ku8cchv8QeqcgACIBrWpUlDD18AOfkPCOcB2kWU
+vRXsdptVm3jPeU5TtDSoAHUAu9nfvB+KcbWTlCOXqpJ7RzhXlQqrUugakJZkNo4e
+0YUAAAFu0uQ60gAABAMARjBEAiBBpH5m7ntGKFTOFgSLcFXRDg66xJqerMy0gOHj
+4TIBYAIgfFABPNy6P61hjiOWwjq73lvoEdAyh18GeFHIp0BgsWEwDQYJKoZIhvcN
+AQELBQADggEBAInaSEqteyQA1zUKiXVqgffhHKZsUq9UnMows6X+UoFPoby9xqm6
+IaY/77zaFZYwXJlP/SvrlbgTLHAdir3y38uhAlfPX4iRuwggOpFFF5hqDckzCm91
+ocGnoG6sUY5mOqKu2vIcZkUQDe+K5gOxI6ME/4YwzWCIcTmBPQ6NQmqiFLPoQty1
+gdbGCcLQNFCuNq4n5OK2NmBjcbtyT4gglat7C4+KV8RkEubZ+MkXzyDkpEXjjzsK
+7iuNB0hRgyyhGzHrlZ/l0OLoT0Cb4I5PzzRSseFEyPKCC1WSF7aE9rFfUqhpqSAT
+7NV7SEijYyFFtuZfz9RGglcqnRlAfgTy+tU=
+-----END CERTIFICATE-----
diff --git a/spec/fixtures/emails/service_desk.eml b/spec/fixtures/emails/service_desk.eml
new file mode 100644
index 00000000000..0db1270bc64
--- /dev/null
+++ b/spec/fixtures/emails/service_desk.eml
@@ -0,0 +1,28 @@
+Return-Path: <jake@adventuretime.ooo>
+Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
+Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
+Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+email-test-project_id-issue-@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
+Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
+Date: Thu, 13 Jun 2013 17:03:48 -0400
+From: Jake the Dog <jake@adventuretime.ooo>
+To: incoming+email-test-project_id-issue-@appmail.adventuretime.ooo
+Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
+Subject: The message subject! @all
+Mime-Version: 1.0
+Content-Type: text/plain;
+ charset=ISO-8859-1
+Content-Transfer-Encoding: 7bit
+X-Sieve: CMU Sieve 2.2
+X-Received: by 10.0.0.1 with SMTP id n7mr11234144ipb.85.1371157428600; Thu,
+ 13 Jun 2013 14:03:48 -0700 (PDT)
+X-Scanned-By: MIMEDefang 2.69 on IPv6:2001:470:1d:165::1
+
+Service desk stuff!
+
+```
+a = b
+```
+
+/label ~label1
+/assign @user1
+/close
diff --git a/spec/fixtures/emails/service_desk_custom_address.eml b/spec/fixtures/emails/service_desk_custom_address.eml
new file mode 100644
index 00000000000..3293dd48303
--- /dev/null
+++ b/spec/fixtures/emails/service_desk_custom_address.eml
@@ -0,0 +1,27 @@
+Return-Path: <jake@adventuretime.ooo>
+Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
+Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <support+project_slug-project_key@example.com>; Thu, 13 Jun 2013 14:03:48 -0700
+Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
+Date: Thu, 13 Jun 2013 17:03:48 -0400
+From: Jake the Dog <jake@adventuretime.ooo>
+To: support+project_slug-project_key@example.com
+Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
+Subject: The message subject! @all
+Mime-Version: 1.0
+Content-Type: text/plain;
+ charset=ISO-8859-1
+Content-Transfer-Encoding: 7bit
+X-Sieve: CMU Sieve 2.2
+X-Received: by 10.0.0.1 with SMTP id n7mr11234144ipb.85.1371157428600; Thu,
+ 13 Jun 2013 14:03:48 -0700 (PDT)
+X-Scanned-By: MIMEDefang 2.69 on IPv6:2001:470:1d:165::1
+
+Service desk stuff!
+
+```
+a = b
+```
+
+/label ~label1
+/assign @user1
+/close
diff --git a/spec/fixtures/emails/service_desk_forwarded.eml b/spec/fixtures/emails/service_desk_forwarded.eml
new file mode 100644
index 00000000000..56987972808
--- /dev/null
+++ b/spec/fixtures/emails/service_desk_forwarded.eml
@@ -0,0 +1,30 @@
+Delivered-To: incoming+email-test-project_id-issue-@appmail.adventuretime.ooo
+Return-Path: <jake@adventuretime.ooo>
+Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
+Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
+Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+email-test-project_id-issue-@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
+Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
+Date: Thu, 13 Jun 2013 17:03:48 -0400
+From: Jake the Dog <jake@adventuretime.ooo>
+To: support@adventuretime.ooo
+Delivered-To: support@adventuretime.ooo
+Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
+Subject: The message subject! @all
+Mime-Version: 1.0
+Content-Type: text/plain;
+ charset=ISO-8859-1
+Content-Transfer-Encoding: 7bit
+X-Sieve: CMU Sieve 2.2
+X-Received: by 10.0.0.1 with SMTP id n7mr11234144ipb.85.1371157428600; Thu,
+ 13 Jun 2013 14:03:48 -0700 (PDT)
+X-Scanned-By: MIMEDefang 2.69 on IPv6:2001:470:1d:165::1
+
+Service desk stuff!
+
+```
+a = b
+```
+
+/label ~label1
+/assign @user1
+/close
diff --git a/spec/fixtures/emails/service_desk_forwarded_new_issue.eml b/spec/fixtures/emails/service_desk_forwarded_new_issue.eml
new file mode 100644
index 00000000000..4eedb24b32d
--- /dev/null
+++ b/spec/fixtures/emails/service_desk_forwarded_new_issue.eml
@@ -0,0 +1,29 @@
+Delivered-To: incoming+email-test-project_id-issue-@appmail.adventuretime.ooo
+Return-Path: <jake@adventuretime.ooo>
+Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
+Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
+Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+email-test-project_id-issue-@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
+Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
+Date: Thu, 13 Jun 2013 17:03:48 -0400
+From: Jake the Dog <jake@adventuretime.ooo>
+To: support@adventuretime.ooo
+Delivered-To: support@adventuretime.ooo
+Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
+Subject: The message subject! @all
+Mime-Version: 1.0
+Content-Type: text/plain;
+ charset=ISO-8859-1
+Content-Transfer-Encoding: 7bit
+X-Sieve: CMU Sieve 2.2
+X-Received: by 10.0.0.1 with SMTP id n7mr11234144ipb.85.1371157428600; Thu,
+ 13 Jun 2013 14:03:48 -0700 (PDT)
+X-Scanned-By: MIMEDefang 2.69 on IPv6:2001:470:1d:165::1
+
+Service desk stuff!
+
+---------- Forwarded message ---------
+From: Jake the Dog <jake@adventuretime.ooo>
+To: <jake@adventuretime.ooo>
+
+
+forwarded content
diff --git a/spec/fixtures/emails/service_desk_legacy.eml b/spec/fixtures/emails/service_desk_legacy.eml
new file mode 100644
index 00000000000..fc9178c937b
--- /dev/null
+++ b/spec/fixtures/emails/service_desk_legacy.eml
@@ -0,0 +1,28 @@
+Return-Path: <jake@adventuretime.ooo>
+Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
+Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
+Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
+Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
+Date: Thu, 13 Jun 2013 17:03:48 -0400
+From: Jake the Dog <jake@adventuretime.ooo>
+To: incoming+email/test@appmail.adventuretime.ooo
+Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
+Subject: The message subject! @all
+Mime-Version: 1.0
+Content-Type: text/plain;
+ charset=ISO-8859-1
+Content-Transfer-Encoding: 7bit
+X-Sieve: CMU Sieve 2.2
+X-Received: by 10.0.0.1 with SMTP id n7mr11234144ipb.85.1371157428600; Thu,
+ 13 Jun 2013 14:03:48 -0700 (PDT)
+X-Scanned-By: MIMEDefang 2.69 on IPv6:2001:470:1d:165::1
+
+Service desk stuff!
+
+```
+a = b
+```
+
+/label ~label1
+/assign @user1
+/close
diff --git a/spec/fixtures/emails/service_desk_sender_and_from.eml b/spec/fixtures/emails/service_desk_sender_and_from.eml
new file mode 100644
index 00000000000..987c24d70bf
--- /dev/null
+++ b/spec/fixtures/emails/service_desk_sender_and_from.eml
@@ -0,0 +1,27 @@
+Delivered-To: incoming+email-test-project_id-issue-@appmail.adventuretime.ooo
+Return-Path: <jake@adventuretime.ooo>
+Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
+Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <incoming+gitlabhq/gitlabhq@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
+Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <incoming+email-test-project_id-issue-@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
+Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
+Date: Thu, 13 Jun 2013 17:03:48 -0400
+From: Finn the Human <finn@adventuretime.ooo>
+Sender: Jake the Dog <jake@adventuretime.ooo>
+To: support@adventuretime.ooo
+Delivered-To: support@adventuretime.ooo
+Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
+Subject: The message subject! @all
+Mime-Version: 1.0
+Content-Type: text/plain;
+ charset=ISO-8859-1
+Content-Transfer-Encoding: 7bit
+X-Sieve: CMU Sieve 2.2
+X-Received: by 10.0.0.1 with SMTP id n7mr11234144ipb.85.1371157428600; Thu,
+ 13 Jun 2013 14:03:48 -0700 (PDT)
+X-Scanned-By: MIMEDefang 2.69 on IPv6:2001:470:1d:165::1
+
+Service desk stuff!
+
+```
+a = b
+```
diff --git a/spec/fixtures/emails/valid_reply_with_quick_actions.eml b/spec/fixtures/emails/valid_reply_with_quick_actions.eml
new file mode 100644
index 00000000000..cd00b6eb8b8
--- /dev/null
+++ b/spec/fixtures/emails/valid_reply_with_quick_actions.eml
@@ -0,0 +1,45 @@
+Return-Path: <jake@adventuretime.ooo>
+Received: from iceking.adventuretime.ooo ([unix socket]) by iceking (Cyrus v2.2.13-Debian-2.2.13-19+squeeze3) with LMTPA; Thu, 13 Jun 2013 17:03:50 -0400
+Received: from mail-ie0-x234.google.com (mail-ie0-x234.google.com [IPv6:2607:f8b0:4001:c03::234]) by iceking.adventuretime.ooo (8.14.3/8.14.3/Debian-9.4) with ESMTP id r5DL3nFJ016967 (version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT) for <reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 17:03:50 -0400
+Received: by mail-ie0-f180.google.com with SMTP id f4so21977375iea.25 for <reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo>; Thu, 13 Jun 2013 14:03:48 -0700
+Received: by 10.0.0.1 with HTTP; Thu, 13 Jun 2013 14:03:48 -0700
+Date: Thu, 13 Jun 2013 17:03:48 -0400
+From: Jake the Dog <jake@adventuretime.ooo>
+To: reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo
+Message-ID: <CADkmRc+rNGAGGbV2iE5p918UVy4UyJqVcXRO2=otppgzduJSg@mail.gmail.com>
+In-Reply-To: <issue_1@localhost>
+References: <reply-59d8df8370b7e95c5a49fbf86aeb2c93@localhost> <issue_1@localhost>
+Subject: re: [Discourse Meta] eviltrout posted in 'Adventure Time Sux'
+Mime-Version: 1.0
+Content-Type: text/plain;
+ charset=ISO-8859-1
+Content-Transfer-Encoding: 7bit
+X-Sieve: CMU Sieve 2.2
+X-Received: by 10.0.0.1 with SMTP id n7mr11234144ipb.85.1371157428600; Thu,
+ 13 Jun 2013 14:03:48 -0700 (PDT)
+X-Scanned-By: MIMEDefang 2.69 on IPv6:2001:470:1d:165::1
+
+I could not disagree more. I am obviously biased but adventure time is the
+greatest show ever created. Everyone should watch it.
+
+- Jake out
+
+/close
+/title test
+
+
+On Sun, Jun 9, 2013 at 1:39 PM, eviltrout via Discourse Meta
+<reply+59d8df8370b7e95c5a49fbf86aeb2c93@appmail.adventuretime.ooo> wrote:
+>
+>
+>
+> eviltrout posted in 'Adventure Time Sux' on Discourse Meta:
+>
+> ---
+> hey guys everyone knows adventure time sucks!
+>
+> ---
+> Please visit this link to respond: http://localhost:3000/t/adventure-time-sux/1234/3
+>
+> To unsubscribe from these emails, visit your [user preferences](http://localhost:3000/user_preferences).
+>
diff --git a/spec/fixtures/gitlab/import_export/corrupted_project_export.tar.gz b/spec/fixtures/gitlab/import_export/corrupted_project_export.tar.gz
index cac16cf9cd8..e99136e96b7 100644
--- a/spec/fixtures/gitlab/import_export/corrupted_project_export.tar.gz
+++ b/spec/fixtures/gitlab/import_export/corrupted_project_export.tar.gz
Binary files differ
diff --git a/spec/fixtures/gitlab/import_export/lightweight_project_export.tar.gz b/spec/fixtures/gitlab/import_export/lightweight_project_export.tar.gz
index c01402954dd..e3ec4f603b9 100644
--- a/spec/fixtures/gitlab/import_export/lightweight_project_export.tar.gz
+++ b/spec/fixtures/gitlab/import_export/lightweight_project_export.tar.gz
Binary files differ
diff --git a/spec/fixtures/helm/helm_list_v2_cilium_deployed.json.gz b/spec/fixtures/helm/helm_list_v2_cilium_deployed.json.gz
new file mode 100644
index 00000000000..a343356c95c
--- /dev/null
+++ b/spec/fixtures/helm/helm_list_v2_cilium_deployed.json.gz
Binary files differ
diff --git a/spec/fixtures/helm/helm_list_v2_cilium_failed.json.gz b/spec/fixtures/helm/helm_list_v2_cilium_failed.json.gz
new file mode 100644
index 00000000000..f7faff2ca19
--- /dev/null
+++ b/spec/fixtures/helm/helm_list_v2_cilium_failed.json.gz
Binary files differ
diff --git a/spec/fixtures/helm/helm_list_v2_cilium_missing.json.gz b/spec/fixtures/helm/helm_list_v2_cilium_missing.json.gz
new file mode 100644
index 00000000000..20cac36287b
--- /dev/null
+++ b/spec/fixtures/helm/helm_list_v2_cilium_missing.json.gz
Binary files differ
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/project.json b/spec/fixtures/lib/gitlab/import_export/complex/project.json
index 0785da9c1bf..d88b2ebc83a 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/complex/project.json
@@ -7007,395 +7007,6 @@
"enabled": false
},
"deploy_keys": [],
- "services": [
- {
- "id": 101,
- "title": "YouTrack",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.327Z",
- "updated_at": "2016-06-14T15:01:51.327Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "YoutrackService",
- "category": "issue_tracker",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 100,
- "title": "JetBrains TeamCity CI",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.315Z",
- "updated_at": "2016-06-14T15:01:51.315Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "TeamcityService",
- "category": "ci",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 99,
- "title": "Slack",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.303Z",
- "updated_at": "2016-06-14T15:01:51.303Z",
- "active": false,
- "properties": {
- "notify_only_broken_pipelines": true
- },
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "pipeline_events": true,
- "type": "SlackService",
- "category": "common",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 98,
- "title": "Redmine",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.289Z",
- "updated_at": "2016-06-14T15:01:51.289Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "RedmineService",
- "category": "issue_tracker",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 97,
- "title": "Pushover",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.277Z",
- "updated_at": "2016-06-14T15:01:51.277Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "PushoverService",
- "category": "common",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 96,
- "title": "PivotalTracker",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.267Z",
- "updated_at": "2016-06-14T15:01:51.267Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "PivotalTrackerService",
- "category": "common",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 95,
- "title": "Jira",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.255Z",
- "updated_at": "2016-06-14T15:01:51.255Z",
- "active": false,
- "properties": {
- "api_url": "",
- "jira_issue_transition_id": "2"
- },
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "JiraService",
- "category": "issue_tracker",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 94,
- "title": "Irker (IRC gateway)",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.232Z",
- "updated_at": "2016-06-14T15:01:51.232Z",
- "active": true,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "IrkerService",
- "category": "common",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 93,
- "title": "HipChat",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.219Z",
- "updated_at": "2016-06-14T15:01:51.219Z",
- "active": false,
- "properties": {
- "notify_only_broken_pipelines": true
- },
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "pipeline_events": true,
- "type": "HipchatService",
- "category": "common",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 91,
- "title": "Flowdock",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.182Z",
- "updated_at": "2016-06-14T15:01:51.182Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "FlowdockService",
- "category": "common",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 90,
- "title": "External Wiki",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.166Z",
- "updated_at": "2016-06-14T15:01:51.166Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "ExternalWikiService",
- "category": "common",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 89,
- "title": "Emails on push",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.153Z",
- "updated_at": "2016-06-14T15:01:51.153Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "EmailsOnPushService",
- "category": "common",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 88,
- "title": "Drone CI",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.139Z",
- "updated_at": "2016-06-14T15:01:51.139Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "DroneCiService",
- "category": "ci",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 87,
- "title": "Custom Issue Tracker",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.125Z",
- "updated_at": "2016-06-14T15:01:51.125Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "CustomIssueTrackerService",
- "category": "issue_tracker",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 86,
- "title": "Campfire",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.113Z",
- "updated_at": "2016-06-14T15:01:51.113Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "CampfireService",
- "category": "common",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 84,
- "title": "Buildkite",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.080Z",
- "updated_at": "2016-06-14T15:01:51.080Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "BuildkiteService",
- "category": "ci",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 83,
- "title": "Atlassian Bamboo CI",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.067Z",
- "updated_at": "2016-06-14T15:01:51.067Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "BambooService",
- "category": "ci",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 82,
- "title": "Assembla",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.047Z",
- "updated_at": "2016-06-14T15:01:51.047Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "AssemblaService",
- "category": "common",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 81,
- "title": "Asana",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.031Z",
- "updated_at": "2016-06-14T15:01:51.031Z",
- "active": false,
- "properties": {},
- "template": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "AsanaService",
- "category": "common",
- "default": false,
- "wiki_page_events": true
- }
- ],
"hooks": [],
"protected_branches": [
{
diff --git a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/services.ndjson b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/services.ndjson
index 6d6afd3af0b..e5d39512255 100644
--- a/spec/fixtures/lib/gitlab/import_export/complex/tree/project/services.ndjson
+++ b/spec/fixtures/lib/gitlab/import_export/complex/tree/project/services.ndjson
@@ -1,19 +1,19 @@
-{"id":101,"title":"YouTrack","project_id":5,"created_at":"2016-06-14T15:01:51.327Z","updated_at":"2016-06-14T15:01:51.327Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"YoutrackService","category":"issue_tracker","default":false,"wiki_page_events":true}
-{"id":100,"title":"JetBrains TeamCity CI","project_id":5,"created_at":"2016-06-14T15:01:51.315Z","updated_at":"2016-06-14T15:01:51.315Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"TeamcityService","category":"ci","default":false,"wiki_page_events":true}
-{"id":99,"title":"Slack","project_id":5,"created_at":"2016-06-14T15:01:51.303Z","updated_at":"2016-06-14T15:01:51.303Z","active":false,"properties":{"notify_only_broken_pipelines":true},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"pipeline_events":true,"type":"SlackService","category":"common","default":false,"wiki_page_events":true}
-{"id":98,"title":"Redmine","project_id":5,"created_at":"2016-06-14T15:01:51.289Z","updated_at":"2016-06-14T15:01:51.289Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"RedmineService","category":"issue_tracker","default":false,"wiki_page_events":true}
-{"id":97,"title":"Pushover","project_id":5,"created_at":"2016-06-14T15:01:51.277Z","updated_at":"2016-06-14T15:01:51.277Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"PushoverService","category":"common","default":false,"wiki_page_events":true}
-{"id":96,"title":"PivotalTracker","project_id":5,"created_at":"2016-06-14T15:01:51.267Z","updated_at":"2016-06-14T15:01:51.267Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"PivotalTrackerService","category":"common","default":false,"wiki_page_events":true}
-{"id":95,"title":"Jira","project_id":5,"created_at":"2016-06-14T15:01:51.255Z","updated_at":"2016-06-14T15:01:51.255Z","active":false,"properties":{"api_url":"","jira_issue_transition_id":"2"},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"JiraService","category":"issue_tracker","default":false,"wiki_page_events":true}
-{"id":94,"title":"Irker (IRC gateway)","project_id":5,"created_at":"2016-06-14T15:01:51.232Z","updated_at":"2016-06-14T15:01:51.232Z","active":true,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"IrkerService","category":"common","default":false,"wiki_page_events":true}
-{"id":93,"title":"HipChat","project_id":5,"created_at":"2016-06-14T15:01:51.219Z","updated_at":"2016-06-14T15:01:51.219Z","active":false,"properties":{"notify_only_broken_pipelines":true},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"pipeline_events":true,"type":"HipchatService","category":"common","default":false,"wiki_page_events":true}
-{"id":91,"title":"Flowdock","project_id":5,"created_at":"2016-06-14T15:01:51.182Z","updated_at":"2016-06-14T15:01:51.182Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"FlowdockService","category":"common","default":false,"wiki_page_events":true}
-{"id":90,"title":"External Wiki","project_id":5,"created_at":"2016-06-14T15:01:51.166Z","updated_at":"2016-06-14T15:01:51.166Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"ExternalWikiService","category":"common","default":false,"wiki_page_events":true}
-{"id":89,"title":"Emails on push","project_id":5,"created_at":"2016-06-14T15:01:51.153Z","updated_at":"2016-06-14T15:01:51.153Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"EmailsOnPushService","category":"common","default":false,"wiki_page_events":true}
-{"id":88,"title":"Drone CI","project_id":5,"created_at":"2016-06-14T15:01:51.139Z","updated_at":"2016-06-14T15:01:51.139Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"DroneCiService","category":"ci","default":false,"wiki_page_events":true}
-{"id":87,"title":"Custom Issue Tracker","project_id":5,"created_at":"2016-06-14T15:01:51.125Z","updated_at":"2016-06-14T15:01:51.125Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"CustomIssueTrackerService","category":"issue_tracker","default":false,"wiki_page_events":true}
-{"id":86,"title":"Campfire","project_id":5,"created_at":"2016-06-14T15:01:51.113Z","updated_at":"2016-06-14T15:01:51.113Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"CampfireService","category":"common","default":false,"wiki_page_events":true}
-{"id":84,"title":"Buildkite","project_id":5,"created_at":"2016-06-14T15:01:51.080Z","updated_at":"2016-06-14T15:01:51.080Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"BuildkiteService","category":"ci","default":false,"wiki_page_events":true}
-{"id":83,"title":"Atlassian Bamboo CI","project_id":5,"created_at":"2016-06-14T15:01:51.067Z","updated_at":"2016-06-14T15:01:51.067Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"BambooService","category":"ci","default":false,"wiki_page_events":true}
-{"id":82,"title":"Assembla","project_id":5,"created_at":"2016-06-14T15:01:51.047Z","updated_at":"2016-06-14T15:01:51.047Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"AssemblaService","category":"common","default":false,"wiki_page_events":true}
-{"id":81,"title":"Asana","project_id":5,"created_at":"2016-06-14T15:01:51.031Z","updated_at":"2016-06-14T15:01:51.031Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"AsanaService","category":"common","default":false,"wiki_page_events":true}
+{"id":101,"project_id":5,"created_at":"2016-06-14T15:01:51.327Z","updated_at":"2016-06-14T15:01:51.327Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"YoutrackService","category":"issue_tracker","default":false,"wiki_page_events":true}
+{"id":100,"project_id":5,"created_at":"2016-06-14T15:01:51.315Z","updated_at":"2016-06-14T15:01:51.315Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"TeamcityService","category":"ci","default":false,"wiki_page_events":true}
+{"id":99,"project_id":5,"created_at":"2016-06-14T15:01:51.303Z","updated_at":"2016-06-14T15:01:51.303Z","active":false,"properties":{"notify_only_broken_pipelines":true},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"pipeline_events":true,"type":"SlackService","category":"common","default":false,"wiki_page_events":true}
+{"id":98,"project_id":5,"created_at":"2016-06-14T15:01:51.289Z","updated_at":"2016-06-14T15:01:51.289Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"RedmineService","category":"issue_tracker","default":false,"wiki_page_events":true}
+{"id":97,"project_id":5,"created_at":"2016-06-14T15:01:51.277Z","updated_at":"2016-06-14T15:01:51.277Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"PushoverService","category":"common","default":false,"wiki_page_events":true}
+{"id":96,"project_id":5,"created_at":"2016-06-14T15:01:51.267Z","updated_at":"2016-06-14T15:01:51.267Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"PivotalTrackerService","category":"common","default":false,"wiki_page_events":true}
+{"id":95,"project_id":5,"created_at":"2016-06-14T15:01:51.255Z","updated_at":"2016-06-14T15:01:51.255Z","active":false,"properties":{"api_url":"","jira_issue_transition_id":"2"},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"JiraService","category":"issue_tracker","default":false,"wiki_page_events":true}
+{"id":94,"project_id":5,"created_at":"2016-06-14T15:01:51.232Z","updated_at":"2016-06-14T15:01:51.232Z","active":true,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"IrkerService","category":"common","default":false,"wiki_page_events":true}
+{"id":93,"project_id":5,"created_at":"2016-06-14T15:01:51.219Z","updated_at":"2016-06-14T15:01:51.219Z","active":false,"properties":{"notify_only_broken_pipelines":true},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"pipeline_events":true,"type":"HipchatService","category":"common","default":false,"wiki_page_events":true}
+{"id":91,"project_id":5,"created_at":"2016-06-14T15:01:51.182Z","updated_at":"2016-06-14T15:01:51.182Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"FlowdockService","category":"common","default":false,"wiki_page_events":true}
+{"id":90,"project_id":5,"created_at":"2016-06-14T15:01:51.166Z","updated_at":"2016-06-14T15:01:51.166Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"ExternalWikiService","category":"common","default":false,"wiki_page_events":true}
+{"id":89,"project_id":5,"created_at":"2016-06-14T15:01:51.153Z","updated_at":"2016-06-14T15:01:51.153Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"EmailsOnPushService","category":"common","default":false,"wiki_page_events":true}
+{"id":88,"project_id":5,"created_at":"2016-06-14T15:01:51.139Z","updated_at":"2016-06-14T15:01:51.139Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"DroneCiService","category":"ci","default":false,"wiki_page_events":true}
+{"id":87,"project_id":5,"created_at":"2016-06-14T15:01:51.125Z","updated_at":"2016-06-14T15:01:51.125Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"CustomIssueTrackerService","category":"issue_tracker","default":false,"wiki_page_events":true}
+{"id":86,"project_id":5,"created_at":"2016-06-14T15:01:51.113Z","updated_at":"2016-06-14T15:01:51.113Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"CampfireService","category":"common","default":false,"wiki_page_events":true}
+{"id":84,"project_id":5,"created_at":"2016-06-14T15:01:51.080Z","updated_at":"2016-06-14T15:01:51.080Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"BuildkiteService","category":"ci","default":false,"wiki_page_events":true}
+{"id":83,"project_id":5,"created_at":"2016-06-14T15:01:51.067Z","updated_at":"2016-06-14T15:01:51.067Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"BambooService","category":"ci","default":false,"wiki_page_events":true}
+{"id":82,"project_id":5,"created_at":"2016-06-14T15:01:51.047Z","updated_at":"2016-06-14T15:01:51.047Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"AssemblaService","category":"common","default":false,"wiki_page_events":true}
+{"id":81,"project_id":5,"created_at":"2016-06-14T15:01:51.031Z","updated_at":"2016-06-14T15:01:51.031Z","active":false,"properties":{},"template":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"AsanaService","category":"common","default":false,"wiki_page_events":true}
diff --git a/spec/fixtures/lib/gitlab/import_export/designs/project.json b/spec/fixtures/lib/gitlab/import_export/designs/project.json
index 28eaa38d387..ebc08868d9e 100644
--- a/spec/fixtures/lib/gitlab/import_export/designs/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/designs/project.json
@@ -456,9 +456,6 @@
"pipeline_schedules":[
],
- "services":[
-
- ],
"protected_branches":[
],
diff --git a/spec/fixtures/lib/gitlab/import_export/light/project.json b/spec/fixtures/lib/gitlab/import_export/light/project.json
index 326a2cef9ff..963cdb342b5 100644
--- a/spec/fixtures/lib/gitlab/import_export/light/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/light/project.json
@@ -141,50 +141,6 @@
]
}
],
- "services": [
- {
- "id": 100,
- "title": "JetBrains TeamCity CI",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.315Z",
- "updated_at": "2016-06-14T15:01:51.315Z",
- "active": false,
- "properties": {},
- "template": true,
- "instance": false,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "TeamcityService",
- "category": "ci",
- "default": false,
- "wiki_page_events": true
- },
- {
- "id": 101,
- "title": "Jira",
- "project_id": 5,
- "created_at": "2016-06-14T15:01:51.315Z",
- "updated_at": "2016-06-14T15:01:51.315Z",
- "active": false,
- "properties": {},
- "template": false,
- "instance": true,
- "push_events": true,
- "issues_events": true,
- "merge_requests_events": true,
- "tag_push_events": true,
- "note_events": true,
- "job_events": true,
- "type": "JiraService",
- "category": "ci",
- "default": false,
- "wiki_page_events": true
- }
- ],
"snippets": [],
"hooks": [],
"custom_attributes": [
diff --git a/spec/fixtures/lib/gitlab/import_export/light/tree/project/services.ndjson b/spec/fixtures/lib/gitlab/import_export/light/tree/project/services.ndjson
index c5ae6bf4b04..414b68dacd7 100644
--- a/spec/fixtures/lib/gitlab/import_export/light/tree/project/services.ndjson
+++ b/spec/fixtures/lib/gitlab/import_export/light/tree/project/services.ndjson
@@ -1,2 +1,2 @@
-{"id":100,"title":"JetBrains TeamCity CI","project_id":5,"created_at":"2016-06-14T15:01:51.315Z","updated_at":"2016-06-14T15:01:51.315Z","active":false,"properties":{},"template":true,"instance":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"TeamcityService","category":"ci","default":false,"wiki_page_events":true}
-{"id":101,"title":"Jira","project_id":5,"created_at":"2016-06-14T15:01:51.315Z","updated_at":"2016-06-14T15:01:51.315Z","active":false,"properties":{},"template":false,"instance":true,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"JiraService","category":"ci","default":false,"wiki_page_events":true}
+{"id":100,"project_id":5,"created_at":"2016-06-14T15:01:51.315Z","updated_at":"2016-06-14T15:01:51.315Z","active":false,"properties":{},"template":true,"instance":false,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"TeamcityService","category":"ci","default":false,"wiki_page_events":true}
+{"id":101,"project_id":5,"created_at":"2016-06-14T15:01:51.315Z","updated_at":"2016-06-14T15:01:51.315Z","active":false,"properties":{},"template":false,"instance":true,"push_events":true,"issues_events":true,"merge_requests_events":true,"tag_push_events":true,"note_events":true,"job_events":true,"type":"JiraService","category":"ci","default":false,"wiki_page_events":true}
diff --git a/spec/fixtures/lib/gitlab/import_export/with_invalid_records/project.json b/spec/fixtures/lib/gitlab/import_export/with_invalid_records/project.json
index a6e6ba43bdc..b9e791ee85a 100644
--- a/spec/fixtures/lib/gitlab/import_export/with_invalid_records/project.json
+++ b/spec/fixtures/lib/gitlab/import_export/with_invalid_records/project.json
@@ -32,7 +32,6 @@
],
"labels": [],
"issues": [],
- "services": [],
"snippets": [],
"hooks": []
}
diff --git a/spec/fixtures/lib/gitlab/metrics/dashboard/sample_dashboard.yml b/spec/fixtures/lib/gitlab/metrics/dashboard/sample_dashboard.yml
index 5177de66fcf..1e41ef669d1 100644
--- a/spec/fixtures/lib/gitlab/metrics/dashboard/sample_dashboard.yml
+++ b/spec/fixtures/lib/gitlab/metrics/dashboard/sample_dashboard.yml
@@ -13,6 +13,23 @@ templating:
options:
default_value: 'default'
text_variable_simple_syntax: 'default value'
+ custom_variable_simple_syntax: ['value1', 'value2', 'value3']
+ custom_variable_full_syntax:
+ label: 'Variable 2'
+ type: custom
+ options:
+ values:
+ - value: 'value option 1'
+ text: 'Option 1'
+ - value: 'value_option_2'
+ text: 'Option 2'
+ default: true
+ metric_label_values_variable:
+ label: 'Variable 3'
+ type: metric_label_values
+ options:
+ series_selector: 'backend:haproxy_backend_availability:ratio{env="{{env}}"}'
+ label: 'backend'
panel_groups:
- group: Group A
priority: 1
diff --git a/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/custom_variable_full_syntax.json b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/custom_variable_full_syntax.json
new file mode 100644
index 00000000000..e251e59de29
--- /dev/null
+++ b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/custom_variable_full_syntax.json
@@ -0,0 +1,12 @@
+{
+ "type": "object",
+ "required": [
+ "type", "options"
+ ],
+ "properties": {
+ "type": { "enum": ["custom"] },
+ "label": { "type": "string" },
+ "options": { "$ref": "custom_variable_options.json" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/custom_variable_options.json b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/custom_variable_options.json
new file mode 100644
index 00000000000..f351d3ba340
--- /dev/null
+++ b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/custom_variable_options.json
@@ -0,0 +1,11 @@
+{
+ "type": "object",
+ "required": ["values"],
+ "properties": {
+ "values": {
+ "type": "array",
+ "items": { "$ref": "custom_variable_values.json" }
+ }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/custom_variable_values.json b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/custom_variable_values.json
new file mode 100644
index 00000000000..430d66a9691
--- /dev/null
+++ b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/custom_variable_values.json
@@ -0,0 +1,10 @@
+{
+ "type": "object",
+ "required": ["value"],
+ "properties": {
+ "value": { "type": "string" },
+ "text": { "type": "string" },
+ "default": { "type": "boolean" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metric_label_values_variable_full_syntax.json b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metric_label_values_variable_full_syntax.json
new file mode 100644
index 00000000000..6eb2c0e51e2
--- /dev/null
+++ b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metric_label_values_variable_full_syntax.json
@@ -0,0 +1,12 @@
+{
+ "type": "object",
+ "required": [
+ "type", "options"
+ ],
+ "properties": {
+ "type": { "enum": "metric_label_values" },
+ "label": { "type": "string" },
+ "options": { "$ref": "metric_label_values_variable_options.json" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metric_label_values_variable_options.json b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metric_label_values_variable_options.json
new file mode 100644
index 00000000000..304372ed876
--- /dev/null
+++ b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/metric_label_values_variable_options.json
@@ -0,0 +1,12 @@
+{
+ "type": "object",
+ "required": [
+ "series_selector", "label", "prometheus_endpoint_path"
+ ],
+ "properties": {
+ "series_selector": { "type": "string" },
+ "label": { "type": "string" },
+ "prometheus_endpoint_path": { "type": "string" }
+ },
+ "additionalProperties": false
+}
diff --git a/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/text_variable_full_syntax.json b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/text_variable_full_syntax.json
index f5090dc8c88..1818b2775f0 100644
--- a/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/text_variable_full_syntax.json
+++ b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/text_variable_full_syntax.json
@@ -4,7 +4,7 @@
"type", "options"
],
"properties": {
- "type": { "type": "string" },
+ "type": { "enum": ["text"] },
"label": { "type": "string" },
"options": { "$ref": "text_variable_options.json" }
},
diff --git a/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/variables.json b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/variables.json
index f3e0dd555a6..aec129111e0 100644
--- a/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/variables.json
+++ b/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/variables.json
@@ -4,7 +4,13 @@
"^[a-zA-Z0-9_]*$": {
"anyOf": [
{ "$ref": "text_variable_full_syntax.json" },
- { "type": "string" }
+ { "type": "string" },
+ {
+ "type": "array",
+ "items": { "type": "string" }
+ },
+ { "$ref": "custom_variable_full_syntax.json" },
+ { "$ref": "metric_label_values_variable_full_syntax.json" }
]
}
},
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/blockquote.json b/spec/fixtures/lib/kramdown/atlassian_document_format/blockquote.json
new file mode 100644
index 00000000000..5ad414b43b9
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/blockquote.json
@@ -0,0 +1,24 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "blockquote",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is a sample quote"
+ },
+ {
+ "type": "text",
+ "text": " with lorem ipsum dolor sit amet..."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/blockquote.md b/spec/fixtures/lib/kramdown/atlassian_document_format/blockquote.md
new file mode 100644
index 00000000000..9564e11fc3b
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/blockquote.md
@@ -0,0 +1,2 @@
+> This is a sample quote with lorem ipsum dolor sit amet...
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/bullet_list.json b/spec/fixtures/lib/kramdown/atlassian_document_format/bullet_list.json
new file mode 100644
index 00000000000..0e2b34b0790
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/bullet_list.json
@@ -0,0 +1,72 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "bulletList",
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Item 1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Item 2",
+ "marks": [
+ {
+ "type": "strong"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Sub-item 1"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Sub-item 1 paragraph"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/bullet_list.md b/spec/fixtures/lib/kramdown/atlassian_document_format/bullet_list.md
new file mode 100644
index 00000000000..b7de76b973f
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/bullet_list.md
@@ -0,0 +1,8 @@
+* Item 1
+
+* **Item 2**
+
+ * Sub-item 1
+
+ Sub-item 1 paragraph
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/code_block.json b/spec/fixtures/lib/kramdown/atlassian_document_format/code_block.json
new file mode 100644
index 00000000000..007493bdf49
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/code_block.json
@@ -0,0 +1,89 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": "javascript"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "export function makeIssue({ parentIssue, project, users }) {\n\n const issueType = pickRandom(project.issueTypes)\n\n console.log(data)\n\n return data\n}"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": "css"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": ".overflow { overflow: hidden; }"
+ }
+ ]
+ },
+ {
+ "type": "bulletList",
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Item 1"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "content": [
+ {
+ "type": "text",
+ "text": "public DemoClass()\n{\n // assign default value\n x = 0;\n}"
+ }
+ ]
+ },
+ {
+ "type": "orderedList",
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list Item 1"
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": "ruby"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "def test\n # assign default value\n x = 0\nend"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/code_block.md b/spec/fixtures/lib/kramdown/atlassian_document_format/code_block.md
new file mode 100644
index 00000000000..c89710afd36
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/code_block.md
@@ -0,0 +1,38 @@
+```javascript
+export function makeIssue({ parentIssue, project, users }) {
+
+ const issueType = pickRandom(project.issueTypes)
+
+ console.log(data)
+
+ return data
+}
+```
+
+<!-- -->
+
+```css
+.overflow { overflow: hidden; }
+```
+
+
+* Item 1
+
+ ```java
+ public DemoClass()
+ {
+ // assign default value
+ x = 0;
+ }
+ ```
+
+
+ 1. Number list Item 1
+
+ ```ruby
+ def test
+ # assign default value
+ x = 0
+ end
+ ```
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/code_mark.json b/spec/fixtures/lib/kramdown/atlassian_document_format/code_mark.json
new file mode 100644
index 00000000000..884715709f7
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/code_mark.json
@@ -0,0 +1,24 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is some "
+ },
+ {
+ "type": "text",
+ "text": "inline code",
+ "marks": [
+ {
+ "type": "code"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/code_mark.md b/spec/fixtures/lib/kramdown/atlassian_document_format/code_mark.md
new file mode 100644
index 00000000000..a52d00bfd38
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/code_mark.md
@@ -0,0 +1,2 @@
+This is some `inline code`
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/complex_document.json b/spec/fixtures/lib/kramdown/atlassian_document_format/complex_document.json
new file mode 100644
index 00000000000..c69ad6b4260
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/complex_document.json
@@ -0,0 +1,964 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is a complex issue…and this is normal text"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "rule"
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Color - Dark Gray"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Color - "
+ },
+ {
+ "type": "text",
+ "text": "Light Gray",
+ "marks": [
+ {
+ "type": "textColor",
+ "attrs": {
+ "color": "#97a0af"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Color - "
+ },
+ {
+ "type": "text",
+ "text": "Purple",
+ "marks": [
+ {
+ "type": "textColor",
+ "attrs": {
+ "color": "#6554c0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Color - "
+ },
+ {
+ "type": "text",
+ "text": "Teal",
+ "marks": [
+ {
+ "type": "textColor",
+ "attrs": {
+ "color": "#00b8d9"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Color - "
+ },
+ {
+ "type": "text",
+ "text": "Green",
+ "marks": [
+ {
+ "type": "textColor",
+ "attrs": {
+ "color": "#36b37e"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Color - "
+ },
+ {
+ "type": "text",
+ "text": "Red",
+ "marks": [
+ {
+ "type": "textColor",
+ "attrs": {
+ "color": "#ff5630"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Color - "
+ },
+ {
+ "type": "text",
+ "text": "Orange",
+ "marks": [
+ {
+ "type": "textColor",
+ "attrs": {
+ "color": "#ff991f"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "rule"
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "inlineCard",
+ "attrs": {
+ "url": "https://gitlab-jira.atlassian.net/browse/DEMO-1"
+ }
+ },
+ {
+ "type": "text",
+ "text": " "
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "inlineCard",
+ "attrs": {
+ "data": {
+ "@context": "https://json-ld.org/contexts/person.jsonld",
+ "@id": "http://dbpedia.org/resource/John_Lennon",
+ "name": "John Lennon",
+ "born": "1940-10-09",
+ "spouse": "http://dbpedia.org/resource/Cynthia_Lennon"
+ }
+ }
+ },
+ {
+ "type": "text",
+ "text": " "
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "External Link",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25718"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "rule"
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "blockquote",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is a block quote"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "panel",
+ "attrs": {
+ "panelType": "success"
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Success info panel"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "panel",
+ "attrs": {
+ "panelType": "info"
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Info info panel"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "panel",
+ "attrs": {
+ "panelType": "note"
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Note info panel"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "panel",
+ "attrs": {
+ "panelType": "warning"
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Warning info panel"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "panel",
+ "attrs": {
+ "panelType": "error"
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Error info panel"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "rule"
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "mention",
+ "attrs": {
+ "id": "5e32f803e127810e82875bc1",
+ "text": "jhope"
+ }
+ },
+ {
+ "type": "text",
+ "text": " what up"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "emoji",
+ "attrs": {
+ "shortName": ":grinning:",
+ "id": "1f600",
+ "text": "\uD83D\uDE00"
+ }
+ },
+ {
+ "type": "text",
+ "text": " "
+ },
+ {
+ "type": "emoji",
+ "attrs": {
+ "shortName": ":rofl:",
+ "id": "1f923",
+ "text": "\uD83E\uDD23"
+ }
+ },
+ {
+ "type": "text",
+ "text": " "
+ },
+ {
+ "type": "emoji",
+ "attrs": {
+ "shortName": ":partying_face:",
+ "id": "1f973",
+ "text": "\uD83E\uDD73"
+ }
+ },
+ {
+ "type": "text",
+ "text": " "
+ },
+ {
+ "type": "emoji",
+ "attrs": {
+ "shortName": ":heart_eyes:",
+ "id": "1f60d",
+ "text": "\uD83D\uDE0D"
+ }
+ },
+ {
+ "type": "text",
+ "text": " "
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "table",
+ "attrs": {
+ "isNumberColumnEnabled": false,
+ "layout": "default"
+ },
+ "content": [
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableHeader",
+ "attrs": {},
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Col 1 Row 1",
+ "marks": [
+ {
+ "type": "strong"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableHeader",
+ "attrs": {},
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Col 2 Row 1",
+ "marks": [
+ {
+ "type": "strong"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableHeader",
+ "attrs": {},
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Col 3 Row 1",
+ "marks": [
+ {
+ "type": "strong"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {},
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Col 1 Row 2"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableCell",
+ "attrs": {},
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Col 2 Row 2"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableCell",
+ "attrs": {},
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Col 3 Row 2"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {},
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Col 1 Row 3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableCell",
+ "attrs": {},
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Col 2 Row 3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableCell",
+ "attrs": {},
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Col 3 Row 3"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Header 1"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Header 2"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Header 3"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 4
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Header 4"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 5
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Header 5"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 6
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Header 6"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "bulletList",
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Bullet point list item 1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Bullet point list Item 2"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Bullet point list Item 3"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "orderedList",
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list Item 1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list item 2"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list item 3"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Underline",
+ "marks": [
+ {
+ "type": "underline"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Superscript",
+ "marks": [
+ {
+ "type": "subsup",
+ "attrs": {
+ "type": "sup"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Subscript",
+ "marks": [
+ {
+ "type": "subsup",
+ "attrs": {
+ "type": "sub"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Bold",
+ "marks": [
+ {
+ "type": "strong"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Italic",
+ "marks": [
+ {
+ "type": "em"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Strikethrough",
+ "marks": [
+ {
+ "type": "strike"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "codeBlock",
+ "attrs": {
+ "language": "javascript"
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "export function makeIssue({ parentIssue, project, users }) {\n \n const issueType = pickRandom(project.issueTypes)\n\n let data = {\n fields: {\n summary: faker.lorem.sentence(),\n issuetype: {\n id: issueType.id\n },\n project: {\n id: project.id\n },\n reporter: {\n id: pickRandom(users)\n }\n }\n }\n\n if (issueType.subtask) {\n data = {\n parent: {\n key: parentIssue\n }\n }\n }\n\n console.log(data)\n\n return data\n}"
+ }
+ ]
+ },
+ {
+ "type": "mediaSingle",
+ "attrs": {
+ "layout": "center"
+ },
+ "content": [
+ {
+ "type": "media",
+ "attrs": {
+ "id": "79411c6b-50e0-477f-b4ed-ac3a5887750c",
+ "type": "file",
+ "collection": "jira-10050-field-description",
+ "width": 400,
+ "height": 400
+ }
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "mediaSingle",
+ "attrs": {
+ "layout": "center"
+ },
+ "content": [
+ {
+ "type": "media",
+ "attrs": {
+ "id": "6a5b48c6-70bd-4747-9ac8-a9abc9adb1f4",
+ "type": "file",
+ "collection": "jira-10050-field-description",
+ "width": 1280,
+ "height": 789
+ }
+ }
+ ]
+ },
+ {
+ "type": "mediaSingle",
+ "attrs": {
+ "layout": "center"
+ },
+ "content": [
+ {
+ "type": "media",
+ "attrs": {
+ "id": "e818a88d-9185-4a7f-8882-18339a0f0966",
+ "type": "file",
+ "collection": "jira-10050-field-description",
+ "width": 1280,
+ "height": 598
+ }
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "blob:"
+ },
+ {
+ "type": "text",
+ "text": "https://gitlab-jira.atlassian.net/5eb8e93b-7b15-446f-82d9-9d82ad7b8ea5#media-blob-url=true&id=572b2c1b-1b38-44ba-904a-649ee1861917&collection=upload-user-collection-426749591&contextId=10042&mimeType=image%2Fpng&name=import-jira-issues.png&size=294408",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "https://gitlab-jira.atlassian.net/5eb8e93b-7b15-446f-82d9-9d82ad7b8ea5#media-blob-url=true&id=572b2c1b-1b38-44ba-904a-649ee1861917&collection=upload-user-collection-426749591&contextId=10042&mimeType=image%2Fpng&name=import-jira-issues.png&size=294408"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": []
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/complex_document.md b/spec/fixtures/lib/kramdown/atlassian_document_format/complex_document.md
new file mode 100644
index 00000000000..d4faf84e971
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/complex_document.md
@@ -0,0 +1,223 @@
+This is a complex issue…and this is normal text
+
+
+
+* * *
+
+Color - Dark Gray
+
+Color - <span color="#97a0af">Light Gray</span>
+
+Color - <span color="#6554c0">Purple</span>
+
+Color - <span color="#00b8d9">Teal</span>
+
+Color - <span color="#36b37e">Green</span>
+
+Color - <span color="#ff5630">Red</span>
+
+Color - <span color="#ff991f">Orange</span>
+
+
+
+* * *
+
+[https://gitlab-jira.atlassian.net/browse/DEMO-1][1]
+
+`adf-inlineCard:
+{"@context"=>"https://json-ld.org/contexts/person.jsonld",
+"@id"=>"http://dbpedia.org/resource/John_Lennon", "name"=>"John Lennon",
+"born"=>"1940-10-09",
+"spouse"=>"http://dbpedia.org/resource/Cynthia_Lennon"}`
+
+[External Link][2]
+
+
+
+* * *
+
+
+
+> This is a block quote
+
+
+
+> \:white\_check\_mark: Success info panel
+
+> \:information\_source: Info info panel
+
+> \:notepad\_spiral: Note info panel
+
+> \:warning: Warning info panel
+
+> \:octagonal\_sign: Error info panel
+
+
+
+
+
+* * *
+
+@adf-mention:jhope what up
+
+
+
+😀 🤣 🥳 😍
+
+
+
+<table>
+<tbody>
+<tr>
+<th>
+
+**Col 1 Row 1**
+
+</th>
+<th>
+
+**Col 2 Row 1**
+
+</th>
+<th>
+
+**Col 3 Row 1**
+
+</th>
+</tr>
+<tr>
+<td>
+
+Col 1 Row 2
+
+</td>
+<td>
+
+Col 2 Row 2
+
+</td>
+<td>
+
+Col 3 Row 2
+
+</td>
+</tr>
+<tr>
+<td>
+
+Col 1 Row 3
+
+</td>
+<td>
+
+Col 2 Row 3
+
+</td>
+<td>
+
+Col 3 Row 3
+
+</td>
+</tr>
+</tbody>
+</table>
+
+
+# Header 1
+
+## Header 2
+
+### Header 3
+
+#### Header 4
+
+##### Header 5
+
+###### Header 6
+
+
+
+* Bullet point list item 1
+
+* Bullet point list Item 2
+
+* Bullet point list Item 3
+
+
+
+1. Number list Item 1
+
+2. Number list item 2
+
+3. Number list item 3
+
+
+
+<u>Underline</u>
+
+<sup>Superscript</sup>
+
+<sub>Subscript</sub>
+
+**Bold**
+
+*Italic*
+
+<del>Strikethrough</del>
+
+```javascript
+export function makeIssue({ parentIssue, project, users }) {
+
+ const issueType = pickRandom(project.issueTypes)
+
+ let data = {
+ fields: {
+ summary: faker.lorem.sentence(),
+ issuetype: {
+ id: issueType.id
+ },
+ project: {
+ id: project.id
+ },
+ reporter: {
+ id: pickRandom(users)
+ }
+ }
+ }
+
+ if (issueType.subtask) {
+ data = {
+ parent: {
+ key: parentIssue
+ }
+ }
+ }
+
+ console.log(data)
+
+ return data
+}
+```
+
+
+![jira-10050-field-description](adf-media://79411c6b-50e0-477f-b4ed-ac3a5887750c)
+
+
+
+![jira-10050-field-description](adf-media://6a5b48c6-70bd-4747-9ac8-a9abc9adb1f4)
+
+![jira-10050-field-description](adf-media://e818a88d-9185-4a7f-8882-18339a0f0966)
+
+
+
+
+
+blob:[https://gitlab-jira.atlassian.net/5eb8e93b-7b15-446f-82d9-9d82ad7b8ea5#media-blob-url=true&id=572b2c1b-1b38-44ba-904a-649ee1861917&collection=upload-user-collection-426749591&contextId=10042&mimeType=image%2Fpng&name=import-jira-issues.png&size=294408][3]
+
+
+
+
+
+[1]: https://gitlab-jira.atlassian.net/browse/DEMO-1
+[2]: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/25718
+[3]: https://gitlab-jira.atlassian.net/5eb8e93b-7b15-446f-82d9-9d82ad7b8ea5#media-blob-url=true&id=572b2c1b-1b38-44ba-904a-649ee1861917&collection=upload-user-collection-426749591&contextId=10042&mimeType=image%2Fpng&name=import-jira-issues.png&size=294408
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/emoji.json b/spec/fixtures/lib/kramdown/atlassian_document_format/emoji.json
new file mode 100644
index 00000000000..3a7944d2509
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/emoji.json
@@ -0,0 +1,66 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Grinning with unicode "
+ },
+ {
+ "type": "emoji",
+ "attrs": {
+ "shortName": ":grinning:",
+ "text": "😀"
+ }
+ },
+ {
+ "type": "text",
+ "text": " and heart eyes with raw unicode "
+ },
+ {
+ "type": "emoji",
+ "attrs": {
+ "shortName": ":heart_eyes:",
+ "id": "1f60d",
+ "text": "\uD83D\uDE0D"
+ }
+ },
+ {
+ "type": "text",
+ "text": ", non-standard Atlassian "
+ },
+ {
+ "type": "emoji",
+ "attrs": {
+ "shortName": ":awthanks:",
+ "id": "atlassian-awthanks",
+ "text": ":awthanks:"
+ }
+ },
+ {
+ "type": "text",
+ "text": ", non-standard customer emoji "
+ },
+ {
+ "type": "emoji",
+ "attrs": {
+ "shortName": ":thumbsup::skin-tone-2:"
+ }
+ },
+ {
+ "type": "text",
+ "text": ", and invalid is ignored "
+ },
+ {
+ "type": "emoji",
+ "attrs": {
+ "id": "1f44d"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/emoji.md b/spec/fixtures/lib/kramdown/atlassian_document_format/emoji.md
new file mode 100644
index 00000000000..11adf377188
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/emoji.md
@@ -0,0 +1,4 @@
+Grinning with unicode 😀 and heart eyes with raw unicode 😍, non-standard
+Atlassian :awthanks:, non-standard customer emoji
+:thumbsup::skin-tone-2:, and invalid is ignored
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/hard_break.json b/spec/fixtures/lib/kramdown/atlassian_document_format/hard_break.json
new file mode 100644
index 00000000000..564570c016e
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/hard_break.json
@@ -0,0 +1,22 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is a sample paragraph"
+ },
+ {
+ "type": "hardBreak"
+ },
+ {
+ "type": "text",
+ "text": "with lorem ipsum dolor sit amet..."
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/hard_break.md b/spec/fixtures/lib/kramdown/atlassian_document_format/hard_break.md
new file mode 100644
index 00000000000..d8c4a8dca53
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/hard_break.md
@@ -0,0 +1,3 @@
+This is a sample paragraph
+with lorem ipsum dolor sit amet...
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/heading.json b/spec/fixtures/lib/kramdown/atlassian_document_format/heading.json
new file mode 100644
index 00000000000..dbc756f3603
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/heading.json
@@ -0,0 +1,91 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 1
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Header 1"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 2
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Header 2",
+ "marks": [
+ {
+ "type": "strong"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 3
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Header 3"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 4
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Header 4",
+ "marks": [
+ {
+ "type": "textColor",
+ "attrs": {
+ "color": "#ff6347"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 5
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Header 5"
+ }
+ ]
+ },
+ {
+ "type": "heading",
+ "attrs": {
+ "level": 6
+ },
+ "content": [
+ {
+ "type": "text",
+ "text": "Header 6"
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/heading.md b/spec/fixtures/lib/kramdown/atlassian_document_format/heading.md
new file mode 100644
index 00000000000..073ae1fdef4
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/heading.md
@@ -0,0 +1,12 @@
+# Header 1
+
+## **Header 2**
+
+### Header 3
+
+#### <span color="#ff6347">Header 4</span>
+
+##### Header 5
+
+###### Header 6
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/inline_card.json b/spec/fixtures/lib/kramdown/atlassian_document_format/inline_card.json
new file mode 100644
index 00000000000..8b7428debc2
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/inline_card.json
@@ -0,0 +1,46 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "An inline card (url): "
+ },
+ {
+ "type": "inlineCard",
+ "attrs": {
+ "url": "https://gitlab-jira.atlassian.net/browse/DEMO-1"
+ }
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Some prelude text "
+ },
+ {
+ "type": "inlineCard",
+ "attrs": {
+ "data": {
+ "@context": "https://json-ld.org/contexts/person.jsonld",
+ "@id": "http://dbpedia.org/resource/John_Lennon",
+ "name": "John Lennon",
+ "born": "1940-10-09",
+ "spouse": "http://dbpedia.org/resource/Cynthia_Lennon"
+ }
+ }
+ },
+ {
+ "type": "text",
+ "text": " some following text"
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/inline_card.md b/spec/fixtures/lib/kramdown/atlassian_document_format/inline_card.md
new file mode 100644
index 00000000000..655102941a7
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/inline_card.md
@@ -0,0 +1,13 @@
+An inline card (url):
+[https://gitlab-jira.atlassian.net/browse/DEMO-1][1]
+
+Some prelude text `adf-inlineCard:
+{"@context"=>"https://json-ld.org/contexts/person.jsonld",
+"@id"=>"http://dbpedia.org/resource/John_Lennon", "name"=>"John Lennon",
+"born"=>"1940-10-09",
+"spouse"=>"http://dbpedia.org/resource/Cynthia_Lennon"}` some following
+text
+
+
+
+[1]: https://gitlab-jira.atlassian.net/browse/DEMO-1
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/invalid_json.json b/spec/fixtures/lib/kramdown/atlassian_document_format/invalid_json.json
new file mode 100644
index 00000000000..6305592d175
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/invalid_json.json
@@ -0,0 +1,16 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is a second paragraph"
+ }
+ ]
+ }
+ ]
+}
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/invalid_no_doc.json b/spec/fixtures/lib/kramdown/atlassian_document_format/invalid_no_doc.json
new file mode 100644
index 00000000000..c9f10eeeb79
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/invalid_no_doc.json
@@ -0,0 +1,13 @@
+{
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is a sample paragraph"
+ },
+ {
+ "type": "text",
+ "text": " with lorem ipsum dolor sit amet..."
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/invalid_node_type.json b/spec/fixtures/lib/kramdown/atlassian_document_format/invalid_node_type.json
new file mode 100644
index 00000000000..ebb74624333
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/invalid_node_type.json
@@ -0,0 +1,28 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "invalid",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is a sample paragraph"
+ },
+ {
+ "type": "text",
+ "text": " with lorem ipsum dolor sit amet..."
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is a second paragraph"
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/link_mark.json b/spec/fixtures/lib/kramdown/atlassian_document_format/link_mark.json
new file mode 100644
index 00000000000..bf6facf1b05
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/link_mark.json
@@ -0,0 +1,44 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is a "
+ },
+ {
+ "type": "text",
+ "text": "link without title",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://example.com"
+ }
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "text": " and a "
+ },
+ {
+ "type": "text",
+ "text": "link with title",
+ "marks": [
+ {
+ "type": "link",
+ "attrs": {
+ "href": "http://example.net",
+ "title": "Link Title"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/link_mark.md b/spec/fixtures/lib/kramdown/atlassian_document_format/link_mark.md
new file mode 100644
index 00000000000..cd42b2297cf
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/link_mark.md
@@ -0,0 +1,6 @@
+This is a [link without title][1] and a [link with title][2]
+
+
+
+[1]: http://example.com
+[2]: http://example.net "Link Title"
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/media_group.json b/spec/fixtures/lib/kramdown/atlassian_document_format/media_group.json
new file mode 100644
index 00000000000..a51da964e0e
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/media_group.json
@@ -0,0 +1,59 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "mediaGroup",
+ "content": [
+ {
+ "type": "media",
+ "attrs": {
+ "id": "79411c6b-50e0-477f-b4ed-ac3a5887750c",
+ "type": "file",
+ "collection": "jira-10050-field-description",
+ "width": 400,
+ "height": 400
+ }
+ },
+ {
+ "type": "media",
+ "attrs": {
+ "id": "79411c6b-50e0-477f-b4ed-abcde",
+ "type": "file",
+ "collection": "jira-10050-field-description",
+ "width": 400,
+ "height": 400
+ }
+ }
+ ]
+ },
+ {
+ "type": "rule"
+ },
+ {
+ "type": "mediaGroup",
+ "content": [
+ {
+ "type": "media",
+ "attrs": {
+ "id": "79411c6b-50e0-477f-b4ed-ac3a5887750c-link1",
+ "type": "link",
+ "collection": "jira-10050-field-description-links",
+ "width": 400,
+ "height": 400
+ }
+ },
+ {
+ "type": "media",
+ "attrs": {
+ "id": "79411c6b-50e0-477f-b4ed-ac3a5887750c-link2",
+ "type": "link",
+ "collection": "jira-10050-field-description-links",
+ "width": 400,
+ "height": 400
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/media_group.md b/spec/fixtures/lib/kramdown/atlassian_document_format/media_group.md
new file mode 100644
index 00000000000..7b602d8fc2b
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/media_group.md
@@ -0,0 +1,10 @@
+* ![jira-10050-field-description](adf-media://79411c6b-50e0-477f-b4ed-ac3a5887750c)
+
+* ![jira-10050-field-description](adf-media://79411c6b-50e0-477f-b4ed-abcde)
+
+* * *
+
+* [adf-media://79411c6b-50e0-477f-b4ed-ac3a5887750c-link1](adf-media://79411c6b-50e0-477f-b4ed-ac3a5887750c-link1)
+
+* [adf-media://79411c6b-50e0-477f-b4ed-ac3a5887750c-link2](adf-media://79411c6b-50e0-477f-b4ed-ac3a5887750c-link2)
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/media_single.json b/spec/fixtures/lib/kramdown/atlassian_document_format/media_single.json
new file mode 100644
index 00000000000..0ecf2dcf03d
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/media_single.json
@@ -0,0 +1,42 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "mediaSingle",
+ "attrs": {
+ "layout": "center"
+ },
+ "content": [
+ {
+ "type": "media",
+ "attrs": {
+ "id": "79411c6b-50e0-477f-b4ed-ac3a5887750c",
+ "type": "file",
+ "collection": "jira-10050-field-description",
+ "width": 400,
+ "height": 400
+ }
+ }
+ ]
+ },
+ {
+ "type": "mediaSingle",
+ "attrs": {
+ "layout": "center"
+ },
+ "content": [
+ {
+ "type": "media",
+ "attrs": {
+ "id": "79411c6b-50e0-477f-b4ed-abcd",
+ "type": "file",
+ "collection": "another-jira-10050-field-description",
+ "width": 400,
+ "height": 400
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/media_single.md b/spec/fixtures/lib/kramdown/atlassian_document_format/media_single.md
new file mode 100644
index 00000000000..5ed1bbb55e1
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/media_single.md
@@ -0,0 +1,4 @@
+![jira-10050-field-description](adf-media://79411c6b-50e0-477f-b4ed-ac3a5887750c)
+
+![another-jira-10050-field-description](adf-media://79411c6b-50e0-477f-b4ed-abcd)
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/mention.json b/spec/fixtures/lib/kramdown/atlassian_document_format/mention.json
new file mode 100644
index 00000000000..81a087c57d9
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/mention.json
@@ -0,0 +1,44 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Mentioning "
+ },
+ {
+ "type": "mention",
+ "attrs": {
+ "id": "ABCDE-ABCDE-ABCDE-ABCDE",
+ "text": "@testuser",
+ "userType": "APP"
+ }
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Mentioning "
+ },
+ {
+ "type": "mention",
+ "attrs": {
+ "id": "ABCDE-ABCDE-ABCDE-ABCDE",
+ "text": "@test user",
+ "userType": "APP"
+ }
+ },
+ {
+ "type": "text",
+ "text": " with space in user name"
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/mention.md b/spec/fixtures/lib/kramdown/atlassian_document_format/mention.md
new file mode 100644
index 00000000000..f22c6421d8c
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/mention.md
@@ -0,0 +1,4 @@
+Mentioning @adf-mention:testuser
+
+Mentioning @adf-mention:\"test user\" with space in user name
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/ordered_list.json b/spec/fixtures/lib/kramdown/atlassian_document_format/ordered_list.json
new file mode 100644
index 00000000000..71d638c6a38
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/ordered_list.json
@@ -0,0 +1,170 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "orderedList",
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list Item 1"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list item 2"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list item 3"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list item 4"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list item 5"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list item 6"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list item 7"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list item 8"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list item 9"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Number list item 10"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "orderedList",
+ "content": [
+ {
+ "type": "listItem",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Another list"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/ordered_list.md b/spec/fixtures/lib/kramdown/atlassian_document_format/ordered_list.md
new file mode 100644
index 00000000000..2c1f45cd810
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/ordered_list.md
@@ -0,0 +1,25 @@
+1. Number list Item 1
+
+2. Number list item 2
+
+3. Number list item 3
+
+4. Number list item 4
+
+5. Number list item 5
+
+6. Number list item 6
+
+7. Number list item 7
+
+8. Number list item 8
+
+9. Number list item 9
+
+10. Number list item 10
+<!-- -->
+
+1. Another list
+
+<!-- -->
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/panel.json b/spec/fixtures/lib/kramdown/atlassian_document_format/panel.json
new file mode 100644
index 00000000000..e3982d23a9e
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/panel.json
@@ -0,0 +1,117 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "panel",
+ "attrs": {
+ "panelType": "success"
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Success info panel"
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Second paragraph"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "panel",
+ "attrs": {
+ "panelType": "info"
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Info info panel"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "panel",
+ "attrs": {
+ "panelType": "note"
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Note info panel"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "panel",
+ "attrs": {
+ "panelType": "warning"
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Warning info panel"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "panel",
+ "attrs": {
+ "panelType": "error"
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Error info panel"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "panel",
+ "attrs": {
+ "panelType": "unknown"
+ },
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Unknown panel"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/panel.md b/spec/fixtures/lib/kramdown/atlassian_document_format/panel.md
new file mode 100644
index 00000000000..fe3a10e4878
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/panel.md
@@ -0,0 +1,12 @@
+> \:white\_check\_mark: Success info panel
+>
+> Second paragraph
+
+> \:information\_source: Info info panel
+
+> \:notepad\_spiral: Note info panel
+
+> \:warning: Warning info panel
+
+> \:octagonal\_sign: Error info panel
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/paragraph.json b/spec/fixtures/lib/kramdown/atlassian_document_format/paragraph.json
new file mode 100644
index 00000000000..e5b99dbd112
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/paragraph.json
@@ -0,0 +1,28 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is a sample paragraph"
+ },
+ {
+ "type": "text",
+ "text": " with lorem ipsum dolor sit amet..."
+ }
+ ]
+ },
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is a second paragraph"
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/paragraph.md b/spec/fixtures/lib/kramdown/atlassian_document_format/paragraph.md
new file mode 100644
index 00000000000..661110e0267
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/paragraph.md
@@ -0,0 +1,4 @@
+This is a sample paragraph with lorem ipsum dolor sit amet...
+
+This is a second paragraph
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/rule.json b/spec/fixtures/lib/kramdown/atlassian_document_format/rule.json
new file mode 100644
index 00000000000..c2566a84713
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/rule.json
@@ -0,0 +1,9 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "rule"
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/rule.md b/spec/fixtures/lib/kramdown/atlassian_document_format/rule.md
new file mode 100644
index 00000000000..8ccef4e8dfb
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/rule.md
@@ -0,0 +1,2 @@
+* * *
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/strike_sup_sub_mark.json b/spec/fixtures/lib/kramdown/atlassian_document_format/strike_sup_sub_mark.json
new file mode 100644
index 00000000000..21d364d642f
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/strike_sup_sub_mark.json
@@ -0,0 +1,56 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is "
+ },
+ {
+ "type": "text",
+ "text": "stricken",
+ "marks": [
+ {
+ "type": "strike"
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "text": " and "
+ },
+ {
+ "type": "text",
+ "text": "superscripted",
+ "marks": [
+ {
+ "type": "subsup",
+ "attrs": {
+ "type": "sup"
+ }
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "text": " and "
+ },
+ {
+ "type": "text",
+ "text": "subscripted",
+ "marks": [
+ {
+ "type": "subsup",
+ "attrs": {
+ "type": "sub"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/strike_sup_sub_mark.md b/spec/fixtures/lib/kramdown/atlassian_document_format/strike_sup_sub_mark.md
new file mode 100644
index 00000000000..e4dda350907
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/strike_sup_sub_mark.md
@@ -0,0 +1,3 @@
+This is <del>stricken</del> and <sup>superscripted</sup> and
+<sub>subscripted</sub>
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/strong_em_mark.json b/spec/fixtures/lib/kramdown/atlassian_document_format/strong_em_mark.json
new file mode 100644
index 00000000000..7ab1a7c1461
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/strong_em_mark.json
@@ -0,0 +1,53 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Hello "
+ },
+ {
+ "type": "text",
+ "text": "strong",
+ "marks": [
+ {
+ "type": "strong"
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "text": " and "
+ },
+ {
+ "type": "text",
+ "text": "emphasis",
+ "marks": [
+ {
+ "type": "em"
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "text": " and "
+ },
+ {
+ "type": "text",
+ "text": "strongly emphasised",
+ "marks": [
+ {
+ "type": "em"
+ },
+ {
+ "type": "strong"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/strong_em_mark.md b/spec/fixtures/lib/kramdown/atlassian_document_format/strong_em_mark.md
new file mode 100644
index 00000000000..d0dcbb231ae
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/strong_em_mark.md
@@ -0,0 +1,2 @@
+Hello **strong** and *emphasis* and ***strongly emphasised***
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/table.json b/spec/fixtures/lib/kramdown/atlassian_document_format/table.json
new file mode 100644
index 00000000000..ad12c2875c0
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/table.json
@@ -0,0 +1,55 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "table",
+ "attrs": {
+ "isNumberColumnEnabled": false,
+ "layout": "default"
+ },
+ "content": [
+ {
+ "type": "tableRow",
+ "content": [
+ {
+ "type": "tableCell",
+ "attrs": {},
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Row one, cell one",
+ "marks": [
+ {
+ "type": "strong"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "tableCell",
+ "attrs": {},
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "Row one, cell two"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/table.md b/spec/fixtures/lib/kramdown/atlassian_document_format/table.md
new file mode 100644
index 00000000000..4e0c53338df
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/table.md
@@ -0,0 +1,18 @@
+<table>
+<tbody>
+<tr>
+<td>
+
+**Row one, cell one**
+
+</td>
+<td>
+
+Row one, cell two
+
+</td>
+</tr>
+</tbody>
+</table>
+
+
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/underline_text_color_mark.json b/spec/fixtures/lib/kramdown/atlassian_document_format/underline_text_color_mark.json
new file mode 100644
index 00000000000..2690233d4f6
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/underline_text_color_mark.json
@@ -0,0 +1,40 @@
+{
+ "version": 1,
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "This is "
+ },
+ {
+ "type": "text",
+ "text": "underlined",
+ "marks": [
+ {
+ "type": "underline"
+ }
+ ]
+ },
+ {
+ "type": "text",
+ "text": " and "
+ },
+ {
+ "type": "text",
+ "text": "red",
+ "marks": [
+ {
+ "type": "textColor",
+ "attrs": {
+ "color": "#ff6347"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/spec/fixtures/lib/kramdown/atlassian_document_format/underline_text_color_mark.md b/spec/fixtures/lib/kramdown/atlassian_document_format/underline_text_color_mark.md
new file mode 100644
index 00000000000..75c9de3b451
--- /dev/null
+++ b/spec/fixtures/lib/kramdown/atlassian_document_format/underline_text_color_mark.md
@@ -0,0 +1,2 @@
+This is <u>underlined</u> and <span color="#ff6347">red</span>
+
diff --git a/spec/fixtures/pager_duty/webhook_incident_trigger.json b/spec/fixtures/pager_duty/webhook_incident_trigger.json
new file mode 100644
index 00000000000..872297adcf6
--- /dev/null
+++ b/spec/fixtures/pager_duty/webhook_incident_trigger.json
@@ -0,0 +1,239 @@
+{
+ "messages": [
+ {
+ "event": "incident.trigger",
+ "log_entries": [
+ {
+ "id": "R2XGXEI3W0FHMSDXHDIBQGBQ5E",
+ "type": "trigger_log_entry",
+ "summary": "Triggered through the website",
+ "self": "https://api.pagerduty.com/log_entries/R2XGXEI3W0FHMSDXHDIBQGBQ5E",
+ "html_url": "https://webdemo.pagerduty.com/incidents/PRORDTY/log_entries/R2XGXEI3W0FHMSDXHDIBQGBQ5E",
+ "created_at": "2017-09-26T15:14:36Z",
+ "agent": {
+ "id": "P553OPV",
+ "type": "user_reference",
+ "summary": "Laura Haley",
+ "self": "https://api.pagerduty.com/users/P553OPV",
+ "html_url": "https://webdemo.pagerduty.com/users/P553OPV"
+ },
+ "channel": {
+ "type": "web_trigger",
+ "summary": "My new incident",
+ "subject": "My new incident",
+ "details": "Oh my gosh",
+ "details_omitted": false
+ },
+ "service": {
+ "id": "PN49J75",
+ "type": "service_reference",
+ "summary": "Production XDB Cluster",
+ "self": "https://api.pagerduty.com/services/PN49J75",
+ "html_url": "https://webdemo.pagerduty.com/services/PN49J75"
+ },
+ "incident": {
+ "id": "PRORDTY",
+ "type": "incident_reference",
+ "summary": "[#33] My new incident",
+ "self": "https://api.pagerduty.com/incidents/PRORDTY",
+ "html_url": "https://webdemo.pagerduty.com/incidents/PRORDTY"
+ },
+ "teams": [
+ {
+ "id": "P4SI59S",
+ "type": "team_reference",
+ "summary": "Engineering",
+ "self": "https://api.pagerduty.com/teams/P4SI59S",
+ "html_url": "https://webdemo.pagerduty.com/teams/P4SI59S"
+ }
+ ],
+ "contexts": [],
+ "event_details": {
+ "description": "My new incident"
+ }
+ }
+ ],
+ "webhook": {
+ "endpoint_url": "https://requestb.in/18ao6fs1",
+ "name": "V2 wabhook",
+ "description": null,
+ "webhook_object": {
+ "id": "PN49J75",
+ "type": "service_reference",
+ "summary": "Production XDB Cluster",
+ "self": "https://api.pagerduty.com/services/PN49J75",
+ "html_url": "https://webdemo.pagerduty.com/services/PN49J75"
+ },
+ "config": {},
+ "outbound_integration": {
+ "id": "PJFWPEP",
+ "type": "outbound_integration_reference",
+ "summary": "Generic V2 Webhook",
+ "self": "https://api.pagerduty.com/outbound_integrations/PJFWPEP",
+ "html_url": null
+ },
+ "accounts_addon": null,
+ "id": "PKT9NNX",
+ "type": "webhook",
+ "summary": "V2 wabhook",
+ "self": "https://api.pagerduty.com/webhooks/PKT9NNX",
+ "html_url": null
+ },
+ "incident": {
+ "incident_number": 33,
+ "title": "My new incident",
+ "description": "My new incident",
+ "created_at": "2017-09-26T15:14:36Z",
+ "status": "triggered",
+ "pending_actions": [
+ {
+ "type": "escalate",
+ "at": "2017-09-26T15:44:36Z"
+ },
+ {
+ "type": "resolve",
+ "at": "2017-09-26T19:14:36Z"
+ }
+ ],
+ "incident_key": null,
+ "service": {
+ "id": "PN49J75",
+ "name": "Production XDB Cluster",
+ "description": "This service was created during onboarding on July 5, 2017.",
+ "auto_resolve_timeout": 14400,
+ "acknowledgement_timeout": 1800,
+ "created_at": "2017-07-05T17:33:09Z",
+ "status": "critical",
+ "last_incident_timestamp": "2017-09-26T15:14:36Z",
+ "teams": [
+ {
+ "id": "P4SI59S",
+ "type": "team_reference",
+ "summary": "Engineering",
+ "self": "https://api.pagerduty.com/teams/P4SI59S",
+ "html_url": "https://webdemo.pagerduty.com/teams/P4SI59S"
+ }
+ ],
+ "incident_urgency_rule": {
+ "type": "constant",
+ "urgency": "high"
+ },
+ "scheduled_actions": [],
+ "support_hours": null,
+ "escalation_policy": {
+ "id": "PINYWEF",
+ "type": "escalation_policy_reference",
+ "summary": "Default",
+ "self": "https://api.pagerduty.com/escalation_policies/PINYWEF",
+ "html_url": "https://webdemo.pagerduty.com/escalation_policies/PINYWEF"
+ },
+ "addons": [],
+ "privilege": null,
+ "alert_creation": "create_alerts_and_incidents",
+ "integrations": [
+ {
+ "id": "PUAYF96",
+ "type": "generic_events_api_inbound_integration_reference",
+ "summary": "API",
+ "self": "https://api.pagerduty.com/services/PN49J75/integrations/PUAYF96",
+ "html_url": "https://webdemo.pagerduty.com/services/PN49J75/integrations/PUAYF96"
+ },
+ {
+ "id": "P90GZUH",
+ "type": "generic_email_inbound_integration_reference",
+ "summary": "Email",
+ "self": "https://api.pagerduty.com/services/PN49J75/integrations/P90GZUH",
+ "html_url": "https://webdemo.pagerduty.com/services/PN49J75/integrations/P90GZUH"
+ }
+ ],
+ "metadata": {},
+ "type": "service",
+ "summary": "Production XDB Cluster",
+ "self": "https://api.pagerduty.com/services/PN49J75",
+ "html_url": "https://webdemo.pagerduty.com/services/PN49J75"
+ },
+ "assignments": [
+ {
+ "at": "2017-09-26T15:14:36Z",
+ "assignee": {
+ "id": "P553OPV",
+ "type": "user_reference",
+ "summary": "Laura Haley",
+ "self": "https://api.pagerduty.com/users/P553OPV",
+ "html_url": "https://webdemo.pagerduty.com/users/P553OPV"
+ }
+ }
+ ],
+ "acknowledgements": [],
+ "last_status_change_at": "2017-09-26T15:14:36Z",
+ "last_status_change_by": {
+ "id": "PN49J75",
+ "type": "service_reference",
+ "summary": "Production XDB Cluster",
+ "self": "https://api.pagerduty.com/services/PN49J75",
+ "html_url": "https://webdemo.pagerduty.com/services/PN49J75"
+ },
+ "first_trigger_log_entry": {
+ "id": "R2XGXEI3W0FHMSDXHDIBQGBQ5E",
+ "type": "trigger_log_entry_reference",
+ "summary": "Triggered through the website",
+ "self": "https://api.pagerduty.com/log_entries/R2XGXEI3W0FHMSDXHDIBQGBQ5E",
+ "html_url": "https://webdemo.pagerduty.com/incidents/PRORDTY/log_entries/R2XGXEI3W0FHMSDXHDIBQGBQ5E"
+ },
+ "escalation_policy": {
+ "id": "PINYWEF",
+ "type": "escalation_policy_reference",
+ "summary": "Default",
+ "self": "https://api.pagerduty.com/escalation_policies/PINYWEF",
+ "html_url": "https://webdemo.pagerduty.com/escalation_policies/PINYWEF"
+ },
+ "privilege": null,
+ "teams": [
+ {
+ "id": "P4SI59S",
+ "type": "team_reference",
+ "summary": "Engineering",
+ "self": "https://api.pagerduty.com/teams/P4SI59S",
+ "html_url": "https://webdemo.pagerduty.com/teams/P4SI59S"
+ }
+ ],
+ "alert_counts": {
+ "all": 0,
+ "triggered": 0,
+ "resolved": 0
+ },
+ "impacted_services": [
+ {
+ "id": "PN49J75",
+ "type": "service_reference",
+ "summary": "Production XDB Cluster",
+ "self": "https://api.pagerduty.com/services/PN49J75",
+ "html_url": "https://webdemo.pagerduty.com/services/PN49J75"
+ }
+ ],
+ "is_mergeable": true,
+ "basic_alert_grouping": null,
+ "alert_grouping": null,
+ "metadata": {},
+ "external_references": [],
+ "importance": null,
+ "incidents_responders": [],
+ "responder_requests": [],
+ "subscriber_requests": [],
+ "urgency": "high",
+ "id": "PRORDTY",
+ "type": "incident",
+ "summary": "[#33] My new incident",
+ "self": "https://api.pagerduty.com/incidents/PRORDTY",
+ "html_url": "https://webdemo.pagerduty.com/incidents/PRORDTY",
+ "alerts": [
+ {
+ "alert_key": "c24117fc42e44b44b4d6876190583378"
+ }
+ ]
+ },
+ "id": "69a7ced0-a2cd-11e7-a799-22000a15839c",
+ "created_on": "2017-09-26T15:14:36Z"
+ }
+ ]
+}
diff --git a/spec/fixtures/product_analytics/event.json b/spec/fixtures/product_analytics/event.json
new file mode 100644
index 00000000000..3100b068a0c
--- /dev/null
+++ b/spec/fixtures/product_analytics/event.json
@@ -0,0 +1,16 @@
+{
+ "aid":"1",
+ "p":"web",
+ "tna":"sp",
+ "tv":"js-2.14.0",
+ "eid":"fbf14096-74ee-47e4-883c-8a0d6cb72e37",
+ "duid":"79543c31-cfc3-4479-a737-fafb9333c8ba",
+ "sid":"54f6d3f3-f4f9-4fdc-87e0-a2c775234c1b",
+ "vid":4,
+ "url":"http://example.com/products/1",
+ "refr":"http://example.com/products/1",
+ "lang":"en-US",
+ "cookie":"1",
+ "tz":"America/Los_Angeles",
+ "cs":"UTF-8"
+}
diff --git a/spec/fixtures/sentry/issue_sample_response.json b/spec/fixtures/sentry/issue_sample_response.json
index 43d55f584b8..82588bd0749 100644
--- a/spec/fixtures/sentry/issue_sample_response.json
+++ b/spec/fixtures/sentry/issue_sample_response.json
@@ -42,7 +42,30 @@
"isBookmarked": false,
"isPublic": false,
"isSubscribed": true,
- "lastRelease": null,
+ "lastRelease": {
+ "dateReleased": null,
+ "commitCount": 1,
+ "url": null,
+ "data": {},
+ "lastDeploy": {},
+ "deployCount": 3,
+ "dateCreated": "2020-06-29T08:10:45.909Z",
+ "lastEvent": "2020-06-30T09:47:19.651Z",
+ "version": "17642328ead24b51867165985996d04b29321448",
+ "firstEvent": "2020-06-29T09:13:36.696Z",
+ "lastCommit": {},
+ "shortVersion": "27de6b42eb4",
+ "authors": [],
+ "owner": null,
+ "newGroups": 208,
+ "ref": null,
+ "projects": [
+ {
+ "name": "Pump Station",
+ "slug": "pump-station"
+ }
+ ]
+ },
"lastSeen": "2018-11-06T21:19:55Z",
"level": "error",
"logger": null,