|
5 | 5 |
|
6 | 6 | import pytest |
7 | 7 |
|
8 | | -from pyrit.scenarios import EncodingStrategy, FoundryStrategy |
| 8 | +from pyrit.scenarios import EncodingStrategy, FoundryStrategy, ScenarioCompositeStrategy |
9 | 9 |
|
10 | 10 |
|
11 | 11 | class TestStrategyValidation: |
@@ -49,3 +49,53 @@ def test_foundry_validation_rejects_attacks_with_converters_and_another_attack(s |
49 | 49 | FoundryStrategy.validate_composition( |
50 | 50 | [FoundryStrategy.Base64, FoundryStrategy.Crescendo, FoundryStrategy.MultiTurn] |
51 | 51 | ) |
| 52 | + |
| 53 | + |
| 54 | +class TestScenarioCompositeStrategyExtraction: |
| 55 | + """Test extraction of strategy values from composite strategies.""" |
| 56 | + |
| 57 | + def test_extract_single_strategy_values_with_single_strategies(self): |
| 58 | + """Test extracting values from single-strategy composites.""" |
| 59 | + composites = [ |
| 60 | + ScenarioCompositeStrategy(strategies=[EncodingStrategy.Base64]), |
| 61 | + ScenarioCompositeStrategy(strategies=[EncodingStrategy.ROT13]), |
| 62 | + ScenarioCompositeStrategy(strategies=[EncodingStrategy.Atbash]), |
| 63 | + ] |
| 64 | + |
| 65 | + values = ScenarioCompositeStrategy.extract_single_strategy_values(composites, strategy_type=EncodingStrategy) |
| 66 | + |
| 67 | + assert values == {"base64", "rot13", "atbash"} |
| 68 | + |
| 69 | + def test_extract_single_strategy_values_filters_by_type(self): |
| 70 | + """Test that extraction filters by strategy type.""" |
| 71 | + composites = [ |
| 72 | + ScenarioCompositeStrategy(strategies=[EncodingStrategy.Base64]), |
| 73 | + ScenarioCompositeStrategy(strategies=[FoundryStrategy.ROT13]), |
| 74 | + ] |
| 75 | + |
| 76 | + # Extract only EncodingStrategy values |
| 77 | + encoding_values = ScenarioCompositeStrategy.extract_single_strategy_values( |
| 78 | + composites, strategy_type=EncodingStrategy |
| 79 | + ) |
| 80 | + assert encoding_values == {"base64"} |
| 81 | + |
| 82 | + # Extract only FoundryStrategy values |
| 83 | + foundry_values = ScenarioCompositeStrategy.extract_single_strategy_values( |
| 84 | + composites, strategy_type=FoundryStrategy |
| 85 | + ) |
| 86 | + assert foundry_values == {"rot13"} |
| 87 | + |
| 88 | + def test_extract_single_strategy_values_rejects_multi_strategy_composites(self): |
| 89 | + """Test that extraction raises error if any composite has multiple strategies.""" |
| 90 | + composites = [ |
| 91 | + ScenarioCompositeStrategy(strategies=[FoundryStrategy.Base64]), |
| 92 | + ScenarioCompositeStrategy(strategies=[FoundryStrategy.ROT13, FoundryStrategy.Atbash]), # Multi-strategy! |
| 93 | + ] |
| 94 | + |
| 95 | + with pytest.raises(ValueError, match="extract_single_strategy_values.*requires all composites"): |
| 96 | + ScenarioCompositeStrategy.extract_single_strategy_values(composites, strategy_type=FoundryStrategy) |
| 97 | + |
| 98 | + def test_extract_single_strategy_values_with_empty_list(self): |
| 99 | + """Test that extraction handles empty composite list.""" |
| 100 | + values = ScenarioCompositeStrategy.extract_single_strategy_values([], strategy_type=EncodingStrategy) |
| 101 | + assert values == set() |
0 commit comments