From f19b3d2bd3a8b076438902a7412539fa730cf030 Mon Sep 17 00:00:00 2001 From: Kambiz Aghaiepour Date: Fri, 8 May 2026 11:42:04 -0400 Subject: [PATCH] Add batch schedule creation endpoint --- src/quads_lib/quads.py | 3 ++ tests/test_quads.py | 73 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/src/quads_lib/quads.py b/src/quads_lib/quads.py index 4e2501e..bb82fd2 100644 --- a/src/quads_lib/quads.py +++ b/src/quads_lib/quads.py @@ -192,6 +192,9 @@ def remove_schedule(self, schedule_id: int) -> dict: def create_schedule(self, data: dict) -> dict: return self.post("schedules", data) + def create_schedules_batch(self, data: dict) -> dict: + return self.post("schedules/batch", data) + # Available @returns("List[Host]") def get_available(self) -> dict: diff --git a/tests/test_quads.py b/tests/test_quads.py index 66ca2a2..ebf40f3 100644 --- a/tests/test_quads.py +++ b/tests/test_quads.py @@ -1133,6 +1133,79 @@ def test_create_schedule(self, mock_post): assert mock_post.call_args[1]["json"] == schedule_data assert result == schedule_data + @patch("requests.Session.request") + def test_create_schedules_batch(self, mock_post): + batch_data = { + "cloud": "cloud1", + "hostnames": ["host1", "host2", "host3"], + "start": "2024-03-20 10:00", + "end": "2024-03-21 10:00", + } + expected_response = { + "assignment_id": 42, + "schedules_created": 3, + "hostnames": ["host1", "host2", "host3"], + "jira_updated": True, + } + mock_response = Mock() + mock_response.status_code = 200 + mock_response.json.return_value = expected_response + mock_post.return_value = mock_response + + result = self.api.create_schedules_batch(batch_data) + + mock_post.assert_called_once() + assert str(mock_post.call_args[0][1]).endswith("/schedules/batch") + assert mock_post.call_args[1]["json"] == batch_data + assert result == expected_response + + @patch("requests.Session.request") + def test_create_schedules_batch_with_assignment_params(self, mock_post): + batch_data = { + "cloud": "cloud2", + "hostnames": ["host1", "host2"], + "start": "now", + "end": "2024-03-21 10:00", + "description": "Test assignment", + "owner": "testuser", + "ticket": "JIRA-123", + "ccuser": "user1,user2", + "vlan": 1234, + "qinq": 1, + } + expected_response = { + "assignment_id": 158, + "schedules_created": 2, + "hostnames": ["host1", "host2"], + "jira_updated": True, + } + mock_response = Mock() + mock_response.status_code = 200 + mock_response.json.return_value = expected_response + mock_post.return_value = mock_response + + result = self.api.create_schedules_batch(batch_data) + + mock_post.assert_called_once() + assert str(mock_post.call_args[0][1]).endswith("/schedules/batch") + assert mock_post.call_args[1]["json"] == batch_data + assert result == expected_response + + @patch("requests.Session.request") + def test_create_schedules_batch_error(self, mock_post): + batch_data = { + "cloud": "cloud1", + "hostnames": ["host1"], + "start": "2024-03-20 10:00", + "end": "2024-03-21 10:00", + } + mock_response = Mock() + mock_response.status_code = 400 + mock_post.return_value = mock_response + + with pytest.raises(APIBadRequest): + self.api.create_schedules_batch(batch_data) + @patch("requests.Session.request") def test_get_available(self, mock_get): expected_response = {