77
88from collections .abc import Awaitable , Callable
99from typing import Any
10+ from unittest .mock import AsyncMock
1011
1112import aiodocker
13+ import pytest
1214from faker import Faker
1315from fastapi import FastAPI
1416from models_library .docker import DockerLabelKey , StandardSimcoreDockerLabels
4850pytest_simcore_ops_services_selection = []
4951
5052
51- async def test_post_task_log_message (
52- disable_autoscaling_background_task ,
53- enabled_rabbitmq : RabbitSettings ,
54- disabled_ec2 : None ,
55- disabled_ssm : None ,
56- mocked_redis_server : None ,
57- initialized_app : FastAPI ,
53+ @pytest .fixture
54+ async def logs_rabbitmq_consumer (
5855 create_rabbitmq_client : Callable [[str ], RabbitMQClient ],
5956 mocker : MockerFixture ,
60- async_docker_client : aiodocker .Docker ,
61- create_service : Callable [
62- [dict [str , Any ], dict [DockerLabelKey , str ], str ], Awaitable [Service ]
63- ],
64- task_template : dict [str , Any ],
65- osparc_docker_label_keys : StandardSimcoreDockerLabels ,
66- faker : Faker ,
67- ):
57+ ) -> AsyncMock :
6858 mocked_message_handler = mocker .AsyncMock (return_value = True )
6959 client = create_rabbitmq_client ("pytest_consumer" )
7060 await client .subscribe (
7161 LoggerRabbitMessage .get_channel_name (),
7262 mocked_message_handler ,
7363 topics = [BIND_TO_ALL_TOPICS ],
7464 )
65+ return mocked_message_handler
7566
76- service_with_labels = await create_service (
77- task_template ,
78- osparc_docker_label_keys .to_simcore_runtime_docker_labels (),
79- "running" ,
67+
68+ @pytest .fixture
69+ async def progress_rabbitmq_consumer (
70+ create_rabbitmq_client : Callable [[str ], RabbitMQClient ],
71+ mocker : MockerFixture ,
72+ ) -> AsyncMock :
73+ mocked_message_handler = mocker .AsyncMock (return_value = True )
74+ client = create_rabbitmq_client ("pytest_consumer" )
75+ await client .subscribe (
76+ ProgressRabbitMessageNode .get_channel_name (),
77+ mocked_message_handler ,
78+ topics = [BIND_TO_ALL_TOPICS ],
8079 )
81- assert service_with_labels .spec
82- service_tasks = TypeAdapter (list [Task ]).validate_python (
83- await async_docker_client .tasks .list (
84- filters = {"service" : service_with_labels .spec .name }
80+ return mocked_message_handler
81+
82+
83+ @pytest .fixture
84+ async def running_service_tasks (
85+ create_service : Callable [
86+ [dict [str , Any ], dict [DockerLabelKey , str ], str ], Awaitable [Service ]
87+ ],
88+ task_template : dict [str , Any ],
89+ async_docker_client : aiodocker .Docker ,
90+ ) -> Callable [[dict [DockerLabelKey , str ]], Awaitable [list [Task ]]]:
91+ async def _ (labels : dict [DockerLabelKey , str ]) -> list [Task ]:
92+ # Simulate a running service
93+ service = await create_service (
94+ task_template ,
95+ labels ,
96+ "running" ,
8597 )
98+ assert service .spec
99+
100+ service_tasks = TypeAdapter (list [Task ]).validate_python (
101+ await async_docker_client .tasks .list (filters = {"service" : service .spec .name })
102+ )
103+ assert service_tasks
104+ assert len (service_tasks ) == 1
105+ return service_tasks
106+
107+ return _
108+
109+
110+ async def test_post_task_log_message (
111+ disable_autoscaling_background_task ,
112+ disable_buffers_pool_background_task ,
113+ enabled_rabbitmq : RabbitSettings ,
114+ disabled_ec2 : None ,
115+ disabled_ssm : None ,
116+ mocked_redis_server : None ,
117+ initialized_app : FastAPI ,
118+ running_service_tasks : Callable [[dict [DockerLabelKey , str ]], Awaitable [list [Task ]]],
119+ osparc_docker_label_keys : StandardSimcoreDockerLabels ,
120+ faker : Faker ,
121+ logs_rabbitmq_consumer : AsyncMock ,
122+ ):
123+ service_tasks = await running_service_tasks (
124+ osparc_docker_label_keys .to_simcore_runtime_docker_labels ()
86125 )
87- assert service_tasks
88126 assert len (service_tasks ) == 1
89-
90127 log_message = faker .pystr ()
91128 await post_tasks_log_message (
92129 initialized_app , tasks = service_tasks , message = log_message , level = 0
@@ -97,7 +134,7 @@ async def test_post_task_log_message(
97134 print (
98135 f"--> checking for message in rabbit exchange { LoggerRabbitMessage .get_channel_name ()} , { attempt .retry_state .retry_object .statistics } "
99136 )
100- mocked_message_handler .assert_called_once_with (
137+ logs_rabbitmq_consumer .assert_called_once_with (
101138 LoggerRabbitMessage (
102139 node_id = osparc_docker_label_keys .node_id ,
103140 project_id = osparc_docker_label_keys .project_id ,
@@ -111,74 +148,22 @@ async def test_post_task_log_message(
111148 print ("... message received" )
112149
113150
114- async def test_post_task_log_message_does_not_raise_if_service_has_no_labels (
115- disable_autoscaling_background_task ,
116- enabled_rabbitmq : RabbitSettings ,
117- disabled_ec2 : None ,
118- disabled_ssm : None ,
119- mocked_redis_server : None ,
120- initialized_app : FastAPI ,
121- async_docker_client : aiodocker .Docker ,
122- create_service : Callable [
123- [dict [str , Any ], dict [DockerLabelKey , str ], str ], Awaitable [Service ]
124- ],
125- task_template : dict [str , Any ],
126- faker : Faker ,
127- ):
128- service_without_labels = await create_service (task_template , {}, "running" )
129- assert service_without_labels .spec
130- service_tasks = TypeAdapter (list [Task ]).validate_python (
131- await async_docker_client .tasks .list (
132- filters = {"service" : service_without_labels .spec .name }
133- )
134- )
135- assert service_tasks
136- assert len (service_tasks ) == 1
137-
138- # this shall not raise any exception even if the task does not contain
139- # the necessary labels
140- await post_tasks_log_message (
141- initialized_app , tasks = service_tasks , message = faker .pystr (), level = 0
142- )
143-
144-
145151async def test_post_task_progress_message (
146152 disable_autoscaling_background_task ,
153+ disable_buffers_pool_background_task ,
147154 enabled_rabbitmq : RabbitSettings ,
148155 disabled_ec2 : None ,
149156 disabled_ssm : None ,
150157 mocked_redis_server : None ,
151158 initialized_app : FastAPI ,
152- create_rabbitmq_client : Callable [[str ], RabbitMQClient ],
153- mocker : MockerFixture ,
154- async_docker_client : aiodocker .Docker ,
155- create_service : Callable [
156- [dict [str , Any ], dict [DockerLabelKey , str ], str ], Awaitable [Service ]
157- ],
158- task_template : dict [str , Any ],
159+ running_service_tasks : Callable [[dict [DockerLabelKey , str ]], Awaitable [list [Task ]]],
159160 osparc_docker_label_keys : StandardSimcoreDockerLabels ,
160161 faker : Faker ,
162+ progress_rabbitmq_consumer : AsyncMock ,
161163):
162- mocked_message_handler = mocker .AsyncMock (return_value = True )
163- client = create_rabbitmq_client ("pytest_consumer" )
164- await client .subscribe (
165- ProgressRabbitMessageNode .get_channel_name (),
166- mocked_message_handler ,
167- topics = [BIND_TO_ALL_TOPICS ],
168- )
169-
170- service_with_labels = await create_service (
171- task_template ,
164+ service_tasks = await running_service_tasks (
172165 osparc_docker_label_keys .to_simcore_runtime_docker_labels (),
173- "running" ,
174166 )
175- assert service_with_labels .spec
176- service_tasks = TypeAdapter (list [Task ]).validate_python (
177- await async_docker_client .tasks .list (
178- filters = {"service" : service_with_labels .spec .name }
179- )
180- )
181- assert service_tasks
182167 assert len (service_tasks ) == 1
183168
184169 progress_value = faker .pyfloat (min_value = 0 )
@@ -194,7 +179,7 @@ async def test_post_task_progress_message(
194179 print (
195180 f"--> checking for message in rabbit exchange { ProgressRabbitMessageNode .get_channel_name ()} , { attempt .retry_state .retry_object .statistics } "
196181 )
197- mocked_message_handler .assert_called_once_with (
182+ progress_rabbitmq_consumer .assert_called_once_with (
198183 ProgressRabbitMessageNode (
199184 node_id = osparc_docker_label_keys .node_id ,
200185 project_id = osparc_docker_label_keys .project_id ,
@@ -208,32 +193,25 @@ async def test_post_task_progress_message(
208193 print ("... message received" )
209194
210195
211- async def test_post_task_progress_does_not_raise_if_service_has_no_labels (
196+ async def test_post_task_messages_does_not_raise_if_service_has_no_labels (
212197 disable_autoscaling_background_task ,
198+ disable_buffers_pool_background_task ,
213199 enabled_rabbitmq : RabbitSettings ,
214200 disabled_ec2 : None ,
215201 disabled_ssm : None ,
216202 mocked_redis_server : None ,
217203 initialized_app : FastAPI ,
218- async_docker_client : aiodocker .Docker ,
219- create_service : Callable [
220- [dict [str , Any ], dict [DockerLabelKey , str ], str ], Awaitable [Service ]
221- ],
222- task_template : dict [str , Any ],
204+ running_service_tasks : Callable [[dict [DockerLabelKey , str ]], Awaitable [list [Task ]]],
223205 faker : Faker ,
224206):
225- service_without_labels = await create_service (task_template , {}, "running" )
226- assert service_without_labels .spec
227- service_tasks = TypeAdapter (list [Task ]).validate_python (
228- await async_docker_client .tasks .list (
229- filters = {"service" : service_without_labels .spec .name }
230- )
231- )
232- assert service_tasks
207+ service_tasks = await running_service_tasks ({})
233208 assert len (service_tasks ) == 1
234209
235210 # this shall not raise any exception even if the task does not contain
236211 # the necessary labels
212+ await post_tasks_log_message (
213+ initialized_app , tasks = service_tasks , message = faker .pystr (), level = 0
214+ )
237215 await post_tasks_progress_message (
238216 initialized_app ,
239217 tasks = service_tasks ,
0 commit comments