properly tested code
This commit is contained in:
@@ -4,10 +4,42 @@ use sqlx::PgPool;
|
|||||||
use crate::adresar::models::Adresar;
|
use crate::adresar::models::Adresar;
|
||||||
use common::proto::multieko2::adresar::{PutAdresarRequest, AdresarResponse};
|
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(
|
pub async fn put_adresar(
|
||||||
db_pool: &PgPool,
|
db_pool: &PgPool,
|
||||||
request: PutAdresarRequest,
|
mut request: PutAdresarRequest,
|
||||||
) -> Result<AdresarResponse, Status> {
|
) -> 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!(
|
let adresar = sqlx::query_as!(
|
||||||
Adresar,
|
Adresar,
|
||||||
r#"
|
r#"
|
||||||
@@ -50,20 +82,20 @@ pub async fn put_adresar(
|
|||||||
"#,
|
"#,
|
||||||
request.id,
|
request.id,
|
||||||
request.firma,
|
request.firma,
|
||||||
request.kz,
|
kz,
|
||||||
request.drc,
|
drc,
|
||||||
request.ulica,
|
ulica,
|
||||||
request.psc,
|
psc,
|
||||||
request.mesto,
|
mesto,
|
||||||
request.stat,
|
stat,
|
||||||
request.banka,
|
banka,
|
||||||
request.ucet,
|
ucet,
|
||||||
request.skladm,
|
skladm,
|
||||||
request.ico,
|
ico,
|
||||||
request.kontakt,
|
kontakt,
|
||||||
request.telefon,
|
telefon,
|
||||||
request.skladu,
|
skladu,
|
||||||
request.fax
|
fax
|
||||||
)
|
)
|
||||||
.fetch_one(db_pool)
|
.fetch_one(db_pool)
|
||||||
.await
|
.await
|
||||||
@@ -88,4 +120,3 @@ pub async fn put_adresar(
|
|||||||
fax: adresar.fax.unwrap_or_default(),
|
fax: adresar.fax.unwrap_or_default(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,4 @@ pub mod models;
|
|||||||
pub mod handlers;
|
pub mod handlers;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub mod tests {
|
pub mod tests;
|
||||||
pub mod post_adresar_test;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -108,15 +108,20 @@ async fn test_update_whitespace_fields() {
|
|||||||
request.firma = " Updated Company ".into();
|
request.firma = " Updated Company ".into();
|
||||||
request.telefon = " +421987654321 ".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)
|
let db_record = sqlx::query!("SELECT firma, telefon FROM adresar WHERE id = $1", existing_id)
|
||||||
.fetch_one(&pool)
|
.fetch_one(&pool)
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
assert_eq!(db_record.firma, " Updated Company ");
|
assert_eq!(db_record.firma, "Updated Company"); // Trimmed
|
||||||
assert_eq!(db_record.telefon.unwrap(), " +421987654321 ");
|
assert_eq!(db_record.telefon.unwrap(), "+421987654321"); // Trimmed
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
@@ -127,7 +132,7 @@ async fn test_update_empty_required_field() {
|
|||||||
|
|
||||||
let result = put_adresar(&pool, request).await;
|
let result = put_adresar(&pool, request).await;
|
||||||
assert!(result.is_err());
|
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]
|
#[tokio::test]
|
||||||
@@ -162,15 +167,20 @@ async fn test_clear_optional_fields() {
|
|||||||
request.telefon = String::new();
|
request.telefon = String::new();
|
||||||
request.ulica = 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)
|
let db_record = sqlx::query!("SELECT telefon, ulica FROM adresar WHERE id = $1", existing_id)
|
||||||
.fetch_one(&pool)
|
.fetch_one(&pool)
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
assert_eq!(db_record.telefon.unwrap(), "");
|
assert!(db_record.telefon.is_none());
|
||||||
assert_eq!(db_record.ulica.unwrap(), "");
|
assert!(db_record.ulica.is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
|
|||||||
Reference in New Issue
Block a user