|
1 | | -import re |
2 | | -import unittest |
| 1 | +from urllib.parse import parse_qs |
3 | 2 |
|
| 3 | +import pytest |
4 | 4 | import requests |
5 | 5 | import requests_mock |
6 | 6 |
|
7 | 7 | import tableauserverclient as TSC |
8 | 8 | from tableauserverclient.server.endpoint.exceptions import InternalServerError, NonXMLResponseError |
9 | 9 |
|
10 | 10 |
|
11 | | -class RequestTests(unittest.TestCase): |
12 | | - def setUp(self): |
13 | | - self.server = TSC.Server("http://test", False) |
14 | | - |
15 | | - # Fake sign in |
16 | | - self.server._site_id = "dad65087-b08b-4603-af4e-2887b8aafc67" |
17 | | - self.server._auth_token = "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM" |
18 | | - |
19 | | - self.baseurl = self.server.workbooks.baseurl |
20 | | - |
21 | | - def test_make_get_request(self): |
22 | | - with requests_mock.mock() as m: |
23 | | - m.get(requests_mock.ANY) |
24 | | - url = "http://test/api/2.3/sites/dad65087-b08b-4603-af4e-2887b8aafc67/workbooks" |
25 | | - opts = TSC.RequestOptions(pagesize=13, pagenumber=15) |
26 | | - resp = self.server.workbooks.get_request(url, request_object=opts) |
27 | | - |
28 | | - self.assertTrue(re.search("pagesize=13", resp.request.query)) |
29 | | - self.assertTrue(re.search("pagenumber=15", resp.request.query)) |
30 | | - |
31 | | - def test_make_post_request(self): |
32 | | - with requests_mock.mock() as m: |
33 | | - m.post(requests_mock.ANY) |
34 | | - url = "http://test/api/2.3/sites/dad65087-b08b-4603-af4e-2887b8aafc67/workbooks" |
35 | | - resp = self.server.workbooks._make_request( |
36 | | - requests.post, |
37 | | - url, |
38 | | - content=b"1337", |
39 | | - auth_token="j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM", |
40 | | - content_type="multipart/mixed", |
41 | | - ) |
42 | | - self.assertEqual(resp.request.headers["x-tableau-auth"], "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM") |
43 | | - self.assertEqual(resp.request.headers["content-type"], "multipart/mixed") |
44 | | - self.assertTrue(re.search("Tableau Server Client", resp.request.headers["user-agent"])) |
45 | | - self.assertEqual(resp.request.body, b"1337") |
46 | | - |
47 | | - # Test that 500 server errors are handled properly |
48 | | - def test_internal_server_error(self): |
49 | | - self.server.version = "3.2" |
50 | | - server_response = "500: Internal Server Error" |
51 | | - with requests_mock.mock() as m: |
52 | | - m.register_uri("GET", self.server.server_info.baseurl, status_code=500, text=server_response) |
53 | | - self.assertRaisesRegex(InternalServerError, server_response, self.server.server_info.get) |
54 | | - |
55 | | - # Test that non-xml server errors are handled properly |
56 | | - def test_non_xml_error(self): |
57 | | - self.server.version = "3.2" |
58 | | - server_response = "this is not xml" |
59 | | - with requests_mock.mock() as m: |
60 | | - m.register_uri("GET", self.server.server_info.baseurl, status_code=499, text=server_response) |
61 | | - self.assertRaisesRegex(NonXMLResponseError, server_response, self.server.server_info.get) |
| 11 | +@pytest.fixture(scope="function") |
| 12 | +def server(): |
| 13 | + """Fixture to create a TSC.Server instance for testing.""" |
| 14 | + server = TSC.Server("http://test", False) |
| 15 | + |
| 16 | + # Fake signin |
| 17 | + server._site_id = "dad65087-b08b-4603-af4e-2887b8aafc67" |
| 18 | + server._auth_token = "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM" |
| 19 | + |
| 20 | + return server |
| 21 | + |
| 22 | +def test_make_get_request(server: TSC.Server) -> None: |
| 23 | + with requests_mock.mock() as m: |
| 24 | + m.get(requests_mock.ANY) |
| 25 | + url = "http://test/api/2.3/sites/dad65087-b08b-4603-af4e-2887b8aafc67/workbooks" |
| 26 | + opts = TSC.RequestOptions(pagesize=13, pagenumber=15) |
| 27 | + resp = server.workbooks.get_request(url, request_object=opts) |
| 28 | + |
| 29 | + query = parse_qs(resp.request.query) |
| 30 | + assert query.get("pagesize") == ["13"] |
| 31 | + assert query.get("pagenumber") == ["15"] |
| 32 | + |
| 33 | +def test_make_post_request(server: TSC.Server) -> None: |
| 34 | + with requests_mock.mock() as m: |
| 35 | + m.post(requests_mock.ANY) |
| 36 | + url = "http://test/api/2.3/sites/dad65087-b08b-4603-af4e-2887b8aafc67/workbooks" |
| 37 | + resp = server.workbooks._make_request( |
| 38 | + requests.post, |
| 39 | + url, |
| 40 | + content=b"1337", |
| 41 | + auth_token="j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM", |
| 42 | + content_type="multipart/mixed", |
| 43 | + ) |
| 44 | + assert resp.request.headers["x-tableau-auth"] == "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM" |
| 45 | + assert resp.request.headers["content-type"] == "multipart/mixed" |
| 46 | + assert "Tableau Server Client" in resp.request.headers["user-agent"] |
| 47 | + assert resp.request.body == b"1337" |
| 48 | + |
| 49 | +# Test that 500 server errors are handled properly |
| 50 | +def test_internal_server_error(server: TSC.Server) -> None: |
| 51 | + server.version = "3.2" |
| 52 | + server_response = "500: Internal Server Error" |
| 53 | + with requests_mock.mock() as m: |
| 54 | + m.register_uri("GET", server.server_info.baseurl, status_code=500, text=server_response) |
| 55 | + with pytest.raises(InternalServerError, match=server_response): |
| 56 | + server.server_info.get() |
| 57 | + |
| 58 | +# Test that non-xml server errors are handled properly |
| 59 | +def test_non_xml_error(server: TSC.Server) -> None: |
| 60 | + server.version = "3.2" |
| 61 | + server_response = "this is not xml" |
| 62 | + with requests_mock.mock() as m: |
| 63 | + m.register_uri("GET", server.server_info.baseurl, status_code=499, text=server_response) |
| 64 | + with pytest.raises(NonXMLResponseError, match=server_response): |
| 65 | + server.server_info.get() |
0 commit comments