#![cfg(feature = "github")]
use std::sync::Arc;
use std::time::Duration;
use self_update::backends::github;
use self_update::http_client::{HeaderMap, HttpClient, HttpResponse};
struct NeverCalled;
impl HttpClient for NeverCalled {
fn get(
&self,
url: &str,
_headers: &HeaderMap,
_timeout: Option<Duration>,
) -> self_update::Result<Box<dyn HttpResponse>> {
panic!("a request with an unencodable auth token must not reach the transport: {url}");
}
}
#[test]
fn an_unencodable_env_token_fails_at_request_time_not_at_build() {
unsafe {
std::env::set_var("GH_TOKEN", "ghp_line1\nline2");
}
let mut builder = github::Update::configure();
builder
.repo_owner("o")
.repo_name("r")
.bin_name("app")
.current_version("0.1.0")
.auth_token_from_env();
assert!(
builder.has_auth_token(),
"the value is taken as-is: validity is not checked during the lookup"
);
let upd = builder
.http_client(Arc::new(NeverCalled))
.build()
.expect("build() must NOT validate the token: the documented failure point is the request");
let err = upd
.get_latest_release()
.expect_err("an unencodable token must fail the request");
assert!(
matches!(err, self_update::errors::Error::InvalidAuthToken { .. }),
"the mangled value must surface as InvalidAuthToken, got: {err:?}"
);
assert!(
!format!("{err}").contains("ghp_line1"),
"the error Display must not echo the token: {err}"
);
}