@redocly/openapi-core 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/__tests__/utils.ts +88 -0
  3. package/lib/config/all.js +0 -1
  4. package/lib/config/minimal.js +0 -1
  5. package/lib/config/recommended.js +0 -1
  6. package/package.json +1 -1
  7. package/src/__tests__/__snapshots__/bundle.test.ts.snap +437 -0
  8. package/src/__tests__/bundle.test.ts +236 -0
  9. package/src/__tests__/codeframes.test.ts +530 -0
  10. package/src/__tests__/fixtures/.redocly.lint-ignore.yaml +5 -0
  11. package/src/__tests__/fixtures/extension.js +24 -0
  12. package/src/__tests__/fixtures/refs/definitions.yaml +3 -0
  13. package/src/__tests__/fixtures/refs/examples.yaml +8 -0
  14. package/src/__tests__/fixtures/refs/external-request-body.yaml +13 -0
  15. package/src/__tests__/fixtures/refs/externalref.yaml +35 -0
  16. package/src/__tests__/fixtures/refs/hosted.yaml +35 -0
  17. package/src/__tests__/fixtures/refs/openapi-with-external-refs-conflicting-names.yaml +21 -0
  18. package/src/__tests__/fixtures/refs/openapi-with-external-refs.yaml +33 -0
  19. package/src/__tests__/fixtures/refs/openapi-with-url-refs.yaml +18 -0
  20. package/src/__tests__/fixtures/refs/param-b.yaml +1 -0
  21. package/src/__tests__/fixtures/refs/param-c.yaml +1 -0
  22. package/src/__tests__/fixtures/refs/rename.yaml +1 -0
  23. package/src/__tests__/fixtures/refs/requestBody.yaml +9 -0
  24. package/src/__tests__/fixtures/refs/schema-a.yaml +1 -0
  25. package/src/__tests__/fixtures/refs/simple.yaml +1 -0
  26. package/src/__tests__/fixtures/refs/vendor.schema.yaml +20 -0
  27. package/src/__tests__/fixtures/resolve/External.yaml +10 -0
  28. package/src/__tests__/fixtures/resolve/External2.yaml +4 -0
  29. package/src/__tests__/fixtures/resolve/description.md +3 -0
  30. package/src/__tests__/fixtures/resolve/externalInfo.yaml +4 -0
  31. package/src/__tests__/fixtures/resolve/externalLicense.yaml +1 -0
  32. package/src/__tests__/fixtures/resolve/openapi-with-back.yaml +13 -0
  33. package/src/__tests__/fixtures/resolve/openapi-with-md-description.yaml +5 -0
  34. package/src/__tests__/fixtures/resolve/openapi.yaml +28 -0
  35. package/src/__tests__/fixtures/resolve/schemas/type-a.yaml +10 -0
  36. package/src/__tests__/fixtures/resolve/schemas/type-b.yaml +6 -0
  37. package/src/__tests__/fixtures/resolve/transitive/a.yaml +1 -0
  38. package/src/__tests__/fixtures/resolve/transitive/components.yaml +5 -0
  39. package/src/__tests__/fixtures/resolve/transitive/schemas.yaml +3 -0
  40. package/src/__tests__/format.test.ts +76 -0
  41. package/src/__tests__/js-yaml.test.ts +73 -0
  42. package/src/__tests__/lint.test.ts +392 -0
  43. package/src/__tests__/logger-browser.test.ts +53 -0
  44. package/src/__tests__/logger.test.ts +47 -0
  45. package/src/__tests__/login.test.ts +17 -0
  46. package/src/__tests__/normalizeVisitors.test.ts +151 -0
  47. package/src/__tests__/output-browser.test.ts +18 -0
  48. package/src/__tests__/output.test.ts +15 -0
  49. package/src/__tests__/ref-utils.test.ts +120 -0
  50. package/src/__tests__/resolve-http.test.ts +77 -0
  51. package/src/__tests__/resolve.test.ts +431 -0
  52. package/src/__tests__/utils-browser.test.ts +11 -0
  53. package/src/__tests__/utils.test.ts +144 -0
  54. package/src/__tests__/walk.test.ts +1545 -0
  55. package/src/benchmark/benches/lint-with-many-rules.bench.ts +35 -0
  56. package/src/benchmark/benches/lint-with-nested-rule.bench.ts +39 -0
  57. package/src/benchmark/benches/lint-with-no-rules.bench.ts +20 -0
  58. package/src/benchmark/benches/lint-with-top-level-rule-report.bench.ts +35 -0
  59. package/src/benchmark/benches/lint-with-top-level-rule.bench.ts +32 -0
  60. package/src/benchmark/benches/rebilly.yaml +32275 -0
  61. package/src/benchmark/benches/recommended-oas3.bench.ts +22 -0
  62. package/src/benchmark/benches/resolve-with-no-external.bench.ts +23 -0
  63. package/src/benchmark/benchmark.js +311 -0
  64. package/src/benchmark/colors.js +29 -0
  65. package/src/benchmark/fork.js +83 -0
  66. package/src/benchmark/utils.ts +36 -0
  67. package/src/bundle.ts +417 -0
  68. package/src/config/__tests__/__snapshots__/config-resolvers.test.ts.snap +164 -0
  69. package/src/config/__tests__/__snapshots__/config.test.ts.snap +144 -0
  70. package/src/config/__tests__/config-resolvers.test.ts +491 -0
  71. package/src/config/__tests__/config.test.ts +312 -0
  72. package/src/config/__tests__/fixtures/ingore-file.ts +8 -0
  73. package/src/config/__tests__/fixtures/load-redocly.yaml +2 -0
  74. package/src/config/__tests__/fixtures/plugin-config.yaml +2 -0
  75. package/src/config/__tests__/fixtures/plugin.js +56 -0
  76. package/src/config/__tests__/fixtures/resolve-config/api/nested-config.yaml +11 -0
  77. package/src/config/__tests__/fixtures/resolve-config/api/plugin.js +69 -0
  78. package/src/config/__tests__/fixtures/resolve-config/local-config-with-circular.yaml +7 -0
  79. package/src/config/__tests__/fixtures/resolve-config/local-config-with-custom-function.yaml +17 -0
  80. package/src/config/__tests__/fixtures/resolve-config/local-config-with-file.yaml +18 -0
  81. package/src/config/__tests__/fixtures/resolve-config/local-config-with-wrong-custom-function.yaml +15 -0
  82. package/src/config/__tests__/fixtures/resolve-config/local-config.yaml +9 -0
  83. package/src/config/__tests__/fixtures/resolve-config/plugin.js +80 -0
  84. package/src/config/__tests__/fixtures/resolve-remote-configs/nested-remote-config.yaml +3 -0
  85. package/src/config/__tests__/fixtures/resolve-remote-configs/remote-config.yaml +4 -0
  86. package/src/config/__tests__/load.test.ts +167 -0
  87. package/src/config/__tests__/resolve-plugins.test.ts +27 -0
  88. package/src/config/__tests__/utils.test.ts +204 -0
  89. package/src/config/all.ts +74 -0
  90. package/src/config/builtIn.ts +37 -0
  91. package/src/config/config-resolvers.ts +474 -0
  92. package/src/config/config.ts +332 -0
  93. package/src/config/index.ts +7 -0
  94. package/src/config/load.ts +144 -0
  95. package/src/config/minimal.ts +61 -0
  96. package/src/config/recommended.ts +61 -0
  97. package/src/config/rules.ts +54 -0
  98. package/src/config/types.ts +231 -0
  99. package/src/config/utils.ts +349 -0
  100. package/src/decorators/__tests__/filter-in.test.ts +310 -0
  101. package/src/decorators/__tests__/filter-out.test.ts +335 -0
  102. package/src/decorators/__tests__/media-type-examples-override.test.ts +665 -0
  103. package/src/decorators/__tests__/remove-x-internal.test.ts +316 -0
  104. package/src/decorators/__tests__/resources/request.yaml +3 -0
  105. package/src/decorators/__tests__/resources/response.yaml +3 -0
  106. package/src/decorators/common/filters/filter-helper.ts +72 -0
  107. package/src/decorators/common/filters/filter-in.ts +18 -0
  108. package/src/decorators/common/filters/filter-out.ts +18 -0
  109. package/src/decorators/common/info-description-override.ts +24 -0
  110. package/src/decorators/common/info-override.ts +15 -0
  111. package/src/decorators/common/media-type-examples-override.ts +79 -0
  112. package/src/decorators/common/operation-description-override.ts +30 -0
  113. package/src/decorators/common/registry-dependencies.ts +25 -0
  114. package/src/decorators/common/remove-x-internal.ts +59 -0
  115. package/src/decorators/common/tag-description-override.ts +25 -0
  116. package/src/decorators/oas2/index.ts +20 -0
  117. package/src/decorators/oas3/index.ts +22 -0
  118. package/src/env.ts +5 -0
  119. package/src/format/codeframes.ts +216 -0
  120. package/src/format/format.ts +375 -0
  121. package/src/index.ts +71 -0
  122. package/src/js-yaml/index.ts +14 -0
  123. package/src/lint.ts +148 -0
  124. package/src/logger.ts +34 -0
  125. package/src/oas-types.ts +57 -0
  126. package/src/output.ts +7 -0
  127. package/src/redocly/__tests__/redocly-client.test.ts +146 -0
  128. package/src/redocly/index.ts +187 -0
  129. package/src/redocly/redocly-client-types.ts +10 -0
  130. package/src/redocly/registry-api-types.ts +32 -0
  131. package/src/redocly/registry-api.ts +150 -0
  132. package/src/ref-utils.ts +85 -0
  133. package/src/resolve.ts +417 -0
  134. package/src/rules/__tests__/fixtures/code-sample.php +9 -0
  135. package/src/rules/__tests__/fixtures/invalid-yaml.yaml +1 -0
  136. package/src/rules/__tests__/fixtures/ref.yaml +1 -0
  137. package/src/rules/__tests__/no-unresolved-refs.test.ts +257 -0
  138. package/src/rules/__tests__/utils.test.ts +160 -0
  139. package/src/rules/ajv.ts +102 -0
  140. package/src/rules/common/__tests__/info-license.test.ts +62 -0
  141. package/src/rules/common/__tests__/license-url.test.ts +63 -0
  142. package/src/rules/common/__tests__/no-ambiguous-paths.test.ts +96 -0
  143. package/src/rules/common/__tests__/no-enum-type-mismatch.test.ts +210 -0
  144. package/src/rules/common/__tests__/no-identical-paths.test.ts +58 -0
  145. package/src/rules/common/__tests__/no-path-trailing-slash.test.ts +85 -0
  146. package/src/rules/common/__tests__/operation-2xx-response.test.ts +192 -0
  147. package/src/rules/common/__tests__/operation-4xx-response.test.ts +231 -0
  148. package/src/rules/common/__tests__/operation-operationId-unique.test.ts +76 -0
  149. package/src/rules/common/__tests__/operation-operationId-url-safe.test.ts +45 -0
  150. package/src/rules/common/__tests__/operation-parameters-unique.test.ts +167 -0
  151. package/src/rules/common/__tests__/operation-singular-tag.test.ts +72 -0
  152. package/src/rules/common/__tests__/path-http-verbs-order.test.ts +95 -0
  153. package/src/rules/common/__tests__/path-not-include-query.test.ts +64 -0
  154. package/src/rules/common/__tests__/path-params-defined.test.ts +202 -0
  155. package/src/rules/common/__tests__/paths-kebab-case.test.ts +108 -0
  156. package/src/rules/common/__tests__/scalar-property-missing-example.test.ts +264 -0
  157. package/src/rules/common/__tests__/security-defined.test.ts +175 -0
  158. package/src/rules/common/__tests__/spec-strict-refs.test.ts +69 -0
  159. package/src/rules/common/__tests__/spec.test.ts +610 -0
  160. package/src/rules/common/__tests__/tag-description.test.ts +65 -0
  161. package/src/rules/common/__tests__/tags-alphabetical.test.ts +64 -0
  162. package/src/rules/common/assertions/__tests__/asserts.test.ts +869 -0
  163. package/src/rules/common/assertions/__tests__/index.test.ts +100 -0
  164. package/src/rules/common/assertions/__tests__/utils.test.ts +236 -0
  165. package/src/rules/common/assertions/asserts.ts +357 -0
  166. package/src/rules/common/assertions/index.ts +53 -0
  167. package/src/rules/common/assertions/utils.ts +331 -0
  168. package/src/rules/common/info-contact.ts +15 -0
  169. package/src/rules/common/info-license-url.ts +10 -0
  170. package/src/rules/common/info-license.ts +15 -0
  171. package/src/rules/common/no-ambiguous-paths.ts +50 -0
  172. package/src/rules/common/no-enum-type-mismatch.ts +52 -0
  173. package/src/rules/common/no-http-verbs-in-paths.ts +36 -0
  174. package/src/rules/common/no-identical-paths.ts +24 -0
  175. package/src/rules/common/no-invalid-parameter-examples.ts +36 -0
  176. package/src/rules/common/no-invalid-schema-examples.ts +27 -0
  177. package/src/rules/common/no-path-trailing-slash.ts +15 -0
  178. package/src/rules/common/operation-2xx-response.ts +24 -0
  179. package/src/rules/common/operation-4xx-response.ts +24 -0
  180. package/src/rules/common/operation-description.ts +13 -0
  181. package/src/rules/common/operation-operationId-unique.ts +21 -0
  182. package/src/rules/common/operation-operationId-url-safe.ts +19 -0
  183. package/src/rules/common/operation-operationId.ts +17 -0
  184. package/src/rules/common/operation-parameters-unique.ts +48 -0
  185. package/src/rules/common/operation-singular-tag.ts +17 -0
  186. package/src/rules/common/operation-summary.ts +13 -0
  187. package/src/rules/common/operation-tag-defined.ts +26 -0
  188. package/src/rules/common/parameter-description.ts +22 -0
  189. package/src/rules/common/path-declaration-must-exist.ts +15 -0
  190. package/src/rules/common/path-excludes-patterns.ts +23 -0
  191. package/src/rules/common/path-http-verbs-order.ts +30 -0
  192. package/src/rules/common/path-not-include-query.ts +17 -0
  193. package/src/rules/common/path-params-defined.ts +65 -0
  194. package/src/rules/common/path-segment-plural.ts +31 -0
  195. package/src/rules/common/paths-kebab-case.ts +19 -0
  196. package/src/rules/common/required-string-property-missing-min-length.ts +44 -0
  197. package/src/rules/common/response-contains-header.ts +35 -0
  198. package/src/rules/common/scalar-property-missing-example.ts +58 -0
  199. package/src/rules/common/security-defined.ts +65 -0
  200. package/src/rules/common/spec-strict-refs.ts +30 -0
  201. package/src/rules/common/spec.ts +175 -0
  202. package/src/rules/common/tag-description.ts +10 -0
  203. package/src/rules/common/tags-alphabetical.ts +20 -0
  204. package/src/rules/no-unresolved-refs.ts +51 -0
  205. package/src/rules/oas2/__tests__/boolean-parameter-prefixes.test.ts +110 -0
  206. package/src/rules/oas2/__tests__/response-contains-header.test.ts +174 -0
  207. package/src/rules/oas2/__tests__/response-contains-property.test.ts +155 -0
  208. package/src/rules/oas2/__tests__/spec/fixtures/description.md +1 -0
  209. package/src/rules/oas2/__tests__/spec/info.test.ts +355 -0
  210. package/src/rules/oas2/__tests__/spec/operation.test.ts +123 -0
  211. package/src/rules/oas2/__tests__/spec/paths.test.ts +245 -0
  212. package/src/rules/oas2/__tests__/spec/referenceableScalars.test.ts +35 -0
  213. package/src/rules/oas2/__tests__/spec/utils.ts +32 -0
  214. package/src/rules/oas2/boolean-parameter-prefixes.ts +26 -0
  215. package/src/rules/oas2/index.ts +91 -0
  216. package/src/rules/oas2/remove-unused-components.ts +81 -0
  217. package/src/rules/oas2/request-mime-type.ts +16 -0
  218. package/src/rules/oas2/response-contains-property.ts +36 -0
  219. package/src/rules/oas2/response-mime-type.ts +16 -0
  220. package/src/rules/oas3/__tests__/boolean-parameter-prefixes.test.ts +111 -0
  221. package/src/rules/oas3/__tests__/component-name-unique.test.ts +823 -0
  222. package/src/rules/oas3/__tests__/fixtures/common.yaml +11 -0
  223. package/src/rules/oas3/__tests__/no-empty-enum-servers.com.test.ts +205 -0
  224. package/src/rules/oas3/__tests__/no-example-value-and-externalValue.test.ts +65 -0
  225. package/src/rules/oas3/__tests__/no-invalid-media-type-examples.test.ts +473 -0
  226. package/src/rules/oas3/__tests__/no-server-example.com.test.ts +60 -0
  227. package/src/rules/oas3/__tests__/no-server-trailing-slash.test.ts +79 -0
  228. package/src/rules/oas3/__tests__/no-unused-components.test.ts +131 -0
  229. package/src/rules/oas3/__tests__/operation-4xx-problem-details-rfc7807.test.ts +145 -0
  230. package/src/rules/oas3/__tests__/response-contains-header.test.ts +389 -0
  231. package/src/rules/oas3/__tests__/response-contains-property.test.ts +403 -0
  232. package/src/rules/oas3/__tests__/spec/callbacks.test.ts +41 -0
  233. package/src/rules/oas3/__tests__/spec/fixtures/description.md +1 -0
  234. package/src/rules/oas3/__tests__/spec/info.test.ts +391 -0
  235. package/src/rules/oas3/__tests__/spec/operation.test.ts +253 -0
  236. package/src/rules/oas3/__tests__/spec/paths.test.ts +284 -0
  237. package/src/rules/oas3/__tests__/spec/referenceableScalars.test.ts +77 -0
  238. package/src/rules/oas3/__tests__/spec/servers.test.ts +505 -0
  239. package/src/rules/oas3/__tests__/spec/spec.test.ts +298 -0
  240. package/src/rules/oas3/__tests__/spec/utils.ts +32 -0
  241. package/src/rules/oas3/__tests__/spec-components-invalid-map-name.test.ts +276 -0
  242. package/src/rules/oas3/__tests__/utils/lint-document-for-test.ts +23 -0
  243. package/src/rules/oas3/boolean-parameter-prefixes.ts +28 -0
  244. package/src/rules/oas3/component-name-unique.ts +158 -0
  245. package/src/rules/oas3/index.ts +113 -0
  246. package/src/rules/oas3/no-empty-servers.ts +22 -0
  247. package/src/rules/oas3/no-example-value-and-externalValue.ts +14 -0
  248. package/src/rules/oas3/no-invalid-media-type-examples.ts +49 -0
  249. package/src/rules/oas3/no-server-example.com.ts +14 -0
  250. package/src/rules/oas3/no-server-trailing-slash.ts +15 -0
  251. package/src/rules/oas3/no-server-variables-empty-enum.ts +66 -0
  252. package/src/rules/oas3/no-undefined-server-variable.ts +30 -0
  253. package/src/rules/oas3/no-unused-components.ts +75 -0
  254. package/src/rules/oas3/operation-4xx-problem-details-rfc7807.ts +35 -0
  255. package/src/rules/oas3/remove-unused-components.ts +95 -0
  256. package/src/rules/oas3/request-mime-type.ts +30 -0
  257. package/src/rules/oas3/response-contains-property.ts +38 -0
  258. package/src/rules/oas3/response-mime-type.ts +30 -0
  259. package/src/rules/oas3/spec-components-invalid-map-name.ts +69 -0
  260. package/src/rules/other/stats.ts +73 -0
  261. package/src/rules/utils.ts +193 -0
  262. package/src/types/config-external-schemas.ts +917 -0
  263. package/src/types/index.ts +149 -0
  264. package/src/types/oas2.ts +478 -0
  265. package/src/types/oas3.ts +597 -0
  266. package/src/types/oas3_1.ts +258 -0
  267. package/src/types/redocly-yaml.ts +1040 -0
  268. package/src/typings/common.ts +17 -0
  269. package/src/typings/openapi.ts +298 -0
  270. package/src/typings/swagger.ts +236 -0
  271. package/src/utils.ts +276 -0
  272. package/src/visitors.ts +491 -0
  273. package/src/walk.ts +439 -0
  274. package/tsconfig.json +8 -0
  275. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,155 @@
1
+ import { outdent } from 'outdent';
2
+ import { lintDocument } from '../../../lint';
3
+ import { parseYamlToDocument, makeConfig } from '../../../../__tests__/utils';
4
+ import { BaseResolver } from '../../../resolve';
5
+
6
+ describe('Oas2 response-contains-property', () => {
7
+ it('should report a response object not containing the property', async () => {
8
+ const document = parseYamlToDocument(outdent`
9
+ swagger: '2.0'
10
+ schemes:
11
+ - https
12
+ basePath: /v2
13
+ paths:
14
+ '/accounts/{accountId}':
15
+ get:
16
+ description: Retrieve a sub account under the master account.
17
+ operationId: account
18
+ responses:
19
+ '200':
20
+ description: Account object returned
21
+ schema:
22
+ type: object
23
+ properties:
24
+ created_at:
25
+ description: Account creation date/time
26
+ format: date-time
27
+ type: string
28
+ owner_email:
29
+ description: Account Owner email
30
+ type: string
31
+ '404':
32
+ description: User not found
33
+ `);
34
+ const results = await lintDocument({
35
+ externalRefResolver: new BaseResolver(),
36
+ document,
37
+ config: await makeConfig({
38
+ 'response-contains-property': {
39
+ severity: 'error',
40
+ names: { '2xx': ['id'], '4xx': ['id'] },
41
+ },
42
+ }),
43
+ });
44
+ expect(results).toMatchInlineSnapshot(`
45
+ Array [
46
+ Object {
47
+ "location": Array [
48
+ Object {
49
+ "pointer": "#/paths/~1accounts~1{accountId}/get/responses/200/schema/properties",
50
+ "reportOnKey": true,
51
+ "source": Source {
52
+ "absoluteRef": "",
53
+ "body": "swagger: '2.0'
54
+ schemes:
55
+ - https
56
+ basePath: /v2
57
+ paths:
58
+ '/accounts/{accountId}':
59
+ get:
60
+ description: Retrieve a sub account under the master account.
61
+ operationId: account
62
+ responses:
63
+ '200':
64
+ description: Account object returned
65
+ schema:
66
+ type: object
67
+ properties:
68
+ created_at:
69
+ description: Account creation date/time
70
+ format: date-time
71
+ type: string
72
+ owner_email:
73
+ description: Account Owner email
74
+ type: string
75
+ '404':
76
+ description: User not found",
77
+ "mimeType": undefined,
78
+ },
79
+ },
80
+ ],
81
+ "message": "Response object must contain a top-level \\"id\\" property.",
82
+ "ruleId": "response-contains-property",
83
+ "severity": "error",
84
+ "suggest": Array [],
85
+ },
86
+ ]
87
+ `);
88
+ });
89
+
90
+ it('should not report a response object containing the expected property', async () => {
91
+ const document = parseYamlToDocument(outdent`
92
+ swagger: '2.0'
93
+ schemes:
94
+ - https
95
+ basePath: /v2
96
+ paths:
97
+ '/accounts/{accountId}':
98
+ get:
99
+ description: Retrieve a sub account under the master account.
100
+ operationId: account
101
+ responses:
102
+ '200':
103
+ description: Account object returned
104
+ schema:
105
+ type: object
106
+ properties:
107
+ created_at:
108
+ description: Account creation date/time
109
+ format: date-time
110
+ type: string
111
+ id: some-id
112
+ '404':
113
+ description: User not found
114
+ id: some-id
115
+ `);
116
+ const results = await lintDocument({
117
+ externalRefResolver: new BaseResolver(),
118
+ document,
119
+ config: await makeConfig({
120
+ 'response-contains-property': {
121
+ severity: 'error',
122
+ names: { '200': ['id'], '4xx': ['id'] },
123
+ },
124
+ }),
125
+ });
126
+ expect(results).toMatchInlineSnapshot(`Array []`);
127
+ });
128
+
129
+ it('should not report a response object when there is no `names` section defined', async () => {
130
+ const document = parseYamlToDocument(outdent`
131
+ swagger: '2.0'
132
+ schemes:
133
+ - https
134
+ basePath: /v2
135
+ paths:
136
+ '/accounts/{accountId}':
137
+ get:
138
+ description: Retrieve a sub account under the master account.
139
+ operationId: account
140
+ responses:
141
+ '404':
142
+ description: User not found
143
+ `);
144
+ const results = await lintDocument({
145
+ externalRefResolver: new BaseResolver(),
146
+ document,
147
+ config: await makeConfig({
148
+ 'response-contains-property': {
149
+ severity: 'error',
150
+ },
151
+ }),
152
+ });
153
+ expect(results).toMatchInlineSnapshot(`Array []`);
154
+ });
155
+ });
@@ -0,0 +1,355 @@
1
+ import { outdent } from 'outdent';
2
+ import { lintDoc } from './utils';
3
+
4
+ describe('OpenAPI Schema 2.0', () => {
5
+ it('should report if the title of the API is empty ', async () => {
6
+ const source = outdent`
7
+ swagger: '2.0'
8
+ info:
9
+ title:
10
+ version: '1.0'
11
+
12
+ paths:
13
+ '/ping':
14
+ get:
15
+ responses:
16
+ '200':
17
+ description: example description
18
+ `;
19
+
20
+ expect(
21
+ await lintDoc(source, {
22
+ spec: 'error',
23
+ })
24
+ ).toMatchInlineSnapshot(`
25
+ Array [
26
+ Object {
27
+ "location": "#/info/title",
28
+ "message": "Expected type \`string\` but got \`null\`.",
29
+ },
30
+ ]
31
+ `);
32
+ });
33
+
34
+ it('should report if in the description field is not string.', async () => {
35
+ const source = outdent`
36
+ swagger: '2.0'
37
+ info:
38
+ title: Example OpenAPI 3 definition.
39
+ version: '1.0'
40
+ description:
41
+
42
+ paths:
43
+ '/ping':
44
+ get:
45
+ responses:
46
+ '200':
47
+ description: example description
48
+ `;
49
+
50
+ expect(
51
+ await lintDoc(source, {
52
+ spec: 'error',
53
+ })
54
+ ).toMatchInlineSnapshot(`
55
+ Array [
56
+ Object {
57
+ "location": "#/info/description",
58
+ "message": "Expected type \`string\` but got \`null\`.",
59
+ },
60
+ ]
61
+ `);
62
+ });
63
+
64
+ it('should report if in the termsOfService field is not string', async () => {
65
+ const source = outdent`
66
+ swagger: '2.0'
67
+ info:
68
+ title: Example OpenAPI 3 definition. Valid.
69
+ version: '1.0'
70
+ termsOfService:
71
+
72
+ paths:
73
+ '/ping':
74
+ get:
75
+ responses:
76
+ '200':
77
+ description: example description
78
+ `;
79
+
80
+ expect(
81
+ await lintDoc(source, {
82
+ spec: 'error',
83
+ })
84
+ ).toMatchInlineSnapshot(`
85
+ Array [
86
+ Object {
87
+ "location": "#/info/termsOfService",
88
+ "message": "Expected type \`string\` but got \`null\`.",
89
+ },
90
+ ]
91
+ `);
92
+ });
93
+
94
+ it('should not report if the Contact Object is valid', async () => {
95
+ const source = outdent`
96
+ swagger: '2.0'
97
+ info:
98
+ title: Example OpenAPI 3 definition. Valid.
99
+ version: '1.0'
100
+ termsOfService: http://example.com/terms/
101
+ contact:
102
+ name: API Support
103
+ url: http://www.example.com/support
104
+ email: support@example.com
105
+
106
+ paths:
107
+ '/ping':
108
+ get:
109
+ responses:
110
+ '200':
111
+ description: example description
112
+ `;
113
+
114
+ expect(
115
+ await lintDoc(source, {
116
+ spec: 'error',
117
+ })
118
+ ).toMatchInlineSnapshot(`Array []`);
119
+ });
120
+
121
+ it('should report if in the Contact Object in URL field is not string', async () => {
122
+ const source = outdent`
123
+ swagger: '2.0'
124
+ info:
125
+ title: Example OpenAPI 3 definition. Valid.
126
+ version: '1.0'
127
+ termsOfService: http://example.com/terms/
128
+ contact:
129
+ url:
130
+ email: support@example.com
131
+
132
+ paths:
133
+ '/ping':
134
+ get:
135
+ responses:
136
+ '200':
137
+ description: example description
138
+ `;
139
+
140
+ expect(
141
+ await lintDoc(source, {
142
+ spec: 'error',
143
+ })
144
+ ).toMatchInlineSnapshot(`
145
+ Array [
146
+ Object {
147
+ "location": "#/info/contact/url",
148
+ "message": "Expected type \`string\` but got \`null\`.",
149
+ },
150
+ ]
151
+ `);
152
+ });
153
+
154
+ it('should report if in the Contact Object in email field is not string', async () => {
155
+ const source = outdent`
156
+ swagger: '2.0'
157
+ info:
158
+ title: Example OpenAPI 3 definition. Valid.
159
+ version: '1.0'
160
+ termsOfService: http://example.com/terms/
161
+ contact:
162
+ url: http://example.com/contact/
163
+ email:
164
+
165
+ paths:
166
+ '/ping':
167
+ get:
168
+ responses:
169
+ '200':
170
+ description: example description
171
+ `;
172
+
173
+ expect(
174
+ await lintDoc(source, {
175
+ spec: 'error',
176
+ })
177
+ ).toMatchInlineSnapshot(`
178
+ Array [
179
+ Object {
180
+ "location": "#/info/contact/email",
181
+ "message": "Expected type \`string\` but got \`null\`.",
182
+ },
183
+ ]
184
+ `);
185
+ });
186
+
187
+ it('should not report if the License Object is valid', async () => {
188
+ const source = outdent`
189
+ swagger: '2.0'
190
+ info:
191
+ title: Example OpenAPI 3 definition. Valid.
192
+ version: '1.0'
193
+ license:
194
+ name: Apache 2.0
195
+ url: https://www.apache.org/licenses/LICENSE-2.0.html
196
+
197
+ paths:
198
+ '/ping':
199
+ get:
200
+ responses:
201
+ '200':
202
+ description: example description
203
+ `;
204
+
205
+ expect(
206
+ await lintDoc(source, {
207
+ spec: 'error',
208
+ })
209
+ ).toMatchInlineSnapshot(`Array []`);
210
+ });
211
+
212
+ it('should report if the License Object missing field Name', async () => {
213
+ const source = outdent`
214
+ swagger: '2.0'
215
+ info:
216
+ title: Example OpenAPI 3 definition. Valid.
217
+ version: '1.0'
218
+ license:
219
+ url: https://www.apache.org/licenses/LICENSE-2.0.html
220
+
221
+ paths:
222
+ '/ping':
223
+ get:
224
+ responses:
225
+ '200':
226
+ description: example description
227
+ `;
228
+
229
+ expect(
230
+ await lintDoc(source, {
231
+ spec: 'error',
232
+ })
233
+ ).toMatchInlineSnapshot(`
234
+ Array [
235
+ Object {
236
+ "location": "#/info/license",
237
+ "message": "The field \`name\` must be present on this level.",
238
+ },
239
+ ]
240
+ `);
241
+ });
242
+
243
+ it('should report if in the URL field of the License Object is not string', async () => {
244
+ const source = outdent`
245
+ swagger: '2.0'
246
+ info:
247
+ title: Example OpenAPI 3 definition. Valid.
248
+ version: '1.0'
249
+ license:
250
+ name: Apache 2.0
251
+ url:
252
+
253
+ paths:
254
+ '/ping':
255
+ get:
256
+ responses:
257
+ '200':
258
+ description: example description
259
+ `;
260
+
261
+ expect(
262
+ await lintDoc(source, {
263
+ spec: 'error',
264
+ })
265
+ ).toMatchInlineSnapshot(`
266
+ Array [
267
+ Object {
268
+ "location": "#/info/license/url",
269
+ "message": "Expected type \`string\` but got \`null\`.",
270
+ },
271
+ ]
272
+ `);
273
+ });
274
+
275
+ it('should not report if the URL field of the License Object is not provided', async () => {
276
+ const source = outdent`
277
+ swagger: '2.0'
278
+ info:
279
+ title: Example OpenAPI 3 definition. Valid.
280
+ version: '1.0'
281
+ license:
282
+ name: Apache 2.0
283
+
284
+ paths:
285
+ '/ping':
286
+ get:
287
+ responses:
288
+ '200':
289
+ description: example description
290
+ `;
291
+
292
+ expect(
293
+ await lintDoc(source, {
294
+ spec: 'error',
295
+ })
296
+ ).toMatchInlineSnapshot(`Array []`);
297
+ });
298
+
299
+ it('should report if the Version field is not provided', async () => {
300
+ const source = outdent`
301
+ swagger: '2.0'
302
+ info:
303
+ title: Example OpenAPI 3 definition.
304
+
305
+ paths:
306
+ '/ping':
307
+ get:
308
+ responses:
309
+ '200':
310
+ description: example description
311
+ `;
312
+
313
+ expect(
314
+ await lintDoc(source, {
315
+ spec: 'error',
316
+ })
317
+ ).toMatchInlineSnapshot(`
318
+ Array [
319
+ Object {
320
+ "location": "#/info",
321
+ "message": "The field \`version\` must be present on this level.",
322
+ },
323
+ ]
324
+ `);
325
+ });
326
+
327
+ it('should report if in the Version field is not string', async () => {
328
+ const source = outdent`
329
+ swagger: '2.0'
330
+ info:
331
+ version:
332
+ title: Example OpenAPI 3 definition.
333
+
334
+ paths:
335
+ '/ping':
336
+ get:
337
+ responses:
338
+ '200':
339
+ description: example description
340
+ `;
341
+
342
+ expect(
343
+ await lintDoc(source, {
344
+ spec: 'error',
345
+ })
346
+ ).toMatchInlineSnapshot(`
347
+ Array [
348
+ Object {
349
+ "location": "#/info/version",
350
+ "message": "Expected type \`string\` but got \`null\`.",
351
+ },
352
+ ]
353
+ `);
354
+ });
355
+ });
@@ -0,0 +1,123 @@
1
+ import { outdent } from 'outdent';
2
+ import { lintDoc } from './utils';
3
+
4
+ describe('OpenAPI Schema 2.0', () => {
5
+ it('should not report of a valid GET operation object', async () => {
6
+ const source = outdent`
7
+ swagger: '2.0'
8
+ info:
9
+ title: Test
10
+ version: '1.0'
11
+
12
+ paths:
13
+ '/ping':
14
+ get:
15
+ responses:
16
+ '200':
17
+ description: example description
18
+ `;
19
+
20
+ expect(
21
+ await lintDoc(source, {
22
+ spec: 'error',
23
+ })
24
+ ).toMatchInlineSnapshot(`Array []`);
25
+ });
26
+
27
+ it('should not report of a valid PUT operation object', async () => {
28
+ const source = outdent`
29
+ swagger: '2.0'
30
+ info:
31
+ title: Test
32
+ version: '1.0'
33
+
34
+ paths:
35
+ '/ping':
36
+ put:
37
+ tags:
38
+ - pet
39
+ summary: Update an existing pet
40
+ description: ''
41
+ operationId: updatePet
42
+ responses:
43
+ '400':
44
+ description: Invalid ID supplied
45
+ `;
46
+
47
+ expect(
48
+ await lintDoc(source, {
49
+ spec: 'error',
50
+ })
51
+ ).toMatchInlineSnapshot(`Array []`);
52
+ });
53
+
54
+ it('should not report of a valid Post operation object', async () => {
55
+ const source = outdent`
56
+ swagger: '2.0'
57
+ info:
58
+ title: Test
59
+ version: '1.0'
60
+
61
+ paths:
62
+ '/ping':
63
+ post:
64
+ tags:
65
+ - pet
66
+ summary: uploads an image
67
+ description: ''
68
+ operationId: uploadFile
69
+ parameters:
70
+ - name: petId
71
+ in: path
72
+ description: ID of pet to update
73
+ required: true
74
+ type: integer
75
+ format: int64
76
+ responses:
77
+ '200':
78
+ description: successful operation
79
+ `;
80
+
81
+ expect(
82
+ await lintDoc(source, {
83
+ spec: 'error',
84
+ })
85
+ ).toMatchInlineSnapshot(`Array []`);
86
+ });
87
+
88
+ it('should not report of a valid delete operation object', async () => {
89
+ const source = outdent`
90
+ swagger: '2.0'
91
+ info:
92
+ title: Test
93
+ version: '1.0'
94
+
95
+ paths:
96
+ '/ping':
97
+ delete:
98
+ tags:
99
+ - store
100
+ summary: Delete purchase order by ID
101
+ description: >-
102
+ For valid response try integer IDs with value < 1000. Anything above
103
+ 1000 or nonintegers will generate API errors
104
+ operationId: deleteOrder
105
+ parameters:
106
+ - name: orderId
107
+ in: path
108
+ description: ID of the order that needs to be deleted
109
+ required: true
110
+ type: string
111
+ minimum: 1
112
+ responses:
113
+ '400':
114
+ description: Invalid ID supplied
115
+ `;
116
+
117
+ expect(
118
+ await lintDoc(source, {
119
+ spec: 'error',
120
+ })
121
+ ).toMatchInlineSnapshot(`Array []`);
122
+ });
123
+ });