diff --git a/pyrit/datasets/seed_datasets/seed_metadata.py b/pyrit/datasets/seed_datasets/seed_metadata.py index 3859a85e47..0fbcb16351 100644 --- a/pyrit/datasets/seed_datasets/seed_metadata.py +++ b/pyrit/datasets/seed_datasets/seed_metadata.py @@ -269,7 +269,9 @@ def _validate(self) -> None: # over criteria in _match_filter_to_metadata vacuously False, so the filter # would silently match no dataset at all. if not self.criteria: - raise ValueError("'criteria' must contain at least one metadata criterion.") + raise ValueError( + "'criteria' must contain at least one criterion. Omit 'criteria' for an unconstrained filter." + ) # An empty set is not a filter. Without strict_match nothing can overlap with it, # and with strict_match nothing can be outside it, so the same filter would match diff --git a/tests/unit/datasets/test_seed_dataset_metadata.py b/tests/unit/datasets/test_seed_dataset_metadata.py index 235bbdfc9a..17e85c19ea 100644 --- a/tests/unit/datasets/test_seed_dataset_metadata.py +++ b/tests/unit/datasets/test_seed_dataset_metadata.py @@ -375,3 +375,18 @@ def test_tags_values(self): def test_harm_categories_values(self): f = SeedDatasetFilter(harm_categories={"violence", "cybercrime"}) assert "violence" in f.criteria[0].harm_categories + + +@pytest.mark.parametrize("strict_match", [False, True]) +def test_empty_criteria_raises(strict_match: bool) -> None: + with pytest.raises(ValueError, match="at least one criterion"): + SeedDatasetFilter(criteria=[], strict_match=strict_match) + + +def test_empty_criteria_with_kwargs_preserves_conflicting_arguments_error() -> None: + with pytest.raises(ValueError, match="Cannot pass both"): + SeedDatasetFilter(criteria=[], tags={"safety"}) + + +def test_unconstrained_criterion_preserves_default_filter() -> None: + assert SeedDatasetFilter(criteria=[SeedDatasetMetadata()]).criteria == SeedDatasetFilter().criteria