44
55import unittest
66from unittest .mock import MagicMock , patch
7+ import sys
8+ from typing import List , Dict , Any
9+
10+ # Add the necessary path to import the filter module
11+ sys .path .append ("/home/varun.edachali/conn/databricks-sql-python/src" )
712
813from databricks .sql .backend .filters import ResultSetFilter
914
@@ -15,39 +20,24 @@ def setUp(self):
1520 """Set up test fixtures."""
1621 # Create a mock SeaResultSet
1722 self .mock_sea_result_set = MagicMock ()
18-
19- # Set up the remaining_rows method on the results attribute
20- self .mock_sea_result_set .results = MagicMock ()
21- self .mock_sea_result_set .results .remaining_rows .return_value = [
22- ["catalog1" , "schema1" , "table1" , "owner1" , "2023-01-01" , "TABLE" , "" ],
23- ["catalog1" , "schema1" , "table2" , "owner1" , "2023-01-01" , "VIEW" , "" ],
24- [
25- "catalog1" ,
26- "schema1" ,
27- "table3" ,
28- "owner1" ,
29- "2023-01-01" ,
30- "SYSTEM TABLE" ,
31- "" ,
32- ],
33- [
34- "catalog1" ,
35- "schema1" ,
36- "table4" ,
37- "owner1" ,
38- "2023-01-01" ,
39- "EXTERNAL TABLE" ,
40- "" ,
41- ],
42- ]
23+ self .mock_sea_result_set ._response = {
24+ "result" : {
25+ "data_array" : [
26+ ["catalog1" , "schema1" , "table1" , "TABLE" , "" ],
27+ ["catalog1" , "schema1" , "table2" , "VIEW" , "" ],
28+ ["catalog1" , "schema1" , "table3" , "SYSTEM TABLE" , "" ],
29+ ["catalog1" , "schema1" , "table4" , "EXTERNAL TABLE" , "" ],
30+ ],
31+ "row_count" : 4 ,
32+ }
33+ }
4334
4435 # Set up the connection and other required attributes
4536 self .mock_sea_result_set .connection = MagicMock ()
4637 self .mock_sea_result_set .backend = MagicMock ()
4738 self .mock_sea_result_set .buffer_size_bytes = 1000
4839 self .mock_sea_result_set .arraysize = 100
4940 self .mock_sea_result_set .statement_id = "test-statement-id"
50- self .mock_sea_result_set .lz4_compressed = False
5141
5242 # Create a mock CommandId
5343 from databricks .sql .backend .types import CommandId , BackendType
@@ -60,102 +50,70 @@ def setUp(self):
6050 ("catalog_name" , "string" , None , None , None , None , True ),
6151 ("schema_name" , "string" , None , None , None , None , True ),
6252 ("table_name" , "string" , None , None , None , None , True ),
63- ("owner" , "string" , None , None , None , None , True ),
64- ("creation_time" , "string" , None , None , None , None , True ),
6553 ("table_type" , "string" , None , None , None , None , True ),
6654 ("remarks" , "string" , None , None , None , None , True ),
6755 ]
6856 self .mock_sea_result_set .has_been_closed_server_side = False
69- self .mock_sea_result_set ._arrow_schema_bytes = None
7057
71- def test_filter_by_column_values (self ):
72- """Test filtering by column values with various options ."""
73- # Case 1: Case-sensitive filtering
74- allowed_values = ["table1 " , "table3 " ]
58+ def test_filter_tables_by_type (self ):
59+ """Test filtering tables by type ."""
60+ # Test with specific table types
61+ table_types = ["TABLE " , "VIEW " ]
7562
63+ # Make the mock_sea_result_set appear to be a SeaResultSet
7664 with patch ("databricks.sql.backend.filters.isinstance" , return_value = True ):
7765 with patch (
7866 "databricks.sql.result_set.SeaResultSet"
7967 ) as mock_sea_result_set_class :
68+ # Set up the mock to return a new mock when instantiated
8069 mock_instance = MagicMock ()
8170 mock_sea_result_set_class .return_value = mock_instance
8271
83- # Call filter_by_column_values on the table_name column (index 2)
84- result = ResultSetFilter .filter_by_column_values (
85- self .mock_sea_result_set , 2 , allowed_values , case_sensitive = True
72+ result = ResultSetFilter .filter_tables_by_type (
73+ self .mock_sea_result_set , table_types
8674 )
8775
8876 # Verify the filter was applied correctly
8977 mock_sea_result_set_class .assert_called_once ()
9078
91- # Check the filtered data passed to the constructor
92- args , kwargs = mock_sea_result_set_class .call_args
93- result_data = kwargs .get ("result_data" )
94- self .assertIsNotNone (result_data )
95- self .assertEqual (len (result_data .data ), 2 )
96- self .assertIn (result_data .data [0 ][2 ], allowed_values )
97- self .assertIn (result_data .data [1 ][2 ], allowed_values )
79+ def test_filter_tables_by_type_case_insensitive (self ):
80+ """Test filtering tables by type with case insensitivity."""
81+ # Test with lowercase table types
82+ table_types = ["table" , "view" ]
9883
99- # Case 2: Case-insensitive filtering
100- mock_sea_result_set_class .reset_mock ()
84+ # Make the mock_sea_result_set appear to be a SeaResultSet
10185 with patch ("databricks.sql.backend.filters.isinstance" , return_value = True ):
10286 with patch (
10387 "databricks.sql.result_set.SeaResultSet"
10488 ) as mock_sea_result_set_class :
89+ # Set up the mock to return a new mock when instantiated
10590 mock_instance = MagicMock ()
10691 mock_sea_result_set_class .return_value = mock_instance
10792
108- # Call filter_by_column_values with case-insensitive matching
109- result = ResultSetFilter .filter_by_column_values (
110- self .mock_sea_result_set ,
111- 2 ,
112- ["TABLE1" , "TABLE3" ],
113- case_sensitive = False ,
114- )
115- mock_sea_result_set_class .assert_called_once ()
116-
117- # Case 3: Unsupported result set type
118- mock_unsupported_result_set = MagicMock ()
119- with patch ("databricks.sql.backend.filters.isinstance" , return_value = False ):
120- with patch ("databricks.sql.backend.filters.logger" ) as mock_logger :
121- result = ResultSetFilter .filter_by_column_values (
122- mock_unsupported_result_set , 0 , ["value" ], True
93+ result = ResultSetFilter .filter_tables_by_type (
94+ self .mock_sea_result_set , table_types
12395 )
124- mock_logger .warning .assert_called_once ()
125- self .assertEqual (result , mock_unsupported_result_set )
12696
127- def test_filter_tables_by_type (self ):
128- """Test filtering tables by type with various options."""
129- # Case 1: Specific table types
130- table_types = ["TABLE" , "VIEW" ]
97+ # Verify the filter was applied correctly
98+ mock_sea_result_set_class .assert_called_once ()
13199
100+ def test_filter_tables_by_type_default (self ):
101+ """Test filtering tables by type with default types."""
102+ # Make the mock_sea_result_set appear to be a SeaResultSet
132103 with patch ("databricks.sql.backend.filters.isinstance" , return_value = True ):
133- with patch .object (
134- ResultSetFilter , "filter_by_column_values"
135- ) as mock_filter :
136- ResultSetFilter .filter_tables_by_type (
137- self .mock_sea_result_set , table_types
104+ with patch (
105+ "databricks.sql.result_set.SeaResultSet"
106+ ) as mock_sea_result_set_class :
107+ # Set up the mock to return a new mock when instantiated
108+ mock_instance = MagicMock ()
109+ mock_sea_result_set_class .return_value = mock_instance
110+
111+ result = ResultSetFilter .filter_tables_by_type (
112+ self .mock_sea_result_set , None
138113 )
139- args , kwargs = mock_filter .call_args
140- self .assertEqual (args [0 ], self .mock_sea_result_set )
141- self .assertEqual (args [1 ], 5 ) # Table type column index
142- self .assertEqual (args [2 ], table_types )
143- self .assertEqual (kwargs .get ("case_sensitive" ), True )
144114
145- # Case 2: Default table types (None or empty list)
146- with patch ("databricks.sql.backend.filters.isinstance" , return_value = True ):
147- with patch .object (
148- ResultSetFilter , "filter_by_column_values"
149- ) as mock_filter :
150- # Test with None
151- ResultSetFilter .filter_tables_by_type (self .mock_sea_result_set , None )
152- args , kwargs = mock_filter .call_args
153- self .assertEqual (args [2 ], ["TABLE" , "VIEW" , "SYSTEM TABLE" ])
154-
155- # Test with empty list
156- ResultSetFilter .filter_tables_by_type (self .mock_sea_result_set , [])
157- args , kwargs = mock_filter .call_args
158- self .assertEqual (args [2 ], ["TABLE" , "VIEW" , "SYSTEM TABLE" ])
115+ # Verify the filter was applied correctly
116+ mock_sea_result_set_class .assert_called_once ()
159117
160118
161119if __name__ == "__main__" :
0 commit comments