From 57cd7a99a0f5c0e8a2418dd2f64acddc0911eced Mon Sep 17 00:00:00 2001
From: Erwan MATHIEU <erwan.mathieu@ultimaker.com>
Date: Thu, 26 Sep 2024 09:12:40 +0200
Subject: [PATCH] Fix unit tests

---
 tests/API/TestAccount.py               |  4 +--
 tests/Settings/TestCuraStackBuilder.py |  5 ++--
 tests/TestOAuth2.py                    | 41 ++++++++++++++++----------
 3 files changed, 30 insertions(+), 20 deletions(-)

diff --git a/tests/API/TestAccount.py b/tests/API/TestAccount.py
index 9d62646eff..26da8d04cd 100644
--- a/tests/API/TestAccount.py
+++ b/tests/API/TestAccount.py
@@ -80,12 +80,12 @@ def test_errorLoginState(application):
     with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.getInstance"):  # Don't want triggers for account information to actually make HTTP requests.
         account._onLoginStateChanged(True, "BLARG!")
     # Even though we said that the login worked, it had an error message, so the login failed.
-    account.loginStateChanged.emit.called_with(False)
+    account.loginStateChanged.emit.assert_called_with(False)
 
     with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.getInstance"):
         account._onLoginStateChanged(True)
         account._onLoginStateChanged(False, "OMGZOMG!")
-    account.loginStateChanged.emit.called_with(False)
+    account.loginStateChanged.emit.assert_called_with(False)
 
 def test_sync_success():
     account = Account(MagicMock())
diff --git a/tests/Settings/TestCuraStackBuilder.py b/tests/Settings/TestCuraStackBuilder.py
index 6bd19a0d30..b049433923 100644
--- a/tests/Settings/TestCuraStackBuilder.py
+++ b/tests/Settings/TestCuraStackBuilder.py
@@ -50,9 +50,10 @@ def quality_changes_container():
 def test_createMachineWithUnknownDefinition(application, container_registry):
     application.getContainerRegistry = MagicMock(return_value=container_registry)
     with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)):
-        with patch("UM.ConfigurationErrorMessage.ConfigurationErrorMessage.getInstance") as mocked_config_error:
+        mocked_config_error = MagicMock()
+        with patch("UM.ConfigurationErrorMessage.ConfigurationErrorMessage.getInstance", MagicMock(return_value=mocked_config_error)):
             assert CuraStackBuilder.createMachine("Whatever", "NOPE") is None
-            assert mocked_config_error.addFaultyContainers.called_with("NOPE")
+            mocked_config_error.addFaultyContainers.assert_called_once_with("NOPE")
 
 
 def test_createMachine(application, container_registry, definition_container, global_variant, material_instance_container,
diff --git a/tests/TestOAuth2.py b/tests/TestOAuth2.py
index 41edaebbf7..d49d42f065 100644
--- a/tests/TestOAuth2.py
+++ b/tests/TestOAuth2.py
@@ -3,6 +3,7 @@
 
 from datetime import datetime
 from unittest.mock import MagicMock, Mock, patch
+from pytest import fixture
 
 from PyQt6.QtGui import QDesktopServices
 from PyQt6.QtNetwork import QNetworkReply
@@ -59,6 +60,17 @@ NO_REFRESH_AUTH_RESPONSE = AuthenticationResponse(
 MALFORMED_AUTH_RESPONSE = AuthenticationResponse(success=False)
 
 
+@fixture
+def http_request_manager():
+    mock_reply = Mock()  # The user profile that the service should respond with.
+    mock_reply.error = Mock(return_value=QNetworkReply.NetworkError.NoError)
+
+    http_mock = Mock()
+    http_mock.get = lambda url, headers_dict, callback, error_callback, timeout: callback(mock_reply)
+    http_mock.readJSON = Mock(return_value={"data": {"user_id": "id_ego_or_superego", "username": "Ghostkeeper"}})
+    http_mock.setDelayRequests = Mock()
+    return http_mock
+
 def test_cleanAuthService() -> None:
     """
     Ensure that when setting up an AuthorizationService, no data is set.
@@ -72,18 +84,20 @@ def test_cleanAuthService() -> None:
 
     assert authorization_service.getAccessToken() is None
 
-def test_refreshAccessTokenSuccess():
+def test_refreshAccessTokenSuccess(http_request_manager):
     authorization_service = AuthorizationService(OAUTH_SETTINGS, Preferences())
     authorization_service.initialize()
     with patch.object(AuthorizationService, "getUserProfile", return_value=UserProfile()):
         authorization_service._storeAuthData(SUCCESSFUL_AUTH_RESPONSE)
     authorization_service.onAuthStateChanged.emit = MagicMock()
 
-    with patch.object(AuthorizationHelpers, "getAccessTokenUsingRefreshToken", return_value=SUCCESSFUL_AUTH_RESPONSE):
-        authorization_service.refreshAccessToken()
-        assert authorization_service.onAuthStateChanged.emit.called_with(True)
+    with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.getInstance", MagicMock(return_value=http_request_manager)):
+        with patch.object(AuthorizationService, "getUserProfile", return_value=UserProfile()):
+            with patch.object(AuthorizationHelpers, "getAccessTokenUsingRefreshToken", side_effect=lambda refresh_token, callback: callback(SUCCESSFUL_AUTH_RESPONSE)):
+                authorization_service.refreshAccessToken()
+                authorization_service.onAuthStateChanged.emit.assert_called_once_with(logged_in = True)
 
-def test__parseJWTNoRefreshToken():
+def test__parseJWTNoRefreshToken(http_request_manager):
     """
     Tests parsing the user profile if there is no refresh token stored, but there is a normal authentication token.
 
@@ -94,13 +108,8 @@ def test__parseJWTNoRefreshToken():
         authorization_service._storeAuthData(NO_REFRESH_AUTH_RESPONSE)
 
     mock_callback = Mock()  # To log the final profile response.
-    mock_reply = Mock()  # The user profile that the service should respond with.
-    mock_reply.error = Mock(return_value = QNetworkReply.NetworkError.NoError)
-    http_mock = Mock()
-    http_mock.get = lambda url, headers_dict, callback, error_callback, timeout: callback(mock_reply)
-    http_mock.readJSON = Mock(return_value = {"data": {"user_id": "id_ego_or_superego", "username": "Ghostkeeper"}})
 
-    with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.getInstance", MagicMock(return_value = http_mock)):
+    with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.getInstance", MagicMock(return_value = http_request_manager)):
         authorization_service._parseJWT(mock_callback)
     mock_callback.assert_called_once()
     profile_reply = mock_callback.call_args_list[0][0][0]
@@ -175,9 +184,10 @@ def test_refreshAccessTokenFailed():
     """
     authorization_service = AuthorizationService(OAUTH_SETTINGS, Preferences())
     authorization_service.initialize()
+    with patch.object(AuthorizationService, "getUserProfile", return_value=UserProfile()):
+        authorization_service._storeAuthData(SUCCESSFUL_AUTH_RESPONSE)
+    authorization_service.onAuthStateChanged.emit = MagicMock()
 
-    def mock_refresh(self, refresh_token, callback):  # Refreshing gives a valid token.
-        callback(FAILED_AUTH_RESPONSE)
     mock_reply = Mock()  # The response that the request should give, containing an error about it failing to authenticate.
     mock_reply.error = Mock(return_value = QNetworkReply.NetworkError.AuthenticationRequiredError)  # The reply is 403: Authentication required, meaning the server responded with a "Can't do that, Dave".
     http_mock = Mock()
@@ -187,10 +197,9 @@ def test_refreshAccessTokenFailed():
     with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.readJSON", Mock(return_value = {"error_description": "Mock a failed request!"})):
         with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.getInstance", MagicMock(return_value = http_mock)):
             authorization_service._storeAuthData(SUCCESSFUL_AUTH_RESPONSE)
-            authorization_service.onAuthStateChanged.emit = MagicMock()
-            with patch("cura.OAuth2.AuthorizationHelpers.AuthorizationHelpers.getAccessTokenUsingRefreshToken", mock_refresh):
+            with patch("cura.OAuth2.AuthorizationHelpers.AuthorizationHelpers.getAccessTokenUsingRefreshToken", side_effect=lambda refresh_token, callback: callback(FAILED_AUTH_RESPONSE)):
                 authorization_service.refreshAccessToken()
-                assert authorization_service.onAuthStateChanged.emit.called_with(False)
+                authorization_service.onAuthStateChanged.emit.assert_called_with(logged_in = False)
 
 def test_refreshAccesTokenWithoutData():
     authorization_service = AuthorizationService(OAUTH_SETTINGS, Preferences())