Skip to content

Commit 6352bb9

Browse files
committed
Handle mutants
1 parent 3b6a693 commit 6352bb9

1 file changed

Lines changed: 94 additions & 7 deletions

File tree

payjoin/src/core/url.rs

Lines changed: 94 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -382,13 +382,7 @@ fn parse_path_query_fragment(input: &str) -> (String, Option<String>, Option<Str
382382

383383
if let Some(q_pos) = before_fragment.find('?') {
384384
path.push_str(&before_fragment[..q_pos]);
385-
let q_part = &before_fragment[q_pos + 1..];
386-
if let Some(f_pos) = q_part.find('#') {
387-
query = Some(q_part[..f_pos].to_string());
388-
fragment = Some(q_part[f_pos + 1..].to_string());
389-
} else {
390-
query = Some(q_part.to_string());
391-
}
385+
query = Some(before_fragment[q_pos + 1..].to_string());
392386
} else {
393387
path.push_str(before_fragment);
394388
}
@@ -489,4 +483,97 @@ mod tests {
489483
assert_eq!(url.fragment(), Some("FRAGMENT"));
490484
assert_eq!(url.as_str(), "http://localhost:1234/PATH#FRAGMENT");
491485
}
486+
487+
#[test]
488+
fn test_empty_host_rejected() {
489+
assert!(matches!(Url::parse("http:///path"), Err(ParseError::EmptyHost)));
490+
}
491+
492+
#[test]
493+
fn test_path_segments_mut_push_adds_separator() {
494+
let mut url = Url::parse("http://example.com/base").unwrap();
495+
{
496+
let mut segs = url.path_segments_mut().unwrap();
497+
segs.push("child");
498+
}
499+
assert_eq!(url.path(), "/base/child");
500+
assert_eq!(url.as_str(), "http://example.com/base/child");
501+
}
502+
503+
#[test]
504+
fn test_host_str() {
505+
let url = Url::parse("http://example.com/").unwrap();
506+
assert_eq!(url.host_str(), Some("example.com".to_string()));
507+
}
508+
509+
#[test]
510+
fn test_host_str_ipv4() {
511+
let mut url = Url::parse("http://127.0.0.1/").unwrap();
512+
url.host = Some(Host::Ipv4([192, 168, 1, 1]));
513+
url.rebuild_raw();
514+
assert_eq!(url.host_str(), Some("192.168.1.1".to_string()));
515+
assert!(url.as_str().contains("192.168.1.1"));
516+
}
517+
518+
#[test]
519+
fn test_set_port() {
520+
let mut url = Url::parse("http://example.com/path").unwrap();
521+
url.set_port(Some(9090));
522+
assert_eq!(url.port(), Some(9090));
523+
assert_eq!(url.as_str(), "http://example.com:9090/path");
524+
url.set_port(None);
525+
assert_eq!(url.port(), None);
526+
assert_eq!(url.as_str(), "http://example.com/path");
527+
}
528+
529+
#[test]
530+
fn test_path_segments_root() {
531+
let url = Url::parse("http://example.com/").unwrap();
532+
let segs: Vec<_> = url.path_segments().unwrap().collect();
533+
assert!(segs.is_empty());
534+
535+
let url = Url::parse("http://example.com").unwrap();
536+
let segs: Vec<_> = url.path_segments().unwrap().collect();
537+
assert!(segs.is_empty());
538+
}
539+
540+
#[test]
541+
fn test_set_query() {
542+
let mut url = Url::parse("http://example.com/path").unwrap();
543+
url.set_query(Some("key=value"));
544+
assert_eq!(url.query(), Some("key=value"));
545+
assert_eq!(url.as_str(), "http://example.com/path?key=value");
546+
url.set_query(None);
547+
assert_eq!(url.query(), None);
548+
assert_eq!(url.as_str(), "http://example.com/path");
549+
}
550+
551+
#[test]
552+
fn test_join_dot_segments() {
553+
let base = Url::parse("http://example.com/a/b/c").unwrap();
554+
555+
let joined = base.join("./d").unwrap();
556+
assert_eq!(joined.path(), "/a/b/d");
557+
558+
let joined = base.join("../d").unwrap();
559+
assert_eq!(joined.path(), "/a/d");
560+
}
561+
562+
#[test]
563+
fn test_parse_query_and_fragment() {
564+
let url = Url::parse("http://example.com/path?q=1#frag").unwrap();
565+
assert_eq!(url.path(), "/path");
566+
assert_eq!(url.query(), Some("q=1"));
567+
assert_eq!(url.fragment(), Some("frag"));
568+
}
569+
570+
#[test]
571+
fn test_has_host() {
572+
let url = Url::parse("http://example.com/").unwrap();
573+
assert!(url.has_host());
574+
575+
let mut url = Url::parse("http://example.com/").unwrap();
576+
url.host = None;
577+
assert!(!url.has_host());
578+
}
492579
}

0 commit comments

Comments
 (0)