@@ -125,6 +125,136 @@ def test_non_string_key_raises_type_error(self):
125125 self .od ._build_alternate_key_str ({1 : "ACC-001" })
126126
127127
128+ class TestListTables (unittest .TestCase ):
129+ """Unit tests for _ODataClient._list_tables filter and select parameters."""
130+
131+ def setUp (self ):
132+ self .od = _make_odata_client ()
133+
134+ def _setup_response (self , value ):
135+ """Configure _request to return a response with the given value list."""
136+ mock_response = MagicMock ()
137+ mock_response .json .return_value = {"value" : value }
138+ self .od ._request .return_value = mock_response
139+
140+ def test_no_filter_uses_default (self ):
141+ """_list_tables() without filter sends only IsPrivate eq false."""
142+ self ._setup_response ([])
143+ self .od ._list_tables ()
144+
145+ self .od ._request .assert_called_once ()
146+ call_kwargs = self .od ._request .call_args
147+ params = call_kwargs .kwargs .get ("params" ) or call_kwargs [1 ].get ("params" , {})
148+ self .assertEqual (params ["$filter" ], "IsPrivate eq false" )
149+
150+ def test_filter_combined_with_default (self ):
151+ """_list_tables(filter=...) combines user filter with IsPrivate eq false."""
152+ self ._setup_response ([{"LogicalName" : "account" }])
153+ self .od ._list_tables (filter = "SchemaName eq 'Account'" )
154+
155+ self .od ._request .assert_called_once ()
156+ call_kwargs = self .od ._request .call_args
157+ params = call_kwargs .kwargs .get ("params" ) or call_kwargs [1 ].get ("params" , {})
158+ self .assertEqual (
159+ params ["$filter" ],
160+ "IsPrivate eq false and (SchemaName eq 'Account')" ,
161+ )
162+
163+ def test_filter_none_same_as_no_filter (self ):
164+ """_list_tables(filter=None) is equivalent to _list_tables()."""
165+ self ._setup_response ([])
166+ self .od ._list_tables (filter = None )
167+
168+ self .od ._request .assert_called_once ()
169+ call_kwargs = self .od ._request .call_args
170+ params = call_kwargs .kwargs .get ("params" ) or call_kwargs [1 ].get ("params" , {})
171+ self .assertEqual (params ["$filter" ], "IsPrivate eq false" )
172+
173+ def test_returns_value_list (self ):
174+ """_list_tables returns the 'value' array from the response."""
175+ expected = [
176+ {"LogicalName" : "account" },
177+ {"LogicalName" : "contact" },
178+ ]
179+ self ._setup_response (expected )
180+ result = self .od ._list_tables ()
181+ self .assertEqual (result , expected )
182+
183+ def test_select_adds_query_param (self ):
184+ """_list_tables(select=...) adds $select as comma-joined string."""
185+ self ._setup_response ([])
186+ self .od ._list_tables (select = ["LogicalName" , "SchemaName" , "DisplayName" ])
187+
188+ self .od ._request .assert_called_once ()
189+ call_kwargs = self .od ._request .call_args
190+ params = call_kwargs .kwargs .get ("params" ) or call_kwargs [1 ].get ("params" , {})
191+ self .assertEqual (params ["$select" ], "LogicalName,SchemaName,DisplayName" )
192+
193+ def test_select_none_omits_query_param (self ):
194+ """_list_tables(select=None) does not add $select to params."""
195+ self ._setup_response ([])
196+ self .od ._list_tables (select = None )
197+
198+ self .od ._request .assert_called_once ()
199+ call_kwargs = self .od ._request .call_args
200+ params = call_kwargs .kwargs .get ("params" ) or call_kwargs [1 ].get ("params" , {})
201+ self .assertNotIn ("$select" , params )
202+
203+ def test_select_empty_list_omits_query_param (self ):
204+ """_list_tables(select=[]) does not add $select (empty list is falsy)."""
205+ self ._setup_response ([])
206+ self .od ._list_tables (select = [])
207+
208+ self .od ._request .assert_called_once ()
209+ call_kwargs = self .od ._request .call_args
210+ params = call_kwargs .kwargs .get ("params" ) or call_kwargs [1 ].get ("params" , {})
211+ self .assertNotIn ("$select" , params )
212+
213+ def test_select_preserves_case (self ):
214+ """_list_tables does not lowercase select values (PascalCase preserved)."""
215+ self ._setup_response ([])
216+ self .od ._list_tables (select = ["EntitySetName" , "LogicalName" ])
217+
218+ self .od ._request .assert_called_once ()
219+ call_kwargs = self .od ._request .call_args
220+ params = call_kwargs .kwargs .get ("params" ) or call_kwargs [1 ].get ("params" , {})
221+ self .assertEqual (params ["$select" ], "EntitySetName,LogicalName" )
222+
223+ def test_select_with_filter (self ):
224+ """_list_tables with both select and filter sends both params."""
225+ self ._setup_response ([{"LogicalName" : "account" }])
226+ self .od ._list_tables (
227+ filter = "SchemaName eq 'Account'" ,
228+ select = ["LogicalName" , "SchemaName" ],
229+ )
230+
231+ self .od ._request .assert_called_once ()
232+ call_kwargs = self .od ._request .call_args
233+ params = call_kwargs .kwargs .get ("params" ) or call_kwargs [1 ].get ("params" , {})
234+ self .assertEqual (
235+ params ["$filter" ],
236+ "IsPrivate eq false and (SchemaName eq 'Account')" ,
237+ )
238+ self .assertEqual (params ["$select" ], "LogicalName,SchemaName" )
239+
240+ def test_select_single_property (self ):
241+ """_list_tables(select=[...]) with a single property works correctly."""
242+ self ._setup_response ([])
243+ self .od ._list_tables (select = ["LogicalName" ])
244+
245+ self .od ._request .assert_called_once ()
246+ call_kwargs = self .od ._request .call_args
247+ params = call_kwargs .kwargs .get ("params" ) or call_kwargs [1 ].get ("params" , {})
248+ self .assertEqual (params ["$select" ], "LogicalName" )
249+
250+ def test_select_bare_string_raises_type_error (self ):
251+ """_list_tables(select='LogicalName') raises TypeError for bare str."""
252+ self ._setup_response ([])
253+ with self .assertRaises (TypeError ) as ctx :
254+ self .od ._list_tables (select = "LogicalName" )
255+ self .assertIn ("list of property names" , str (ctx .exception ))
256+
257+
128258class TestUpsert (unittest .TestCase ):
129259 """Unit tests for _ODataClient._upsert."""
130260
0 commit comments