From 0855804f45e9da6ae2e90095c4162480fafa2999 Mon Sep 17 00:00:00 2001 From: albamig Date: Mon, 7 Feb 2022 15:02:32 +0100 Subject: [PATCH 01/14] - Specs generated in tests. issue #151 --- .../tests/test_networks/test_specs.py | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 packages/core/minos-microservice-networks/tests/test_networks/test_specs.py diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py new file mode 100644 index 000000000..64ae67e24 --- /dev/null +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py @@ -0,0 +1,139 @@ +import unittest +from itertools import chain +from operator import itemgetter + +from minos.common import ( + MinosConfig, +) +from minos.networks import EnrouteAnalyzer +from tests.utils import ( + BASE_PATH, +) + + +class TestAPISpecs(unittest.TestCase): + CONFIG_FILE_PATH = BASE_PATH / "test_config.yml" + + def test_true(self): + self.assertEqual(True, True) + + def test_openapi(self): + config = MinosConfig(self.CONFIG_FILE_PATH) + endpoints = list() + for name in config.services: + decorators = EnrouteAnalyzer(name, config).get_rest_command_query() + endpoints += [ + {"url": decorator.url, "method": decorator.method} for decorator in set(chain(*decorators.values())) + ] + + endpoints.sort(key=itemgetter("url", "method")) + + base_spec = { + "swagger": "2.0", + "info": { + "version": "1.0.0", + "title": "Minos OpenAPI Spec", + "description": "An example API", + "contact": { + "name": "Minos framework" + }, + "license": { + "name": "MIT" + } + }, + "host": "TODO", + "basePath": "/api/specs/openapi", + "schemes": [ + "http" + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": {}, + "definitions": { + "Pet": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "tag": { + "type": "string" + } + } + } + } + } + + for endpoint in endpoints: + url = endpoint["url"] + method = endpoint["method"] + + openapi_path_spec = { + "description": None, + "produces": [None], + "parameters": [None], + "responses": { + "200": {}, + "default": {} + } + } + + if url in base_spec["paths"]: + base_spec["paths"][url][method] = openapi_path_spec + else: + base_spec["paths"][url] = {method: openapi_path_spec} + + pass + + def test_asyncapi(self): + config = MinosConfig(self.CONFIG_FILE_PATH) + + events = list() + for name in config.services: + decorators = EnrouteAnalyzer(name, config).get_broker_event() + events += [ + {"topic": decorator.topic} for decorator in set(chain(*decorators.values())) + ] + + base_spec = { + "asyncapi": "2.0.0", + "info": { + "title": None, + "version": None + }, + "description": None, + "license": "MIT", + "servers": { + "url": f'{config.broker.host}:{config.broker.port}' + }, + "channels": {} + } + + for event in events: + topic: str = event["topic"] + event_spec = { + "publish": { + "operationId": None, + "message": None + } + } + + base_spec["channels"][topic] = event_spec + + pass + + +if __name__ == '__main__': + unittest.main() From 0c84b21fa2eb9c4999e6205727e3b9814e05c30d Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Mon, 7 Feb 2022 15:10:33 +0000 Subject: [PATCH 02/14] Restyled by black --- .../tests/test_networks/test_specs.py | 71 +++++-------------- 1 file changed, 18 insertions(+), 53 deletions(-) diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py index 64ae67e24..aeb5c878d 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py @@ -34,46 +34,26 @@ def test_openapi(self): "version": "1.0.0", "title": "Minos OpenAPI Spec", "description": "An example API", - "contact": { - "name": "Minos framework" - }, - "license": { - "name": "MIT" - } + "contact": {"name": "Minos framework"}, + "license": {"name": "MIT"}, }, "host": "TODO", "basePath": "/api/specs/openapi", - "schemes": [ - "http" - ], - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], + "schemes": ["http"], + "consumes": ["application/json"], + "produces": ["application/json"], "paths": {}, "definitions": { "Pet": { "type": "object", - "required": [ - "id", - "name" - ], + "required": ["id", "name"], "properties": { - "id": { - "type": "integer", - "format": "int64" - }, - "name": { - "type": "string" - }, - "tag": { - "type": "string" - } - } + "id": {"type": "integer", "format": "int64"}, + "name": {"type": "string"}, + "tag": {"type": "string"}, + }, } - } + }, } for endpoint in endpoints: @@ -84,10 +64,7 @@ def test_openapi(self): "description": None, "produces": [None], "parameters": [None], - "responses": { - "200": {}, - "default": {} - } + "responses": {"200": {}, "default": {}}, } if url in base_spec["paths"]: @@ -103,37 +80,25 @@ def test_asyncapi(self): events = list() for name in config.services: decorators = EnrouteAnalyzer(name, config).get_broker_event() - events += [ - {"topic": decorator.topic} for decorator in set(chain(*decorators.values())) - ] + events += [{"topic": decorator.topic} for decorator in set(chain(*decorators.values()))] base_spec = { "asyncapi": "2.0.0", - "info": { - "title": None, - "version": None - }, + "info": {"title": None, "version": None}, "description": None, "license": "MIT", - "servers": { - "url": f'{config.broker.host}:{config.broker.port}' - }, - "channels": {} + "servers": {"url": f"{config.broker.host}:{config.broker.port}"}, + "channels": {}, } for event in events: topic: str = event["topic"] - event_spec = { - "publish": { - "operationId": None, - "message": None - } - } + event_spec = {"publish": {"operationId": None, "message": None}} base_spec["channels"][topic] = event_spec pass -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() From bc46cda1c00bc13ed787376f9923fd9020c416ed Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Mon, 7 Feb 2022 15:10:34 +0000 Subject: [PATCH 03/14] Restyled by isort --- .../tests/test_networks/test_specs.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py index aeb5c878d..5592516c6 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py @@ -1,11 +1,17 @@ import unittest -from itertools import chain -from operator import itemgetter +from itertools import ( + chain, +) +from operator import ( + itemgetter, +) from minos.common import ( MinosConfig, ) -from minos.networks import EnrouteAnalyzer +from minos.networks import ( + EnrouteAnalyzer, +) from tests.utils import ( BASE_PATH, ) From 3ad47e9fee3567e8a7a9c89cd230e6efaa614092 Mon Sep 17 00:00:00 2001 From: albamig Date: Mon, 7 Feb 2022 18:55:57 +0100 Subject: [PATCH 04/14] - Refactored to service. issue #151 --- .../minos/api_specs/__init__.py | 0 .../minos/api_specs/asyncapi.py | 42 +++++++++ .../minos/api_specs/openapi.py | 77 ++++++++++++++++ .../tests/test_networks/test_specs.py | 88 ------------------- 4 files changed, 119 insertions(+), 88 deletions(-) create mode 100644 packages/core/minos-microservice-networks/minos/api_specs/__init__.py create mode 100644 packages/core/minos-microservice-networks/minos/api_specs/asyncapi.py create mode 100644 packages/core/minos-microservice-networks/minos/api_specs/openapi.py diff --git a/packages/core/minos-microservice-networks/minos/api_specs/__init__.py b/packages/core/minos-microservice-networks/minos/api_specs/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/core/minos-microservice-networks/minos/api_specs/asyncapi.py b/packages/core/minos-microservice-networks/minos/api_specs/asyncapi.py new file mode 100644 index 000000000..640d2185f --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/api_specs/asyncapi.py @@ -0,0 +1,42 @@ +from itertools import chain +from pathlib import Path + +from minos.common import MinosConfig +from ..networks import enroute, EnrouteAnalyzer + + +class OpenAPIService: + CONFIG_FILE_PATH = Path(__file__).parent / "config.yml" + + def __init__(self): + self.spec = BASE_SPEC.copy() + + @enroute.rest.command("/spec/openapi") + def generate_spec(self) -> dict: + events = self.get_events() + + for event in events: + topic: str = event["topic"] + event_spec = {"publish": {"operationId": None, "message": None}} + + self.spec["channels"][topic] = event_spec + + return self.spec + + def get_events(self) -> list[dict]: + config = MinosConfig(self.CONFIG_FILE_PATH) + events = list() + for name in config.services: + decorators = EnrouteAnalyzer(name, config).get_broker_event() + events += [{"topic": decorator.topic} for decorator in set(chain(*decorators.values()))] + + return events + + +BASE_SPEC = { + "asyncapi": "2.0.0", + "info": {"title": None, "version": None}, + "description": None, + "license": "MIT", + "channels": {}, +} diff --git a/packages/core/minos-microservice-networks/minos/api_specs/openapi.py b/packages/core/minos-microservice-networks/minos/api_specs/openapi.py new file mode 100644 index 000000000..65c2d22ad --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/api_specs/openapi.py @@ -0,0 +1,77 @@ +from itertools import chain +from operator import itemgetter +from pathlib import Path + +from minos.common import MinosConfig +from ..networks import enroute, EnrouteAnalyzer + + +class OpenAPIService: + CONFIG_FILE_PATH = Path(__file__).parent / "config.yml" + + def __init__(self): + self.spec = BASE_SPEC.copy() + + @enroute.rest.command("/spec/openapi") + def generate_spec(self) -> dict: + endpoints = self.get_endpoints() + + for endpoint in endpoints: + url = endpoint["url"] + method = endpoint["method"] + + endpoint_spec = { + "description": None, + "produces": [None], + "parameters": [None], + "responses": {"200": {}, "default": {}}, + } + + if url in self.spec["paths"]: + self.spec["paths"][url][method] = endpoint_spec + else: + self.spec["paths"][url] = {method: endpoint_spec} + + return self.spec + + def get_endpoints(self) -> list[dict]: + config = MinosConfig(self.CONFIG_FILE_PATH) + endpoints = list() + for name in config.services: + decorators = EnrouteAnalyzer(name, config).get_rest_command_query() + endpoints += [ + {"url": decorator.url, "method": decorator.method} for decorator in set(chain(*decorators.values())) + ] + + endpoints.sort(key=itemgetter("url", "method")) + + return endpoints + + +BASE_SPEC = { + "swagger": "2.0", + "info": { + "version": "1.0.0", + "title": "Minos OpenAPI Spec", + "description": "An example API", + "contact": {"name": "Minos framework"}, + "license": {"name": "MIT"}, + }, + "host": "TODO", + "basePath": "/api/specs/openapi", + "schemes": ["http"], + "consumes": ["application/json"], + "produces": ["application/json"], + "paths": {}, + "definitions": { + "Pet": { + "type": "object", + "required": ["id", "name"], + "properties": { + "id": {"type": "integer", "format": "int64"}, + "name": {"type": "string"}, + "tag": {"type": "string"}, + }, + } + }, +} diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py index 5592516c6..a4e381401 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py @@ -1,17 +1,5 @@ import unittest -from itertools import ( - chain, -) -from operator import ( - itemgetter, -) -from minos.common import ( - MinosConfig, -) -from minos.networks import ( - EnrouteAnalyzer, -) from tests.utils import ( BASE_PATH, ) @@ -24,85 +12,9 @@ def test_true(self): self.assertEqual(True, True) def test_openapi(self): - config = MinosConfig(self.CONFIG_FILE_PATH) - endpoints = list() - for name in config.services: - decorators = EnrouteAnalyzer(name, config).get_rest_command_query() - endpoints += [ - {"url": decorator.url, "method": decorator.method} for decorator in set(chain(*decorators.values())) - ] - - endpoints.sort(key=itemgetter("url", "method")) - - base_spec = { - "swagger": "2.0", - "info": { - "version": "1.0.0", - "title": "Minos OpenAPI Spec", - "description": "An example API", - "contact": {"name": "Minos framework"}, - "license": {"name": "MIT"}, - }, - "host": "TODO", - "basePath": "/api/specs/openapi", - "schemes": ["http"], - "consumes": ["application/json"], - "produces": ["application/json"], - "paths": {}, - "definitions": { - "Pet": { - "type": "object", - "required": ["id", "name"], - "properties": { - "id": {"type": "integer", "format": "int64"}, - "name": {"type": "string"}, - "tag": {"type": "string"}, - }, - } - }, - } - - for endpoint in endpoints: - url = endpoint["url"] - method = endpoint["method"] - - openapi_path_spec = { - "description": None, - "produces": [None], - "parameters": [None], - "responses": {"200": {}, "default": {}}, - } - - if url in base_spec["paths"]: - base_spec["paths"][url][method] = openapi_path_spec - else: - base_spec["paths"][url] = {method: openapi_path_spec} - pass def test_asyncapi(self): - config = MinosConfig(self.CONFIG_FILE_PATH) - - events = list() - for name in config.services: - decorators = EnrouteAnalyzer(name, config).get_broker_event() - events += [{"topic": decorator.topic} for decorator in set(chain(*decorators.values()))] - - base_spec = { - "asyncapi": "2.0.0", - "info": {"title": None, "version": None}, - "description": None, - "license": "MIT", - "servers": {"url": f"{config.broker.host}:{config.broker.port}"}, - "channels": {}, - } - - for event in events: - topic: str = event["topic"] - event_spec = {"publish": {"operationId": None, "message": None}} - - base_spec["channels"][topic] = event_spec - pass From c90e634c4af388ff78c15537a02c2d75a3e789db Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Mon, 7 Feb 2022 17:56:13 +0000 Subject: [PATCH 05/14] Restyled by isort --- .../minos/api_specs/asyncapi.py | 20 ++++++++++++----- .../minos/api_specs/openapi.py | 22 ++++++++++++++----- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/packages/core/minos-microservice-networks/minos/api_specs/asyncapi.py b/packages/core/minos-microservice-networks/minos/api_specs/asyncapi.py index 640d2185f..602d74595 100644 --- a/packages/core/minos-microservice-networks/minos/api_specs/asyncapi.py +++ b/packages/core/minos-microservice-networks/minos/api_specs/asyncapi.py @@ -1,8 +1,18 @@ -from itertools import chain -from pathlib import Path - -from minos.common import MinosConfig -from ..networks import enroute, EnrouteAnalyzer +from itertools import ( + chain, +) +from pathlib import ( + Path, +) + +from minos.common import ( + MinosConfig, +) + +from ..networks import ( + EnrouteAnalyzer, + enroute, +) class OpenAPIService: diff --git a/packages/core/minos-microservice-networks/minos/api_specs/openapi.py b/packages/core/minos-microservice-networks/minos/api_specs/openapi.py index 65c2d22ad..787a3350c 100644 --- a/packages/core/minos-microservice-networks/minos/api_specs/openapi.py +++ b/packages/core/minos-microservice-networks/minos/api_specs/openapi.py @@ -1,9 +1,21 @@ -from itertools import chain -from operator import itemgetter -from pathlib import Path +from itertools import ( + chain, +) +from operator import ( + itemgetter, +) +from pathlib import ( + Path, +) -from minos.common import MinosConfig -from ..networks import enroute, EnrouteAnalyzer +from minos.common import ( + MinosConfig, +) + +from ..networks import ( + EnrouteAnalyzer, + enroute, +) class OpenAPIService: From 6ba2687abe4b861a286172efee9a189f28e812b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Garc=C3=ADa=20Prado?= Date: Fri, 18 Mar 2022 09:45:32 +0100 Subject: [PATCH 06/14] ISSUE #151 * Update code to follow "Service" structure. --- .../minos/api_specs/__init__.py | 0 .../minos/networks/__init__.py | 4 + .../minos/networks/specs/__init__.py | 6 ++ .../{api_specs => networks/specs}/asyncapi.py | 33 ++++---- .../{api_specs => networks/specs}/openapi.py | 32 ++++---- .../tests/test_networks/test_specs.py | 75 ++++++++++++++++--- 6 files changed, 114 insertions(+), 36 deletions(-) delete mode 100644 packages/core/minos-microservice-networks/minos/api_specs/__init__.py create mode 100644 packages/core/minos-microservice-networks/minos/networks/specs/__init__.py rename packages/core/minos-microservice-networks/minos/{api_specs => networks/specs}/asyncapi.py (59%) rename packages/core/minos-microservice-networks/minos/{api_specs => networks/specs}/openapi.py (77%) diff --git a/packages/core/minos-microservice-networks/minos/api_specs/__init__.py b/packages/core/minos-microservice-networks/minos/api_specs/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/core/minos-microservice-networks/minos/networks/__init__.py b/packages/core/minos-microservice-networks/minos/networks/__init__.py index 4880de25a..d6ecb698b 100644 --- a/packages/core/minos-microservice-networks/minos/networks/__init__.py +++ b/packages/core/minos-microservice-networks/minos/networks/__init__.py @@ -121,6 +121,10 @@ ScheduledRequestContent, ScheduledResponseException, ) +from .specs import ( + AsyncAPIService, + OpenAPIService, +) from .system import ( SystemService, ) diff --git a/packages/core/minos-microservice-networks/minos/networks/specs/__init__.py b/packages/core/minos-microservice-networks/minos/networks/specs/__init__.py new file mode 100644 index 000000000..8e603f2b8 --- /dev/null +++ b/packages/core/minos-microservice-networks/minos/networks/specs/__init__.py @@ -0,0 +1,6 @@ +from .asyncapi import ( + AsyncAPIService, +) +from .openapi import ( + OpenAPIService, +) diff --git a/packages/core/minos-microservice-networks/minos/api_specs/asyncapi.py b/packages/core/minos-microservice-networks/minos/networks/specs/asyncapi.py similarity index 59% rename from packages/core/minos-microservice-networks/minos/api_specs/asyncapi.py rename to packages/core/minos-microservice-networks/minos/networks/specs/asyncapi.py index 602d74595..7cd339787 100644 --- a/packages/core/minos-microservice-networks/minos/api_specs/asyncapi.py +++ b/packages/core/minos-microservice-networks/minos/networks/specs/asyncapi.py @@ -1,28 +1,32 @@ from itertools import ( chain, ) -from pathlib import ( - Path, -) from minos.common import ( - MinosConfig, + Config, ) -from ..networks import ( +from ..decorators import ( EnrouteAnalyzer, enroute, ) +from ..requests import ( + Request, + Response, +) -class OpenAPIService: - CONFIG_FILE_PATH = Path(__file__).parent / "config.yml" +class AsyncAPIService: + """TODO""" - def __init__(self): + def __init__(self, config: Config): + self.config = config self.spec = BASE_SPEC.copy() - @enroute.rest.command("/spec/openapi") - def generate_spec(self) -> dict: + @enroute.rest.command("/spec/asyncapi", "GET") + def generate_spec(self, request: Request) -> Response: + """TODO""" + events = self.get_events() for event in events: @@ -31,13 +35,14 @@ def generate_spec(self) -> dict: self.spec["channels"][topic] = event_spec - return self.spec + return Response(self.spec) def get_events(self) -> list[dict]: - config = MinosConfig(self.CONFIG_FILE_PATH) + """TODO""" + events = list() - for name in config.services: - decorators = EnrouteAnalyzer(name, config).get_broker_event() + for name in self.config.services: + decorators = EnrouteAnalyzer(name, self.config).get_broker_event() events += [{"topic": decorator.topic} for decorator in set(chain(*decorators.values()))] return events diff --git a/packages/core/minos-microservice-networks/minos/api_specs/openapi.py b/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py similarity index 77% rename from packages/core/minos-microservice-networks/minos/api_specs/openapi.py rename to packages/core/minos-microservice-networks/minos/networks/specs/openapi.py index 787a3350c..a680e1fef 100644 --- a/packages/core/minos-microservice-networks/minos/api_specs/openapi.py +++ b/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py @@ -4,28 +4,33 @@ from operator import ( itemgetter, ) -from pathlib import ( - Path, -) from minos.common import ( - MinosConfig, + Config, ) -from ..networks import ( +from ..decorators import ( EnrouteAnalyzer, enroute, ) +from ..requests import ( + Request, + Response, +) class OpenAPIService: - CONFIG_FILE_PATH = Path(__file__).parent / "config.yml" + """TODO""" - def __init__(self): + def __init__(self, config: Config): + self.config = config self.spec = BASE_SPEC.copy() - @enroute.rest.command("/spec/openapi") - def generate_spec(self) -> dict: + # noinspection PyUnusedLocal + @enroute.rest.command("/spec/openapi", "GET") + def generate_spec(self, request: Request) -> Response: + """TODO""" + endpoints = self.get_endpoints() for endpoint in endpoints: @@ -44,13 +49,14 @@ def generate_spec(self) -> dict: else: self.spec["paths"][url] = {method: endpoint_spec} - return self.spec + return Response(self.spec) def get_endpoints(self) -> list[dict]: - config = MinosConfig(self.CONFIG_FILE_PATH) + """TODO""" + endpoints = list() - for name in config.services: - decorators = EnrouteAnalyzer(name, config).get_rest_command_query() + for name in self.config.services: + decorators = EnrouteAnalyzer(name, self.config).get_rest_command_query() endpoints += [ {"url": decorator.url, "method": decorator.method} for decorator in set(chain(*decorators.values())) ] diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py index a4e381401..fff20f53a 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py @@ -1,21 +1,78 @@ import unittest +from minos.common import ( + Config, +) +from minos.networks import ( + AsyncAPIService, + EnrouteAnalyzer, + InMemoryRequest, + OpenAPIService, + RestCommandEnrouteDecorator, +) from tests.utils import ( - BASE_PATH, + CONFIG_FILE_PATH, ) -class TestAPISpecs(unittest.TestCase): - CONFIG_FILE_PATH = BASE_PATH / "test_config.yml" +class TestAsyncAPIService(unittest.TestCase): + def setUp(self) -> None: + super().setUp() + self.config = Config(CONFIG_FILE_PATH) + + def test_constructor(self): + service = AsyncAPIService(self.config) + self.assertIsInstance(service, AsyncAPIService) + self.assertEqual(self.config, service.config) + + def test_get_enroute(self): + service = AsyncAPIService(self.config) + expected = { + service.generate_spec.__name__: {RestCommandEnrouteDecorator("/spec/asyncapi", "GET")}, + } + observed = EnrouteAnalyzer(service, self.config).get_all() + self.assertEqual(expected, observed) + + @unittest.skip("TODO") + async def test_generate_spec(self): + service = AsyncAPIService(self.config) + + request = InMemoryRequest() + response = service.generate_spec(request) + + expected = ... # TODO + + self.assertEqual(expected, await response.content()) + + +class TestOpenAPIService(unittest.IsolatedAsyncioTestCase): + def setUp(self) -> None: + super().setUp() + self.config = Config(CONFIG_FILE_PATH) + + def test_constructor(self): + service = OpenAPIService(self.config) + self.assertIsInstance(service, OpenAPIService) + self.assertEqual(self.config, service.config) + + def test_get_enroute(self): + service = OpenAPIService(self.config) + expected = { + service.generate_spec.__name__: {RestCommandEnrouteDecorator("/spec/openapi", "GET")}, + } + observed = EnrouteAnalyzer(service, self.config).get_all() + self.assertEqual(expected, observed) + + @unittest.skip("TODO") + async def test_generate_spec(self): + service = OpenAPIService(self.config) - def test_true(self): - self.assertEqual(True, True) + request = InMemoryRequest() + response = service.generate_spec(request) - def test_openapi(self): - pass + expected = ... # TODO - def test_asyncapi(self): - pass + self.assertEqual(expected, await response.content()) if __name__ == "__main__": From 8ea882614bbe0fed4db6c11e7e14a11ef45aa608 Mon Sep 17 00:00:00 2001 From: albamig Date: Fri, 25 Mar 2022 13:43:50 +0100 Subject: [PATCH 07/14] - Basic OpenAPI specs generated and tested. - Switched to OpenAPI 3.0.0. issue #151 --- .../minos/networks/specs/openapi.py | 49 ++++++----------- .../tests/services/commands.py | 4 ++ .../test_discovery/test_connectors.py | 9 ++- .../test_networks/test_specs/__init__.py | 0 .../test_asyncapi.py} | 31 ----------- .../test_networks/test_specs/test_openapi.py | 55 +++++++++++++++++++ 6 files changed, 85 insertions(+), 63 deletions(-) create mode 100644 packages/core/minos-microservice-networks/tests/test_networks/test_specs/__init__.py rename packages/core/minos-microservice-networks/tests/test_networks/{test_specs.py => test_specs/test_asyncapi.py} (55%) create mode 100644 packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py diff --git a/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py b/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py index a680e1fef..84d9e1021 100644 --- a/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py +++ b/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py @@ -24,34 +24,26 @@ class OpenAPIService: def __init__(self, config: Config): self.config = config - self.spec = BASE_SPEC.copy() + self.spec = SPEC_SCHEMA.copy() # noinspection PyUnusedLocal @enroute.rest.command("/spec/openapi", "GET") def generate_spec(self, request: Request) -> Response: """TODO""" - endpoints = self.get_endpoints() - - for endpoint in endpoints: + for endpoint in self.endpoints: url = endpoint["url"] method = endpoint["method"] - endpoint_spec = { - "description": None, - "produces": [None], - "parameters": [None], - "responses": {"200": {}, "default": {}}, - } - if url in self.spec["paths"]: - self.spec["paths"][url][method] = endpoint_spec + self.spec["paths"][url][method] = PATH_SCHEMA else: - self.spec["paths"][url] = {method: endpoint_spec} + self.spec["paths"][url] = {method: PATH_SCHEMA} - return Response(self.spec) + return Response(self.spec) - def get_endpoints(self) -> list[dict]: + @property + def endpoints(self) -> list[dict]: """TODO""" endpoints = list() @@ -66,14 +58,12 @@ def get_endpoints(self) -> list[dict]: return endpoints -BASE_SPEC = { - "swagger": "2.0", +SPEC_SCHEMA = { + "openapi": "3.0.0", "info": { "version": "1.0.0", "title": "Minos OpenAPI Spec", - "description": "An example API", - "contact": {"name": "Minos framework"}, - "license": {"name": "MIT"}, + "description": "Minos OpenAPI Spec", }, "host": "TODO", "basePath": "/api/specs/openapi", @@ -81,15 +71,12 @@ def get_endpoints(self) -> list[dict]: "consumes": ["application/json"], "produces": ["application/json"], "paths": {}, - "definitions": { - "Pet": { - "type": "object", - "required": ["id", "name"], - "properties": { - "id": {"type": "integer", "format": "int64"}, - "name": {"type": "string"}, - "tag": {"type": "string"}, - }, - } - }, +} + +PATH_SCHEMA = { + "description": None, + "produces": [], + "parameters": [], + "requestBody": {}, + "responses": {}, } diff --git a/packages/core/minos-microservice-networks/tests/services/commands.py b/packages/core/minos-microservice-networks/tests/services/commands.py index 23f3c708c..d358969a6 100644 --- a/packages/core/minos-microservice-networks/tests/services/commands.py +++ b/packages/core/minos-microservice-networks/tests/services/commands.py @@ -11,6 +11,10 @@ class CommandService: def get_order_rest(self, request: Request) -> Response: return Response("get_order") + @enroute.rest.command(path="/order", method="DELETE") + def delete_order_rest(self, request: Request) -> Response: + return Response("delete_order") + @enroute.broker.command("GetOrder") def get_order_command(self, request: Request) -> Response: return BrokerResponse("get_order") diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_connectors.py b/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_connectors.py index 7ed85ac24..ed1417ccd 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_connectors.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_discovery/test_connectors.py @@ -45,7 +45,14 @@ async def test_subscription(self): await self.discovery.subscribe() self.assertEqual(1, mock.call_count) expected = call( - self.ip, 8080, "Order", [{"url": "/order", "method": "GET"}, {"url": "/ticket", "method": "POST"}] + self.ip, + 8080, + "Order", + [ + {"url": "/order", "method": "DELETE"}, + {"url": "/order", "method": "GET"}, + {"url": "/ticket", "method": "POST"}, + ], ) self.assertEqual(expected, mock.call_args) diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/__init__.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py similarity index 55% rename from packages/core/minos-microservice-networks/tests/test_networks/test_specs.py rename to packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py index fff20f53a..c3032ce42 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_specs.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py @@ -7,7 +7,6 @@ AsyncAPIService, EnrouteAnalyzer, InMemoryRequest, - OpenAPIService, RestCommandEnrouteDecorator, ) from tests.utils import ( @@ -45,35 +44,5 @@ async def test_generate_spec(self): self.assertEqual(expected, await response.content()) -class TestOpenAPIService(unittest.IsolatedAsyncioTestCase): - def setUp(self) -> None: - super().setUp() - self.config = Config(CONFIG_FILE_PATH) - - def test_constructor(self): - service = OpenAPIService(self.config) - self.assertIsInstance(service, OpenAPIService) - self.assertEqual(self.config, service.config) - - def test_get_enroute(self): - service = OpenAPIService(self.config) - expected = { - service.generate_spec.__name__: {RestCommandEnrouteDecorator("/spec/openapi", "GET")}, - } - observed = EnrouteAnalyzer(service, self.config).get_all() - self.assertEqual(expected, observed) - - @unittest.skip("TODO") - async def test_generate_spec(self): - service = OpenAPIService(self.config) - - request = InMemoryRequest() - response = service.generate_spec(request) - - expected = ... # TODO - - self.assertEqual(expected, await response.content()) - - if __name__ == "__main__": unittest.main() diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py new file mode 100644 index 000000000..bd374a354 --- /dev/null +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py @@ -0,0 +1,55 @@ +import unittest + +from minos.common import ( + Config, +) +from minos.networks import ( + EnrouteAnalyzer, + InMemoryRequest, + OpenAPIService, + RestCommandEnrouteDecorator, +) +from tests.utils import ( + CONFIG_FILE_PATH, +) + + +class TestOpenAPIService(unittest.IsolatedAsyncioTestCase): + def setUp(self) -> None: + super().setUp() + self.config = Config(CONFIG_FILE_PATH) + + def test_constructor(self): + service = OpenAPIService(self.config) + self.assertIsInstance(service, OpenAPIService) + self.assertEqual(self.config, service.config) + + def test_get_enroute(self): + service = OpenAPIService(self.config) + expected = { + service.generate_spec.__name__: {RestCommandEnrouteDecorator("/spec/openapi", "GET")}, + } + observed = EnrouteAnalyzer(service, self.config).get_all() + self.assertEqual(expected, observed) + + async def test_generate_spec(self): + service = OpenAPIService(self.config) + + request = InMemoryRequest() + response = service.generate_spec(request) + + expected_paths = { + "/order": { + "DELETE": {"description": None, "produces": [], "parameters": [], "requestBody": {}, "responses": {}}, + "GET": {"description": None, "produces": [], "parameters": [], "requestBody": {}, "responses": {}}, + }, + "/ticket": { + "POST": {"description": None, "produces": [], "parameters": [], "requestBody": {}, "responses": {}} + }, + } + + self.assertEqual(expected_paths, (await response.content())["paths"]) + + +if __name__ == "__main__": + unittest.main() From 6b8e651d4bf235d33cf9853200ae87ab04b0c99e Mon Sep 17 00:00:00 2001 From: albamig Date: Fri, 25 Mar 2022 13:51:56 +0100 Subject: [PATCH 08/14] - Deleted unnecessary comments. issue #151 --- .../minos/networks/specs/openapi.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py b/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py index 84d9e1021..3a1e76738 100644 --- a/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py +++ b/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py @@ -20,8 +20,6 @@ class OpenAPIService: - """TODO""" - def __init__(self, config: Config): self.config = config self.spec = SPEC_SCHEMA.copy() @@ -29,8 +27,6 @@ def __init__(self, config: Config): # noinspection PyUnusedLocal @enroute.rest.command("/spec/openapi", "GET") def generate_spec(self, request: Request) -> Response: - """TODO""" - for endpoint in self.endpoints: url = endpoint["url"] method = endpoint["method"] @@ -44,8 +40,6 @@ def generate_spec(self, request: Request) -> Response: @property def endpoints(self) -> list[dict]: - """TODO""" - endpoints = list() for name in self.config.services: decorators = EnrouteAnalyzer(name, self.config).get_rest_command_query() From 587f9ea6759c24b3fbbccc758c302600784c63cd Mon Sep 17 00:00:00 2001 From: albamig Date: Fri, 25 Mar 2022 13:53:11 +0100 Subject: [PATCH 09/14] - Renamed contractions. - Deleted unnecessary comments. issue #151 --- .../minos/networks/specs/openapi.py | 6 +++--- .../tests/test_networks/test_specs/test_openapi.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py b/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py index 3a1e76738..d7287c7b0 100644 --- a/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py +++ b/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py @@ -22,11 +22,11 @@ class OpenAPIService: def __init__(self, config: Config): self.config = config - self.spec = SPEC_SCHEMA.copy() + self.spec = SPECIFICATION_SCHEMA.copy() # noinspection PyUnusedLocal @enroute.rest.command("/spec/openapi", "GET") - def generate_spec(self, request: Request) -> Response: + def generate_specification(self, request: Request) -> Response: for endpoint in self.endpoints: url = endpoint["url"] method = endpoint["method"] @@ -52,7 +52,7 @@ def endpoints(self) -> list[dict]: return endpoints -SPEC_SCHEMA = { +SPECIFICATION_SCHEMA = { "openapi": "3.0.0", "info": { "version": "1.0.0", diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py index bd374a354..bf07e427c 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py @@ -27,7 +27,7 @@ def test_constructor(self): def test_get_enroute(self): service = OpenAPIService(self.config) expected = { - service.generate_spec.__name__: {RestCommandEnrouteDecorator("/spec/openapi", "GET")}, + service.generate_specification.__name__: {RestCommandEnrouteDecorator("/spec/openapi", "GET")}, } observed = EnrouteAnalyzer(service, self.config).get_all() self.assertEqual(expected, observed) @@ -36,7 +36,7 @@ async def test_generate_spec(self): service = OpenAPIService(self.config) request = InMemoryRequest() - response = service.generate_spec(request) + response = service.generate_specification(request) expected_paths = { "/order": { From 338909fd12ecae903a9c9ac0b38e8c042aa56db1 Mon Sep 17 00:00:00 2001 From: albamig Date: Fri, 25 Mar 2022 14:01:31 +0100 Subject: [PATCH 10/14] - Fixed asyncio test issue. issue #151 --- .../tests/test_networks/test_specs/test_asyncapi.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py index c3032ce42..a0bb5de95 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py @@ -14,7 +14,7 @@ ) -class TestAsyncAPIService(unittest.TestCase): +class TestAsyncAPIService(unittest.IsolatedAsyncioTestCase): def setUp(self) -> None: super().setUp() self.config = Config(CONFIG_FILE_PATH) @@ -32,7 +32,6 @@ def test_get_enroute(self): observed = EnrouteAnalyzer(service, self.config).get_all() self.assertEqual(expected, observed) - @unittest.skip("TODO") async def test_generate_spec(self): service = AsyncAPIService(self.config) From 639d1273d2bbd2a7f746dc9c4f5931c8fab22fa2 Mon Sep 17 00:00:00 2001 From: albamig Date: Fri, 25 Mar 2022 14:06:54 +0100 Subject: [PATCH 11/14] - Added AsyncAPI test. - 100% coverage. issue #151 --- .../minos-microservice-networks/tests/services/commands.py | 2 +- .../tests/test_networks/test_specs/test_asyncapi.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/core/minos-microservice-networks/tests/services/commands.py b/packages/core/minos-microservice-networks/tests/services/commands.py index d358969a6..fbbc75cd9 100644 --- a/packages/core/minos-microservice-networks/tests/services/commands.py +++ b/packages/core/minos-microservice-networks/tests/services/commands.py @@ -32,7 +32,7 @@ def update_order(self, request: Request) -> Response: return BrokerResponse("update_order") @enroute.broker.event("TicketAdded") - def ticket_added(self, request: Request) -> None: + def ticket_added(self, request: Request) -> str: return "command_service_ticket_added" @enroute.periodic.event("@daily") diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py index a0bb5de95..4845c85c3 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py @@ -38,9 +38,12 @@ async def test_generate_spec(self): request = InMemoryRequest() response = service.generate_spec(request) - expected = ... # TODO + expected = { + "TicketAdded": {"publish": {"operationId": None, "message": None}}, + "TicketDeleted": {"publish": {"operationId": None, "message": None}}, + } - self.assertEqual(expected, await response.content()) + self.assertEqual(expected, (await response.content())["channels"]) if __name__ == "__main__": From 3ee48ab055fa2e2a4be600ea2ef722fa264192a7 Mon Sep 17 00:00:00 2001 From: albamig Date: Fri, 25 Mar 2022 14:08:43 +0100 Subject: [PATCH 12/14] - Improved names by deleting contractions. - Deleted unnecessary comments. issue #151 --- .../minos/networks/specs/asyncapi.py | 12 +++--------- .../tests/test_networks/test_specs/test_asyncapi.py | 4 ++-- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/packages/core/minos-microservice-networks/minos/networks/specs/asyncapi.py b/packages/core/minos-microservice-networks/minos/networks/specs/asyncapi.py index 7cd339787..1d6af5643 100644 --- a/packages/core/minos-microservice-networks/minos/networks/specs/asyncapi.py +++ b/packages/core/minos-microservice-networks/minos/networks/specs/asyncapi.py @@ -17,16 +17,12 @@ class AsyncAPIService: - """TODO""" - def __init__(self, config: Config): self.config = config - self.spec = BASE_SPEC.copy() + self.spec = SPECIFICATION_SCHEMA.copy() @enroute.rest.command("/spec/asyncapi", "GET") - def generate_spec(self, request: Request) -> Response: - """TODO""" - + def generate_specification(self, request: Request) -> Response: events = self.get_events() for event in events: @@ -38,8 +34,6 @@ def generate_spec(self, request: Request) -> Response: return Response(self.spec) def get_events(self) -> list[dict]: - """TODO""" - events = list() for name in self.config.services: decorators = EnrouteAnalyzer(name, self.config).get_broker_event() @@ -48,7 +42,7 @@ def get_events(self) -> list[dict]: return events -BASE_SPEC = { +SPECIFICATION_SCHEMA = { "asyncapi": "2.0.0", "info": {"title": None, "version": None}, "description": None, diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py index 4845c85c3..4455542a2 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py @@ -27,7 +27,7 @@ def test_constructor(self): def test_get_enroute(self): service = AsyncAPIService(self.config) expected = { - service.generate_spec.__name__: {RestCommandEnrouteDecorator("/spec/asyncapi", "GET")}, + service.generate_specification.__name__: {RestCommandEnrouteDecorator("/spec/asyncapi", "GET")}, } observed = EnrouteAnalyzer(service, self.config).get_all() self.assertEqual(expected, observed) @@ -36,7 +36,7 @@ async def test_generate_spec(self): service = AsyncAPIService(self.config) request = InMemoryRequest() - response = service.generate_spec(request) + response = service.generate_specification(request) expected = { "TicketAdded": {"publish": {"operationId": None, "message": None}}, From 2e62139fd26d2a6a6447538ff6b42cc49e122031 Mon Sep 17 00:00:00 2001 From: albamig Date: Fri, 25 Mar 2022 15:15:51 +0100 Subject: [PATCH 13/14] - Spect tested agains https://apitools.dev/swagger-parser/online/ issue #151 --- .../minos/networks/specs/openapi.py | 13 ++----------- .../test_networks/test_specs/test_openapi.py | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py b/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py index d90168be9..96ec32a3e 100644 --- a/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py +++ b/packages/core/minos-microservice-networks/minos/networks/specs/openapi.py @@ -29,7 +29,7 @@ def __init__(self, config: Config): def generate_specification(self, request: Request) -> Response: for endpoint in self.endpoints: url = endpoint["url"] - method = endpoint["method"] + method = endpoint["method"].lower() if url in self.spec["paths"]: self.spec["paths"][url][method] = PATH_SCHEMA @@ -59,18 +59,9 @@ def endpoints(self) -> list[dict]: "title": "Minos OpenAPI Spec", "description": "Minos OpenAPI Spec", }, - "host": "TODO", - "basePath": "/api/specs/openapi", - "schemes": ["http"], - "consumes": ["application/json"], - "produces": ["application/json"], "paths": {}, } PATH_SCHEMA = { - "description": None, - "produces": [], - "parameters": [], - "requestBody": {}, - "responses": {}, + "responses": {"200": {"description": ""}}, } diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py index e964623de..cc5377945 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py @@ -38,17 +38,18 @@ async def test_generate_spec(self): request = InMemoryRequest() response = service.generate_specification(request) - expected_paths = { - "/order": { - "DELETE": {"description": None, "produces": [], "parameters": [], "requestBody": {}, "responses": {}}, - "GET": {"description": None, "produces": [], "parameters": [], "requestBody": {}, "responses": {}}, - }, - "/ticket": { - "POST": {"description": None, "produces": [], "parameters": [], "requestBody": {}, "responses": {}} + expected = { + "openapi": "3.0.0", + "info": {"version": "1.0.0", "title": "Minos OpenAPI Spec", "description": "Minos OpenAPI Spec"}, + "paths": { + "/order": { + "delete": {"responses": {"200": {"description": ""}}}, + "get": {"responses": {"200": {"description": ""}}}, + }, + "/ticket": {"post": {"responses": {"200": {"description": ""}}}}, }, } - - self.assertEqual(expected_paths, (await response.content())["paths"]) + self.assertEqual(expected, await response.content()) if __name__ == "__main__": From 3c741be6ff3b13c55071fe8b22170535f61bd44f Mon Sep 17 00:00:00 2001 From: albamig Date: Fri, 25 Mar 2022 15:30:45 +0100 Subject: [PATCH 14/14] - AsyncAPi tested agains https://studio.asyncapi.com/ issue #151 --- .../minos/networks/specs/asyncapi.py | 8 +++----- .../tests/test_networks/test_specs/test_asyncapi.py | 7 ++++--- .../tests/test_networks/test_specs/test_openapi.py | 1 + 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/core/minos-microservice-networks/minos/networks/specs/asyncapi.py b/packages/core/minos-microservice-networks/minos/networks/specs/asyncapi.py index 471e3f1d8..3fd5e2116 100644 --- a/packages/core/minos-microservice-networks/minos/networks/specs/asyncapi.py +++ b/packages/core/minos-microservice-networks/minos/networks/specs/asyncapi.py @@ -27,7 +27,7 @@ def generate_specification(self, request: Request) -> Response: for event in events: topic: str = event["topic"] - event_spec = {"publish": {"operationId": None, "message": None}} + event_spec = {} self.spec["channels"][topic] = event_spec @@ -43,9 +43,7 @@ def get_events(self) -> list[dict]: SPECIFICATION_SCHEMA = { - "asyncapi": "2.0.0", - "info": {"title": None, "version": None}, - "description": None, - "license": "MIT", + "asyncapi": "2.3.0", + "info": {"title": "", "version": ""}, "channels": {}, } diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py index c81798897..d0cda344d 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_asyncapi.py @@ -39,11 +39,12 @@ async def test_generate_spec(self): response = service.generate_specification(request) expected = { - "TicketAdded": {"publish": {"operationId": None, "message": None}}, - "TicketDeleted": {"publish": {"operationId": None, "message": None}}, + "asyncapi": "2.3.0", + "info": {"title": "", "version": ""}, + "channels": {"TicketAdded": {}, "TicketDeleted": {}}, } - self.assertEqual(expected, (await response.content())["channels"]) + self.assertEqual(expected, await response.content()) if __name__ == "__main__": diff --git a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py index cc5377945..7e2374f23 100644 --- a/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py +++ b/packages/core/minos-microservice-networks/tests/test_networks/test_specs/test_openapi.py @@ -49,6 +49,7 @@ async def test_generate_spec(self): "/ticket": {"post": {"responses": {"200": {"description": ""}}}}, }, } + self.assertEqual(expected, await response.content())