Skip to content

Commit 32588db

Browse files
Allow table_guid to be None when searching for and deleting list items (#417)
Co-authored-by: pyansys-ci-bot <[email protected]>
1 parent 98975ba commit 32588db

File tree

7 files changed

+56
-11
lines changed

7 files changed

+56
-11
lines changed

doc/changelog.d/417.added.md

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Allow table_guid to be None when searching for and deleting list items

src/ansys/grantami/recordlists/_connection.py

+3
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,9 @@ def _is_item_resolvable_in_db(self, item: RecordListItem, db_key: str) -> bool:
11421142
"""
11431143
try:
11441144
if item.record_version is not None and item.record_guid is not None:
1145+
assert (
1146+
item.table_guid
1147+
), "RecordListItem.table_guid must be populated to check record version resolvability"
11451148
self._record_versions_api.get_record_version(
11461149
database_key=db_key,
11471150
table_guid=item.table_guid,

src/ansys/grantami/recordlists/_models.py

+9-5
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,8 @@ class RecordListItem:
223223
----------
224224
database_guid : str
225225
GUID of the database.
226-
table_guid : str
227-
GUID of the table.
226+
table_guid : str or None
227+
GUID of the table. Must be provided if this object is added to a RecordList. Optional otherwise.
228228
record_history_guid : str
229229
Record History GUID.
230230
record_version : int, optional
@@ -236,12 +236,12 @@ class RecordListItem:
236236
def __init__(
237237
self,
238238
database_guid: str,
239-
table_guid: str,
239+
table_guid: str | None,
240240
record_history_guid: str,
241241
record_version: Optional[int] = None,
242242
):
243243
self._database_guid: str = database_guid
244-
self._table_guid: str = table_guid
244+
self._table_guid: str | None = table_guid
245245
self._record_history_guid: str = record_history_guid
246246
self._record_version: Optional[int] = record_version
247247
self._record_guid: Optional[str] = None
@@ -252,7 +252,7 @@ def database_guid(self) -> str:
252252
return self._database_guid
253253

254254
@property
255-
def table_guid(self) -> str:
255+
def table_guid(self) -> str | None:
256256
"""Table GUID."""
257257
return self._table_guid
258258

@@ -306,6 +306,10 @@ def _from_model(cls, model: models.GsaListItem) -> "RecordListItem":
306306
def _to_create_list_item_model(self) -> models.GsaCreateListItem:
307307
"""Generate the Create List Item DTO for use with the auto-generated client code."""
308308
logger.debug("Serializing RecordListItem to GsaCreateListItem API model")
309+
if self.table_guid is None:
310+
raise ValueError(
311+
"table_guid must be provided for a RecordListItem which is added to a RecordList."
312+
)
309313
model = models.GsaCreateListItem(
310314
database_guid=self.database_guid,
311315
table_guid=self.table_guid,

tests/integration/conftest.py

+12
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,18 @@ def resolvable_items(admin_client, training_database_guid) -> List[RecordListIte
254254
]
255255

256256

257+
@pytest.fixture(scope="session")
258+
def resolvable_items_without_table_guids(resolvable_items) -> List[RecordListItem]:
259+
return [
260+
RecordListItem(
261+
database_guid=item.database_guid,
262+
table_guid=None,
263+
record_history_guid=item.record_history_guid,
264+
)
265+
for item in resolvable_items
266+
]
267+
268+
257269
@pytest.fixture(scope="session")
258270
def rs_database_guid(admin_client) -> str:
259271
schema_api = SchemaDatabasesApi(admin_client)

tests/integration/test_integration.py

+25-5
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,10 @@ def test_get_list_items_many_unresolvable_items(
121121
assert all(isinstance(item, RecordListItem) for item in record_list_items)
122122
assert len(record_list_items) == len(many_unresolvable_items)
123123

124-
def test_items_management(self, admin_client, new_list, unresolvable_item):
124+
@pytest.mark.parametrize("include_table_guid_for_deletion", [True, False])
125+
def test_items_management(
126+
self, admin_client, new_list, unresolvable_item, include_table_guid_for_deletion
127+
):
125128
another_item = RecordListItem(
126129
unresolvable_item.database_guid,
127130
unresolvable_item.table_guid,
@@ -136,6 +139,12 @@ def test_items_management(self, admin_client, new_list, unresolvable_item):
136139
items = admin_client.remove_items_from_list(new_list, items=[unresolvable_item])
137140
assert items == [another_item]
138141

142+
if include_table_guid_for_deletion is False:
143+
another_item = RecordListItem(
144+
database_guid=another_item.database_guid,
145+
table_guid=None,
146+
record_history_guid=another_item.record_history_guid,
147+
)
139148
items = admin_client.remove_items_from_list(new_list, items=[another_item])
140149
assert items == []
141150

@@ -1094,17 +1103,22 @@ def test_two_tables_two_hits(
10941103
)
10951104

10961105

1106+
@pytest.mark.parametrize(
1107+
"resolvable_item_fixture_name", ["resolvable_items", "resolvable_items_without_table_guids"]
1108+
)
10971109
@pytest.mark.parametrize("include_items", [True, False])
10981110
class TestSearchByRecord(_TestSearch):
10991111
def test_single_record_two_hits(
11001112
self,
11011113
include_items,
11021114
admin_client,
11031115
list_name,
1104-
resolvable_items,
1116+
resolvable_item_fixture_name,
1117+
request,
11051118
resolvable_rs_items,
11061119
list_mi_training_items,
11071120
):
1121+
resolvable_items = request.getfixturevalue(resolvable_item_fixture_name)
11081122
record_reference = resolvable_items[0]
11091123
criteria = SearchCriterion(
11101124
name_contains=list_name,
@@ -1129,10 +1143,12 @@ def test_two_records_same_database_two_hits(
11291143
include_items,
11301144
admin_client,
11311145
list_name,
1132-
resolvable_items,
1146+
resolvable_item_fixture_name,
1147+
request,
11331148
resolvable_rs_items,
11341149
list_mi_training_items,
11351150
):
1151+
resolvable_items = request.getfixturevalue(resolvable_item_fixture_name)
11361152
record_reference_1 = resolvable_items[0]
11371153
record_reference_2 = resolvable_items[1]
11381154

@@ -1160,10 +1176,12 @@ def test_two_records_different_databases_three_hits(
11601176
include_items,
11611177
admin_client,
11621178
list_name,
1163-
resolvable_items,
1179+
resolvable_item_fixture_name,
1180+
request,
11641181
resolvable_rs_items,
11651182
list_mi_training_items,
11661183
):
1184+
resolvable_items = request.getfixturevalue(resolvable_item_fixture_name)
11671185
training_record_reference = resolvable_items[0]
11681186
rs_record_reference = resolvable_rs_items[0]
11691187
criteria = SearchCriterion(
@@ -1191,10 +1209,12 @@ def test_two_records_different_databases_three_hits_2025_r1(
11911209
include_items,
11921210
admin_client,
11931211
list_name,
1194-
resolvable_items,
1212+
resolvable_item_fixture_name,
1213+
request,
11951214
resolvable_rs_items,
11961215
list_mi_training_items,
11971216
):
1217+
resolvable_items = request.getfixturevalue(resolvable_item_fixture_name)
11981218
training_record_reference = resolvable_items[0]
11991219
rs_record_reference = resolvable_rs_items[0]
12001220
criteria = BooleanCriterion(

tests/test_client.py

+5
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ def test_add_items(self, client, api_method, mock_list):
191191
api_method.assert_called_once_with(list_identifier=mock_list.identifier, body=expected_body)
192192
assert response == [self._existing_item, new_item]
193193

194+
def test_add_item_without_table_guids_raises_value_error(self, client, api_method, mock_list):
195+
new_item = RecordListItem("a", None, "c")
196+
with pytest.raises(ValueError, match="table_guid must be provided"):
197+
client.add_items_to_list(mock_list, [new_item])
198+
194199

195200
class TestRemoveItems(TestClientMethod):
196201
_api = ListItemApi

tests/test_models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ class TestItemEquality:
264264
RHG1 = str(uuid.uuid4())
265265
RV1 = 1
266266

267-
# Voluntary inconsistent naming scheme to highlight differences in test matrix
267+
# Intentionally inconsistent naming scheme to highlight differences in test matrix
268268
db_guid_2 = str(uuid.uuid4())
269269
table_guid_2 = str(uuid.uuid4())
270270
record_hguid_2 = str(uuid.uuid4())

0 commit comments

Comments
 (0)