@@ -28,14 +28,42 @@ async def after_scan_1(self):
2828 assert {f .confidence for f in findings } == {"UNKNOWN" }
2929 assert {f .confidence_score for f in findings } == {1 }
3030
31- # risk should auto-sync from finding_max_severity
31+ # risk should auto-sync from finding_max_severity via CVSS: HIGH -> 7.0
3232 www_asset = await self .bbot_server .get_asset (host = "www.evilcorp.com" )
33- assert www_asset .risk == "HIGH"
33+ assert www_asset .risk == 7.0
3434 assert www_asset .risk_override == False
3535 www2_asset = await self .bbot_server .get_asset (host = "www2.evilcorp.com" )
36- assert www2_asset .risk == "HIGH"
36+ assert www2_asset .risk == 7.0
3737 assert www2_asset .risk_override == False
3838
39+ # api.evilcorp.com has no findings yet → risk should be None
40+ api_asset = await self .bbot_server .get_asset (host = "api.evilcorp.com" )
41+ assert api_asset .risk is None
42+ assert api_asset .risk_override == False
43+
44+ # set risk on asset with no findings, then clear → should revert to None
45+ result = await self .bbot_server .set_risk (host = "api.evilcorp.com" , risk = 5.0 )
46+ assert result ["risk" ] == 5.0
47+ assert result ["risk_override" ] == True
48+ result = await self .bbot_server .set_risk (host = "api.evilcorp.com" )
49+ assert result ["risk" ] is None
50+ assert result ["risk_override" ] == False
51+ api_asset = await self .bbot_server .get_asset (host = "api.evilcorp.com" )
52+ assert api_asset .risk is None
53+ assert api_asset .risk_override == False
54+
55+ # override risk to None on asset with no findings (explicit "no risk score")
56+ result = await self .bbot_server .set_risk (host = "api.evilcorp.com" , override_none = True )
57+ assert result ["risk" ] is None
58+ assert result ["risk_override" ] == True
59+ api_asset = await self .bbot_server .get_asset (host = "api.evilcorp.com" )
60+ assert api_asset .risk is None
61+ assert api_asset .risk_override == True
62+ # clear → should revert to None (no findings = no CVSS value)
63+ result = await self .bbot_server .set_risk (host = "api.evilcorp.com" )
64+ assert result ["risk" ] is None
65+ assert result ["risk_override" ] == False
66+
3967 async def after_scan_2 (self ):
4068 findings = [f async for f in self .bbot_server .list_findings ()]
4169 assert len (findings ) == 4
@@ -166,38 +194,60 @@ async def after_scan_2(self):
166194
167195 # --- risk field tests ---
168196
169- # after scan 2, www2 and api have CRITICAL findings, so risk should auto-update
197+ # after scan 2, www2 and api have CRITICAL findings → CVSS 9.0
170198 www2_asset = await self .bbot_server .get_asset (host = "www2.evilcorp.com" )
171- assert www2_asset .risk == "CRITICAL"
199+ assert www2_asset .risk == 9.0
172200 assert www2_asset .risk_override == False
173201 api_asset = await self .bbot_server .get_asset (host = "api.evilcorp.com" )
174- assert api_asset .risk == "CRITICAL"
202+ assert api_asset .risk == 9.0
175203 assert api_asset .risk_override == False
176- # www only had HIGH findings from scan 1, risk should still be HIGH
204+ # www only had HIGH findings from scan 1 → CVSS 7.0
177205 www_asset = await self .bbot_server .get_asset (host = "www.evilcorp.com" )
178- assert www_asset .risk == "HIGH"
206+ assert www_asset .risk == 7.0
179207 assert www_asset .risk_override == False
180208
181- # manually override risk on www2
182- result = await self .bbot_server .set_risk (host = "www2.evilcorp.com" , risk = "LOW" )
183- assert result ["risk" ] == "LOW"
209+ # manually set risk on www2 (float 0.0-10.0)
210+ result = await self .bbot_server .set_risk (host = "www2.evilcorp.com" , risk = 7.5 )
211+ assert result ["risk" ] == 7.5
212+ assert result ["risk_override" ] == True
213+ www2_asset = await self .bbot_server .get_asset (host = "www2.evilcorp.com" )
214+ assert www2_asset .risk == 7.5
215+ assert www2_asset .risk_override == True
216+
217+ # set risk with extra precision — should round to 1 decimal
218+ result = await self .bbot_server .set_risk (host = "www2.evilcorp.com" , risk = 3.14 )
219+ assert result ["risk" ] == 3.1
220+ assert result ["risk_override" ] == True
221+
222+ # boundary values
223+ result = await self .bbot_server .set_risk (host = "www2.evilcorp.com" , risk = 0.0 )
224+ assert result ["risk" ] == 0.0
225+ assert result ["risk_override" ] == True
226+ result = await self .bbot_server .set_risk (host = "www2.evilcorp.com" , risk = 10.0 )
227+ assert result ["risk" ] == 10.0
228+ assert result ["risk_override" ] == True
229+
230+ # override risk to None — explicit "no risk score"
231+ result = await self .bbot_server .set_risk (host = "www2.evilcorp.com" , override_none = True )
232+ assert result ["risk" ] is None
184233 assert result ["risk_override" ] == True
185234 www2_asset = await self .bbot_server .get_asset (host = "www2.evilcorp.com" )
186- assert www2_asset .risk == "LOW"
235+ assert www2_asset .risk is None
187236 assert www2_asset .risk_override == True
188237
189- # clear the override, risk should revert to finding_max_severity
238+ # clear override — should revert to CVSS-derived value (CRITICAL → 9.0)
190239 result = await self .bbot_server .set_risk (host = "www2.evilcorp.com" )
191- assert result ["risk" ] == "CRITICAL"
240+ assert result ["risk" ] == 9.0
192241 assert result ["risk_override" ] == False
193242 www2_asset = await self .bbot_server .get_asset (host = "www2.evilcorp.com" )
194- assert www2_asset .risk == "CRITICAL"
243+ assert www2_asset .risk == 9.0
195244 assert www2_asset .risk_override == False
196245
197- # verify RISK_UPDATED activities were emitted (allow time for async queue processing)
198- # expected: 2 from scan 1 (www + www2: None->HIGH),
199- # 2 from scan 2 (www2: HIGH->CRITICAL, api: None->CRITICAL),
200- # 2 from manual set + clear above
246+ # verify RISK_UPDATED activities were emitted
247+ # expected: 2 from scan 1 auto-sync (www + www2: None->7.0),
248+ # 4 from after_scan_1 manual set_risk (api: set 5.0, clear, set None, clear),
249+ # 2 from scan 2 auto-sync (www2: 7.0->9.0, api: None->9.0),
250+ # 6 from after_scan_2 manual set_risk (7.5, 3.1, 0.0, 10.0, None, clear)
201251 await asyncio .sleep (1.0 )
202252 activities = [a async for a in self .bbot_server .list_activities () if a .type == "RISK_UPDATED" ]
203- assert len (activities ) == 6
253+ assert len (activities ) == 14
0 commit comments