diff --git a/sushy_tools/emulator/main.py b/sushy_tools/emulator/main.py index bfc51a37..3d68da21 100755 --- a/sushy_tools/emulator/main.py +++ b/sushy_tools/emulator/main.py @@ -405,8 +405,15 @@ def manager_resource(identity): elif flask.request.method == "PATCH": if app.feature_set != "full": raise error.MethodNotAllowed("PATCH not supported in minimum mode") + try: + data = flask.request.get_json() + except wz_exc.BadRequest: + app.logger.error( + "PATCH method missing in /Managers/%s due to invalid JSON", + identity + ) + raise error.BadRequest("Request must be a valid JSON") - data = flask.request.get_json(force=True) new_datetime = data.get("DateTime") new_offset = data.get("DateTimeLocalOffset") diff --git a/sushy_tools/tests/unit/emulator/test_main.py b/sushy_tools/tests/unit/emulator/test_main.py index 7d946384..e399c9d2 100644 --- a/sushy_tools/tests/unit/emulator/test_main.py +++ b/sushy_tools/tests/unit/emulator/test_main.py @@ -238,6 +238,33 @@ class ManagersTestCase(EmulatorTestCase): self.assertEqual({'@odata.id': '/redfish/v1/Systems/xxx/VirtualMedia'}, response.json['VirtualMedia']) + @patch_resource('managers') + def test_manager_resource_patch_valid_json(self, managers_mock): + managers_mock = managers_mock.return_value + managers_mock.set_datetime.return_value = None + + payload = { + "DateTime": "2025-07-14T11:30:00+00:00", + "DateTimeLocalOffset": "+00:00"} + + response = self.app.patch( + '/redfish/v1/Managers/xxxx-yyyy-zzzz', + json=payload) + + self.assertEqual(204, response.status_code) + + @patch_resource('managers') + def test_manager_resource_patch_invalid_json(self, managers_mock): + managers_mock = managers_mock.return_value + managers_mock.set_datetime.return_value = None + + response = self.app.patch( + '/redfish/v1/Managers/xxxx-yyyy-zzzz', + data='not-json', + content_type='application/json') + + self.assertEqual(400, response.status_code) + @patch_resource('managers') def test_manager_resource_get_reduced_feature_set(self, managers_mock): self.set_feature_set("vmedia")