robotframework-openapitools 1.0.0b5__tar.gz → 1.0.1__tar.gz

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 (45) hide show
  1. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/PKG-INFO +16 -98
  2. robotframework_openapitools-1.0.1/docs/README.md +15 -0
  3. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/pyproject.toml +10 -2
  4. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiDriver/__init__.py +1 -0
  5. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiDriver/openapi_executors.py +25 -1
  6. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiDriver/openapidriver.libspec +183 -80
  7. robotframework_openapitools-1.0.1/src/OpenApiDriver/openapidriver.py +98 -0
  8. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/__init__.py +26 -0
  9. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/openapi_libcore.libspec +229 -121
  10. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/openapi_libcore.py +10 -248
  11. robotframework_openapitools-1.0.1/src/openapi_libgen/__init__.py +3 -0
  12. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/openapi_libgen/generator.py +0 -2
  13. robotframework_openapitools-1.0.1/src/openapitools_docs/docstrings.py +891 -0
  14. robotframework_openapitools-1.0.1/src/openapitools_docs/documentation_generator.py +35 -0
  15. robotframework_openapitools-1.0.1/src/openapitools_docs/templates/documentation.jinja +209 -0
  16. robotframework_openapitools-1.0.0b5/docs/README.md +0 -102
  17. robotframework_openapitools-1.0.0b5/src/OpenApiDriver/openapidriver.py +0 -369
  18. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/LICENSE +0 -0
  19. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiDriver/openapi_reader.py +0 -0
  20. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiDriver/py.typed +0 -0
  21. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/annotations.py +0 -0
  22. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/data_generation/__init__.py +0 -0
  23. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/data_generation/body_data_generation.py +0 -0
  24. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/data_generation/data_generation_core.py +0 -0
  25. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/data_invalidation.py +0 -0
  26. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/dto_base.py +0 -0
  27. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/dto_utils.py +0 -0
  28. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/localized_faker.py +0 -0
  29. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/models.py +0 -0
  30. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/oas_cache.py +0 -0
  31. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/parameter_utils.py +0 -0
  32. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/path_functions.py +0 -0
  33. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/path_invalidation.py +0 -0
  34. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/protocols.py +0 -0
  35. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/py.typed +0 -0
  36. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/request_data.py +0 -0
  37. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/resource_relations.py +0 -0
  38. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/validation.py +0 -0
  39. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/OpenApiLibCore/value_utils.py +0 -0
  40. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/openapi_libgen/command_line.py +0 -0
  41. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/openapi_libgen/parsing_utils.py +0 -0
  42. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/openapi_libgen/spec_parser.py +0 -0
  43. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/openapi_libgen/templates/__init__.jinja +0 -0
  44. {robotframework_openapitools-1.0.0b5 → robotframework_openapitools-1.0.1}/src/openapi_libgen/templates/library.jinja +0 -0
  45. {robotframework_openapitools-1.0.0b5/src/openapi_libgen → robotframework_openapitools-1.0.1/src/openapitools_docs}/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: robotframework-openapitools
3
- Version: 1.0.0b5
3
+ Version: 1.0.1
4
4
  Summary: A set of Robot Framework libraries to test APIs for which the OAS is available.
5
5
  License: Apache License
6
6
  Version 2.0, January 2004
@@ -210,6 +210,9 @@ Maintainer-email: r.a.mackaij@gmail.com
210
210
  Requires-Python: >=3.10, <4
211
211
  Classifier: Programming Language :: Python :: 3
212
212
  Classifier: Programming Language :: Python :: 3.10
213
+ Classifier: Programming Language :: Python :: 3.11
214
+ Classifier: Programming Language :: Python :: 3.12
215
+ Classifier: Programming Language :: Python :: 3.13
213
216
  Classifier: License :: OSI Approved :: Apache Software License
214
217
  Classifier: Operating System :: OS Independent
215
218
  Classifier: Topic :: Software Development :: Testing
@@ -226,109 +229,24 @@ Requires-Dist: rich_click (>=1.7.0)
226
229
  Requires-Dist: robotframework (>=6.0.0,!=7.0.0)
227
230
  Requires-Dist: robotframework-datadriver (>=1.10.0)
228
231
  Requires-Dist: rstr (>=3.2.0)
232
+ Project-URL: Documentation, https://marketsquare.github.io/robotframework-openapitools
229
233
  Project-URL: Homepage, https://github.com/MarketSquare/robotframework-openapitools
234
+ Project-URL: Repository, https://github.com/MarketSquare/robotframework-openapitools.git
230
235
  Description-Content-Type: text/markdown
231
236
 
232
- # OpenApiTools for Robot Framework
233
-
234
- OpenApiTools is a set of libraries centered around the OpenAPI Specification:
235
-
236
- - [OpenApiDriver](./driver.md)
237
- - [OpenApiLibCore](./libcore.md)
238
-
239
-
240
- ## New in OpenApiTools v1.0.0
241
-
242
- Inspired by the work Bartlomiej and Mateusz did on #roboswag, I've created a CLI tool that generates a fully functional Robot Framework (Python) library that builds on OpenApiLibCore for automatic request data generation and request execution.
243
-
244
- ### So how does it work?
245
- After installing / updating to the v1.0.0 beta (`pip install robotframework-openapitools==1.0.0b3`) , there's a new CLI command available in your (virtual) environment: `generate-library`. You'll have to provide a path to the openapi spec (json or yaml, can be a url or path to the file), provide a path to where to generate the library and (optionally) a name for the library:
246
-
247
- ```
248
- $ generate-library
249
- Please provide a source for the generation:
250
- $ http://127.0.0.1:8000/openapi.json
251
- Please provide a path to where the library will be generated:
252
- $ ./generated
253
- Please provide a name for the library [default: FastAPI]:
254
- $ My Generated Library
255
- generated/MyGeneratedLibrary/__init__.py created
256
- generated/MyGeneratedLibrary/my_generated_library.py created
257
- ```
258
-
259
- > Note: there's currently 2 environment variables that are taken into account by the generator; USE_SUMMARY_AS_KEYWORD_NAME can result in nicer keyword names (but: uniqueness is not guaranteed, so you might need to rename some of the generated keywords manually) and EXPAND_BODY_ARGUMENTS is what a recent poll in #api-testing was about.
260
-
261
- If the location where the library is located is in your Python search path, you'll be able to use it like a regular Robot Framework library (in fact, it's a drop-in replacement for OpenApiLibCore):
237
+ [![build](https://github.com/MarketSquare/robotframework-openapitools/actions/workflows/on-push.yml/badge.svg)](https://github.com/MarketSquare/robotframework-openapitools/actions/workflows/on-push.yml)
238
+ ![coverage](coverage-badge.svg)
262
239
 
263
- ```{robot}
264
- *** Settings ***
265
- Library MyGeneratedLibrary
266
- ... source=${ORIGIN}/openapi.json
267
- ... origin=${ORIGIN}
268
- ... base_path=${EMPTY}
269
- ... mappings_path=${ROOT}/tests/user_implemented/custom_user_mappings.py
270
- Variables ${ROOT}/tests/variables.py
240
+ ![latest release](https://img.shields.io/pypi/v/robotframework-openapitools?label=latest%20release)
241
+ ![Python versions](https://img.shields.io/pypi/pyversions/robotframework-openapitools)
242
+ ![PyPi downloads](https://img.shields.io/pypi/dm/robotframework-openapitools)
243
+ ![license](https://img.shields.io/pypi/l/robotframework-openapitools)
271
244
 
245
+ # OpenApiTools for Robot Framework
272
246
 
273
- *** Variables ***
274
- ${ORIGIN}= http://localhost:8000
275
-
276
-
277
- *** Test Cases ***
278
- Test Generated Keywords: Get Employees
279
- ${response}= Get Employees
280
- Should Be Equal As Integers ${response.status_code} 200
281
-
282
- Test Generated Keywords: Post Employee
283
- VAR &{body} name=Robin the Robot
284
- ${response}= Post Employee body=${body}
285
- # ${response}= Post Employee name=Robin the Robot
286
- Should Be Equal As Integers ${response.status_code} 201
287
- Should Be Equal ${response.json()}[name] Robin the Robot
288
-
289
- Test Generated Keywords: Get Employee
290
- ${response}= Get Employee
291
- Should Be Equal As Integers ${response.status_code} 200
292
-
293
- Test Generated Keywords: Patch Employee
294
- ${employee_id}= Get Valid Id For Path path=/employees/{employee_id}
295
- VAR &{body} date_of_birth=2021-12-31
296
- ${response}= Patch Employee employee_id=${employee_id} body=${body}
297
- # ${response}= Patch Employee employee_id=${employee_id} date_of_birth=2021-12-31
298
- Should Be Equal As Integers ${response.status_code} 403
299
-
300
- Test Generated Keywords: Post WageGroup
301
- VAR &{body} hourly_rate=99.99
302
- ${response}= Post Wagegroup body=${body}
303
- # ${response}= Post Wagegroup hourly_rate=99.99
304
- Should Be Equal As Integers ${response.status_code} 201
305
- Should Be Equal As Numbers ${response.json()}[hourly-rate] 99.99
306
-
307
- Test Generated Keywords: Get Energy Label
308
- ${response}= Get Energy Label
309
- ... zipcode=1111AA
310
- ... home_number=10
311
- ... extension=too long to be acceptable
312
- ... validate_against_schema=${FALSE}
313
- Should Be Equal As Integers ${response.status_code} 422
314
-
315
- VAR @{omit} extension
316
- ${response}= Get Energy Label
317
- ... zipcode=1111AA
318
- ... home_number=10
319
- ... extension=too long to be acceptable
320
- ... omit_parameters=${omit}
321
- Should Be Equal As Integers ${response.status_code} 200
322
- ```
323
-
324
- ### Contributions and feedback
247
+ If you're testing an API for which an OpenAPI specification is available (if you have a Swagger UI available, you are), OpenApiTools is for you!
325
248
 
326
- So now I need your feedback! Does the library generator work for your openapi spec? Does the library work / do all the generated keywords work? Please let me know of any issues you run into!
327
- Things I'd like to address / improve before an official release:
328
- - parameters with union types (e.g. int or float) are currently annotated as Any.
329
- - support for lists / arrays is limited (i.e. not supported as body)
330
- - objects / dicts are currently only typed as dict; I'm looking into TypedDict annotation for better auto-complete / auto-conversion
331
- - a documentation rework
249
+ To read everything about it, see the [html documentation](https://marketsquare.github.io/robotframework-openapitools).
332
250
 
333
- Subscribe to https://app.slack.com/client/T07PJQ9S7/CKK0X68KD for updates
251
+ The latest release notes can be found [here](./release_notes/1.0.1.md).
334
252
 
@@ -0,0 +1,15 @@
1
+ [![build](https://github.com/MarketSquare/robotframework-openapitools/actions/workflows/on-push.yml/badge.svg)](https://github.com/MarketSquare/robotframework-openapitools/actions/workflows/on-push.yml)
2
+ ![coverage](coverage-badge.svg)
3
+
4
+ ![latest release](https://img.shields.io/pypi/v/robotframework-openapitools?label=latest%20release)
5
+ ![Python versions](https://img.shields.io/pypi/pyversions/robotframework-openapitools)
6
+ ![PyPi downloads](https://img.shields.io/pypi/dm/robotframework-openapitools)
7
+ ![license](https://img.shields.io/pypi/l/robotframework-openapitools)
8
+
9
+ # OpenApiTools for Robot Framework
10
+
11
+ If you're testing an API for which an OpenAPI specification is available (if you have a Swagger UI available, you are), OpenApiTools is for you!
12
+
13
+ To read everything about it, see the [html documentation](https://marketsquare.github.io/robotframework-openapitools).
14
+
15
+ The latest release notes can be found [here](./release_notes/1.0.1.md).
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name="robotframework-openapitools"
3
- version = "1.0.0b5"
3
+ version = "1.0.1"
4
4
  description = "A set of Robot Framework libraries to test APIs for which the OAS is available."
5
5
  authors = [
6
6
  {name = "Robin Mackaij", email = "r.a.mackaij@gmail.com"},
@@ -13,6 +13,9 @@ license = { file = "LICENSE"}
13
13
  classifiers = [
14
14
  "Programming Language :: Python :: 3",
15
15
  "Programming Language :: Python :: 3.10",
16
+ "Programming Language :: Python :: 3.11",
17
+ "Programming Language :: Python :: 3.12",
18
+ "Programming Language :: Python :: 3.13",
16
19
  "License :: OSI Approved :: Apache Software License",
17
20
  "Operating System :: OS Independent",
18
21
  "Topic :: Software Development :: Testing",
@@ -42,6 +45,7 @@ dev = [
42
45
  "fastapi >= 0.109.0",
43
46
  "coverage[toml] >= 7.2.0",
44
47
  "robotcode-runner >= 1.0.3",
48
+ "genbadge[coverage] >= 1.1.2",
45
49
  ]
46
50
  type-checking = [
47
51
  "mypy >= 1.14.1",
@@ -58,7 +62,9 @@ lint-and-format = [
58
62
  ]
59
63
 
60
64
  [project.urls]
61
- homepage = "https://github.com/MarketSquare/robotframework-openapitools"
65
+ Homepage = "https://github.com/MarketSquare/robotframework-openapitools"
66
+ Documentation = "https://marketsquare.github.io/robotframework-openapitools"
67
+ Repository = "https://github.com/MarketSquare/robotframework-openapitools.git"
62
68
 
63
69
  [project.scripts]
64
70
  generate-library = 'openapi_libgen.command_line:main'
@@ -69,6 +75,7 @@ packages = [
69
75
  {include = "OpenApiDriver", from = "src"},
70
76
  {include = "OpenApiLibCore", from = "src"},
71
77
  {include = "openapi_libgen", from = "src"},
78
+ {include = "openapitools_docs", from = "src"}
72
79
  ]
73
80
  include = ["*.libspec", "*.jinja"]
74
81
 
@@ -79,6 +86,7 @@ uvicorn = ">=0.27.0"
79
86
  fastapi = ">=0.109.0"
80
87
  coverage = {version = ">=7.2.0", extras = ["toml"]}
81
88
  robotcode-runner = ">=1.0.3"
89
+ genbadge = {version = ">=1.1.2", extras = ["coverage"]}
82
90
 
83
91
  [tool.poetry.group.lint-and-format.dependencies]
84
92
  ruff = ">=0.9.0"
@@ -30,6 +30,7 @@ try:
30
30
  except Exception: # pragma: no cover pylint: disable=broad-exception-caught
31
31
  pass
32
32
 
33
+
33
34
  __all__ = [
34
35
  "IGNORE",
35
36
  "Dto",
@@ -2,6 +2,7 @@
2
2
 
3
3
  from collections.abc import Mapping, MutableMapping
4
4
  from http import HTTPStatus
5
+ from os import getenv
5
6
  from pathlib import Path
6
7
  from random import choice
7
8
  from types import MappingProxyType
@@ -14,13 +15,29 @@ from robot.api.deco import keyword, library
14
15
  from robot.api.exceptions import SkipExecution
15
16
  from robot.libraries.BuiltIn import BuiltIn
16
17
 
17
- from OpenApiLibCore import OpenApiLibCore, RequestData, RequestValues, ValidationLevel
18
+ from OpenApiLibCore import (
19
+ KEYWORD_NAMES as LIBCORE_KEYWORD_NAMES,
20
+ )
21
+ from OpenApiLibCore import (
22
+ OpenApiLibCore,
23
+ RequestData,
24
+ RequestValues,
25
+ ValidationLevel,
26
+ )
18
27
  from OpenApiLibCore.annotations import JSON
19
28
 
20
29
  run_keyword = BuiltIn().run_keyword
21
30
  default_str_mapping: Mapping[str, str] = MappingProxyType({})
22
31
 
23
32
 
33
+ KEYWORD_NAMES = [
34
+ "test_unauthorized",
35
+ "test_forbidden",
36
+ "test_invalid_url",
37
+ "test_endpoint",
38
+ ]
39
+
40
+
24
41
  @library(scope="SUITE", doc_format="ROBOT")
25
42
  class OpenApiExecutors(OpenApiLibCore):
26
43
  """Main class providing the keywords and core logic to perform endpoint validations."""
@@ -305,3 +322,10 @@ class OpenApiExecutors(OpenApiLibCore):
305
322
  if response.ok:
306
323
  original_data = response.json()
307
324
  return original_data
325
+
326
+ @staticmethod
327
+ def get_keyword_names() -> list[str]:
328
+ """Curated keywords for libdoc and libspec."""
329
+ if getenv("HIDE_INHERITED_KEYWORDS") == "true":
330
+ return KEYWORD_NAMES
331
+ return KEYWORD_NAMES + LIBCORE_KEYWORD_NAMES
@@ -1,11 +1,13 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
- <keywordspec name="OpenApiDriver" type="LIBRARY" format="HTML" scope="SUITE" generated="2025-06-09T18:38:35+00:00" specversion="6" source="/workspaces/robotframework-openapitools/src/OpenApiDriver/openapidriver.py" lineno="358">
3
- <version>1.0.0b5</version>
4
- <doc>&lt;p&gt;Visit the &lt;a href="https://github.com/MarketSquare/robotframework-openapidriver"&gt;library page&lt;/a&gt; for an introduction and examples.&lt;/p&gt;</doc>
2
+ <keywordspec name="OpenApiDriver" type="LIBRARY" format="HTML" scope="SUITE" generated="2025-09-12T09:00:23+00:00" specversion="6" source="/workspaces/robotframework-openapitools/src/OpenApiDriver/openapidriver.py" lineno="24">
3
+ <version>1.0.1</version>
4
+ <doc>The OpenApiDriver library provides the keywords and logic for execution of generated test cases based on an OpenAPI document.
5
+
6
+ Visit the &lt;a href="./index.html" target="_blank"&gt;OpenApiTools documentation&lt;/a&gt; for an introduction.</doc>
5
7
  <tags>
6
8
  </tags>
7
9
  <inits>
8
- <init name="__init__" lineno="150">
10
+ <init name="__init__" lineno="25">
9
11
  <arguments repr="source: str, origin: str = , base_path: str = , included_paths: Iterable[str] = frozenset(), ignored_paths: Iterable[str] = frozenset(), ignored_responses: Iterable[int] = frozenset(), ignored_testcases: Iterable[tuple[str, str, int]] = frozenset(), response_validation: ValidationLevel = WARN, disable_server_validation: bool = True, mappings_path: str | Path = , invalid_property_default_response: int = 422, default_id_property_name: str = id, faker_locale: str | list[str] = , require_body_for_invalid_url: bool = False, recursion_limit: int = 1, recursion_default: JSON = {}, username: str = , password: str = , security_token: str = , auth: AuthBase | None = None, cert: str | tuple[str, str] = , verify_tls: bool | str = True, extra_headers: Mapping[str, str] = {}, cookies: MutableMapping[str, str] | RequestsCookieJar | None = None, proxies: MutableMapping[str, str] | None = None">
10
12
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="source: str">
11
13
  <name>source</name>
@@ -180,74 +182,150 @@
180
182
  <default>None</default>
181
183
  </arg>
182
184
  </arguments>
183
- <doc>&lt;h3&gt;Base parameters&lt;/h3&gt;
184
- &lt;h4&gt;source&lt;/h4&gt;
185
- &lt;p&gt;An absolute path to an openapi.json or openapi.yaml file or an url to such a file.&lt;/p&gt;
186
- &lt;h4&gt;origin&lt;/h4&gt;
187
- &lt;p&gt;The server (and port) of the target server. E.g. &lt;code&gt;https://localhost:8000&lt;/code&gt;&lt;/p&gt;
188
- &lt;h4&gt;base_path&lt;/h4&gt;
189
- &lt;p&gt;The routing between &lt;code&gt;origin&lt;/code&gt; and the endpoints as found in the &lt;code&gt;paths&lt;/code&gt; section in the openapi document. E.g. &lt;code&gt;/petshop/v2&lt;/code&gt;.&lt;/p&gt;
190
- &lt;h3&gt;Test case generation and execution&lt;/h3&gt;
191
- &lt;h4&gt;included_paths&lt;/h4&gt;
192
- &lt;p&gt;A list of paths that will be included when generating the test cases. The &lt;code&gt;*&lt;/code&gt; character can be used at the end of a partial path to include all paths starting with the partial path (wildcard include).&lt;/p&gt;
193
- &lt;h4&gt;ignored_paths&lt;/h4&gt;
194
- &lt;p&gt;A list of paths that will be ignored when generating the test cases. The &lt;code&gt;*&lt;/code&gt; character can be used at the end of a partial path to ignore all paths starting with the partial path (wildcard ignore).&lt;/p&gt;
195
- &lt;h4&gt;ignored_responses&lt;/h4&gt;
196
- &lt;p&gt;A list of responses that will be ignored when generating the test cases.&lt;/p&gt;
197
- &lt;h4&gt;ignored_testcases&lt;/h4&gt;
198
- &lt;p&gt;A list of specific test cases that, if it would be generated, will be ignored. Specific test cases to ignore must be specified as a &lt;code&gt;tuple&lt;/code&gt; or &lt;code&gt;list&lt;/code&gt; of &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;method&lt;/code&gt; and &lt;code&gt;response&lt;/code&gt;.&lt;/p&gt;
199
- &lt;h4&gt;response_validation&lt;/h4&gt;
200
- &lt;p&gt;By default, a &lt;code&gt;WARN&lt;/code&gt; is logged when the Response received after a Request does not comply with the schema as defined in the openapi document for the given operation. The following values are supported:&lt;/p&gt;
185
+ <doc>&lt;h2&gt;Test case generation and execution&lt;/h2&gt;
186
+
187
+ &lt;h3&gt;included_paths&lt;/h3&gt;
188
+ A list of paths that will be included when generating the test cases.
189
+ The &lt;code&gt;*&lt;/code&gt; character can be used at the end of a partial path to include all paths
190
+ starting with the partial path (wildcard include).
191
+
192
+ &lt;h3&gt;ignored_paths&lt;/h3&gt;
193
+ A list of paths that will be ignored when generating the test cases.
194
+ The &lt;code&gt;*&lt;/code&gt; character can be used at the end of a partial path to ignore all paths
195
+ starting with the partial path (wildcard ignore).
196
+
197
+ &lt;h3&gt;ignored_responses&lt;/h3&gt;
198
+ A list of responses that will be ignored when generating the test cases.
199
+
200
+ &lt;h3&gt;ignored_testcases&lt;/h3&gt;
201
+ A list of specific test cases that, if it would be generated, will be ignored.
202
+ Specific test cases to ignore must be specified as a &lt;code&gt;tuple&lt;/code&gt; or
203
+ &lt;code&gt;list&lt;/code&gt; of &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;method&lt;/code&gt; and &lt;code&gt;response&lt;/code&gt;.
204
+
205
+
206
+ &lt;h2&gt;Base parameters&lt;/h2&gt;
207
+
208
+ &lt;h3&gt;source&lt;/h3&gt;
209
+ An absolute path to an openapi.json or openapi.yaml file or an url to such a file.
210
+
211
+ &lt;h3&gt;origin&lt;/h3&gt;
212
+ The server (and port) of the target server. E.g. &lt;code&gt;https://localhost:8000&lt;/code&gt;
213
+
214
+ &lt;h3&gt;base_path&lt;/h3&gt;
215
+ The routing between &lt;code&gt;origin&lt;/code&gt; and the paths as found in the &lt;code&gt;paths&lt;/code&gt;
216
+ section in the openapi document.
217
+ E.g. &lt;code&gt;/petshop/v2&lt;/code&gt;.
218
+
219
+ &lt;h2&gt;Test case execution&lt;/h2&gt;
220
+
221
+ &lt;h3&gt;response_validation&lt;/h3&gt;
222
+ By default, a &lt;code&gt;WARN&lt;/code&gt; is logged when the Response received after a Request
223
+ does not comply with the schema as defined in the OpenAPI document for the given operation.
224
+ The following values are supported:
201
225
  &lt;ul&gt;
202
226
  &lt;li&gt;&lt;code&gt;DISABLED&lt;/code&gt;: All Response validation errors will be ignored&lt;/li&gt;
203
227
  &lt;li&gt;&lt;code&gt;INFO&lt;/code&gt;: Any Response validation erros will be logged at &lt;code&gt;INFO&lt;/code&gt; level&lt;/li&gt;
204
228
  &lt;li&gt;&lt;code&gt;WARN&lt;/code&gt;: Any Response validation erros will be logged at &lt;code&gt;WARN&lt;/code&gt; level&lt;/li&gt;
205
229
  &lt;li&gt;&lt;code&gt;STRICT&lt;/code&gt;: The Test Case will fail on any Response validation errors&lt;/li&gt;
206
230
  &lt;/ul&gt;
207
- &lt;h4&gt;disable_server_validation&lt;/h4&gt;
208
- &lt;p&gt;If enabled by setting this parameter to &lt;code&gt;True&lt;/code&gt;, the Response validation will also include possible errors for Requests made to a server address that is not defined in the list of servers in the openapi document. This generally means that if there is a mismatch, every Test Case will raise this error. Note that &lt;code&gt;localhost&lt;/code&gt; and &lt;code&gt;127.0.0.1&lt;/code&gt; are not considered the same by Response validation.&lt;/p&gt;
209
- &lt;h3&gt;API-specific configurations&lt;/h3&gt;
210
- &lt;h4&gt;mappings_path&lt;/h4&gt;
211
- &lt;p&gt;See &lt;a href="https://marketsquare.github.io/robotframework-openapi-libcore/advanced_use.html"&gt;this page&lt;/a&gt; for an in-depth explanation.&lt;/p&gt;
212
- &lt;h4&gt;invalid_property_default_response&lt;/h4&gt;
213
- &lt;p&gt;The default response code for requests with a JSON body that does not comply with the schema. Example: a value outside the specified range or a string value for a property defined as integer in the schema.&lt;/p&gt;
214
- &lt;h4&gt;default_id_property_name&lt;/h4&gt;
215
- &lt;p&gt;The default name for the property that identifies a resource (i.e. a unique entity) within the API. The default value for this property name is &lt;code&gt;id&lt;/code&gt;. If the target API uses a different name for all the resources within the API, you can configure it globally using this property.&lt;/p&gt;
216
- &lt;p&gt;If different property names are used for the unique identifier for different types of resources, an &lt;code&gt;ID_MAPPING&lt;/code&gt; can be implemented using the &lt;code&gt;mappings_path&lt;/code&gt;.&lt;/p&gt;
217
- &lt;h4&gt;faker_locale&lt;/h4&gt;
218
- &lt;p&gt;A locale string or list of locale strings to pass to the Faker library to be used in generation of string data for supported format types.&lt;/p&gt;
219
- &lt;h4&gt;require_body_for_invalid_url&lt;/h4&gt;
220
- &lt;p&gt;When a request is made against an invalid url, this usually is because of a "404" request; a request for a resource that does not exist. Depending on API implementation, when a request with a missing or invalid request body is made on a non-existent resource, either a 404 or a 422 or 400 Response is normally returned. If the API being tested processes the request body before checking if the requested resource exists, set this parameter to True.&lt;/p&gt;
221
- &lt;h3&gt;Parsing parameters&lt;/h3&gt;
222
- &lt;h4&gt;recursion_limit&lt;/h4&gt;
223
- &lt;p&gt;The recursion depth to which to fully parse recursive references before the &lt;span class="name"&gt;recursion_default&lt;/span&gt; is used to end the recursion.&lt;/p&gt;
224
- &lt;h4&gt;recursion_default&lt;/h4&gt;
225
- &lt;p&gt;The value that is used instead of the referenced schema when the &lt;span class="name"&gt;recursion_limit&lt;/span&gt; has been reached. The default &lt;span class="name"&gt;{}&lt;/span&gt; represents an empty object in JSON. Depending on schema definitions, this may cause schema validation errors. If this is the case, 'None' (&lt;code&gt;${NONE}&lt;/code&gt; in Robot Framework) or an empty list can be tried as an alternative.&lt;/p&gt;
226
- &lt;h3&gt;Security-related parameters&lt;/h3&gt;
227
- &lt;p&gt;&lt;i&gt;Note: these parameters are equivalent to those in the &lt;code&gt;requests&lt;/code&gt; library.&lt;/i&gt;&lt;/p&gt;
228
- &lt;h4&gt;username&lt;/h4&gt;
229
- &lt;p&gt;The username to be used for Basic Authentication.&lt;/p&gt;
230
- &lt;h4&gt;password&lt;/h4&gt;
231
- &lt;p&gt;The password to be used for Basic Authentication.&lt;/p&gt;
232
- &lt;h4&gt;security_token&lt;/h4&gt;
233
- &lt;p&gt;The token to be used for token based security using the &lt;code&gt;Authorization&lt;/code&gt; header.&lt;/p&gt;
234
- &lt;h4&gt;auth&lt;/h4&gt;
235
- &lt;p&gt;A &lt;a href="https://requests.readthedocs.io/en/latest/api/#authentication"&gt;requests &lt;code&gt;AuthBase&lt;/code&gt; instance&lt;/a&gt; to be used for authentication instead of the &lt;code&gt;username&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt;.&lt;/p&gt;
236
- &lt;h4&gt;cert&lt;/h4&gt;
237
- &lt;p&gt;The SSL certificate to use with all requests. If string: the path to ssl client cert file (.pem). If tuple: the ('cert', 'key') pair.&lt;/p&gt;
238
- &lt;h4&gt;verify_tls&lt;/h4&gt;
239
- &lt;p&gt;Whether or not to verify the TLS / SSL certificate of the server. If boolean: whether or not to verify the server TLS certificate. If string: path to a CA bundle to use for verification.&lt;/p&gt;
240
- &lt;h4&gt;extra_headers&lt;/h4&gt;
241
- &lt;p&gt;A dictionary with extra / custom headers that will be send with every request. This parameter can be used to send headers that are not documented in the openapi document or to provide an API-key.&lt;/p&gt;
242
- &lt;h4&gt;cookies&lt;/h4&gt;
243
- &lt;p&gt;A dictionary or &lt;a href="https://docs.python.org/3/library/http.cookiejar.html#http.cookiejar.CookieJar"&gt;CookieJar object&lt;/a&gt; to send with all requests.&lt;/p&gt;
244
- &lt;h4&gt;proxies&lt;/h4&gt;
245
- &lt;p&gt;A dictionary of 'protocol': 'proxy url' to use for all requests.&lt;/p&gt;</doc>
246
- <shortdoc> == Base parameters ==</shortdoc>
231
+
232
+ &lt;h3&gt;disable_server_validation&lt;/h3&gt;
233
+ If enabled by setting this parameter to &lt;code class="language-robotframework"&gt;${TRUE}&lt;/code&gt;,
234
+ the Response validation will also include possible errors for Requests made to a server
235
+ address that is not defined in the list of servers in the OpenAPI document.
236
+ This generally means that if there is a mismatch, every Test Case will raise this error.
237
+ Note that &lt;code&gt;localhost&lt;/code&gt; and &lt;code&gt;127.0.0.1&lt;/code&gt; are not considered the same
238
+ by Response validation.
239
+
240
+ &lt;h2&gt;API-specific configurations&lt;/h2&gt;
241
+
242
+ &lt;h3&gt;mappings_path&lt;/h3&gt;
243
+ See the Advanced Use tab for an in-depth explanation.
244
+
245
+ &lt;h3&gt;invalid_property_default_response&lt;/h3&gt;
246
+ The default response code for requests with a JSON body that does not comply
247
+ with the schema.
248
+ Example: a value outside the specified range or a string value
249
+ for a property defined as integer in the schema.
250
+
251
+ &lt;h3&gt;default_id_property_name&lt;/h3&gt;
252
+ The default name for the property that identifies a resource (i.e. a unique
253
+ entity) within the API.
254
+ The default value for this property name is &lt;code&gt;id&lt;/code&gt;.
255
+ If the target API uses a different name for all the resources within the API,
256
+ you can configure it globally using this property.
257
+
258
+ If different property names are used for the unique identifier for different
259
+ types of resources, an &lt;code&gt;ID_MAPPING&lt;/code&gt; can be implemented using the &lt;code&gt;mappings_path&lt;/code&gt;.
260
+
261
+ &lt;h3&gt;faker_locale&lt;/h3&gt;
262
+ A locale string or list of locale strings to pass to the Faker library to be
263
+ used in generation of string data for supported format types.
264
+
265
+ &lt;h3&gt;require_body_for_invalid_url&lt;/h3&gt;
266
+ When a request is made against an invalid url, this usually is because of a "404" request;
267
+ a request for a resource that does not exist. Depending on API implementation, when a
268
+ request with a missing or invalid request body is made on a non-existent resource,
269
+ either a 404 or a 422 or 400 Response is normally returned. If the API being tested
270
+ processes the request body before checking if the requested resource exists, set
271
+ this parameter to True.
272
+
273
+ &lt;h2&gt;Parsing parameters&lt;/h2&gt;
274
+
275
+ &lt;h3&gt;recursion_limit&lt;/h3&gt;
276
+ The recursion depth to which to fully parse recursive references before the
277
+ &lt;code&gt;recursion_default&lt;/code&gt; is used to end the recursion.
278
+
279
+ &lt;h3&gt;recursion_default&lt;/h3&gt;
280
+ The value that is used instead of the referenced schema when the
281
+ &lt;code&gt;recursion_limit&lt;/code&gt; has been reached.
282
+ The default &lt;code class="language-python"&gt;{}&lt;/code&gt; represents an empty object in JSON.
283
+ Depending on schema definitions, this may cause schema validation errors.
284
+ If this is the case &lt;code class="language-robotframework"&gt;${NONE}&lt;/code&gt; or an empty list
285
+ can be tried as an alternative.
286
+
287
+ &lt;h2&gt;Security-related parameters&lt;/h2&gt;
288
+ &lt;blockquote&gt;&lt;i&gt;Note: these parameters are equivalent to those in the &lt;code&gt;requests&lt;/code&gt; library.&lt;/i&gt;&lt;/blockquote&gt;
289
+
290
+ &lt;h3&gt;username&lt;/h3&gt;
291
+ The username to be used for Basic Authentication.
292
+
293
+ &lt;h3&gt;password&lt;/h3&gt;
294
+ The password to be used for Basic Authentication.
295
+
296
+ &lt;h3&gt;security_token&lt;/h3&gt;
297
+ The token to be used for token based security using the &lt;code&gt;Authorization&lt;/code&gt; header.
298
+
299
+ &lt;h3&gt;auth&lt;/h3&gt;
300
+ A &lt;a href="https://requests.readthedocs.io/en/latest/api/#authentication" target="_blank"&gt;requests &lt;code&gt;AuthBase&lt;/code&gt; instance&lt;/a&gt; to be used for authentication instead of the &lt;code&gt;username&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt;.
301
+
302
+ &lt;h3&gt;cert&lt;/h3&gt;
303
+ The SSL certificate to use with all requests.
304
+ If string: the path to ssl client cert file (&lt;code&gt;.pem&lt;/code&gt;).
305
+ If tuple: the &lt;code class="language-python"&gt;("cert", "key")&lt;/code&gt; pair.
306
+
307
+ &lt;h3&gt;verify_tls&lt;/h3&gt;
308
+ Whether or not to verify the TLS / SSL certificate of the server.
309
+ If boolean: whether or not to verify the server TLS certificate.
310
+ If string: path to a CA bundle to use for verification.
311
+
312
+ &lt;h3&gt;extra_headers&lt;/h3&gt;
313
+ A dictionary with extra / custom headers that will be send with every request.
314
+ This parameter can be used to send headers that are not documented in the
315
+ openapi document or to provide an API-key.
316
+
317
+ &lt;h3&gt;cookies&lt;/h3&gt;
318
+ A dictionary or
319
+ &lt;a href="https://docs.python.org/3/library/http.cookiejar.html#http.cookiejar.CookieJar" target="_blank"&gt;&lt;code&gt;CookieJar&lt;/code&gt; object&lt;/a&gt;
320
+ to send with all requests.
321
+
322
+ &lt;h3&gt;proxies&lt;/h3&gt;
323
+ A dictionary of &lt;code&gt;"protocol": "proxy url"&lt;/code&gt; to use for all requests.</doc>
324
+ <shortdoc>&lt;h2&gt;Test case generation and execution&lt;/h2&gt;</shortdoc>
247
325
  </init>
248
326
  </inits>
249
327
  <keywords>
250
- <kw name="Test Endpoint" source="/workspaces/robotframework-openapitools/src/OpenApiDriver/openapi_executors.py" lineno="166">
328
+ <kw name="Test Endpoint" source="/workspaces/robotframework-openapitools/src/OpenApiDriver/openapi_executors.py" lineno="183">
251
329
  <arguments repr="path: str, method: str, status_code: int">
252
330
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="path: str">
253
331
  <name>path</name>
@@ -262,12 +340,17 @@
262
340
  <type name="int" typedoc="integer"/>
263
341
  </arg>
264
342
  </arguments>
265
- <doc>&lt;p&gt;Validate that performing the &lt;span class="name"&gt;method&lt;/span&gt; operation on &lt;a href="#type-Path" class="name"&gt;path&lt;/a&gt; results in a &lt;span class="name"&gt;status_code&lt;/span&gt; response.&lt;/p&gt;
266
- &lt;p&gt;This is the main keyword to be used in the &lt;span class="name"&gt;Test Template&lt;/span&gt; keyword when using the OpenApiDriver.&lt;/p&gt;
267
- &lt;p&gt;The keyword calls other keywords to generate the neccesary data to perform the desired operation and validate the response against the openapi document.&lt;/p&gt;</doc>
343
+ <doc>Validate that performing the &lt;span class="name"&gt;method&lt;/span&gt; operation on &lt;a href="#type-Path" class="name"&gt;path&lt;/a&gt; results in a
344
+ &lt;span class="name"&gt;status_code&lt;/span&gt; response.
345
+
346
+ This is the main keyword to be used in the &lt;span class="name"&gt;Test Template&lt;/span&gt; keyword when using
347
+ the OpenApiDriver.
348
+
349
+ The keyword calls other keywords to generate the neccesary data to perform
350
+ the desired operation and validate the response against the openapi document.</doc>
268
351
  <shortdoc>Validate that performing the `method` operation on `path` results in a `status_code` response.</shortdoc>
269
352
  </kw>
270
- <kw name="Test Forbidden" source="/workspaces/robotframework-openapitools/src/OpenApiDriver/openapi_executors.py" lineno="98">
353
+ <kw name="Test Forbidden" source="/workspaces/robotframework-openapitools/src/OpenApiDriver/openapi_executors.py" lineno="115">
271
354
  <arguments repr="path: str, method: str">
272
355
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="path: str">
273
356
  <name>path</name>
@@ -278,12 +361,17 @@
278
361
  <type name="str" typedoc="string"/>
279
362
  </arg>
280
363
  </arguments>
281
- <doc>&lt;p&gt;Perform a request for &lt;span class="name"&gt;method&lt;/span&gt; on the &lt;a href="#type-Path" class="name"&gt;path&lt;/a&gt;, with the provided authorization.&lt;/p&gt;
282
- &lt;p&gt;This keyword only passes if the response code is 403: Forbidden.&lt;/p&gt;
283
- &lt;p&gt;For this keyword to pass, the authorization parameters used to initialize the library should grant insufficient access rights to the target endpoint. &amp;gt; Note: No headers or (json) body are send with the request. For security reasons, the access rights validation should be checked first.&lt;/p&gt;</doc>
364
+ <doc>Perform a request for &lt;span class="name"&gt;method&lt;/span&gt; on the &lt;a href="#type-Path" class="name"&gt;path&lt;/a&gt;, with the provided authorization.
365
+
366
+ This keyword only passes if the response code is 403: Forbidden.
367
+
368
+ For this keyword to pass, the authorization parameters used to initialize the
369
+ library should grant insufficient access rights to the target endpoint.
370
+ &gt; Note: No headers or (json) body are send with the request. For security
371
+ reasons, the access rights validation should be checked first.</doc>
284
372
  <shortdoc>Perform a request for `method` on the `path`, with the provided authorization.</shortdoc>
285
373
  </kw>
286
- <kw name="Test Invalid Url" source="/workspaces/robotframework-openapitools/src/OpenApiDriver/openapi_executors.py" lineno="115">
374
+ <kw name="Test Invalid Url" source="/workspaces/robotframework-openapitools/src/OpenApiDriver/openapi_executors.py" lineno="132">
287
375
  <arguments repr="path: str, method: str, expected_status_code: int = 404">
288
376
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="path: str">
289
377
  <name>path</name>
@@ -299,13 +387,23 @@
299
387
  <default>404</default>
300
388
  </arg>
301
389
  </arguments>
302
- <doc>&lt;p&gt;Perform a request for the provided 'path' and 'method' where the url for the &lt;a href="#type-Path" class="name"&gt;path&lt;/a&gt; is invalidated.&lt;/p&gt;
303
- &lt;p&gt;This keyword will be &lt;span class="name"&gt;SKIPPED&lt;/span&gt; if the path contains no parts that can be invalidated and there is no mapping for a PathPropertiesConstraint for the &lt;span class="name"&gt;expected_status_code&lt;/span&gt;.&lt;/p&gt;
304
- &lt;p&gt;The optional &lt;span class="name"&gt;expected_status_code&lt;/span&gt; parameter (default: 404) can be set to the expected status code for APIs that do not return a 404 on invalid urls.&lt;/p&gt;
305
- &lt;p&gt;&amp;gt; Note: Depending on API design, the url may be validated before or after validation of headers, query parameters and / or (json) body. By default, no parameters are send with the request. The &lt;span class="name"&gt;require_body_for_invalid_url&lt;/span&gt; parameter can be set to &lt;span class="name"&gt;True&lt;/span&gt; if needed.&lt;/p&gt;</doc>
390
+ <doc>Perform a request for the provided 'path' and 'method' where the url for
391
+ the &lt;a href="#type-Path" class="name"&gt;path&lt;/a&gt; is invalidated.
392
+
393
+ This keyword will be &lt;span class="name"&gt;SKIPPED&lt;/span&gt; if the path contains no parts
394
+ that can be invalidated and there is no mapping for a
395
+ PathPropertiesConstraint for the &lt;span class="name"&gt;expected_status_code&lt;/span&gt;.
396
+
397
+ The optional &lt;span class="name"&gt;expected_status_code&lt;/span&gt; parameter (default: 404) can be set to the
398
+ expected status code for APIs that do not return a 404 on invalid urls.
399
+
400
+ &gt; Note: Depending on API design, the url may be validated before or after
401
+ validation of headers, query parameters and / or (json) body. By default, no
402
+ parameters are send with the request. The &lt;span class="name"&gt;require_body_for_invalid_url&lt;/span&gt;
403
+ parameter can be set to &lt;span class="name"&gt;True&lt;/span&gt; if needed.</doc>
306
404
  <shortdoc>Perform a request for the provided 'path' and 'method' where the url for the `path` is invalidated.</shortdoc>
307
405
  </kw>
308
- <kw name="Test Unauthorized" source="/workspaces/robotframework-openapitools/src/OpenApiDriver/openapi_executors.py" lineno="77">
406
+ <kw name="Test Unauthorized" source="/workspaces/robotframework-openapitools/src/OpenApiDriver/openapi_executors.py" lineno="94">
309
407
  <arguments repr="path: str, method: str">
310
408
  <arg kind="POSITIONAL_OR_NAMED" required="true" repr="path: str">
311
409
  <name>path</name>
@@ -316,9 +414,14 @@
316
414
  <type name="str" typedoc="string"/>
317
415
  </arg>
318
416
  </arguments>
319
- <doc>&lt;p&gt;Perform a request for &lt;span class="name"&gt;method&lt;/span&gt; on the &lt;a href="#type-Path" class="name"&gt;path&lt;/a&gt;, with no authorization.&lt;/p&gt;
320
- &lt;p&gt;This keyword only passes if the response code is 401: Unauthorized.&lt;/p&gt;
321
- &lt;p&gt;Any authorization parameters used to initialize the library are ignored for this request. &amp;gt; Note: No headers or (json) body are send with the request. For security reasons, the authorization validation should be checked first.&lt;/p&gt;</doc>
417
+ <doc>Perform a request for &lt;span class="name"&gt;method&lt;/span&gt; on the &lt;a href="#type-Path" class="name"&gt;path&lt;/a&gt;, with no authorization.
418
+
419
+ This keyword only passes if the response code is 401: Unauthorized.
420
+
421
+ Any authorization parameters used to initialize the library are
422
+ ignored for this request.
423
+ &gt; Note: No headers or (json) body are send with the request. For security
424
+ reasons, the authorization validation should be checked first.</doc>
322
425
  <shortdoc>Perform a request for `method` on the `path`, with no authorization.</shortdoc>
323
426
  </kw>
324
427
  </keywords>
@@ -421,7 +524,7 @@
421
524
  </usages>
422
525
  </type>
423
526
  <type name="ValidationLevel" type="Enum">
424
- <doc>&lt;p&gt;The available levels for the response_validation parameter.&lt;/p&gt;</doc>
527
+ <doc>The available levels for the response_validation parameter.</doc>
425
528
  <accepts>
426
529
  <type>string</type>
427
530
  </accepts>