3
3
import os
4
4
import xml .etree .ElementTree as ET
5
5
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>'''
23
16
24
17
TABLEAU_CONNECTION_XML = ET .fromstring (
25
18
'''<connection authentication='sspi' class='sqlserver' dbname='TestV1' odbc-native-protocol='yes' one-time-sql='' server='mssql2012.test.tsi.lan' username=''></connection>''' )
26
19
27
-
28
20
class HelperMethodTests (unittest .TestCase ):
29
21
30
22
def test_is_valid_file_with_valid_inputs (self ):
@@ -38,6 +30,23 @@ def test_is_valid_file_with_invalid_inputs(self):
38
30
self .assertFalse (Workbook ._is_valid_file ('file2.twb3' ))
39
31
40
32
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
+
41
50
class ConnectionModelTests (unittest .TestCase ):
42
51
43
52
def setUp (self ):
@@ -114,5 +123,34 @@ def test_can_update_datasource_connection_and_save(self):
114
123
self .assertEqual (new_wb .datasources [0 ].connection .dbname , 'newdb.test.tsi.lan' )
115
124
116
125
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
+
117
155
if __name__ == '__main__' :
118
156
unittest .main ()
0 commit comments