diff --git a/crates/dids/core/src/did/url.rs b/crates/dids/core/src/did/url.rs index 88b2ae32b..36f50765b 100644 --- a/crates/dids/core/src/did/url.rs +++ b/crates/dids/core/src/did/url.rs @@ -726,4 +726,46 @@ mod tests { assert!(DIDURL::new(input).is_err()) } } + + #[test] + fn test_did_url_path_query_fragment() { + // Test all combinations of path, query, and fragment presence. + for path_str in ["", "/path", "/path/subpath"] { + for query_str in [None, Some("query=value")] { + for fragment_str in [None, Some("fragment")] { + let mut did_url_str = "did:example:123".to_string(); + if !path_str.is_empty() { + did_url_str.push_str(path_str); + } + if let Some(query_str) = query_str { + did_url_str.push_str("?"); + did_url_str.push_str(query_str); + } + if let Some(fragment_str) = fragment_str { + did_url_str.push_str("#"); + did_url_str.push_str(fragment_str); + } + let did_url = DIDURL::new(&did_url_str).unwrap(); + assert_eq!( + did_url.path().as_str(), + path_str, + "did_url str: {:?}", + did_url_str + ); + assert_eq!( + did_url.query().map(|x| x.as_str()), + query_str, + "did_url str: {:?}", + did_url_str + ); + assert_eq!( + did_url.fragment().map(|x| x.as_str()), + fragment_str, + "did_url str: {:?}", + did_url_str + ); + } + } + } + } } diff --git a/crates/dids/core/src/did/url/relative.rs b/crates/dids/core/src/did/url/relative.rs index 0f9d4e608..57313fddd 100644 --- a/crates/dids/core/src/did/url/relative.rs +++ b/crates/dids/core/src/did/url/relative.rs @@ -104,7 +104,7 @@ impl RelativeDIDURL { pub fn fragment(&self) -> Option<&Fragment> { let start = self.fragment_delimiter_offset(); - let end = self.fragment_delimiter_offset_from(start); + let end = self.0.len(); if start == end { None } else { @@ -375,3 +375,51 @@ impl RelativeDIDURL { } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_relative_did_url_path_query_fragment() { + // Test all combinations of path, query, and fragment presence. + for path_str in ["", "/path", "/path/subpath"] { + for query_str in [None, Some("query=value")] { + for fragment_str in [None, Some("fragment")] { + let mut relative_did_url_str = String::new(); + if !path_str.is_empty() { + relative_did_url_str.push_str(path_str); + } + if let Some(query_str) = query_str { + relative_did_url_str.push_str("?"); + relative_did_url_str.push_str(query_str); + } + if let Some(fragment_str) = fragment_str { + relative_did_url_str.push_str("#"); + relative_did_url_str.push_str(fragment_str); + } + let relative_did_url = + RelativeDIDURL::new(&relative_did_url_str.as_bytes()).unwrap(); + assert_eq!( + relative_did_url.path().as_str(), + path_str, + "relative_did_url str: {:?}", + relative_did_url_str + ); + assert_eq!( + relative_did_url.query().map(|x| x.as_str()), + query_str, + "relative_did_url str: {:?}", + relative_did_url_str + ); + assert_eq!( + relative_did_url.fragment().map(|x| x.as_str()), + fragment_str, + "relative_did_url str: {:?}", + relative_did_url_str + ); + } + } + } + } +}