From b39f05125ee8f1961ef786cffbf76aa2cfacf7c1 Mon Sep 17 00:00:00 2001 From: Brian Cantoni Date: Fri, 17 Oct 2025 13:25:10 -0700 Subject: [PATCH 1/3] Add test for retrieving Customized Monthly schedule --- .../schedule_get_customized_monthly_id.xml | 10 ++++++++++ test/test_schedule.py | 16 ++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 test/assets/schedule_get_customized_monthly_id.xml diff --git a/test/assets/schedule_get_customized_monthly_id.xml b/test/assets/schedule_get_customized_monthly_id.xml new file mode 100644 index 000000000..cc2bf5606 --- /dev/null +++ b/test/assets/schedule_get_customized_monthly_id.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/test/test_schedule.py b/test/test_schedule.py index 4fcc85e18..3d3377ca2 100644 --- a/test/test_schedule.py +++ b/test/test_schedule.py @@ -15,6 +15,7 @@ GET_DAILY_ID_XML = os.path.join(TEST_ASSET_DIR, "schedule_get_daily_id.xml") GET_MONTHLY_ID_XML = os.path.join(TEST_ASSET_DIR, "schedule_get_monthly_id.xml") GET_MONTHLY_ID_2_XML = os.path.join(TEST_ASSET_DIR, "schedule_get_monthly_id_2.xml") +GET_CUSTOMIZED_MONTHLY_ID_XML = os.path.join(TEST_ASSET_DIR, "schedule_get_customized_monthly_id.xml") GET_EMPTY_XML = os.path.join(TEST_ASSET_DIR, "schedule_get_empty.xml") CREATE_HOURLY_XML = os.path.join(TEST_ASSET_DIR, "schedule_create_hourly.xml") CREATE_DAILY_XML = os.path.join(TEST_ASSET_DIR, "schedule_create_daily.xml") @@ -175,6 +176,21 @@ def test_get_monthly_by_id_2(self) -> None: self.assertEqual("Active", schedule.state) self.assertEqual(("Monday", "First"), schedule.interval_item.interval) + def test_get_customized_monthly_by_id(self) -> None: + self.server.version = "3.15" + with open(GET_CUSTOMIZED_MONTHLY_ID_XML, "rb") as f: + response_xml = f.read().decode("utf-8") + with requests_mock.mock() as m: + schedule_id = "f048d794-90dc-40b0-bfad-2ca78e437369" + baseurl = f"{self.server.baseurl}/schedules/{schedule_id}" + m.get(baseurl, text=response_xml) + schedule = self.server.schedules.get_by_id(schedule_id) + self.assertIsNotNone(schedule) + self.assertEqual(schedule_id, schedule.id) + self.assertEqual("Monthly customized", schedule.name) + self.assertEqual("Active", schedule.state) + self.assertEqual(("Customized Monthly"), schedule.interval_item.interval) + def test_delete(self) -> None: with requests_mock.mock() as m: m.delete(self.baseurl + "/c9cff7f9-309c-4361-99ff-d4ba8c9f5467", status_code=204) From b1499d0204e0f10edbc3d1a656b6898ecc09ca64 Mon Sep 17 00:00:00 2001 From: Brian Cantoni Date: Fri, 17 Oct 2025 13:29:21 -0700 Subject: [PATCH 2/3] Fix test to expect a tuple --- test/test_schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_schedule.py b/test/test_schedule.py index 3d3377ca2..12e849ce3 100644 --- a/test/test_schedule.py +++ b/test/test_schedule.py @@ -189,7 +189,7 @@ def test_get_customized_monthly_by_id(self) -> None: self.assertEqual(schedule_id, schedule.id) self.assertEqual("Monthly customized", schedule.name) self.assertEqual("Active", schedule.state) - self.assertEqual(("Customized Monthly"), schedule.interval_item.interval) + self.assertEqual(("Customized Monthly",), schedule.interval_item.interval) def test_delete(self) -> None: with requests_mock.mock() as m: From 630eaed06925dc41f6c6f90bb8f08c0901be860f Mon Sep 17 00:00:00 2001 From: Brian Cantoni Date: Fri, 17 Oct 2025 13:29:59 -0700 Subject: [PATCH 3/3] Add "Customized Monthly" as a possible schedule interval type that might be returned --- tableauserverclient/models/interval_item.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tableauserverclient/models/interval_item.py b/tableauserverclient/models/interval_item.py index 14cec1878..0888441f9 100644 --- a/tableauserverclient/models/interval_item.py +++ b/tableauserverclient/models/interval_item.py @@ -305,6 +305,7 @@ def interval(self, interval_values): "Fourth", "Fifth", "Last", + "Customized Monthly", ] for value in range(1, 32): VALID_INTERVALS.append(str(value))