Skip to content

Commit b831356

Browse files
author
Sergio García Prado
committed
ISSUE #371
* Increase coverage (2).
1 parent 285dbc0 commit b831356

File tree

7 files changed

+125
-15
lines changed

7 files changed

+125
-15
lines changed

packages/core/minos-microservice-common/minos/common/config/v2.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -100,52 +100,52 @@ def _get_injections(self) -> list[Union[InjectableMixin, type[InjectableMixin]]]
100100
def _get_databases(self) -> dict[str, dict[str, Any]]:
101101
data = deepcopy(self.get_by_key("databases"))
102102
for database in data.values():
103-
if "client" in database:
103+
if database.get("client") is not None:
104104
database["client"] = import_module(database["client"])
105105
return data
106106

107107
def _get_interfaces(self) -> dict[str, dict[str, Any]]:
108108
data = deepcopy(self.get_by_key("interfaces"))
109109

110-
if "http" in data:
110+
if data.get("http") is not None:
111111
data["http"] = self._parse_http_interface(data["http"])
112-
if "broker" in data:
112+
if data.get("broker") is not None:
113113
data["broker"] = self._parse_broker_interface(data["broker"])
114-
if "periodic" in data:
114+
if data.get("periodic") is not None:
115115
data["periodic"] = self._parse_periodic_interface(data["periodic"])
116116

117117
return data
118118

119119
@staticmethod
120120
def _parse_http_interface(data: dict[str, Any]) -> dict[str, Any]:
121-
if "port" in data:
121+
if data.get("port") is not None:
122122
data["port"] = import_module(data["port"])
123-
if "connector" in data:
123+
if data.get("connector") is not None:
124124
data["connector"]["client"] = import_module(data["connector"]["client"])
125125
return data
126126

127127
@staticmethod
128128
def _parse_broker_interface(data: dict[str, Any]) -> dict[str, Any]:
129-
if "port" in data:
129+
if data.get("port") is not None:
130130
data["port"] = import_module(data["port"])
131131

132-
if "publisher" in data:
132+
if data.get("publisher") is not None:
133133
data["publisher"]["client"] = import_module(data["publisher"]["client"])
134-
if "queue" in data["publisher"]:
134+
if data["publisher"].get("queue") is not None:
135135
data["publisher"]["queue"] = import_module(data["publisher"]["queue"])
136136

137-
if "subscriber" in data:
137+
if data.get("subscriber") is not None:
138138
data["subscriber"]["client"] = import_module(data["subscriber"]["client"])
139-
if "queue" in data["subscriber"]:
139+
if data["subscriber"].get("queue") is not None:
140140
data["subscriber"]["queue"] = import_module(data["subscriber"]["queue"])
141-
if "validator" in data["subscriber"]:
141+
if data["subscriber"].get("validator") is not None:
142142
data["subscriber"]["validator"] = import_module(data["subscriber"]["validator"])
143143

144144
return data
145145

146146
@staticmethod
147147
def _parse_periodic_interface(data: dict[str, Any]) -> dict[str, Any]:
148-
if "port" in data:
148+
if data.get("port") is not None:
149149
data["port"] = import_module(data["port"])
150150

151151
return data

packages/core/minos-microservice-common/minos/common/database/mixins.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,6 @@ def _get_generic_operation_factory(self) -> Optional[type[GenericDatabaseOperati
7878
if origin is None or not issubclass(origin, DatabaseMixin):
7979
continue
8080
args = get_args(base)
81-
if not len(args):
82-
continue
8381
operation_factory_cls = args[0]
8482
if not isinstance(operation_factory_cls, type) or not issubclass(
8583
operation_factory_cls, DatabaseOperationFactory

packages/core/minos-microservice-common/tests/test_common/test_database/test_abc.py renamed to packages/core/minos-microservice-common/tests/test_common/test_database/test_mixins.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
from minos.common import (
44
AiopgDatabaseClient,
55
AiopgDatabaseOperation,
6+
AiopgLockDatabaseOperationFactory,
67
DatabaseClientPool,
78
DatabaseMixin,
9+
LockDatabaseOperationFactory,
810
NotProvidedException,
911
PoolFactory,
1012
)
@@ -39,6 +41,33 @@ async def test_pool(self):
3941
async with DatabaseMixin() as database:
4042
self.assertIsInstance(database.database_pool, DatabaseClientPool)
4143

44+
async def test_operation_factory(self):
45+
operation_factory = AiopgLockDatabaseOperationFactory()
46+
mixin = DatabaseMixin(operation_factory=operation_factory)
47+
self.assertEqual(operation_factory, mixin.operation_factory)
48+
49+
async def test_operation_factory_from_cls_init(self):
50+
mixin = DatabaseMixin(operation_factory_cls=LockDatabaseOperationFactory)
51+
self.assertIsInstance(mixin.operation_factory, AiopgLockDatabaseOperationFactory)
52+
53+
async def test_operation_factory_from_cls_generic(self):
54+
class _DatabaseMixin(DatabaseMixin[LockDatabaseOperationFactory]):
55+
"""For testing purposes."""
56+
57+
mixin = _DatabaseMixin()
58+
self.assertIsInstance(mixin.operation_factory, AiopgLockDatabaseOperationFactory)
59+
60+
async def test_operation_factory_none(self):
61+
mixin = DatabaseMixin()
62+
self.assertEqual(None, mixin.operation_factory)
63+
64+
async def test_operation_factory_from_cls_generic_raises(self):
65+
class _DatabaseMixin(DatabaseMixin[int]):
66+
"""For testing purposes."""
67+
68+
with self.assertRaises(TypeError):
69+
_DatabaseMixin()
70+
4271
async def test_submit_query(self):
4372
op1 = AiopgDatabaseOperation("CREATE TABLE foo (id INT NOT NULL);")
4473
op2 = AiopgDatabaseOperation("SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'foo');")

packages/core/minos-microservice-common/tests/test_common/test_database/test_operations/__init__.py

Whitespace-only changes.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import unittest
2+
from abc import (
3+
ABC,
4+
)
5+
6+
from minos.common import (
7+
ComposedDatabaseOperation,
8+
DatabaseOperation,
9+
DatabaseOperationFactory,
10+
)
11+
12+
13+
class _DatabaseOperation(DatabaseOperation):
14+
"""For testing purposes."""
15+
16+
17+
class TestDatabaseOperation(unittest.TestCase):
18+
def test_abstract(self):
19+
self.assertTrue(issubclass(DatabaseOperation, ABC))
20+
21+
def test_constructor(self):
22+
operation = _DatabaseOperation()
23+
self.assertEqual(None, operation.timeout)
24+
self.assertEqual(None, operation.lock)
25+
26+
def test_constructor_extended(self):
27+
operation = _DatabaseOperation(timeout=3, lock="foo")
28+
self.assertEqual(3, operation.timeout)
29+
self.assertEqual("foo", operation.lock)
30+
31+
32+
class TestComposedDatabaseOperation(unittest.TestCase):
33+
def test_subclass(self) -> None:
34+
self.assertTrue(issubclass(ComposedDatabaseOperation, DatabaseOperation))
35+
36+
def test_constructor(self):
37+
operations = [_DatabaseOperation(), _DatabaseOperation()]
38+
composed = ComposedDatabaseOperation(operations)
39+
self.assertEqual(tuple(operations), composed.operations)
40+
41+
42+
class TestDatabaseOperationFactory(unittest.TestCase):
43+
def test_abstract(self):
44+
self.assertTrue(issubclass(DatabaseOperationFactory, ABC))
45+
46+
47+
if __name__ == "__main__":
48+
unittest.main()
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import unittest
2+
3+
from minos.common import (
4+
AiopgDatabaseOperation,
5+
DatabaseOperation,
6+
)
7+
8+
9+
class TestAiopgDatabaseOperation(unittest.TestCase):
10+
def test_subclass(self) -> None:
11+
self.assertTrue(issubclass(AiopgDatabaseOperation, DatabaseOperation))
12+
13+
def test_constructor(self):
14+
operation = AiopgDatabaseOperation("query", {"foo": "bar"})
15+
self.assertEqual("query", operation.query)
16+
self.assertEqual({"foo": "bar"}, operation.parameters)
17+
self.assertEqual(None, operation.timeout)
18+
self.assertEqual(None, operation.lock)
19+
20+
21+
if __name__ == "__main__":
22+
unittest.main()

packages/core/minos-microservice-common/tests/test_common/test_database/test_pools.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,20 @@
55

66
from minos.common import (
77
AiopgDatabaseClient,
8+
Config,
89
DatabaseClient,
910
DatabaseClientBuilder,
1011
DatabaseClientPool,
1112
DatabaseLock,
1213
DatabaseLockPool,
1314
UnableToConnectException,
15+
classname,
1416
)
1517
from minos.common.testing import (
1618
DatabaseMinosTestCase,
1719
)
1820
from tests.utils import (
21+
CONFIG_FILE_PATH,
1922
CommonTestCase,
2023
)
2124

@@ -43,6 +46,16 @@ def test_from_config(self):
4346
self.assertIsInstance(pool.client_builder, DatabaseClientBuilder)
4447
self.assertEqual(AiopgDatabaseClient, pool.client_builder.instance_cls)
4548

49+
def test_from_config_client_builder(self):
50+
config = Config(CONFIG_FILE_PATH, databases_default_client=classname(DatabaseClientBuilder))
51+
pool = DatabaseClientPool.from_config(config)
52+
self.assertIsInstance(pool.client_builder, DatabaseClientBuilder)
53+
54+
def test_from_config_client_none(self):
55+
config = Config(CONFIG_FILE_PATH, databases_default_client=None)
56+
with self.assertRaises(ValueError):
57+
DatabaseClientPool.from_config(config)
58+
4659
async def test_acquire_once(self):
4760
async with self.pool.acquire() as c1:
4861
self.assertIsInstance(c1, DatabaseClient)

0 commit comments

Comments
 (0)