aletrn commited on
Commit
238719b
·
1 Parent(s): 5b77c7a

[test] add get_parsed_bbox_points test case, refactor test structure

Browse files
src/app.py CHANGED
@@ -1,120 +1,11 @@
1
- import json
2
  import time
3
  from http import HTTPStatus
4
- from typing import Dict, List
5
 
6
- from aws_lambda_powertools.event_handler import content_types
7
  from aws_lambda_powertools.utilities.typing import LambdaContext
8
- from aws_lambda_powertools.utilities.parser import BaseModel
9
 
10
  from src import app_logger
11
- from src.io.coordinates_pixel_conversion import get_latlng_to_pixel_coordinates
12
  from src.prediction_api.predictors import samexporter_predict
13
- from src.utilities.constants import CUSTOM_RESPONSE_MESSAGES, DEFAULT_LOG_LEVEL
14
- from src.utilities.utilities import base64_decode
15
-
16
-
17
- list_float = List[float]
18
- llist_float = List[list_float]
19
-
20
-
21
- class LatLngDict(BaseModel):
22
- lat: float
23
- lng: float
24
-
25
-
26
- class RawBBox(BaseModel):
27
- ne: LatLngDict
28
- sw: LatLngDict
29
-
30
-
31
- class RawPrompt(BaseModel):
32
- type: str
33
- data: LatLngDict
34
- label: int = 0
35
-
36
-
37
- class RawRequestInput(BaseModel):
38
- bbox: RawBBox
39
- prompt: RawPrompt
40
- zoom: int | float
41
- source_type: str = "Satellite"
42
-
43
-
44
- class ParsedPrompt(BaseModel):
45
- type: str
46
- data: llist_float
47
- label: int = 0
48
-
49
-
50
- class ParsedRequestInput(BaseModel):
51
- bbox: llist_float
52
- prompt: ParsedPrompt
53
- zoom: int | float
54
-
55
-
56
- def get_response(status: int, start_time: float, request_id: str, response_body: Dict = None) -> str:
57
- """
58
- Return a response for frontend clients.
59
-
60
- Args:
61
- status: status response
62
- start_time: request start time (float)
63
- request_id: str
64
- response_body: dict we embed into our response
65
-
66
- Returns:
67
- str: json response
68
-
69
- """
70
- app_logger.debug(f"response_body:{response_body}.")
71
- response_body["duration_run"] = time.time() - start_time
72
- response_body["message"] = CUSTOM_RESPONSE_MESSAGES[status]
73
- response_body["request_id"] = request_id
74
-
75
- response = {
76
- "statusCode": status,
77
- "header": {"Content-Type": content_types.APPLICATION_JSON},
78
- "body": json.dumps(response_body),
79
- "isBase64Encoded": False
80
- }
81
- app_logger.debug(f"response type:{type(response)} => {response}.")
82
- return json.dumps(response)
83
-
84
-
85
- def get_parsed_bbox_points(request_input: RawRequestInput) -> Dict:
86
- app_logger.info(f"try to parsing input request {request_input}...")
87
- bbox = request_input["bbox"]
88
- app_logger.debug(f"request bbox: {type(bbox)}, value:{bbox}.")
89
- ne = bbox["ne"]
90
- sw = bbox["sw"]
91
- app_logger.debug(f"request ne: {type(ne)}, value:{ne}.")
92
- app_logger.debug(f"request sw: {type(sw)}, value:{sw}.")
93
- ne_latlng = [float(ne["lat"]), float(ne["lng"])]
94
- sw_latlng = [float(sw["lat"]), float(sw["lng"])]
95
- bbox = [ne_latlng, sw_latlng]
96
- zoom = int(request_input["zoom"])
97
- for prompt in request_input["prompt"]:
98
- app_logger.debug(f"current prompt: {type(prompt)}, value:{prompt}.")
99
- data = prompt["data"]
100
- if prompt["type"] == "point":
101
- current_point = get_latlng_to_pixel_coordinates(ne, sw, data, zoom, "point")
102
- app_logger.debug(f"current prompt: {type(current_point)}, value:{current_point}.")
103
- new_prompt_data = [current_point['x'], current_point['y']]
104
- app_logger.debug(f"new_prompt_data: {type(new_prompt_data)}, value:{new_prompt_data}.")
105
- prompt["data"] = new_prompt_data
106
- else:
107
- raise ValueError("valid prompt type is only 'point'")
108
-
109
- app_logger.debug(f"bbox => {bbox}.")
110
- app_logger.debug(f'request_input-prompt updated => {request_input["prompt"]}.')
111
-
112
- app_logger.info(f"unpacking elaborated {request_input}...")
113
- return {
114
- "bbox": bbox,
115
- "prompt": request_input["prompt"],
116
- "zoom": zoom
117
- }
118
 
119
 
120
  def lambda_handler(event: dict, context: LambdaContext):
@@ -125,7 +16,7 @@ def lambda_handler(event: dict, context: LambdaContext):
125
  app_logger.info(f"event version: {event['version']}.")
126
 
127
  try:
128
- body = get_parsed_request_body(context, event)
129
 
130
  try:
131
  prompt_latlng = body["prompt"]
@@ -144,28 +35,3 @@ def lambda_handler(event: dict, context: LambdaContext):
144
 
145
  app_logger.info(f"response_dumped:{response}...")
146
  return response
147
-
148
-
149
- def get_parsed_request_body(context, event):
150
- app_logger.info(f"event:{json.dumps(event)}...")
151
- app_logger.info(f"context:{context}...")
152
- try:
153
- body = event["body"]
154
- except Exception as e_constants1:
155
- app_logger.error(f"e_constants1:{e_constants1}.")
156
- body = event
157
- app_logger.debug(f"body, #1: {type(body)}, {body}...")
158
- if isinstance(body, str):
159
- body_decoded_str = base64_decode(body)
160
- app_logger.debug(f"body_decoded_str: {type(body_decoded_str)}, {body_decoded_str}...")
161
- body = json.loads(body_decoded_str)
162
- app_logger.info(f"body, #2: {type(body)}, {body}...")
163
- try:
164
- log_level = 'DEBUG' if body['debug'] else DEFAULT_LOG_LEVEL
165
- app_logger.warning(f"set logger level to DEBUG")
166
- app_logger.setLevel(log_level)
167
- except KeyError:
168
- app_logger.warning(f"can't set log level, reset it...")
169
- app_logger.setLevel(DEFAULT_LOG_LEVEL)
170
- app_logger.warning(f"logger level is {app_logger.log_level}.")
171
- return body
 
 
1
  import time
2
  from http import HTTPStatus
 
3
 
 
4
  from aws_lambda_powertools.utilities.typing import LambdaContext
 
5
 
6
  from src import app_logger
7
+ from src.io.lambda_helpers import get_parsed_request_body, get_parsed_bbox_points, get_response
8
  from src.prediction_api.predictors import samexporter_predict
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
 
11
  def lambda_handler(event: dict, context: LambdaContext):
 
16
  app_logger.info(f"event version: {event['version']}.")
17
 
18
  try:
19
+ body = get_parsed_request_body(event, context)
20
 
21
  try:
22
  prompt_latlng = body["prompt"]
 
35
 
36
  app_logger.info(f"response_dumped:{response}...")
37
  return response
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/io/lambda_helpers.py ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import time
3
+ from typing import Dict
4
+
5
+ from aws_lambda_powertools.event_handler import content_types
6
+
7
+ from src import app_logger
8
+ from src.io.coordinates_pixel_conversion import get_latlng_to_pixel_coordinates
9
+ from src.utilities.constants import CUSTOM_RESPONSE_MESSAGES, DEFAULT_LOG_LEVEL
10
+ from src.utilities.type_hints import RawRequestInput
11
+ from src.utilities.utilities import base64_decode, LogArgumentsDecorator
12
+
13
+
14
+ def get_response(status: int, start_time: float, request_id: str, response_body: Dict = None) -> str:
15
+ """
16
+ Return a response for frontend clients.
17
+
18
+ Args:
19
+ status: status response
20
+ start_time: request start time (float)
21
+ request_id: str
22
+ response_body: dict we embed into our response
23
+
24
+ Returns:
25
+ str: json response
26
+
27
+ """
28
+ app_logger.debug(f"response_body:{response_body}.")
29
+ response_body["duration_run"] = time.time() - start_time
30
+ response_body["message"] = CUSTOM_RESPONSE_MESSAGES[status]
31
+ response_body["request_id"] = request_id
32
+
33
+ response = {
34
+ "statusCode": status,
35
+ "header": {"Content-Type": content_types.APPLICATION_JSON},
36
+ "body": json.dumps(response_body),
37
+ "isBase64Encoded": False
38
+ }
39
+ app_logger.debug(f"response type:{type(response)} => {response}.")
40
+ return json.dumps(response)
41
+
42
+
43
+ def get_parsed_bbox_points(request_input: RawRequestInput) -> Dict:
44
+ app_logger.info(f"try to parsing input request {request_input}...")
45
+ bbox = request_input["bbox"]
46
+ app_logger.debug(f"request bbox: {type(bbox)}, value:{bbox}.")
47
+ ne = bbox["ne"]
48
+ sw = bbox["sw"]
49
+ app_logger.debug(f"request ne: {type(ne)}, value:{ne}.")
50
+ app_logger.debug(f"request sw: {type(sw)}, value:{sw}.")
51
+ ne_latlng = [float(ne["lat"]), float(ne["lng"])]
52
+ sw_latlng = [float(sw["lat"]), float(sw["lng"])]
53
+ bbox = [ne_latlng, sw_latlng]
54
+ zoom = int(request_input["zoom"])
55
+ for prompt in request_input["prompt"]:
56
+ app_logger.debug(f"current prompt: {type(prompt)}, value:{prompt}.")
57
+ data = prompt["data"]
58
+ if prompt["type"] == "point":
59
+ current_point = get_latlng_to_pixel_coordinates(ne, sw, data, zoom, "point")
60
+ app_logger.debug(f"current prompt: {type(current_point)}, value:{current_point}.")
61
+ new_prompt_data = [current_point['x'], current_point['y']]
62
+ app_logger.debug(f"new_prompt_data: {type(new_prompt_data)}, value:{new_prompt_data}.")
63
+ prompt["data"] = new_prompt_data
64
+ else:
65
+ raise ValueError("valid prompt type is only 'point'")
66
+
67
+ app_logger.debug(f"bbox => {bbox}.")
68
+ app_logger.debug(f'request_input-prompt updated => {request_input["prompt"]}.')
69
+
70
+ app_logger.info(f"unpacking elaborated {request_input}...")
71
+ return {
72
+ "bbox": bbox,
73
+ "prompt": request_input["prompt"],
74
+ "zoom": zoom
75
+ }
76
+
77
+
78
+ def get_parsed_request_body(event, context):
79
+ app_logger.info(f"event:{json.dumps(event)}...")
80
+ app_logger.info(f"context:{context}...")
81
+ try:
82
+ body = event["body"]
83
+ except Exception as e_constants1:
84
+ app_logger.error(f"e_constants1:{e_constants1}.")
85
+ body = event
86
+ app_logger.debug(f"body, #1: {type(body)}, {body}...")
87
+ if isinstance(body, str):
88
+ body_decoded_str = base64_decode(body)
89
+ app_logger.debug(f"body_decoded_str: {type(body_decoded_str)}, {body_decoded_str}...")
90
+ body = json.loads(body_decoded_str)
91
+ app_logger.info(f"body, #2: {type(body)}, {body}...")
92
+ try:
93
+ log_level = 'DEBUG' if body['debug'] else DEFAULT_LOG_LEVEL
94
+ app_logger.warning(f"set logger level to DEBUG")
95
+ app_logger.setLevel(log_level)
96
+ except KeyError:
97
+ app_logger.warning(f"can't set log level, reset it...")
98
+ app_logger.setLevel(DEFAULT_LOG_LEVEL)
99
+ app_logger.warning(f"logger level is {app_logger.log_level}.")
100
+ return body
src/utilities/type_hints.py CHANGED
@@ -1,11 +1,48 @@
1
  """custom type hints"""
 
2
  from typing import TypedDict
3
 
4
 
5
  ts_dict_str2 = dict[str, str]
6
  ts_dict_str3 = dict[str, str, any]
7
  ts_ddict1 = dict[str, dict[str, any], dict, dict, any]
8
- # ts_list_float = list[float, float]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
 
11
  class PixelCoordinate(TypedDict):
 
1
  """custom type hints"""
2
+ from pydantic import BaseModel
3
  from typing import TypedDict
4
 
5
 
6
  ts_dict_str2 = dict[str, str]
7
  ts_dict_str3 = dict[str, str, any]
8
  ts_ddict1 = dict[str, dict[str, any], dict, dict, any]
9
+ list_float = list[float]
10
+ llist_float = list[list_float]
11
+
12
+
13
+ class LatLngDict(BaseModel):
14
+ lat: float
15
+ lng: float
16
+
17
+
18
+ class RawBBox(BaseModel):
19
+ ne: LatLngDict
20
+ sw: LatLngDict
21
+
22
+
23
+ class RawPrompt(BaseModel):
24
+ type: str
25
+ data: LatLngDict
26
+ label: int = 0
27
+
28
+
29
+ class RawRequestInput(BaseModel):
30
+ bbox: RawBBox
31
+ prompt: RawPrompt
32
+ zoom: int | float
33
+ source_type: str = "Satellite"
34
+
35
+
36
+ class ParsedPrompt(BaseModel):
37
+ type: str
38
+ data: llist_float
39
+ label: int = 0
40
+
41
+
42
+ class ParsedRequestInput(BaseModel):
43
+ bbox: llist_float
44
+ prompt: ParsedPrompt
45
+ zoom: int | float
46
 
47
 
48
  class PixelCoordinate(TypedDict):
tests/events/get_parsed_bbox_points.json ADDED
@@ -0,0 +1,208 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "europe": {
3
+ "input": {
4
+ "request_input": {
5
+ "bbox": {
6
+ "ne": {
7
+ "lat": 38.03932961278458,
8
+ "lng": 15.36808069832851
9
+ },
10
+ "sw": {
11
+ "lat": 37.455509218936974,
12
+ "lng": 14.632807441554068
13
+ }
14
+ },
15
+ "prompt": [
16
+ {
17
+ "type": "point",
18
+ "data": {
19
+ "lat": 37.0,
20
+ "lng": 15.0
21
+ },
22
+ "label": 0
23
+ }
24
+ ],
25
+ "zoom": 10,
26
+ "source_type": "Satellite",
27
+ "debug": true
28
+ }
29
+ },
30
+ "output": {
31
+ "bbox": [
32
+ [
33
+ 38.03932961278458,
34
+ 15.36808069832851
35
+ ],
36
+ [
37
+ 37.455509218936974,
38
+ 14.632807441554068
39
+ ]
40
+ ],
41
+ "prompt": [
42
+ {
43
+ "type": "point",
44
+ "data": [
45
+ 267,
46
+ 954
47
+ ],
48
+ "label": 0
49
+ }
50
+ ],
51
+ "zoom": 10
52
+ }
53
+ },
54
+ "north_america": {
55
+ "input": {
56
+ "request_input": {
57
+ "bbox": {
58
+ "ne": {
59
+ "lat": 44.918201144476456,
60
+ "lng": -111.7859533595829
61
+ },
62
+ "sw": {
63
+ "lat": 39.35135789075441,
64
+ "lng": -123.03595335958288
65
+ }
66
+ },
67
+ "prompt": [
68
+ {
69
+ "type": "point",
70
+ "data": {
71
+ "lat": 41.142370385846974,
72
+ "lng": -112.64967251996322
73
+ },
74
+ "label": 0
75
+ }
76
+ ],
77
+ "zoom": 7,
78
+ "source_type": "Satellite"
79
+ }
80
+ },
81
+ "output": {
82
+ "bbox": [
83
+ [
84
+ 44.918201144476456,
85
+ -111.7859533595829
86
+ ],
87
+ [
88
+ 39.35135789075441,
89
+ -123.03595335958288
90
+ ]
91
+ ],
92
+ "prompt": [
93
+ {
94
+ "type": "point",
95
+ "data": [
96
+ 946,
97
+ 471
98
+ ],
99
+ "label": 0
100
+ }
101
+ ],
102
+ "zoom": 7
103
+ }
104
+ },
105
+ "oceania": {
106
+ "input": {
107
+ "request_input": {
108
+ "bbox": {
109
+ "ne": {
110
+ "lat": -1.4939713066293112,
111
+ "lng": 155.30273437500003
112
+ },
113
+ "sw": {
114
+ "lat": -52.32191088594772,
115
+ "lng": 65.30273437500001
116
+ }
117
+ },
118
+ "prompt": [
119
+ {
120
+ "type": "point",
121
+ "data": {
122
+ "lat": -42.51390169585491,
123
+ "lng": 147.0746141732014
124
+ },
125
+ "label": 0
126
+ }
127
+ ],
128
+ "zoom": 4,
129
+ "source_type": "Satellite"
130
+ }
131
+ },
132
+ "output": {
133
+ "bbox": [
134
+ [
135
+ -1.4939713066293112,
136
+ 155.30273437500003
137
+ ],
138
+ [
139
+ -52.32191088594772,
140
+ 65.30273437500001
141
+ ]
142
+ ],
143
+ "prompt": [
144
+ {
145
+ "type": "point",
146
+ "data": [
147
+ 930,
148
+ 518
149
+ ],
150
+ "label": 0
151
+ }
152
+ ],
153
+ "zoom": 4
154
+ }
155
+ },
156
+ "south_america": {
157
+ "input": {
158
+ "request_input": {
159
+ "bbox": {
160
+ "ne": {
161
+ "lat": -24.80663308621806,
162
+ "lng": -63.98446722241735
163
+ },
164
+ "sw": {
165
+ "lat": -31.42861774444052,
166
+ "lng": -75.23446722241735
167
+ }
168
+ },
169
+ "prompt": [
170
+ {
171
+ "type": "point",
172
+ "data": {
173
+ "lat": -29.911045956544207,
174
+ "lng": -64.78226803685988
175
+ },
176
+ "label": 0
177
+ }
178
+ ],
179
+ "zoom": 7,
180
+ "source_type": "Satellite"
181
+ }
182
+ },
183
+ "output": {
184
+ "bbox": [
185
+ [
186
+ -24.80663308621806,
187
+ -63.98446722241735
188
+ ],
189
+ [
190
+ -31.42861774444052,
191
+ -75.23446722241735
192
+ ]
193
+ ],
194
+ "prompt": [
195
+ {
196
+ "type": "point",
197
+ "data": [
198
+ 952,
199
+ 524
200
+ ],
201
+ "label": 0
202
+ }
203
+ ],
204
+ "zoom": 7
205
+ }
206
+ }
207
+ }
208
+
tests/io/test_coordinates_pixel_conversion.py CHANGED
@@ -1,36 +1,13 @@
1
- import json
2
- from unittest import TestCase
3
 
4
- from src.io.coordinates_pixel_conversion import get_latlng2pixel_projection, get_point_latlng_to_pixel_coordinates, \
5
- get_latlng_to_pixel_coordinates
6
 
7
- from tests import TEST_EVENTS_FOLDER
 
8
 
9
 
10
- names_fn_dict = {
11
- "get_latlng2pixel_projection": get_latlng2pixel_projection,
12
- "get_point_latlng_to_pixel_coordinates": get_point_latlng_to_pixel_coordinates,
13
- "get_latlng_to_pixel_coordinates": get_latlng_to_pixel_coordinates
14
- }
15
 
16
 
17
- def test_fn_reading_json_inputs_outputs(name_fn):
18
- fn = names_fn_dict[name_fn]
19
-
20
- with open(TEST_EVENTS_FOLDER / f"{name_fn}.json") as tst_json:
21
- inputs_outputs = json.load(tst_json)
22
- for k, input_output in inputs_outputs.items():
23
- print(f"k:{k}.")
24
- output = fn(**input_output["input"])
25
- assert output == input_output["output"]
26
-
27
-
28
- class Test(TestCase):
29
- def test_get_latlng2pixel_projection(self):
30
- test_fn_reading_json_inputs_outputs("get_latlng2pixel_projection")
31
-
32
- def test_get_point_latlng_to_pixel_coordinates(self):
33
- test_fn_reading_json_inputs_outputs("get_point_latlng_to_pixel_coordinates")
34
-
35
- def test_get_latlng_to_pixel_coordinates(self):
36
- test_fn_reading_json_inputs_outputs("get_latlng_to_pixel_coordinates")
 
1
+ from tests.io.test_utilities import fn_reading_json_inputs_outputs__test
 
2
 
 
 
3
 
4
+ def test_get_latlng2pixel_projection():
5
+ fn_reading_json_inputs_outputs__test(name_fn="get_latlng2pixel_projection")
6
 
7
 
8
+ def test_get_point_latlng_to_pixel_coordinates():
9
+ fn_reading_json_inputs_outputs__test(name_fn="get_point_latlng_to_pixel_coordinates")
 
 
 
10
 
11
 
12
+ def test_get_latlng_to_pixel_coordinates():
13
+ fn_reading_json_inputs_outputs__test(name_fn="get_latlng_to_pixel_coordinates")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/io/test_lambda_helpers.py ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ from tests.io.test_utilities import fn_reading_json_inputs_outputs__test
2
+
3
+
4
+ def test_get_parsed_bbox_points():
5
+ fn_reading_json_inputs_outputs__test(name_fn="get_parsed_bbox_points")
tests/io/test_utilities.py ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+
3
+ from src.io.coordinates_pixel_conversion import get_latlng2pixel_projection, get_point_latlng_to_pixel_coordinates, \
4
+ get_latlng_to_pixel_coordinates
5
+ from src.io.lambda_helpers import get_parsed_bbox_points
6
+
7
+ from tests import TEST_EVENTS_FOLDER
8
+
9
+
10
+ names_fn_dict = {
11
+ "get_latlng2pixel_projection": get_latlng2pixel_projection,
12
+ "get_point_latlng_to_pixel_coordinates": get_point_latlng_to_pixel_coordinates,
13
+ "get_latlng_to_pixel_coordinates": get_latlng_to_pixel_coordinates,
14
+ "get_parsed_bbox_points": get_parsed_bbox_points
15
+ }
16
+
17
+
18
+ def fn_reading_json_inputs_outputs__test(name_fn):
19
+ fn = names_fn_dict[name_fn]
20
+
21
+ with open(TEST_EVENTS_FOLDER / f"{name_fn}.json") as tst_json:
22
+ inputs_outputs = json.load(tst_json)
23
+ for k, input_output in inputs_outputs.items():
24
+ print(f"k:{k}.")
25
+ output = fn(**input_output["input"])
26
+ assert output == input_output["output"]