Compare commits

..

2 Commits

Author SHA1 Message Date
d064e46af6 do not terminate child process explicitly
This feature sometimes causes the main process termination. Since the
child process has been already terminated (or going to) there is no need
to terminate it manually
2023-05-29 17:27:04 +03:00
5627c9cca0 fix case where it was impossible to create session if user and password
are required

Issue appears if auth is enabled and unix socket is disabled and caused
by 7f5e541120
2023-05-29 17:23:57 +03:00
4 changed files with 20 additions and 13 deletions

View File

@ -172,7 +172,6 @@ class Spawn(Thread, LazyLogging):
process = self.active.pop(process_id, None) process = self.active.pop(process_id, None)
if process is not None: if process is not None:
process.terminate() # make sure lol
process.join() process.join()
def stop(self) -> None: def stop(self) -> None:

View File

@ -102,15 +102,22 @@ class WebClient(Client, LazyLogging):
return address, False return address, False
@contextlib.contextmanager @contextlib.contextmanager
def __get_session(self) -> Generator[requests.Session, None, None]: def __get_session(self, session: requests.Session | None = None) -> Generator[requests.Session, None, None]:
""" """
execute request and handle exceptions execute request and handle exceptions
Args:
session(requests.Session | None, optional): session to be used or stored instance property otherwise
(Default value = None)
Yields: Yields:
requests.Session: session for requests requests.Session: session for requests
""" """
try: try:
yield self.__session if session is not None:
yield session # use session from arguments
else:
yield self.__session # use instance generated session
except requests.RequestException as e: except requests.RequestException as e:
if self.suppress_errors: if self.suppress_errors:
return return
@ -136,13 +143,16 @@ class WebClient(Client, LazyLogging):
return session return session
session = requests.Session() session = requests.Session()
self._login() self._login(session)
return session return session
def _login(self) -> None: def _login(self, session: requests.Session) -> None:
""" """
process login to the service process login to the service
Args:
session(requests.Session): request session to login
""" """
if self.user is None: if self.user is None:
return # no auth configured return # no auth configured
@ -152,7 +162,7 @@ class WebClient(Client, LazyLogging):
"password": self.user.password "password": self.user.password
} }
with self.__get_session() as session: with self.__get_session(session):
response = session.post(self._login_url, json=payload) response = session.post(self._login_url, json=payload)
response.raise_for_status() response.raise_for_status()

View File

@ -55,7 +55,7 @@ def test_create_session(web_client: WebClient, mocker: MockerFixture) -> None:
session = web_client._create_session(use_unix_socket=False) session = web_client._create_session(use_unix_socket=False)
assert isinstance(session, requests.Session) assert isinstance(session, requests.Session)
assert not isinstance(session, requests_unixsocket.Session) assert not isinstance(session, requests_unixsocket.Session)
login_mock.assert_called_once_with() login_mock.assert_called_once_with(pytest.helpers.anyvar(int))
def test_create_session_unix_socket(web_client: WebClient, mocker: MockerFixture) -> None: def test_create_session_unix_socket(web_client: WebClient, mocker: MockerFixture) -> None:
@ -80,7 +80,7 @@ def test_login(web_client: WebClient, user: User, mocker: MockerFixture) -> None
"password": user.password "password": user.password
} }
web_client._login() web_client._login(requests.Session())
requests_mock.assert_called_once_with(pytest.helpers.anyvar(str, True), json=payload) requests_mock.assert_called_once_with(pytest.helpers.anyvar(str, True), json=payload)
@ -90,7 +90,7 @@ def test_login_failed(web_client: WebClient, user: User, mocker: MockerFixture)
""" """
web_client.user = user web_client.user = user
mocker.patch("requests.Session.post", side_effect=Exception()) mocker.patch("requests.Session.post", side_effect=Exception())
web_client._login() web_client._login(requests.Session())
def test_login_failed_http_error(web_client: WebClient, user: User, mocker: MockerFixture) -> None: def test_login_failed_http_error(web_client: WebClient, user: User, mocker: MockerFixture) -> None:
@ -99,7 +99,7 @@ def test_login_failed_http_error(web_client: WebClient, user: User, mocker: Mock
""" """
web_client.user = user web_client.user = user
mocker.patch("requests.Session.post", side_effect=requests.exceptions.HTTPError()) mocker.patch("requests.Session.post", side_effect=requests.exceptions.HTTPError())
web_client._login() web_client._login(requests.Session())
def test_login_skip(web_client: WebClient, mocker: MockerFixture) -> None: def test_login_skip(web_client: WebClient, mocker: MockerFixture) -> None:
@ -107,7 +107,7 @@ def test_login_skip(web_client: WebClient, mocker: MockerFixture) -> None:
must skip login if no user set must skip login if no user set
""" """
requests_mock = mocker.patch("requests.Session.post") requests_mock = mocker.patch("requests.Session.post")
web_client._login() web_client._login(requests.Session())
requests_mock.assert_not_called() requests_mock.assert_not_called()

View File

@ -140,9 +140,7 @@ def test_run_pop(spawner: Spawn) -> None:
spawner.run() spawner.run()
first.terminate.assert_called_once_with()
first.join.assert_called_once_with() first.join.assert_called_once_with()
second.terminate.assert_called_once_with()
second.join.assert_called_once_with() second.join.assert_called_once_with()
assert not spawner.active assert not spawner.active