From 10613091d3da1b178ed6dab8b006d1cb62756789 Mon Sep 17 00:00:00 2001 From: Jordan Woods <13803242+jorwoods@users.noreply.github.com> Date: Thu, 20 Nov 2025 22:13:28 -0600 Subject: [PATCH 1/3] fix: black ci errors --- test/test_datasource.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/test_datasource.py b/test/test_datasource.py index 7f4cca75..56eb11ab 100644 --- a/test/test_datasource.py +++ b/test/test_datasource.py @@ -895,7 +895,8 @@ def test_publish_description(server: TSC.Server) -> None: ds_elem = body.find(".//datasource") assert ds_elem is not None assert ds_elem.attrib["description"] == "Sample description" - + + def test_get_datasource_no_owner(server: TSC.Server) -> None: with requests_mock.mock() as m: m.get(server.datasources.baseurl, text=GET_NO_OWNER.read_text()) From bde2790e96e4a5448f407b8e37b011151b6e316c Mon Sep 17 00:00:00 2001 From: Jordan Woods <13803242+jorwoods@users.noreply.github.com> Date: Wed, 12 Nov 2025 21:57:36 -0600 Subject: [PATCH 2/3] chore: pytestify requests --- test/test_requests.py | 110 ++++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 53 deletions(-) diff --git a/test/test_requests.py b/test/test_requests.py index 5c0d090b..3a22b516 100644 --- a/test/test_requests.py +++ b/test/test_requests.py @@ -1,6 +1,6 @@ -import re -import unittest +from urllib.parse import parse_qs +import pytest import requests import requests_mock @@ -8,54 +8,58 @@ from tableauserverclient.server.endpoint.exceptions import InternalServerError, NonXMLResponseError -class RequestTests(unittest.TestCase): - def setUp(self): - self.server = TSC.Server("http://test", False) - - # Fake sign in - self.server._site_id = "dad65087-b08b-4603-af4e-2887b8aafc67" - self.server._auth_token = "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM" - - self.baseurl = self.server.workbooks.baseurl - - def test_make_get_request(self): - with requests_mock.mock() as m: - m.get(requests_mock.ANY) - url = "http://test/api/2.3/sites/dad65087-b08b-4603-af4e-2887b8aafc67/workbooks" - opts = TSC.RequestOptions(pagesize=13, pagenumber=15) - resp = self.server.workbooks.get_request(url, request_object=opts) - - self.assertTrue(re.search("pagesize=13", resp.request.query)) - self.assertTrue(re.search("pagenumber=15", resp.request.query)) - - def test_make_post_request(self): - with requests_mock.mock() as m: - m.post(requests_mock.ANY) - url = "http://test/api/2.3/sites/dad65087-b08b-4603-af4e-2887b8aafc67/workbooks" - resp = self.server.workbooks._make_request( - requests.post, - url, - content=b"1337", - auth_token="j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM", - content_type="multipart/mixed", - ) - self.assertEqual(resp.request.headers["x-tableau-auth"], "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM") - self.assertEqual(resp.request.headers["content-type"], "multipart/mixed") - self.assertTrue(re.search("Tableau Server Client", resp.request.headers["user-agent"])) - self.assertEqual(resp.request.body, b"1337") - - # Test that 500 server errors are handled properly - def test_internal_server_error(self): - self.server.version = "3.2" - server_response = "500: Internal Server Error" - with requests_mock.mock() as m: - m.register_uri("GET", self.server.server_info.baseurl, status_code=500, text=server_response) - self.assertRaisesRegex(InternalServerError, server_response, self.server.server_info.get) - - # Test that non-xml server errors are handled properly - def test_non_xml_error(self): - self.server.version = "3.2" - server_response = "this is not xml" - with requests_mock.mock() as m: - m.register_uri("GET", self.server.server_info.baseurl, status_code=499, text=server_response) - self.assertRaisesRegex(NonXMLResponseError, server_response, self.server.server_info.get) +@pytest.fixture(scope="function") +def server(): + """Fixture to create a TSC.Server instance for testing.""" + server = TSC.Server("http://test", False) + + # Fake signin + server._site_id = "dad65087-b08b-4603-af4e-2887b8aafc67" + server._auth_token = "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM" + + return server + +def test_make_get_request(server: TSC.Server) -> None: + with requests_mock.mock() as m: + m.get(requests_mock.ANY) + url = "http://test/api/2.3/sites/dad65087-b08b-4603-af4e-2887b8aafc67/workbooks" + opts = TSC.RequestOptions(pagesize=13, pagenumber=15) + resp = server.workbooks.get_request(url, request_object=opts) + + query = parse_qs(resp.request.query) + assert query.get("pagesize") == ["13"] + assert query.get("pagenumber") == ["15"] + +def test_make_post_request(server: TSC.Server) -> None: + with requests_mock.mock() as m: + m.post(requests_mock.ANY) + url = "http://test/api/2.3/sites/dad65087-b08b-4603-af4e-2887b8aafc67/workbooks" + resp = server.workbooks._make_request( + requests.post, + url, + content=b"1337", + auth_token="j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM", + content_type="multipart/mixed", + ) + assert resp.request.headers["x-tableau-auth"] == "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM" + assert resp.request.headers["content-type"] == "multipart/mixed" + assert "Tableau Server Client" in resp.request.headers["user-agent"] + assert resp.request.body == b"1337" + +# Test that 500 server errors are handled properly +def test_internal_server_error(server: TSC.Server) -> None: + server.version = "3.2" + server_response = "500: Internal Server Error" + with requests_mock.mock() as m: + m.register_uri("GET", server.server_info.baseurl, status_code=500, text=server_response) + with pytest.raises(InternalServerError, match=server_response): + server.server_info.get() + +# Test that non-xml server errors are handled properly +def test_non_xml_error(server: TSC.Server) -> None: + server.version = "3.2" + server_response = "this is not xml" + with requests_mock.mock() as m: + m.register_uri("GET", server.server_info.baseurl, status_code=499, text=server_response) + with pytest.raises(NonXMLResponseError, match=server_response): + server.server_info.get() From 4a939289b64b295af202fccceb1172224ee86b3d Mon Sep 17 00:00:00 2001 From: Jordan Woods <13803242+jorwoods@users.noreply.github.com> Date: Wed, 12 Nov 2025 22:00:54 -0600 Subject: [PATCH 3/3] style: black --- test/test_requests.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/test_requests.py b/test/test_requests.py index 3a22b516..5ee68b02 100644 --- a/test/test_requests.py +++ b/test/test_requests.py @@ -19,6 +19,7 @@ def server(): return server + def test_make_get_request(server: TSC.Server) -> None: with requests_mock.mock() as m: m.get(requests_mock.ANY) @@ -30,6 +31,7 @@ def test_make_get_request(server: TSC.Server) -> None: assert query.get("pagesize") == ["13"] assert query.get("pagenumber") == ["15"] + def test_make_post_request(server: TSC.Server) -> None: with requests_mock.mock() as m: m.post(requests_mock.ANY) @@ -46,6 +48,7 @@ def test_make_post_request(server: TSC.Server) -> None: assert "Tableau Server Client" in resp.request.headers["user-agent"] assert resp.request.body == b"1337" + # Test that 500 server errors are handled properly def test_internal_server_error(server: TSC.Server) -> None: server.version = "3.2" @@ -55,6 +58,7 @@ def test_internal_server_error(server: TSC.Server) -> None: with pytest.raises(InternalServerError, match=server_response): server.server_info.get() + # Test that non-xml server errors are handled properly def test_non_xml_error(server: TSC.Server) -> None: server.version = "3.2"