Skip to content

Commit b87c0d7

Browse files
committed
Merge branch 'hotfix/0.2.1'
2 parents 16cae5f + 99b7b48 commit b87c0d7

File tree

5 files changed

+87
-30
lines changed

5 files changed

+87
-30
lines changed

.vscode/launch.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"-m", "unittest"
1616
],
1717
"preLaunchTask": "Python: Package test linter",
18-
"postDebugTask": "Python: Package test report"
18+
"postDebugTask": "Python: Package test report passed 100%"
1919
},
2020
{
2121
"name": "RESTful API",

.vscode/tasks.json

+6
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@
6262
"command": "${command:python.interpreterPath}",
6363
"args": ["-m", "coverage", "report", "-m"]
6464
},
65+
{
66+
"label": "Python: Package test report passed 100%",
67+
"dependsOn": "Python: Package test report",
68+
"type": "shell",
69+
"command": "if [ $(${command:python.interpreterPath} -m coverage json -q -o /dev/stdout | jq .totals.percent_covered) = 100 ]; then exit; else exit 1; fi"
70+
},
6571
{
6672
"label": "Python: Package build",
6773
"type": "shell",

asicverifier/__init__.py

+24-3
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def asicverifier(
142142
member_code: str,
143143
subsystem_code: str,
144144
asice_type: AsiceType = AsiceType.REQUEST,
145-
conf_refresh: bool = None
145+
conf_refresh: bool = False
146146
) -> dict:
147147
CONF_PATH: str = (
148148
f'asicverifier/security-server/{urlparse(security_server_url).netloc}/'
@@ -161,7 +161,15 @@ def asicverifier(
161161
with ZipFile(BytesIO(response.content)) as zip_file:
162162
zip_file.extractall(CONF_PATH)
163163
except requests.exceptions.HTTPError:
164-
logging.error(f"verificationconf: '{response.text}'")
164+
logging.error(
165+
'\n'.join([
166+
f'{key}: "{value}"'
167+
for key, value in dict(
168+
security_server_url=security_server_url,
169+
verificationconf=response.text
170+
).items()
171+
])
172+
)
165173
raise
166174

167175
# Asice File
@@ -203,7 +211,20 @@ def asicverifier(
203211
proc_yes.kill()
204212
logging.debug(message)
205213
except requests.exceptions.HTTPError:
206-
logging.error(f"Asice: '{response.text}'")
214+
logging.error(
215+
'\n'.join([
216+
f'{key}: "{value}"'
217+
for key, value in dict(
218+
security_server_url=security_server_url,
219+
query_id=query_id,
220+
x_road_instance=x_road_instance,
221+
member_class=member_class,
222+
member_code=member_code,
223+
subsystem_code=subsystem_code,
224+
asice=response.text
225+
).items()
226+
])
227+
)
207228
raise
208229

209230
return extract_asice(message)

asicverifier/restful_api.py

+33-18
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
from datetime import datetime
77
from os import getenv
8-
from typing import Any, List
8+
from typing import List
99

10-
from fastapi import APIRouter, FastAPI
10+
from fastapi import APIRouter, FastAPI, HTTPException, Query
1111
from fastapi.middleware.cors import CORSMiddleware
1212
from pydantic import (
1313
BaseModel,
@@ -16,6 +16,7 @@
1616
HttpUrl,
1717
NonNegativeInt
1818
)
19+
from requests.exceptions import HTTPError
1920
import uvicorn
2021

2122
from . import AsiceType, asicverifier, META_DATA, SUMMARY
@@ -95,17 +96,16 @@ class Asice(BaseModel):
9596
file: List[AsicFile]
9697

9798

98-
StringNoneEmptySpace: Any = Field(pattern=r'^[\w\-]+$')
99+
non_empty_str: str = r'^[\w\-]+$'
99100

100101

101102
class AsicVerifier(BaseModel):
102-
security_server_url: HttpUrl
103-
query_id: str = StringNoneEmptySpace
104-
x_road_instance: str = StringNoneEmptySpace
105-
member_class: str = StringNoneEmptySpace
106-
member_code: str = StringNoneEmptySpace
107-
subsystem_code: str = StringNoneEmptySpace
108-
asice_type: AsiceType = AsiceType.REQUEST
103+
security_server_url: HttpUrl = Field(alias='securityServerUrl')
104+
query_id: str = Field(alias='queryId', pattern=non_empty_str)
105+
x_road_instance: str = Field(alias='xRoadInstance', pattern=non_empty_str)
106+
member_class: str = Field(alias='memberClass', pattern=non_empty_str)
107+
member_code: str = Field(alias='memberCode', pattern=non_empty_str)
108+
subsystem_code: str = Field(alias='subsystemCode', pattern=non_empty_str)
109109

110110

111111
class RestfulApi:
@@ -119,6 +119,16 @@ def app() -> FastAPI:
119119
api: FastAPI = FastAPI(
120120
title=SUMMARY,
121121
version=META_DATA['Version'],
122+
contact=dict(
123+
name=META_DATA['Author'],
124+
url=META_DATA['Home-page'],
125+
email=META_DATA['Author-email']
126+
),
127+
license_info=dict(
128+
name=META_DATA['License'],
129+
identifier=META_DATA['License'],
130+
url=f"{META_DATA['Home-page']}/blob/main/LICENSE"
131+
),
122132
docs_url=f'{RESTFUL_API_PATH}/docs',
123133
redoc_url=f'{RESTFUL_API_PATH}/redoc',
124134
openapi_url=f'{RESTFUL_API_PATH}/openapi.json'
@@ -138,15 +148,20 @@ def app() -> FastAPI:
138148

139149
@router.post('/')
140150
async def verifier(
141-
data: AsicVerifier, conf_refresh: bool = None
151+
data: AsicVerifier,
152+
asice_type: AsiceType = Query(
153+
None, alias='type', description='Default is request'
154+
),
155+
conf_refresh: bool = Query(None, description='Default is false')
142156
) -> Asice:
143-
return asicverifier(
144-
**{
145-
key: value if key == 'asice_type' else f'{value}'
146-
for key, value in data
147-
},
148-
conf_refresh=conf_refresh
149-
)
157+
try:
158+
return asicverifier(
159+
**{key: f'{value}' for key, value in data},
160+
asice_type=asice_type if asice_type else AsiceType.REQUEST,
161+
conf_refresh=conf_refresh
162+
)
163+
except HTTPError as error:
164+
raise HTTPException(error.response.status_code)
150165

151166
api.include_router(router, prefix=RESTFUL_API_PATH)
152167
return api

tests/test_restful_api.py

+23-8
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,31 @@ def test_app(self, _):
3535
self.assertDictEqual(
3636
client.post(
3737
'/',
38-
params={'conf_refresh': True},
38+
params={'conf_refresh': True, 'type': ASICE_TYPE.value},
3939
json={
40-
'security_server_url': URL,
41-
'query_id': QUERY_ID,
42-
'x_road_instance': X_ROAD_INSTANCE,
43-
'member_class': MEMBER_CLASS,
44-
'member_code': MEMBER_CODE,
45-
'subsystem_code': SUBSYSTEM_CODE,
46-
'asice_type': ASICE_TYPE.value
40+
'securityServerUrl': URL,
41+
'queryId': QUERY_ID,
42+
'xRoadInstance': X_ROAD_INSTANCE,
43+
'memberClass': MEMBER_CLASS,
44+
'memberCode': MEMBER_CODE,
45+
'subsystemCode': SUBSYSTEM_CODE
4746
}
4847
).json(object_hook=datetime_parser),
4948
ASIC_VERIFIER_RESPONSE
5049
)
50+
51+
with self.assertRaises(AttributeError):
52+
self.assertEqual(
53+
client.post(
54+
'/',
55+
params={'conf_refresh': True, 'type': ASICE_TYPE.value},
56+
json={
57+
'securityServerUrl': URL.replace('https', 'http'),
58+
'queryId': QUERY_ID,
59+
'xRoadInstance': X_ROAD_INSTANCE,
60+
'memberClass': MEMBER_CLASS,
61+
'memberCode': MEMBER_CODE,
62+
'subsystemCode': SUBSYSTEM_CODE
63+
}
64+
).status_code
65+
)

0 commit comments

Comments
 (0)