1use http::HeaderMap;
4
5use crate::types::RiskLevel;
6
7#[derive(Debug, Clone)]
12pub struct KnownDuplicate {
13 pub field: String,
15 pub value: String,
17}
18
19#[derive(Debug, Clone)]
23pub struct StateField {
24 pub field: String,
26 pub value: String,
28}
29
30#[derive(Debug, Clone)]
35pub struct ScanContext {
36 pub target: String,
38 pub baseline_id: String,
40 pub probe_id: String,
42 pub headers: HeaderMap,
44 pub max_risk: RiskLevel,
46 pub known_duplicate: Option<KnownDuplicate>,
49 pub state_field: Option<StateField>,
52 pub alt_credential: Option<HeaderMap>,
55 pub body_template: Option<String>,
58}
59
60#[cfg(test)]
61mod tests {
62 use super::*;
63 use http::HeaderMap;
64
65 #[test]
68 fn known_duplicate_fields_accessible() {
69 let kd = KnownDuplicate {
70 field: "email".to_owned(),
71 value: "alice@example.com".to_owned(),
72 };
73 assert_eq!(kd.field, "email");
74 assert_eq!(kd.value, "alice@example.com");
75 }
76
77 #[test]
78 fn state_field_fields_accessible() {
79 let sf = StateField {
80 field: "status".to_owned(),
81 value: "invalid_state".to_owned(),
82 };
83 assert_eq!(sf.field, "status");
84 assert_eq!(sf.value, "invalid_state");
85 }
86
87 #[test]
88 fn scan_context_all_some_fields_accessible() {
89 let ctx = ScanContext {
90 target: "https://example.com/users/{id}".to_owned(),
91 baseline_id: "00000000-0000-0000-0000-000000000001".to_owned(),
92 probe_id: "ffffffff-ffff-ffff-ffff-ffffffffffff".to_owned(),
93 headers: HeaderMap::new(),
94 max_risk: RiskLevel::MethodDestructive,
95 known_duplicate: Some(KnownDuplicate {
96 field: "email".to_owned(),
97 value: "alice@example.com".to_owned(),
98 }),
99 state_field: Some(StateField {
100 field: "status".to_owned(),
101 value: "invalid_state".to_owned(),
102 }),
103 alt_credential: Some(HeaderMap::new()),
104 body_template: None,
105 };
106
107 assert_eq!(ctx.target, "https://example.com/users/{id}");
108 assert_eq!(ctx.max_risk, RiskLevel::MethodDestructive);
109 assert!(ctx.known_duplicate.is_some());
110 assert!(ctx.state_field.is_some());
111 assert!(ctx.alt_credential.is_some());
112 }
113
114 #[test]
115 fn scan_context_all_none_fields_accessible() {
116 let ctx = ScanContext {
117 target: "https://example.com/items/{id}".to_owned(),
118 baseline_id: "1".to_owned(),
119 probe_id: "999999".to_owned(),
120 headers: HeaderMap::new(),
121 max_risk: RiskLevel::Safe,
122 known_duplicate: None,
123 state_field: None,
124 alt_credential: None,
125 body_template: None,
126 };
127
128 assert!(ctx.known_duplicate.is_none());
129 assert!(ctx.state_field.is_none());
130 assert!(ctx.alt_credential.is_none());
131 }
132}