33import os
44import xml .etree .ElementTree as ET
55
6- from tableaudocumentapi import Workbook , Datasource , Connection
7-
8- TABLEAU_93_WORKBOOK = '''<?xml version='1.0' encoding='utf-8' ?>
9- <workbook source-build='9.3.1 (9300.16.0510.0100)' source-platform='mac' version='9.3' xmlns:user='http://www.tableausoftware.com/xml/user'>
10- <datasources>
11- <datasource caption='xy (TestV1)' inline='true' name='sqlserver.17u3bqc16tjtxn14e2hxh19tyvpo' version='9.3'>
12- <connection authentication='sspi' class='sqlserver' dbname='TestV1' odbc-native-protocol='yes' one-time-sql='' server='mssql2012.test.tsi.lan' username=''>
13- </connection>
14- </datasource>
15- </datasources>
16- </workbook>'''
17-
18- TABLEAU_93_TDS = '''<?xml version='1.0' encoding='utf-8' ?>
19- <datasource formatted-name='sqlserver.17u3bqc16tjtxn14e2hxh19tyvpo' inline='true' source-platform='mac' version='9.3' xmlns:user='http://www.tableausoftware.com/xml/user'>
20- <connection authentication='sspi' class='sqlserver' dbname='TestV1' odbc-native-protocol='yes' one-time-sql='' server='mssql2012.test.tsi.lan' username=''>
21- </connection>
22- </datasource>'''
6+ from tableaudocumentapi import Workbook , Datasource , Connection , ConnectionParser
7+
8+
9+ TABLEAU_93_WORKBOOK = '''<?xml version='1.0' encoding='utf-8' ?><workbook source-build='9.3.1 (9300.16.0510.0100)' source-platform='mac' version='9.3' xmlns:user='http://www.tableausoftware.com/xml/user'><datasources><datasource caption='xy (TestV1)' inline='true' name='sqlserver.17u3bqc16tjtxn14e2hxh19tyvpo' version='9.3'><connection authentication='sspi' class='sqlserver' dbname='TestV1' odbc-native-protocol='yes' one-time-sql='' server='mssql2012.test.tsi.lan' username=''></connection></datasource></datasources></workbook>'''
10+
11+ TABLEAU_93_TDS = '''<?xml version='1.0' encoding='utf-8' ?><datasource formatted-name='sqlserver.17u3bqc16tjtxn14e2hxh19tyvpo' inline='true' source-platform='mac' version='9.3' xmlns:user='http://www.tableausoftware.com/xml/user'><connection authentication='sspi' class='sqlserver' dbname='TestV1' odbc-native-protocol='yes' one-time-sql='' server='mssql2012.test.tsi.lan' username=''></connection></datasource>'''
12+
13+ TABLEAU_10_TDS = '''<?xml version='1.0' encoding='utf-8' ?><datasources><datasource caption='xy+ (Multiple Connections)' inline='true' name='federated.1s4nxn20cywkdv13ql0yk0g1mpdx' version='10.0'><connection class='federated'><named-connections><named-connection caption='mysql55.test.tsi.lan' name='mysql.1ewmkrw0mtgsev1dnurma1blii4x'><connection class='mysql' dbname='testv1' odbc-native-protocol='yes' port='3306' server='mysql55.test.tsi.lan' source-charset='' username='test' /></named-connection><named-connection caption='mssql2012.test.tsi.lan' name='sqlserver.1erdwp01uqynlb14ul78p0haai2r'><connection authentication='sqlserver' class='sqlserver' dbname='TestV1' odbc-native-protocol='yes' one-time-sql='' server='mssql2012.test.tsi.lan' username='test' /></named-connection></named-connections></connection></datasource></datasources>'''
14+
15+ TABLEAU_10_WORKBOOK = '''<?xml version='1.0' encoding='utf-8' ?><workbook source-build='0.0.0 (0000.16.0510.1300)' source-platform='mac' version='10.0' xmlns:user='http://www.tableausoftware.com/xml/user'><datasources><datasource caption='xy+ (Multiple Connections)' inline='true' name='federated.1s4nxn20cywkdv13ql0yk0g1mpdx' version='10.0'><connection class='federated'><named-connections><named-connection caption='mysql55.test.tsi.lan' name='mysql.1ewmkrw0mtgsev1dnurma1blii4x'><connection class='mysql' dbname='testv1' odbc-native-protocol='yes' port='3306' server='mysql55.test.tsi.lan' source-charset='' username='test' /></named-connection><named-connection caption='mssql2012.test.tsi.lan' name='sqlserver.1erdwp01uqynlb14ul78p0haai2r'><connection authentication='sqlserver' class='sqlserver' dbname='TestV1' odbc-native-protocol='yes' one-time-sql='' server='mssql2012.test.tsi.lan' username='test' /></named-connection></named-connections></connection></datasource></datasources></workbook>'''
2316
2417TABLEAU_CONNECTION_XML = ET .fromstring (
2518 '''<connection authentication='sspi' class='sqlserver' dbname='TestV1' odbc-native-protocol='yes' one-time-sql='' server='mssql2012.test.tsi.lan' username=''></connection>''' )
2619
27-
2820class HelperMethodTests (unittest .TestCase ):
2921
3022 def test_is_valid_file_with_valid_inputs (self ):
@@ -38,6 +30,23 @@ def test_is_valid_file_with_invalid_inputs(self):
3830 self .assertFalse (Workbook ._is_valid_file ('file2.twb3' ))
3931
4032
33+ class ConnectionParserTests (unittest .TestCase ):
34+
35+ def test_can_extract_legacy_connection (self ):
36+ parser = ConnectionParser (ET .fromstring (TABLEAU_93_TDS ), '9.2' )
37+ connection = parser .get_connections ()
38+ self .assertIsInstance (connection , Connection )
39+ self .assertEqual (connection .dbname , 'TestV1' )
40+
41+
42+ def test_can_extract_federated_connections (self ):
43+ parser = ConnectionParser (ET .fromstring (TABLEAU_10_TDS ), '10.0' )
44+ connections = parser .get_connections ()
45+ self .assertIsInstance (connections , list )
46+ self .assertIsInstance (connections [0 ], Connection )
47+ self .assertEqual (connections [0 ].dbname , 'testv1' )
48+
49+
4150class ConnectionModelTests (unittest .TestCase ):
4251
4352 def setUp (self ):
@@ -114,5 +123,34 @@ def test_can_update_datasource_connection_and_save(self):
114123 self .assertEqual (new_wb .datasources [0 ].connection .dbname , 'newdb.test.tsi.lan' )
115124
116125
126+ class WorkbookModelV10Tests (unittest .TestCase ):
127+
128+ def setUp (self ):
129+ self .workbook_file = io .FileIO ('testv10.twb' , 'w' )
130+ self .workbook_file .write (TABLEAU_10_WORKBOOK .encode ('utf8' ))
131+ self .workbook_file .seek (0 )
132+
133+ def tearDown (self ):
134+ self .workbook_file .close ()
135+ os .unlink (self .workbook_file .name )
136+
137+ def test_can_extract_datasourceV10 (self ):
138+ wb = Workbook (self .workbook_file .name )
139+ self .assertEqual (len (wb .datasources ), 1 )
140+ self .assertEqual (len (wb .datasources [0 ].connection ), 2 )
141+ self .assertIsInstance (wb .datasources [0 ].connection , list )
142+ self .assertIsInstance (wb .datasources [0 ], Datasource )
143+ self .assertEqual (wb .datasources [0 ].name ,
144+ 'federated.1s4nxn20cywkdv13ql0yk0g1mpdx' )
145+
146+ def test_can_update_datasource_connection_and_saveV10 (self ):
147+ original_wb = Workbook (self .workbook_file .name )
148+ original_wb .datasources [0 ].connection [0 ].dbname = 'newdb.test.tsi.lan'
149+
150+ original_wb .save ()
151+
152+ new_wb = Workbook (self .workbook_file .name )
153+ self .assertEqual (new_wb .datasources [0 ].connection [0 ].dbname , 'newdb.test.tsi.lan' )
154+
117155if __name__ == '__main__' :
118156 unittest .main ()
0 commit comments