From 45f51c358866a09810dacfc9508c4c06cbc18ec4 Mon Sep 17 00:00:00 2001 From: Daniel Schiavini Date: Fri, 7 Dec 2018 18:09:20 +0100 Subject: [PATCH] STAR-322: First test cloud output device manager --- .../tests/Cloud/NetworkManagerMock.py | 32 +++++++----- .../Cloud/TestCloudOutputDeviceManager.py | 51 +++++++++++++++++++ .../tests/Cloud/__init__.py | 2 + 3 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDeviceManager.py create mode 100644 plugins/UM3NetworkPrinting/tests/Cloud/__init__.py diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/NetworkManagerMock.py b/plugins/UM3NetworkPrinting/tests/Cloud/NetworkManagerMock.py index b14ee760d9..945c526814 100644 --- a/plugins/UM3NetworkPrinting/tests/Cloud/NetworkManagerMock.py +++ b/plugins/UM3NetworkPrinting/tests/Cloud/NetworkManagerMock.py @@ -1,9 +1,10 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import json +from typing import Dict, Tuple from unittest.mock import MagicMock -from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply, QNetworkRequest +from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply from UM.Signal import Signal @@ -20,23 +21,26 @@ class NetworkManagerMock: "HEAD": QNetworkAccessManager.HeadOperation, } - def __getattr__(self, item): - operation = self._OPERATIONS.get(item.upper()) + def __init__(self): + self.replies = {} # type: Dict[Tuple[str, str], QNetworkReply] + + def __getattr__(self, method): + operation = self._OPERATIONS.get(method.upper()) if operation: - return lambda request, *_: self._fakeReply(operation, request) - return super().__getattribute__(item) + return lambda request, *_: self.replies[method.upper(), request.url().toString()] + return super().__getattribute__(method) - def _fakeReply(self, operation: QNetworkAccessManager.Operation, request: QNetworkRequest) -> QNetworkReply: - reply_mock = MagicMock() - reply_mock.url = request.url - reply_mock.operation.return_value = operation - return reply_mock - - def respond(self, method: str, url: str, status_code: int, response: dict) -> QNetworkReply: + def prepareResponse(self, method: str, url: str, status_code: int, response: dict) -> None: reply_mock = MagicMock() reply_mock.url().toString.return_value = url reply_mock.operation.return_value = self._OPERATIONS[method] reply_mock.attribute.return_value = status_code reply_mock.readAll.return_value = json.dumps(response).encode() - self.finished.emit(reply_mock) - return reply_mock + self.replies[method, url] = reply_mock + + def flushReplies(self): + for reply in self.replies.values(): + self.finished.emit(reply) + + def reset(self): + self.replies.clear() diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDeviceManager.py new file mode 100644 index 0000000000..cf86f713b2 --- /dev/null +++ b/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDeviceManager.py @@ -0,0 +1,51 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. +from unittest import TestCase +from unittest.mock import patch + +from cura.CuraApplication import CuraApplication +from plugins.UM3NetworkPrinting.src.Cloud.CloudOutputDevice import CloudOutputDevice +from plugins.UM3NetworkPrinting.src.Cloud.CloudOutputDeviceManager import CloudOutputDeviceManager +from plugins.UM3NetworkPrinting.tests.Cloud.NetworkManagerMock import NetworkManagerMock + + +@patch("cura.NetworkClient.QNetworkAccessManager") +class TestCloudOutputDeviceManager(TestCase): + app = CuraApplication.getInstance() or CuraApplication() + + def setUp(self): + super().setUp() + self.app.initialize() + + self.network = NetworkManagerMock() + self.network.prepareResponse( + "GET", "https://api-staging.ultimaker.com/connect/v1/clusters", + 200, { + "data": [{ + "cluster_id": "RIZ6cZbWA_Ua7RZVJhrdVfVpf0z-MqaSHQE4v8aRTtYq", + "host_guid": "e90ae0ac-1257-4403-91ee-a44c9b7e8050", + "host_name": "ultimakersystem-ccbdd30044ec", "host_version": "5.1.2.20180807", + "is_online": False, "status": "inactive" + }, { + "cluster_id": "R0YcLJwar1ugh0ikEZsZs8NWKV6vJP_LdYsXgXqAcaNC", + "host_guid": "e90ae0ac-1257-4403-91ee-a44c9b7e8050", + "host_name": "ultimakersystem-ccbdd30044ec", "host_version": "5.1.2.20180807", + "is_online": True, "status": "active" + }] + } + ) + + def tearDown(self): + super().tearDown() + + def test_device(self, network_mock): + network_mock.return_value = self.network + + manager = CloudOutputDeviceManager() + manager._account.loginStateChanged.emit(True) + manager._update_timer.timeout.emit() + + self.network.flushReplies() + + devices = self.app.getOutputDeviceManager().getOutputDevices() + self.assertEqual([CloudOutputDevice], list(map(type, devices))) diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/__init__.py b/plugins/UM3NetworkPrinting/tests/Cloud/__init__.py new file mode 100644 index 0000000000..f3f6970c54 --- /dev/null +++ b/plugins/UM3NetworkPrinting/tests/Cloud/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher.