From 627139d1e2d433e8b475c84ce5485939679ec7a4 Mon Sep 17 00:00:00 2001 From: filipriec Date: Mon, 24 Feb 2025 00:01:05 +0100 Subject: [PATCH] properly tested code --- server/src/adresar/handlers/put_adresar.rs | 63 +++++++++++++++----- server/src/adresar/mod.rs | 4 +- server/src/adresar/tests/put_adresar_test.rs | 24 +++++--- 3 files changed, 65 insertions(+), 26 deletions(-) diff --git a/server/src/adresar/handlers/put_adresar.rs b/server/src/adresar/handlers/put_adresar.rs index 96066b0..7ccd1f7 100644 --- a/server/src/adresar/handlers/put_adresar.rs +++ b/server/src/adresar/handlers/put_adresar.rs @@ -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 { + 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 { + // 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(), }) } - diff --git a/server/src/adresar/mod.rs b/server/src/adresar/mod.rs index 257983c..def9506 100644 --- a/server/src/adresar/mod.rs +++ b/server/src/adresar/mod.rs @@ -4,6 +4,4 @@ pub mod models; pub mod handlers; #[cfg(test)] -pub mod tests { - pub mod post_adresar_test; -} +pub mod tests; diff --git a/server/src/adresar/tests/put_adresar_test.rs b/server/src/adresar/tests/put_adresar_test.rs index e86dd2e..4bf9ea4 100644 --- a/server/src/adresar/tests/put_adresar_test.rs +++ b/server/src/adresar/tests/put_adresar_test.rs @@ -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]