diff --git a/server/src/adresar/tests/mod.rs b/server/src/adresar/tests/mod.rs index f8829c3..a6e60d6 100644 --- a/server/src/adresar/tests/mod.rs +++ b/server/src/adresar/tests/mod.rs @@ -1,3 +1,4 @@ // src/adresar/tests/mod.rs pub mod post_adresar_test; +pub mod put_adresar_test; diff --git a/server/src/adresar/tests/put_adresar_test.rs b/server/src/adresar/tests/put_adresar_test.rs new file mode 100644 index 0000000..e86dd2e --- /dev/null +++ b/server/src/adresar/tests/put_adresar_test.rs @@ -0,0 +1,210 @@ +// src/adresar/tests/put_adresar_test.rs +use super::super::handlers::put_adresar; +use common::proto::multieko2::adresar::{AdresarResponse, PutAdresarRequest}; +use sqlx::{postgres::PgPoolOptions, PgPool}; +use std::env; + +mod test_helpers { + use super::*; + + pub async fn setup_test_db() -> (PgPool, i64) { + dotenvy::from_filename(".env_test").ok(); + let pool = PgPoolOptions::new() + .max_connections(5) + .connect(&env::var("TEST_DATABASE_URL").unwrap()) + .await + .unwrap(); + + sqlx::migrate!() + .run(&pool) + .await + .expect("Migrations failed"); + + let record = sqlx::query!( + r#" + INSERT INTO adresar ( + firma, kz, drc, ulica, psc, mesto, stat, banka, ucet, + skladm, ico, kontakt, telefon, skladu, fax, deleted + ) + VALUES ( + 'Original Company', 'Original KZ', 'Original DRC', 'Original Street', + '12345', 'Original City', 'Original Country', 'Original Bank', + 'Original Account', 'Original SkladM', 'Original ICO', + 'Original Contact', '+421123456789', 'Original SkladU', 'Original Fax', + false + ) + RETURNING id + "# + ) + .fetch_one(&pool) + .await + .unwrap(); + + (pool, record.id) + } + + pub fn valid_put_request(id: i64) -> PutAdresarRequest { + PutAdresarRequest { + id, + firma: "Updated Company".into(), + kz: "Updated KZ".into(), + drc: "Updated DRC".into(), + ulica: "Updated Street".into(), + psc: "67890".into(), + mesto: "Updated City".into(), + stat: "Updated Country".into(), + banka: "Updated Bank".into(), + ucet: "987654321".into(), + skladm: "Updated SkladM".into(), + ico: "87654321".into(), + kontakt: "Jane Doe".into(), + telefon: "+421987654321".into(), + skladu: "Updated SkladU".into(), + fax: "+421987654300".into(), + } + } + + + pub async fn assert_response_matches(pool: &PgPool, id: i64, response: &AdresarResponse) { + let db_record = sqlx::query!("SELECT * FROM adresar WHERE id = $1", id) + .fetch_one(pool) + .await + .unwrap(); + + assert_eq!(db_record.firma, response.firma); + assert_eq!(db_record.kz.unwrap_or_default(), response.kz); + assert_eq!(db_record.drc.unwrap_or_default(), response.drc); + assert_eq!(db_record.ulica.unwrap_or_default(), response.ulica); + assert_eq!(db_record.psc.unwrap_or_default(), response.psc); + assert_eq!(db_record.mesto.unwrap_or_default(), response.mesto); + assert_eq!(db_record.stat.unwrap_or_default(), response.stat); + assert_eq!(db_record.banka.unwrap_or_default(), response.banka); + assert_eq!(db_record.ucet.unwrap_or_default(), response.ucet); + assert_eq!(db_record.skladm.unwrap_or_default(), response.skladm); + assert_eq!(db_record.ico.unwrap_or_default(), response.ico); + assert_eq!(db_record.kontakt.unwrap_or_default(), response.kontakt); + assert_eq!(db_record.telefon.unwrap_or_default(), response.telefon); + assert_eq!(db_record.skladu.unwrap_or_default(), response.skladu); + assert_eq!(db_record.fax.unwrap_or_default(), response.fax); + assert!(!db_record.deleted, "Record should not be deleted"); + } +} + +#[tokio::test] +async fn test_update_adresar_success() { + let (pool, existing_id) = test_helpers::setup_test_db().await; + let request = test_helpers::valid_put_request(existing_id); + + let response = put_adresar(&pool, request).await.unwrap(); + + assert_eq!(response.id, existing_id); + test_helpers::assert_response_matches(&pool, existing_id, &response).await; +} + +#[tokio::test] +async fn test_update_whitespace_fields() { + let (pool, existing_id) = test_helpers::setup_test_db().await; + let mut request = test_helpers::valid_put_request(existing_id); + request.firma = " Updated Company ".into(); + request.telefon = " +421987654321 ".into(); + + let _response = put_adresar(&pool, request).await.unwrap(); + + 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 "); +} + +#[tokio::test] +async fn test_update_empty_required_field() { + let (pool, existing_id) = test_helpers::setup_test_db().await; + let mut request = test_helpers::valid_put_request(existing_id); + request.firma = "".into(); + + let result = put_adresar(&pool, request).await; + assert!(result.is_err()); + assert_eq!(result.unwrap_err().code(), tonic::Code::Internal); +} + +#[tokio::test] +async fn test_update_nonexistent_id() { + let (pool, _) = test_helpers::setup_test_db().await; + let request = test_helpers::valid_put_request(9999); + + let result = put_adresar(&pool, request).await; + assert!(result.is_err()); + assert_eq!(result.unwrap_err().code(), tonic::Code::Internal); +} + +#[tokio::test] +async fn test_update_deleted_record() { + let (pool, existing_id) = test_helpers::setup_test_db().await; + sqlx::query!("UPDATE adresar SET deleted = true WHERE id = $1", existing_id) + .execute(&pool) + .await + .unwrap(); + + let request = test_helpers::valid_put_request(existing_id); + let result = put_adresar(&pool, request).await; + + assert!(result.is_err()); + assert_eq!(result.unwrap_err().code(), tonic::Code::Internal); +} + +#[tokio::test] +async fn test_clear_optional_fields() { + let (pool, existing_id) = test_helpers::setup_test_db().await; + let mut request = test_helpers::valid_put_request(existing_id); + request.telefon = String::new(); + request.ulica = String::new(); + + let _response = put_adresar(&pool, request).await.unwrap(); + + 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(), ""); +} + +#[tokio::test] +async fn test_max_length_fields() { + let (pool, existing_id) = test_helpers::setup_test_db().await; + let mut request = test_helpers::valid_put_request(existing_id); + request.firma = "a".repeat(255); + request.telefon = "1".repeat(20); + + let _response = put_adresar(&pool, request).await.unwrap(); + + 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.len(), 255); + assert_eq!(db_record.telefon.unwrap().len(), 20); +} + +#[tokio::test] +async fn test_special_characters() { + let (pool, existing_id) = test_helpers::setup_test_db().await; + let mut request = test_helpers::valid_put_request(existing_id); + request.ulica = "Náměstí 28. října".into(); + request.telefon = "+420 123-456.789".into(); + + let _response = put_adresar(&pool, request).await.unwrap(); + + let db_record = sqlx::query!("SELECT ulica, telefon FROM adresar WHERE id = $1", existing_id) + .fetch_one(&pool) + .await + .unwrap(); + + assert_eq!(db_record.ulica.unwrap(), "Náměstí 28. října"); + assert_eq!(db_record.telefon.unwrap(), "+420 123-456.789"); +}