Skip to content

Commit 84fab38

Browse files
committedJan 14, 2021
Properly check for positive int
1 parent ab88153 commit 84fab38

File tree

4 files changed

+90
-4
lines changed

4 files changed

+90
-4
lines changed
 

‎.coveragerc

+1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ omit = pyxelrest/generated/*
33

44
[report]
55
exclude_lines =
6+
pragma: no cover
67
if __name__ == .__main__.:

‎pyxelrest/_common.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import re
33
import os
44
import time
5+
from abc import ABC, abstractmethod
56
from typing import Optional, Union, List, Any, Dict
67

78

@@ -83,7 +84,7 @@ def allow_parameter(self, parameter_name: str) -> bool:
8384
return True
8485

8586

86-
class UDFParameter:
87+
class UDFParameter(ABC):
8788
def __init__(
8889
self,
8990
name: str,
@@ -116,8 +117,11 @@ def validate_required(self, value: Any, request_content: "RequestContent"):
116117
raise self._not_provided()
117118
self.validate_optional(value, request_content)
118119

119-
def validate_optional(self, value: Any, request_content: "RequestContent"):
120-
pass
120+
@abstractmethod
121+
def validate_optional(
122+
self, value: Any, request_content: "RequestContent"
123+
): # pragma: no cover
124+
...
121125

122126
def _not_provided(self) -> Exception:
123127
return Exception(f"{self.name} is required.")
@@ -184,7 +188,7 @@ def _to_positive_int(value: Union[str, int]) -> Optional[int]:
184188
if value:
185189
try:
186190
value = int(value)
187-
return value if value else None
191+
return value if value > 0 else None
188192
except ValueError:
189193
logger.warning(
190194
f"Invalid positive value provided: {value}. Considering as not set."

‎tests/test_invalid_parameter.py

+43
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,46 @@ def test_parameter_cannot_be_parsed(responses: RequestsMock, tmpdir):
4646
str(exception_info.value)
4747
== "Unable to extract parameters from {'in': 'query', 'name': 'param', 'schema': {}, 'server_param_name': 'param'}"
4848
)
49+
50+
51+
def test_parameter_with_more_than_one_field_type(responses: RequestsMock, tmpdir):
52+
responses.add(
53+
responses.GET,
54+
url="http://test/",
55+
json={
56+
"swagger": "2.0",
57+
"paths": {
58+
"/test": {
59+
"get": {
60+
"parameters": [
61+
{
62+
"in": "query",
63+
"name": "param",
64+
"type": ["string", "integer"],
65+
}
66+
],
67+
"responses": {
68+
"200": {
69+
"description": "return value",
70+
}
71+
},
72+
}
73+
}
74+
},
75+
},
76+
match_querystring=True,
77+
)
78+
with pytest.raises(Exception) as exception_info:
79+
loader.load(
80+
tmpdir,
81+
{
82+
"invalid": {
83+
"open_api": {"definition": "http://test/"},
84+
"formulas": {"dynamic_array": {"lock_excel": True}},
85+
}
86+
},
87+
)
88+
assert (
89+
str(exception_info.value)
90+
== "Unable to guess field type amongst ['string', 'integer']"
91+
)

‎tests/test_legacy_array.py

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from responses import RequestsMock
2+
3+
from tests import loader
4+
5+
6+
def test_formula_prefix(responses: RequestsMock, tmpdir):
7+
responses.add(
8+
responses.GET,
9+
url="http://test/",
10+
json={
11+
"swagger": "2.0",
12+
"paths": {
13+
"/test": {
14+
"get": {
15+
"responses": {200: {"description": "successful operation"}},
16+
}
17+
}
18+
},
19+
},
20+
match_querystring=True,
21+
)
22+
generated_functions = loader.load(
23+
tmpdir,
24+
{
25+
"legacy": {
26+
"open_api": {"definition": "http://test/"},
27+
"formulas": {"legacy_array": {"lock_excel": True}},
28+
}
29+
},
30+
)
31+
32+
responses.add(
33+
responses.GET,
34+
url="http://test/test",
35+
json={},
36+
match_querystring=True,
37+
)
38+
assert generated_functions.legacy_legacy_get_test() == [[""]]

0 commit comments

Comments
 (0)
Please sign in to comment.