11import contextlib
22import os
3- import unittest
3+ from pathlib import Path
44import xml .etree .ElementTree as ET
55
6+ import pytest
67import requests_mock
78
89import tableauserverclient as TSC
910from tableauserverclient .config import config
1011
11- TEST_ASSET_DIR = os . path . join ( os . path . dirname ( __file__ ), "assets" )
12+ TEST_ASSET_DIR = Path ( __file__ ). parent / "assets"
1213
13- GET_VIEW_XML = os .path .join (TEST_ASSET_DIR , "view_get.xml" )
14- GET_XML_PAGE1 = os .path .join (TEST_ASSET_DIR , "workbook_get_page_1.xml" )
15- GET_XML_PAGE2 = os .path .join (TEST_ASSET_DIR , "workbook_get_page_2.xml" )
16- GET_XML_PAGE3 = os .path .join (TEST_ASSET_DIR , "workbook_get_page_3.xml" )
14+ GET_VIEW_XML = TEST_ASSET_DIR / "view_get.xml"
15+ GET_XML_PAGE1 = TEST_ASSET_DIR / "workbook_get_page_1.xml"
16+ GET_XML_PAGE2 = TEST_ASSET_DIR / "workbook_get_page_2.xml"
17+ GET_XML_PAGE3 = TEST_ASSET_DIR / "workbook_get_page_3.xml"
18+
19+
20+ @pytest .fixture (scope = "function" )
21+ def server ():
22+ """Fixture to create a TSC.Server instance for testing."""
23+ server = TSC .Server ("http://test" , False )
24+
25+ # Fake signin
26+ server ._site_id = "dad65087-b08b-4603-af4e-2887b8aafc67"
27+ server ._auth_token = "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM"
28+
29+ return server
1730
1831
1932@contextlib .contextmanager
@@ -27,110 +40,99 @@ def set_env(**environ):
2740 os .environ .update (old_environ )
2841
2942
30- class PagerTests (unittest .TestCase ):
31- def setUp (self ):
32- self .server = TSC .Server ("http://test" , False )
33-
34- # Fake sign in
35- self .server ._site_id = "dad65087-b08b-4603-af4e-2887b8aafc67"
36- self .server ._auth_token = "j80k54ll2lfMZ0tv97mlPvvSCRyD0DOM"
37-
38- self .baseurl = self .server .workbooks .baseurl
39-
40- def test_pager_with_no_options (self ) -> None :
41- with open (GET_XML_PAGE1 , "rb" ) as f :
42- page_1 = f .read ().decode ("utf-8" )
43- with open (GET_XML_PAGE2 , "rb" ) as f :
44- page_2 = f .read ().decode ("utf-8" )
45- with open (GET_XML_PAGE3 , "rb" ) as f :
46- page_3 = f .read ().decode ("utf-8" )
47- with requests_mock .mock () as m :
48- # Register Pager with default request options
49- m .get (self .baseurl , text = page_1 )
50-
51- # Register Pager with some pages
52- m .get (self .baseurl + "?pageNumber=1&pageSize=1" , text = page_1 )
53- m .get (self .baseurl + "?pageNumber=2&pageSize=1" , text = page_2 )
54- m .get (self .baseurl + "?pageNumber=3&pageSize=1" , text = page_3 )
55-
56- # No options should get all 3
57- workbooks = list (TSC .Pager (self .server .workbooks ))
58- self .assertTrue (len (workbooks ) == 3 )
59-
60- # Let's check that workbook items aren't duplicates
61- wb1 , wb2 , wb3 = workbooks
62- self .assertEqual (wb1 .name , "Page1Workbook" )
63- self .assertEqual (wb2 .name , "Page2Workbook" )
64- self .assertEqual (wb3 .name , "Page3Workbook" )
65-
66- def test_pager_with_options (self ) -> None :
67- with open (GET_XML_PAGE1 , "rb" ) as f :
68- page_1 = f .read ().decode ("utf-8" )
69- with open (GET_XML_PAGE2 , "rb" ) as f :
70- page_2 = f .read ().decode ("utf-8" )
71- with open (GET_XML_PAGE3 , "rb" ) as f :
72- page_3 = f .read ().decode ("utf-8" )
73- with requests_mock .mock () as m :
74- # Register Pager with some pages
75- m .get (self .baseurl + "?pageNumber=1&pageSize=1" , complete_qs = True , text = page_1 )
76- m .get (self .baseurl + "?pageNumber=2&pageSize=1" , complete_qs = True , text = page_2 )
77- m .get (self .baseurl + "?pageNumber=3&pageSize=1" , complete_qs = True , text = page_3 )
78- m .get (self .baseurl + "?pageNumber=1&pageSize=3" , complete_qs = True , text = page_1 )
79-
80- # Starting on page 2 should get 2 out of 3
81- opts = TSC .RequestOptions (2 , 1 )
82- workbooks = list (TSC .Pager (self .server .workbooks , opts ))
83- self .assertTrue (len (workbooks ) == 2 )
84-
85- # Check that the workbooks are the 2 we think they should be
86- wb2 , wb3 = workbooks
87- self .assertEqual (wb2 .name , "Page2Workbook" )
88- self .assertEqual (wb3 .name , "Page3Workbook" )
89-
90- # Starting on 1 with pagesize of 3 should get all 3
91- opts = TSC .RequestOptions (1 , 3 )
92- workbooks = list (TSC .Pager (self .server .workbooks , opts ))
93- self .assertTrue (len (workbooks ) == 3 )
94- wb1 , wb2 , wb3 = workbooks
95- self .assertEqual (wb1 .name , "Page1Workbook" )
96- self .assertEqual (wb2 .name , "Page2Workbook" )
97- self .assertEqual (wb3 .name , "Page3Workbook" )
98-
99- # Starting on 3 with pagesize of 1 should get the last item
100- opts = TSC .RequestOptions (3 , 1 )
101- workbooks = list (TSC .Pager (self .server .workbooks , opts ))
102- self .assertTrue (len (workbooks ) == 1 )
103- # Should have the last workbook
104- wb3 = workbooks .pop ()
105- self .assertEqual (wb3 .name , "Page3Workbook" )
106-
107- def test_pager_with_env_var (self ) -> None :
108- with set_env (TSC_PAGE_SIZE = "1000" ):
109- assert config .PAGE_SIZE == 1000
110- loop = TSC .Pager (self .server .workbooks )
111- assert loop ._options .pagesize == 1000
112-
113- def test_queryset_with_env_var (self ) -> None :
114- with set_env (TSC_PAGE_SIZE = "1000" ):
115- assert config .PAGE_SIZE == 1000
116- loop = self .server .workbooks .all ()
117- assert loop .request_options .pagesize == 1000
118-
119- def test_pager_view (self ) -> None :
120- with open (GET_VIEW_XML , "rb" ) as f :
121- view_xml = f .read ().decode ("utf-8" )
122- with requests_mock .mock () as m :
123- m .get (self .server .views .baseurl , text = view_xml )
124- for view in TSC .Pager (self .server .views ):
125- assert view .name is not None
126-
127- def test_queryset_no_matches (self ) -> None :
128- elem = ET .Element ("tsResponse" , xmlns = "http://tableau.com/api" )
129- ET .SubElement (elem , "pagination" , totalAvailable = "0" )
130- ET .SubElement (elem , "groups" )
131- xml = ET .tostring (elem ).decode ("utf-8" )
132- with requests_mock .mock () as m :
133- m .get (self .server .groups .baseurl , text = xml )
134- all_groups = self .server .groups .all ()
135- groups = list (all_groups )
136- assert len (groups ) == 0
43+ def test_pager_with_no_options (server : TSC .Server ) -> None :
44+ page_1 = GET_XML_PAGE1 .read_text ()
45+ page_2 = GET_XML_PAGE2 .read_text ()
46+ page_3 = GET_XML_PAGE3 .read_text ()
47+ with requests_mock .mock () as m :
48+ # Register Pager with default request options
49+ m .get (server .workbooks .baseurl , text = page_1 )
50+
51+ # Register Pager with some pages
52+ m .get (server .workbooks .baseurl + "?pageNumber=1&pageSize=1" , text = page_1 )
53+ m .get (server .workbooks .baseurl + "?pageNumber=2&pageSize=1" , text = page_2 )
54+ m .get (server .workbooks .baseurl + "?pageNumber=3&pageSize=1" , text = page_3 )
55+
56+ # No options should get all 3
57+ workbooks = list (TSC .Pager (server .workbooks ))
58+ assert len (workbooks ) == 3
59+
60+ # Let's check that workbook items aren't duplicates
61+ wb1 , wb2 , wb3 = workbooks
62+ assert wb1 .name == "Page1Workbook"
63+ assert wb2 .name == "Page2Workbook"
64+ assert wb3 .name == "Page3Workbook"
65+
66+
67+ def test_pager_with_options (server : TSC .Server ) -> None :
68+ page_1 = GET_XML_PAGE1 .read_text ()
69+ page_2 = GET_XML_PAGE2 .read_text ()
70+ page_3 = GET_XML_PAGE3 .read_text ()
71+ with requests_mock .mock () as m :
72+ # Register Pager with some pages
73+ m .get (server .workbooks .baseurl + "?pageNumber=1&pageSize=1" , complete_qs = True , text = page_1 )
74+ m .get (server .workbooks .baseurl + "?pageNumber=2&pageSize=1" , complete_qs = True , text = page_2 )
75+ m .get (server .workbooks .baseurl + "?pageNumber=3&pageSize=1" , complete_qs = True , text = page_3 )
76+ m .get (server .workbooks .baseurl + "?pageNumber=1&pageSize=3" , complete_qs = True , text = page_1 )
77+
78+ # Starting on page 2 should get 2 out of 3
79+ opts = TSC .RequestOptions (2 , 1 )
80+ workbooks = list (TSC .Pager (server .workbooks , opts ))
81+ assert len (workbooks ) == 2
82+
83+ # Check that the workbooks are the 2 we think they should be
84+ wb2 , wb3 = workbooks
85+ assert wb2 .name == "Page2Workbook"
86+ assert wb3 .name == "Page3Workbook"
87+
88+ # Starting on 1 with pagesize of 3 should get all 3
89+ opts = TSC .RequestOptions (1 , 3 )
90+ workbooks = list (TSC .Pager (server .workbooks , opts ))
91+ assert len (workbooks ) == 3
92+ wb1 , wb2 , wb3 = workbooks
93+ assert wb1 .name == "Page1Workbook"
94+ assert wb2 .name == "Page2Workbook"
95+ assert wb3 .name == "Page3Workbook"
96+
97+ # Starting on 3 with pagesize of 1 should get the last item
98+ opts = TSC .RequestOptions (3 , 1 )
99+ workbooks = list (TSC .Pager (server .workbooks , opts ))
100+ assert len (workbooks ) == 1
101+ # Should have the last workbook
102+ wb3 = workbooks .pop ()
103+ assert wb3 .name == "Page3Workbook"
104+
105+
106+ def test_pager_with_env_var (server : TSC .Server ) -> None :
107+ with set_env (TSC_PAGE_SIZE = "1000" ):
108+ assert config .PAGE_SIZE == 1000
109+ loop = TSC .Pager (server .workbooks )
110+ assert loop ._options .pagesize == 1000
111+
112+
113+ def test_queryset_with_env_var (server : TSC .Server ) -> None :
114+ with set_env (TSC_PAGE_SIZE = "1000" ):
115+ assert config .PAGE_SIZE == 1000
116+ loop = server .workbooks .all ()
117+ assert loop .request_options .pagesize == 1000
118+
119+
120+ def test_pager_view (server : TSC .Server ) -> None :
121+ with open (GET_VIEW_XML , "rb" ) as f :
122+ view_xml = f .read ().decode ("utf-8" )
123+ with requests_mock .mock () as m :
124+ m .get (server .views .baseurl , text = view_xml )
125+ for view in TSC .Pager (server .views ):
126+ assert view .name is not None
127+
128+
129+ def test_queryset_no_matches (server : TSC .Server ) -> None :
130+ elem = ET .Element ("tsResponse" , xmlns = "http://tableau.com/api" )
131+ ET .SubElement (elem , "pagination" , totalAvailable = "0" )
132+ ET .SubElement (elem , "groups" )
133+ xml = ET .tostring (elem ).decode ("utf-8" )
134+ with requests_mock .mock () as m :
135+ m .get (server .groups .baseurl , text = xml )
136+ all_groups = server .groups .all ()
137+ groups = list (all_groups )
138+ assert len (groups ) == 0
0 commit comments