Skip to content

Commit dd18db9

Browse files
committed
fix anonymous security alternatives
1 parent ee9a8c4 commit dd18db9

2 files changed

Lines changed: 51 additions & 1 deletion

File tree

openapi_python_client/parser/openapi.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@
3030
_PATH_PARAM_REGEX = re.compile("{([a-zA-Z_-][a-zA-Z0-9_-]*)}")
3131

3232

33+
def requires_authenticated_client(security: list[dict[str, list[str]]] | None) -> bool:
34+
"""Return false when an operation permits anonymous access."""
35+
if not security:
36+
return False
37+
return not any(not requirement for requirement in security)
38+
39+
3340
def import_string_from_class(class_: Class, prefix: str = "") -> str:
3441
"""Create a string which is used to import a reference"""
3542
return f"from {prefix}.{class_.module_name} import {class_.name}"
@@ -420,7 +427,7 @@ def from_data(
420427
summary=utils.remove_string_escapes(data.summary) if data.summary else "",
421428
description=utils.remove_string_escapes(data.description) if data.description else "",
422429
name=name,
423-
requires_security=bool(data.security),
430+
requires_security=requires_authenticated_client(data.security),
424431
tags=tags,
425432
)
426433

tests/test_parser/test_openapi.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,49 @@ def test_from_data_no_security(self, mocker, config):
555555
config=config,
556556
)
557557

558+
@pytest.mark.parametrize(
559+
("security", "expected_requires_security"),
560+
[
561+
([{}], False),
562+
([{"apiKey": []}, {}], False),
563+
([{"apiKey": []}], True),
564+
],
565+
)
566+
def test_from_data_security_allows_anonymous_alternative(
567+
self,
568+
security,
569+
expected_requires_security,
570+
mocker,
571+
config,
572+
):
573+
data = oai.Operation.model_construct(
574+
description=mocker.MagicMock(),
575+
operationId=mocker.MagicMock(),
576+
security=security,
577+
responses=mocker.MagicMock(),
578+
)
579+
add_parameters = mocker.patch.object(
580+
Endpoint, "add_parameters", return_value=(mocker.MagicMock(), mocker.MagicMock(), mocker.MagicMock())
581+
)
582+
mocker.patch.object(Endpoint, "_add_responses", return_value=(mocker.MagicMock(), mocker.MagicMock()))
583+
path = mocker.MagicMock()
584+
method = mocker.MagicMock()
585+
mocker.patch("openapi_python_client.utils.remove_string_escapes", return_value=data.description)
586+
587+
Endpoint.from_data(
588+
data=data,
589+
path=path,
590+
method=method,
591+
tags=["default"],
592+
schemas=mocker.MagicMock(),
593+
responses={},
594+
parameters=mocker.MagicMock(),
595+
config=config,
596+
request_bodies={},
597+
)
598+
599+
assert add_parameters.call_args.kwargs["endpoint"].requires_security is expected_requires_security
600+
558601
def test_from_data_some_bad_bodies(self, config):
559602
endpoint, _, _ = Endpoint.from_data(
560603
data=oai.Operation(

0 commit comments

Comments
 (0)