properly tested code

This commit is contained in:
filipriec
2025-02-24 00:01:05 +01:00
parent f466d34395
commit 627139d1e2
3 changed files with 65 additions and 26 deletions

View File

@@ -4,10 +4,42 @@ use sqlx::PgPool;
use crate::adresar::models::Adresar;
use common::proto::multieko2::adresar::{PutAdresarRequest, AdresarResponse};
// Add the same sanitize_input helper as in POST handler
fn sanitize_input(input: &str) -> Option<String> {
let trimmed = input.trim().to_string();
if trimmed.is_empty() {
None
} else {
Some(trimmed)
}
}
pub async fn put_adresar(
db_pool: &PgPool,
request: PutAdresarRequest,
mut request: PutAdresarRequest,
) -> Result<AdresarResponse, Status> {
// Add validation for required fields like in POST
request.firma = request.firma.trim().to_string();
if request.firma.is_empty() {
return Err(Status::invalid_argument("Firma je povinne pole"));
}
// Sanitize optional fields like in POST
let kz = sanitize_input(&request.kz);
let drc = sanitize_input(&request.drc);
let ulica = sanitize_input(&request.ulica);
let psc = sanitize_input(&request.psc);
let mesto = sanitize_input(&request.mesto);
let stat = sanitize_input(&request.stat);
let banka = sanitize_input(&request.banka);
let ucet = sanitize_input(&request.ucet);
let skladm = sanitize_input(&request.skladm);
let ico = sanitize_input(&request.ico);
let kontakt = sanitize_input(&request.kontakt);
let telefon = sanitize_input(&request.telefon);
let skladu = sanitize_input(&request.skladu);
let fax = sanitize_input(&request.fax);
let adresar = sqlx::query_as!(
Adresar,
r#"
@@ -50,20 +82,20 @@ pub async fn put_adresar(
"#,
request.id,
request.firma,
request.kz,
request.drc,
request.ulica,
request.psc,
request.mesto,
request.stat,
request.banka,
request.ucet,
request.skladm,
request.ico,
request.kontakt,
request.telefon,
request.skladu,
request.fax
kz,
drc,
ulica,
psc,
mesto,
stat,
banka,
ucet,
skladm,
ico,
kontakt,
telefon,
skladu,
fax
)
.fetch_one(db_pool)
.await
@@ -88,4 +120,3 @@ pub async fn put_adresar(
fax: adresar.fax.unwrap_or_default(),
})
}

View File

@@ -4,6 +4,4 @@ pub mod models;
pub mod handlers;
#[cfg(test)]
pub mod tests {
pub mod post_adresar_test;
}
pub mod tests;

View File

@@ -108,15 +108,20 @@ async fn test_update_whitespace_fields() {
request.firma = " Updated Company ".into();
request.telefon = " +421987654321 ".into();
let _response = put_adresar(&pool, request).await.unwrap();
let response = put_adresar(&pool, request).await.unwrap();
// Verify trimmed values in response
assert_eq!(response.firma, "Updated Company");
assert_eq!(response.telefon, "+421987654321");
// Verify raw values in database
let db_record = sqlx::query!("SELECT firma, telefon FROM adresar WHERE id = $1", existing_id)
.fetch_one(&pool)
.await
.unwrap();
assert_eq!(db_record.firma, " Updated Company ");
assert_eq!(db_record.telefon.unwrap(), " +421987654321 ");
assert_eq!(db_record.firma, "Updated Company"); // Trimmed
assert_eq!(db_record.telefon.unwrap(), "+421987654321"); // Trimmed
}
#[tokio::test]
@@ -127,7 +132,7 @@ async fn test_update_empty_required_field() {
let result = put_adresar(&pool, request).await;
assert!(result.is_err());
assert_eq!(result.unwrap_err().code(), tonic::Code::Internal);
assert_eq!(result.unwrap_err().code(), tonic::Code::InvalidArgument); // Changed from Internal
}
#[tokio::test]
@@ -162,15 +167,20 @@ async fn test_clear_optional_fields() {
request.telefon = String::new();
request.ulica = String::new();
let _response = put_adresar(&pool, request).await.unwrap();
let response = put_adresar(&pool, request).await.unwrap();
// Check response contains empty strings
assert!(response.telefon.is_empty());
assert!(response.ulica.is_empty());
// Check database contains NULL
let db_record = sqlx::query!("SELECT telefon, ulica FROM adresar WHERE id = $1", existing_id)
.fetch_one(&pool)
.await
.unwrap();
assert_eq!(db_record.telefon.unwrap(), "");
assert_eq!(db_record.ulica.unwrap(), "");
assert!(db_record.telefon.is_none());
assert!(db_record.ulica.is_none());
}
#[tokio::test]