feature/agent-client #12
@@ -33,3 +33,6 @@ reqwest = { version = "^0.12", features = ["json", "multipart", "stream"] }
|
|||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tempfile = "3"
|
tempfile = "3"
|
||||||
|
|
||||||
|
[lints.clippy]
|
||||||
|
unwrap_used = "deny"
|
||||||
@@ -28,7 +28,7 @@ fn action(
|
|||||||
_matches: &clap::ArgMatches,
|
_matches: &clap::ArgMatches,
|
||||||
) -> std::pin::Pin<Box<dyn std::future::Future<Output = ()> + Send>> {
|
) -> std::pin::Pin<Box<dyn std::future::Future<Output = ()> + Send>> {
|
||||||
let output_path = _matches.get_one::<String>("output_path");
|
let output_path = _matches.get_one::<String>("output_path");
|
||||||
let output_path = output_path.unwrap().to_string();
|
let output_path = output_path.expect("output_path is required").to_string();
|
||||||
|
|
||||||
Box::pin(async move {
|
Box::pin(async move {
|
||||||
tracing::subscriber::with_default(log::make_temporary_subscriber(), || {
|
tracing::subscriber::with_default(log::make_temporary_subscriber(), || {
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ impl FromConfig for ServerSettings {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
fn mock() -> Self {
|
fn mock() -> Self {
|
||||||
ServerSettings {
|
ServerSettings {
|
||||||
address: "0.0.0.0".parse().unwrap(),
|
address: "0.0.0.0".parse().expect("Failed to parse mock IP address"),
|
||||||
port: 8080,
|
port: 8080,
|
||||||
serve_openapi: false,
|
serve_openapi: false,
|
||||||
cors: CORSSettings {
|
cors: CORSSettings {
|
||||||
|
|||||||
@@ -138,13 +138,21 @@ mod test {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
let response = app
|
let response = app
|
||||||
.oneshot(Request::builder().uri("/info").body(Body::empty()).unwrap())
|
.oneshot(
|
||||||
|
Request::builder()
|
||||||
|
.uri("/info")
|
||||||
|
.body(Body::empty())
|
||||||
|
.expect("Failed to build request"),
|
||||||
|
)
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
assert_eq!(response.status(), StatusCode::OK);
|
assert_eq!(response.status(), StatusCode::OK);
|
||||||
let body = to_bytes(response.into_body(), 1024 * 1024).await.unwrap(); // Set limit to 1 MB
|
let body = to_bytes(response.into_body(), 1024 * 1024)
|
||||||
let health_info: HealthInfo = serde_json::from_slice(&body).unwrap();
|
.await
|
||||||
|
.expect("Failed to read response body"); // Set limit to 1 MB
|
||||||
|
let health_info: HealthInfo =
|
||||||
|
serde_json::from_slice(&body).expect("Failed to deserialize response body");
|
||||||
assert_eq!(health_info.status, STATUS_HEALTHY);
|
assert_eq!(health_info.status, STATUS_HEALTHY);
|
||||||
assert_eq!(health_info.version, env!("CARGO_PKG_VERSION"));
|
assert_eq!(health_info.version, env!("CARGO_PKG_VERSION"));
|
||||||
assert!(health_info.errors.is_none());
|
assert!(health_info.errors.is_none());
|
||||||
|
|||||||
@@ -197,14 +197,17 @@ mod tests {
|
|||||||
let (token, _) = service
|
let (token, _) = service
|
||||||
.generate_jwt(user_id, 60)
|
.generate_jwt(user_id, 60)
|
||||||
.await
|
.await
|
||||||
.expect("generate jwt");
|
.expect("Failed to generate jwt");
|
||||||
|
|
||||||
let valid = service
|
let valid = service
|
||||||
.is_valid_jwt(&token, None)
|
.is_valid_jwt(&token, None)
|
||||||
.await
|
.await
|
||||||
.expect("validate jwt");
|
.expect("Failed to validate jwt");
|
||||||
assert!(valid.is_some(), "Generated token should be valid");
|
assert!(valid.is_some(), "Generated token should be valid");
|
||||||
let claims = service.parse_jwt(&token).await.expect("parse jwt");
|
let claims = service
|
||||||
|
.parse_jwt(&token)
|
||||||
|
.await
|
||||||
|
.expect("Failed to parse jwt");
|
||||||
assert_eq!(claims.sub, user_id.to_string());
|
assert_eq!(claims.sub, user_id.to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,10 +216,16 @@ mod tests {
|
|||||||
let service = AuthenticationServiceImpl::new(Some("secret".to_string()));
|
let service = AuthenticationServiceImpl::new(Some("secret".to_string()));
|
||||||
|
|
||||||
let user_id = Uuid::new_v4();
|
let user_id = Uuid::new_v4();
|
||||||
let (token, _) = service.generate_jwt(user_id, 60).await.unwrap();
|
let (token, _) = service
|
||||||
|
.generate_jwt(user_id, 60)
|
||||||
|
.await
|
||||||
|
.expect("Failed to generate jwt");
|
||||||
|
|
||||||
let other_sub = Uuid::new_v4().to_string();
|
let other_sub = Uuid::new_v4().to_string();
|
||||||
let valid = service.is_valid_jwt(&token, Some(other_sub)).await.unwrap();
|
let valid = service
|
||||||
|
.is_valid_jwt(&token, Some(other_sub))
|
||||||
|
.await
|
||||||
|
.expect("jwt is not valid");
|
||||||
assert!(
|
assert!(
|
||||||
valid.is_none(),
|
valid.is_none(),
|
||||||
"Token should be invalid for a different subject"
|
"Token should be invalid for a different subject"
|
||||||
@@ -236,10 +245,19 @@ mod tests {
|
|||||||
let service = AuthenticationServiceImpl::new(Some("secret".to_string()));
|
let service = AuthenticationServiceImpl::new(Some("secret".to_string()));
|
||||||
|
|
||||||
let user_id = Uuid::new_v4();
|
let user_id = Uuid::new_v4();
|
||||||
let (token, _) = service.generate_jwt(user_id, 60).await.unwrap();
|
let (token, _) = service
|
||||||
let new_token = service.refresh_jwt(&token, 120).await.unwrap();
|
.generate_jwt(user_id, 60)
|
||||||
|
.await
|
||||||
|
.expect("Failed to generate jwt");
|
||||||
|
let new_token = service
|
||||||
|
.refresh_jwt(&token, 120)
|
||||||
|
.await
|
||||||
|
.expect("Failed to refresh jwt");
|
||||||
|
|
||||||
let claims = service.parse_jwt(&new_token).await.unwrap();
|
let claims = service
|
||||||
|
.parse_jwt(&new_token)
|
||||||
|
.await
|
||||||
|
.expect("Failed to parse refreshed jwt");
|
||||||
assert_eq!(claims.sub, user_id.to_string());
|
assert_eq!(claims.sub, user_id.to_string());
|
||||||
assert_eq!(claims.exp - claims.iat, 120);
|
assert_eq!(claims.exp - claims.iat, 120);
|
||||||
}
|
}
|
||||||
@@ -249,10 +267,16 @@ mod tests {
|
|||||||
let service = AuthenticationServiceImpl::new(Some("secret".to_string()));
|
let service = AuthenticationServiceImpl::new(Some("secret".to_string()));
|
||||||
|
|
||||||
let user_id = Uuid::new_v4();
|
let user_id = Uuid::new_v4();
|
||||||
let (token, claims) = service.generate_jwt(user_id, 1).await.unwrap();
|
let (token, claims) = service
|
||||||
|
.generate_jwt(user_id, 1)
|
||||||
|
.await
|
||||||
|
.expect("Failed to generate jwt");
|
||||||
sleep(Duration::from_secs(2)).await;
|
sleep(Duration::from_secs(2)).await;
|
||||||
|
|
||||||
let valid = service.is_valid_jwt(&token, None).await.unwrap();
|
let valid = service
|
||||||
|
.is_valid_jwt(&token, None)
|
||||||
|
.await
|
||||||
|
.expect("Failed to validate jwt");
|
||||||
assert!(
|
assert!(
|
||||||
valid.is_none(),
|
valid.is_none(),
|
||||||
"Token should be expired and thus invalid. Current time: {:?}. Diff: {}",
|
"Token should be expired and thus invalid. Current time: {:?}. Diff: {}",
|
||||||
@@ -266,9 +290,15 @@ mod tests {
|
|||||||
let service = AuthenticationServiceImpl::new(Some("secret".to_string()));
|
let service = AuthenticationServiceImpl::new(Some("secret".to_string()));
|
||||||
|
|
||||||
let user_id = Uuid::new_v4();
|
let user_id = Uuid::new_v4();
|
||||||
let (token, _) = service.generate_jwt(user_id, 1).await.unwrap();
|
let (token, _) = service
|
||||||
|
.generate_jwt(user_id, 1)
|
||||||
|
.await
|
||||||
|
.expect("Failed to generate jwt");
|
||||||
|
|
||||||
service.invalidate_jwt(&token).await.unwrap();
|
service
|
||||||
|
.invalidate_jwt(&token)
|
||||||
|
.await
|
||||||
|
.expect("Failed to invalidate jwt");
|
||||||
|
|
||||||
// ensure entry is present
|
// ensure entry is present
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ mod test {
|
|||||||
"CorrectPassword".as_bytes(),
|
"CorrectPassword".as_bytes(),
|
||||||
&SaltString::generate(&mut OsRng),
|
&SaltString::generate(&mut OsRng),
|
||||||
)
|
)
|
||||||
.unwrap()
|
.expect("Failed to hash password")
|
||||||
.to_string();
|
.to_string();
|
||||||
let db = MockDatabase::new(sea_orm::DatabaseBackend::Sqlite)
|
let db = MockDatabase::new(sea_orm::DatabaseBackend::Sqlite)
|
||||||
.append_query_results(vec![vec![user::Model {
|
.append_query_results(vec![vec![user::Model {
|
||||||
@@ -281,7 +281,7 @@ mod test {
|
|||||||
"CorrectPassword".as_bytes(),
|
"CorrectPassword".as_bytes(),
|
||||||
&SaltString::generate(&mut OsRng),
|
&SaltString::generate(&mut OsRng),
|
||||||
)
|
)
|
||||||
.unwrap()
|
.expect("Failed to hash password")
|
||||||
.to_string();
|
.to_string();
|
||||||
let db = MockDatabase::new(sea_orm::DatabaseBackend::Sqlite)
|
let db = MockDatabase::new(sea_orm::DatabaseBackend::Sqlite)
|
||||||
.append_query_results(vec![vec![user::Model {
|
.append_query_results(vec![vec![user::Model {
|
||||||
|
|||||||
Reference in New Issue
Block a user