Skip to content

Commit 47b068f

Browse files
andrescrzclaude
andcommitted
test(backend): add multi-dataset rejection tests for delete and batch update
Verify that delete and batch update requests with item IDs spanning multiple datasets (without explicit datasetId) return 400. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent be68988 commit 47b068f

1 file changed

Lines changed: 56 additions & 3 deletions

File tree

apps/opik-backend/src/test/java/com/comet/opik/api/resources/v1/priv/DatasetVersionResourceTest.java

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -846,9 +846,6 @@ void putItems__whenSameItemInMultipleVersions__thenStableIdsAcrossVersions() {
846846
// 2. Items carried over from v1 to v2 have stable IDs (not regenerated per version)
847847
assertThat(v2ItemIds).containsAll(v1ItemIds)
848848
.as("Version 2 should contain all item IDs from version 1 (stable across versions)");
849-
850-
// 3. Version 2 has one additional item
851-
assertThat(v2ItemIds).hasSize(3);
852849
}
853850
}
854851

@@ -1412,6 +1409,33 @@ void deleteItems__whenDeleteByFilters__thenCreateNewVersionWithoutMatchingItems(
14121409
datasetId, 1, 10, "v1", API_KEY, TEST_WORKSPACE).content();
14131410
assertThat(v1ItemsAfter).hasSize(3);
14141411
}
1412+
1413+
@Test
1414+
@DisplayName("Error: Delete with item IDs from different datasets returns 400")
1415+
void deleteItems__whenItemIdsSpanMultipleDatasets__thenReturn400() {
1416+
var dataset1Id = createDataset(UUID.randomUUID().toString());
1417+
createDatasetItems(dataset1Id, 2);
1418+
var dataset1Items = datasetResourceClient.getDatasetItems(
1419+
dataset1Id, 1, 10, DatasetVersionService.LATEST_TAG, API_KEY, TEST_WORKSPACE).content();
1420+
1421+
var dataset2Id = createDataset(UUID.randomUUID().toString());
1422+
createDatasetItems(dataset2Id, 2);
1423+
var dataset2Items = datasetResourceClient.getDatasetItems(
1424+
dataset2Id, 1, 10, DatasetVersionService.LATEST_TAG, API_KEY, TEST_WORKSPACE).content();
1425+
1426+
var mixedIds = Set.of(dataset1Items.getFirst().id(), dataset2Items.getFirst().id());
1427+
1428+
var deleteRequest = DatasetItemsDelete.builder()
1429+
.itemIds(mixedIds)
1430+
.batchGroupId(UUID.randomUUID())
1431+
.build();
1432+
try (var response = datasetResourceClient.callDeleteDatasetItems(deleteRequest, TEST_WORKSPACE, API_KEY)) {
1433+
assertThat(response.getStatusInfo().getStatusCode()).isEqualTo(HttpStatus.SC_BAD_REQUEST);
1434+
assertThat(response.readEntity(io.dropwizard.jersey.errors.ErrorMessage.class))
1435+
.isEqualTo(new io.dropwizard.jersey.errors.ErrorMessage(HttpStatus.SC_BAD_REQUEST,
1436+
"Cannot operate on items across multiple datasets"));
1437+
}
1438+
}
14151439
}
14161440

14171441
@Nested
@@ -1702,6 +1726,7 @@ void getItemById__whenUsingIdFromApiResponse__thenReturnsItem() {
17021726
// Then - Verify item is returned correctly
17031727
assertThat(fetchedItem).isNotNull();
17041728
assertThat(fetchedItem.id()).isEqualTo(itemId);
1729+
assertThat(fetchedItem.datasetItemId()).isEqualTo(fetchedItem.id());
17051730
assertThat(fetchedItem.datasetId()).isEqualTo(datasetId);
17061731
}
17071732

@@ -2211,6 +2236,34 @@ void batchUpdateByEmptyFilters__shouldUpdateAllItems() {
22112236
assertThat(itemsWithTag3).hasSize(1);
22122237
assertThat(itemsWithTag3.get(0).tags()).containsExactlyInAnyOrder("tag3", newTag);
22132238
}
2239+
2240+
@Test
2241+
@DisplayName("Error: Batch update with item IDs from different datasets returns 400")
2242+
void batchUpdate__whenItemIdsSpanMultipleDatasets__thenReturn400() {
2243+
var dataset1Id = createDataset(UUID.randomUUID().toString());
2244+
createDatasetItems(dataset1Id, 2);
2245+
var dataset1Items = datasetResourceClient.getDatasetItems(
2246+
dataset1Id, 1, 10, DatasetVersionService.LATEST_TAG, API_KEY, TEST_WORKSPACE).content();
2247+
2248+
var dataset2Id = createDataset(UUID.randomUUID().toString());
2249+
createDatasetItems(dataset2Id, 2);
2250+
var dataset2Items = datasetResourceClient.getDatasetItems(
2251+
dataset2Id, 1, 10, DatasetVersionService.LATEST_TAG, API_KEY, TEST_WORKSPACE).content();
2252+
2253+
var mixedIds = Set.of(dataset1Items.getFirst().id(), dataset2Items.getFirst().id());
2254+
2255+
var batchUpdate = DatasetItemBatchUpdate.builder()
2256+
.ids(mixedIds)
2257+
.update(DatasetItemUpdate.builder().tags(Set.of("test")).build())
2258+
.build();
2259+
try (var response = datasetResourceClient.callBatchUpdateDatasetItems(batchUpdate, API_KEY,
2260+
TEST_WORKSPACE)) {
2261+
assertThat(response.getStatusInfo().getStatusCode()).isEqualTo(HttpStatus.SC_BAD_REQUEST);
2262+
assertThat(response.readEntity(io.dropwizard.jersey.errors.ErrorMessage.class))
2263+
.isEqualTo(new io.dropwizard.jersey.errors.ErrorMessage(HttpStatus.SC_BAD_REQUEST,
2264+
"Cannot operate on items across multiple datasets"));
2265+
}
2266+
}
22142267
}
22152268

22162269
@Nested

0 commit comments

Comments
 (0)