support primitive responses for JsonApiCondition

pull/3554/head
KPrasch 2024-07-03 16:39:40 +08:00 committed by derekpierre
parent 3f2e3df059
commit c8e7d5eac3
No known key found for this signature in database
2 changed files with 17 additions and 2 deletions

View File

@ -51,7 +51,7 @@ class JsonApiCondition(AccessControlCondition):
)
parameters = fields.Dict(required=False)
endpoint = Url(required=True, relative=False, schemes=["https"])
query = JSONPathField(required=True)
query = JSONPathField(required=False, allow_none=True)
return_value_test = fields.Nested(
ReturnValueTest.ReturnValueTestSchema(), required=True
)
@ -63,8 +63,8 @@ class JsonApiCondition(AccessControlCondition):
def __init__(
self,
endpoint: str,
query: Optional[str],
return_value_test: ReturnValueTest,
query: Optional[str] = None,
parameters: Optional[dict] = None,
condition_type: str = ConditionType.JSONAPI.value,
):
@ -131,6 +131,8 @@ class JsonApiCondition(AccessControlCondition):
return data
def query_response(self, data: Any) -> Any:
if not self.query:
return data # primitive value
try:
expression = parse(self.query)
matches = expression.find(data)

View File

@ -65,6 +65,19 @@ def test_https_enforcement():
assert "Not a valid URL" in str(excinfo.value)
def test_json_api_condition_with_primitive_response(mocker):
mock_response = mocker.Mock(status_code=200)
mock_response.json.return_value = 1
mocker.patch("requests.get", return_value=mock_response)
condition = JsonApiCondition(
endpoint="https://api.example.com/data",
return_value_test=ReturnValueTest("==", 1),
)
success, result = condition.verify()
assert success is True
def test_json_api_condition_fetch(mocker):
mock_response = mocker.Mock(status_code=200)
mock_response.json.return_value = {"store": {"book": [{"title": "Test Title"}]}}