use gix_url::Scheme; use crate::parse::{assert_url, assert_url_roundtrip, url, url_with_pass}; #[test]fn username_expansion_is_unsupported() -> crate::Result { assert_url_roundtrip( "http://example.com/~byron/hello", url(Scheme::Http, None, "example.com", None, b"/~byron/hello"), )} #[test]fn empty_user_cannot_roundtrip() -> crate::Result { let actual = gix_url::parse("http://@example.com/~byron/hello".into())?; let expected = url(Scheme::Http, None, "example.com", None, b"/~byron/hello"); assert_eq!(actual, expected); assert_eq!( actual.to_bstring(), "http://example.com/~byron/hello", "we cannot differentiate between empty user and no user" ); Ok(())} #[test]fn username_and_password() -> crate::Result { assert_url_roundtrip( "http://user:password@example.com/~byron/hello", url_with_pass(Scheme::Http, "user", "password", "example.com", None, b"/~byron/hello"), )} #[test]fn username_and_password_and_port() -> crate::Result { assert_url_roundtrip( "http://user:password@example.com:8080/~byron/hello", url_with_pass(Scheme::Http, "user", "password", "example.com", 8080, b"/~byron/hello"), )} #[test]fn username_and_password_with_spaces_and_port() -> crate::Result { let expected = gix_url::Url::from_parts( Scheme::Http, Some("user name".into()), Some("password secret".into()), Some("example.com".into()), Some(8080), b"/~byron/hello".into(), false, )?; assert_url_roundtrip( "http://user%20name:password%20secret@example.com:8080/~byron/hello", expected.clone(), )?; assert_eq!(expected.user(), Some("user name")); assert_eq!(expected.password(), Some("password secret")); Ok(())} #[test]fn only_password() -> crate::Result { assert_url_roundtrip( "http://:password@example.com/~byron/hello", url_with_pass(Scheme::Http, "", "password", "example.com", None, b"/~byron/hello"), )} #[test]fn username_and_empty_password() -> crate::Result { let actual = gix_url::parse("http://user:@example.com/~byron/hello".into())?; let expected = url(Scheme::Http, "user", "example.com", None, b"/~byron/hello"); assert_eq!(actual, expected); assert_eq!( actual.to_bstring(), "http://user@example.com/~byron/hello", "an empty password appears like no password to us - fair enough" ); Ok(())} #[test]fn secure() -> crate::Result { assert_url_roundtrip( "https://github.com/byron/gitoxide", url(Scheme::Https, None, "github.com", None, b"/byron/gitoxide"), )} #[test]fn http_missing_path() -> crate::Result { assert_url_roundtrip("http://host.xz/", url(Scheme::Http, None, "host.xz", None, b"/"))?; assert_url("http://host.xz", url(Scheme::Http, None, "host.xz", None, b"/"))?; Ok(())} #[test]fn username_with_dot_is_not_percent_encoded() -> crate::Result { assert_url_roundtrip( "http://user.name@example.com/repo", url(Scheme::Http, "user.name", "example.com", None, b"/repo"), )} #[test]fn password_with_dot_is_not_percent_encoded() -> crate::Result { assert_url_roundtrip( "http://user:pass.word@example.com/repo", url_with_pass(Scheme::Http, "user", "pass.word", "example.com", None, b"/repo"), )} #[test]fn username_and_password_with_dots_are_not_percent_encoded() -> crate::Result { assert_url_roundtrip( "http://user.name:pass.word@example.com/repo", url_with_pass(Scheme::Http, "user.name", "pass.word", "example.com", None, b"/repo"), )} #[test]fn http_with_ipv6() -> crate::Result { assert_url_roundtrip("http://[::1]/repo", url(Scheme::Http, None, "[::1]", None, b"/repo"))} #[test]fn http_with_ipv6_and_port() -> crate::Result { assert_url_roundtrip( "http://[::1]:8080/repo", url(Scheme::Http, None, "[::1]", 8080, b"/repo"), )} #[test]fn https_with_ipv6_user_and_port() -> crate::Result { assert_url_roundtrip( "https://user@[2001:db8::1]:8443/repo", url(Scheme::Https, "user", "[2001:db8::1]", 8443, b"/repo"), )} #[test]fn percent_encoded_path() -> crate::Result { let url = gix_url::parse("https://example.com/path/with%20spaces/file".into())?; assert_eq!(url.path, "/path/with spaces/file", "paths are now decoded"); Ok(())} #[test]fn percent_encoded_international_path() -> crate::Result { let url = gix_url::parse("https://example.com/caf%C3%A9".into())?; assert_eq!(url.path, "/café", "international characters are decoded in path"); Ok(())} #[test]fn percent_encoded_path_roundtrips_in_lossless_serialization() -> crate::Result { for (input, expected_host, expected_path) in [ ("https://%20@%40:example.org/%20%25", "%40:example.org", "/ %"), ("https://%20@%40:example.org/%20%25/%20%25", "%40:example.org", "/ %/ %"), ] { let url = gix_url::parse(input.into())?; let serialized = url.to_bstring(); assert_eq!(serialized, input); assert_eq!(url.host(), Some(expected_host)); assert_eq!(url.path, expected_path); assert_eq!(gix_url::parse(serialized.as_ref())?, url); } Ok(())} #[test]fn query_and_fragment_delimiters_in_path_roundtrip() -> crate::Result { assert_url_roundtrip( "https://host/repo.git?token=abc", url(Scheme::Https, None, "host", None, b"/repo.git?token=abc"), )?; assert_url_roundtrip( "https://host/repo.git#section", url(Scheme::Https, None, "host", None, b"/repo.git#section"), )?; Ok(())}
use gix_url::Scheme;
use crate::parse::{assert_url, assert_url_roundtrip, url, url_with_pass};
#[test]
fn username_expansion_is_unsupported() -> crate::Result {
assert_url_roundtrip(
"http://example.com/~byron/hello",
url(Scheme::Http, None, "example.com", None, b"/~byron/hello"),
)
}
#[test]
fn empty_user_cannot_roundtrip() -> crate::Result {
let actual = gix_url::parse("http://@example.com/~byron/hello".into())?;
let expected = url(Scheme::Http, None, "example.com", None, b"/~byron/hello");
assert_eq!(actual, expected);
assert_eq!(
actual.to_bstring(),
"http://example.com/~byron/hello",
"we cannot differentiate between empty user and no user"
);
Ok(())
}
#[test]
fn username_and_password() -> crate::Result {
assert_url_roundtrip(
"http://user:password@example.com/~byron/hello",
url_with_pass(Scheme::Http, "user", "password", "example.com", None, b"/~byron/hello"),
)
}
#[test]
fn username_and_password_and_port() -> crate::Result {
assert_url_roundtrip(
"http://user:password@example.com:8080/~byron/hello",
url_with_pass(Scheme::Http, "user", "password", "example.com", 8080, b"/~byron/hello"),
)
}
#[test]
fn username_and_password_with_spaces_and_port() -> crate::Result {
let expected = gix_url::Url::from_parts(
Scheme::Http,
Some("user name".into()),
Some("password secret".into()),
Some("example.com".into()),
Some(8080),
b"/~byron/hello".into(),
false,
)?;
assert_url_roundtrip(
"http://user%20name:password%20secret@example.com:8080/~byron/hello",
expected.clone(),
)?;
assert_eq!(expected.user(), Some("user name"));
assert_eq!(expected.password(), Some("password secret"));
Ok(())
}
#[test]
fn only_password() -> crate::Result {
assert_url_roundtrip(
"http://:password@example.com/~byron/hello",
url_with_pass(Scheme::Http, "", "password", "example.com", None, b"/~byron/hello"),
)
}
#[test]
fn username_and_empty_password() -> crate::Result {
let actual = gix_url::parse("http://user:@example.com/~byron/hello".into())?;
let expected = url(Scheme::Http, "user", "example.com", None, b"/~byron/hello");
assert_eq!(actual, expected);
assert_eq!(
actual.to_bstring(),
"http://user@example.com/~byron/hello",
"an empty password appears like no password to us - fair enough"
);
Ok(())
}
#[test]
fn secure() -> crate::Result {
assert_url_roundtrip(
"https://github.com/byron/gitoxide",
url(Scheme::Https, None, "github.com", None, b"/byron/gitoxide"),
)
}
#[test]
fn http_missing_path() -> crate::Result {
assert_url_roundtrip("http://host.xz/", url(Scheme::Http, None, "host.xz", None, b"/"))?;
assert_url("http://host.xz", url(Scheme::Http, None, "host.xz", None, b"/"))?;
Ok(())
}
#[test]
fn username_with_dot_is_not_percent_encoded() -> crate::Result {
assert_url_roundtrip(
"http://user.name@example.com/repo",
url(Scheme::Http, "user.name", "example.com", None, b"/repo"),
)
}
#[test]
fn password_with_dot_is_not_percent_encoded() -> crate::Result {
assert_url_roundtrip(
"http://user:pass.word@example.com/repo",
url_with_pass(Scheme::Http, "user", "pass.word", "example.com", None, b"/repo"),
)
}
#[test]
fn username_and_password_with_dots_are_not_percent_encoded() -> crate::Result {
assert_url_roundtrip(
"http://user.name:pass.word@example.com/repo",
url_with_pass(Scheme::Http, "user.name", "pass.word", "example.com", None, b"/repo"),
)
}
#[test]
fn http_with_ipv6() -> crate::Result {
assert_url_roundtrip("http://[::1]/repo", url(Scheme::Http, None, "[::1]", None, b"/repo"))
}
#[test]
fn http_with_ipv6_and_port() -> crate::Result {
assert_url_roundtrip(
"http://[::1]:8080/repo",
url(Scheme::Http, None, "[::1]", 8080, b"/repo"),
)
}
#[test]
fn https_with_ipv6_user_and_port() -> crate::Result {
assert_url_roundtrip(
"https://user@[2001:db8::1]:8443/repo",
url(Scheme::Https, "user", "[2001:db8::1]", 8443, b"/repo"),
)
}
#[test]
fn percent_encoded_path() -> crate::Result {
let url = gix_url::parse("https://example.com/path/with%20spaces/file".into())?;
assert_eq!(url.path, "/path/with spaces/file", "paths are now decoded");
Ok(())
}
#[test]
fn percent_encoded_international_path() -> crate::Result {
let url = gix_url::parse("https://example.com/caf%C3%A9".into())?;
assert_eq!(url.path, "/café", "international characters are decoded in path");
Ok(())
}
#[test]
fn percent_encoded_path_roundtrips_in_lossless_serialization() -> crate::Result {
for (input, expected_host, expected_path) in [
("https://%20@%40:example.org/%20%25", "%40:example.org", "/ %"),
("https://%20@%40:example.org/%20%25/%20%25", "%40:example.org", "/ %/ %"),
] {
let url = gix_url::parse(input.into())?;
let serialized = url.to_bstring();
assert_eq!(serialized, input);
assert_eq!(url.host(), Some(expected_host));
assert_eq!(url.path, expected_path);
assert_eq!(gix_url::parse(serialized.as_ref())?, url);
}
Ok(())
}
#[test]
fn query_and_fragment_delimiters_in_path_roundtrip() -> crate::Result {
assert_url_roundtrip(
"https://host/repo.git?token=abc",
url(Scheme::Https, None, "host", None, b"/repo.git?token=abc"),
)?;
assert_url_roundtrip(
"https://host/repo.git#section",
url(Scheme::Https, None, "host", None, b"/repo.git#section"),
)?;
Ok(())
}