From e1b75c240bd07983d59b72eee563d80e6cb4f42f Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 16:00:08 -0400 Subject: [PATCH 01/19] Moving file --- src/caller/{message.rs => message/mod.rs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/caller/{message.rs => message/mod.rs} (100%) diff --git a/src/caller/message.rs b/src/caller/message/mod.rs similarity index 100% rename from src/caller/message.rs rename to src/caller/message/mod.rs -- 2.47.3 From 83aae8e344d040ec5b27e47a453f37a2260ccb0b Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 16:02:07 -0400 Subject: [PATCH 02/19] Adding constant for endpoint --- src/caller/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/caller/mod.rs b/src/caller/mod.rs index 3a9e62a..3c9a585 100644 --- a/src/caller/mod.rs +++ b/src/caller/mod.rs @@ -14,6 +14,8 @@ pub mod endpoints { pub const ADD_MESSAGE: &str = "/api/v1/message/new"; /// Constant for getting messages endpoint pub const GET_MESSAGE: &str = "/api/v1/message"; + /// Constant for scheduling message endpoint + pub const SCHEDULE_MESSAGE: &str = "api/v1/schedule/message"; } pub mod response { -- 2.47.3 From 25705872f4cc7db5e45d2572dda6ee2bb1247029 Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 16:18:44 -0400 Subject: [PATCH 03/19] Making caller::message::scheduling module available --- src/caller/message/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/caller/message/mod.rs b/src/caller/message/mod.rs index 3e07c0a..3d28da6 100644 --- a/src/caller/message/mod.rs +++ b/src/caller/message/mod.rs @@ -1,3 +1,5 @@ +pub mod scheduling; + pub mod request { use serde::{Deserialize, Serialize}; use utoipa::ToSchema; -- 2.47.3 From 19d86d153f20525a6eb6fa6ab59bbc95477f37fa Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 16:30:31 -0400 Subject: [PATCH 04/19] bump: textsender_models --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 993ac87..446c6aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2321,7 +2321,7 @@ dependencies = [ [[package]] name = "textsender_models" version = "0.4.0" -source = "git+ssh://git@git.kundeng.us/phoenix/textsender_models.git?tag=v0.4.0#2722af5589023db819554a97c1f596d9e735fe96" +source = "git+ssh://git@git.kundeng.us/phoenix/textsender_models.git?tag=v0.4.0-29-7534e8652f-111#7534e8652f68eac3f346322f42c8ef6bb1e14328" dependencies = [ "const_format", "dotenvy", diff --git a/Cargo.toml b/Cargo.toml index 44b5dc4..6c8e8c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ jsonwebtoken = { version = "10.4.0", features = ["rust_crypto"] } josekit = { version = "0.10.3" } utoipa = { version = "5.5.0", features = ["axum_extras"] } utoipa-swagger-ui = { version = "9.0.2", features = ["axum"] } -textsender_models = { git = "ssh://git@git.kundeng.us/phoenix/textsender_models.git", tag = "v0.4.0" } +textsender_models = { git = "ssh://git@git.kundeng.us/phoenix/textsender_models.git", tag = "v0.4.0-29-7534e8652f-111" } [dev-dependencies] common-multipart-rfc7578 = { version = "0.7.0" } -- 2.47.3 From d046ddfa8157daaa7b9c9b0fcaca9301eb9d3783 Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 16:30:38 -0400 Subject: [PATCH 05/19] Saving changes --- src/caller/message/scheduling.rs | 78 ++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/caller/message/scheduling.rs diff --git a/src/caller/message/scheduling.rs b/src/caller/message/scheduling.rs new file mode 100644 index 0000000..52c4632 --- /dev/null +++ b/src/caller/message/scheduling.rs @@ -0,0 +1,78 @@ +pub mod request { + use serde::{Deserialize, Serialize}; + use utoipa::ToSchema; + + #[derive(Debug, Deserialize, Serialize, ToSchema)] + pub struct ScheduleMessageRequest { + #[serde(with = "time::serde::rfc3339::option")] + pub scheduled: Option, + pub status: String, + pub user_id: uuid::Uuid, + } + + impl ScheduleMessageRequest { + pub fn is_valid(&self) -> bool { + self.scheduled.is_some() || !self.status.is_empty() || !self.user_id.is_nil() + } + } +} + +pub mod response { + use serde::{Deserialize, Serialize}; + use utoipa::ToSchema; + + #[derive(Debug, Default, Deserialize, Serialize, ToSchema)] + pub struct ScheduleMessageResponse { + pub message: String, + pub data: Vec + } +} + +pub mod endpoint { + use crate::repo::message as message_repo; + + /// Endpoint to create a Scheudled Message + #[utoipa::path( + post, + path = crate::caller::endpoints::SCHEDULE_MESSAGE, + request_body( + content = super::request::ScheduleMessageRequest, + description = "Data needed to create a Scheduled Message", + content_type = "application/json" + ), + responses( + (status = 201, description = "Scheduled Message created", body = super::response::ScheduleMessageResponse), + (status = 400, description = "Error", body = super::response::ScheduleMessageResponse), + (status = 500, description = "Error creating Scheduled Message", body = super::response::ScheduleMessageResponse) + ) +)] + pub async fn schedule_message( + axum::Extension(pool): axum::Extension, + axum::Json(payload): axum::Json, + ) -> ( + axum::http::StatusCode, + axum::Json, + ) { + let mut response = super::response::ScheduleMessageResponse::default(); + + if payload.is_valid() { + if payload.status != textsender_models::message::scheduling::PENDING { + response.message = String::from("scheduled message must be pending"); + (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) + } else { + if can_schedule(&payload.scheduled) { + } else { + response.message = String::from("Cannot schedule message"); + (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) + } + } + } else { + response.message = String::from("Request body is not valid"); + (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) + } + } + + fn can_schedule(scheduled_time: &Option) -> bool { + false + } +} -- 2.47.3 From 7045a6200cfd7072e43cec69cd77f97d5ff38974 Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 16:56:43 -0400 Subject: [PATCH 06/19] Adding repo::scheduling module --- src/repo/mod.rs | 1 + src/repo/scheduling.rs | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 src/repo/scheduling.rs diff --git a/src/repo/mod.rs b/src/repo/mod.rs index 2af9758..d185221 100644 --- a/src/repo/mod.rs +++ b/src/repo/mod.rs @@ -1,2 +1,3 @@ pub mod contact; pub mod message; +pub mod scheduling; diff --git a/src/repo/scheduling.rs b/src/repo/scheduling.rs new file mode 100644 index 0000000..9f87472 --- /dev/null +++ b/src/repo/scheduling.rs @@ -0,0 +1,28 @@ +use sqlx::Row; + +pub async fn insert( + pool: &sqlx::PgPool, + scheduled_message: &textsender_models::message::scheduling::ScheduledMessage, + user_id: &uuid::Uuid, +) -> Result<(uuid::Uuid, time::OffsetDateTime), sqlx::Error> { + match sqlx::query( + r#" + INSERT INTO "scheduled_messages" (scheduled, status, user_id) + VALUES($1, $2, $3) RETURNING id, created; + "#, + ) + .bind(scheduled_message.scheduled) + .bind(&scheduled_message.status) + .bind(user_id) + .fetch_one(pool) + .await + { + Ok(row) => { + let id: uuid::Uuid = row.try_get("id")?; + let created: time::OffsetDateTime = row.try_get("created")?; + Ok((id, created)) + } + Err(_) => Err(sqlx::Error::RowNotFound), + } +} + -- 2.47.3 From 77d6d10d05a3638c5be2abc14ae96912c6ffeb9a Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 16:56:54 -0400 Subject: [PATCH 07/19] bump: textsender_models --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 446c6aa..9814f13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2320,8 +2320,8 @@ dependencies = [ [[package]] name = "textsender_models" -version = "0.4.0" -source = "git+ssh://git@git.kundeng.us/phoenix/textsender_models.git?tag=v0.4.0-29-7534e8652f-111#7534e8652f68eac3f346322f42c8ef6bb1e14328" +version = "0.4.1" +source = "git+ssh://git@git.kundeng.us/phoenix/textsender_models.git?tag=v0.4.1-29-ad632fca16-111#ad632fca168ec817e61dd364716f8030c9cfb0b3" dependencies = [ "const_format", "dotenvy", diff --git a/Cargo.toml b/Cargo.toml index 6c8e8c3..b2323a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ jsonwebtoken = { version = "10.4.0", features = ["rust_crypto"] } josekit = { version = "0.10.3" } utoipa = { version = "5.5.0", features = ["axum_extras"] } utoipa-swagger-ui = { version = "9.0.2", features = ["axum"] } -textsender_models = { git = "ssh://git@git.kundeng.us/phoenix/textsender_models.git", tag = "v0.4.0-29-7534e8652f-111" } +textsender_models = { git = "ssh://git@git.kundeng.us/phoenix/textsender_models.git", tag = "v0.4.1-29-ad632fca16-111" } [dev-dependencies] common-multipart-rfc7578 = { version = "0.7.0" } -- 2.47.3 From 3c3f4d5ac80483bac66d37713537c308add6d600 Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 16:57:08 -0400 Subject: [PATCH 08/19] Adding scheduled_messages table --- migrations/20260613211440_init.sql | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/migrations/20260613211440_init.sql b/migrations/20260613211440_init.sql index caf9db4..48d8e47 100644 --- a/migrations/20260613211440_init.sql +++ b/migrations/20260613211440_init.sql @@ -16,3 +16,11 @@ CREATE TABLE IF NOT EXISTS "messages" ( content TEXT NOT NULL, user_id UUID NOT NULL ); + +CREATE TABLE IF NOT EXISTS "scheduled_messages" ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + scheduled timestamptz NOT NULL, + created timestamptz DEFAULT now(), + status TEXT CHECK (status IN ('PENDING', 'READY', 'PROCESSING', 'DONE')), + user_id UUID NOT NULL +); -- 2.47.3 From 5daee39a4e2875c1bd0c38924233f9081bd83120 Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 16:57:35 -0400 Subject: [PATCH 09/19] Adding code to schedule message --- src/caller/message/scheduling.rs | 25 +++++++++++++++++++++---- src/config/mod.rs | 17 +++++++++++++++-- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/caller/message/scheduling.rs b/src/caller/message/scheduling.rs index 52c4632..b35f626 100644 --- a/src/caller/message/scheduling.rs +++ b/src/caller/message/scheduling.rs @@ -29,7 +29,7 @@ pub mod response { } pub mod endpoint { - use crate::repo::message as message_repo; + use crate::repo::scheduling as scheduling_repo; /// Endpoint to create a Scheudled Message #[utoipa::path( @@ -57,10 +57,27 @@ pub mod endpoint { if payload.is_valid() { if payload.status != textsender_models::message::scheduling::PENDING { - response.message = String::from("scheduled message must be pending"); - (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) + response.message = String::from("scheduled message must be pending"); + (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) } else { if can_schedule(&payload.scheduled) { + let mut scheduled_message = textsender_models::message::scheduling::ScheduledMessage { + user_id: payload.user_id, + ..Default::default() + }; + match scheduling_repo::insert(&pool, &scheduled_message, &payload.user_id).await { + Ok((id, created)) => { + scheduled_message.id = id; + scheduled_message.created = Some(created); + response.message = String::from("Message scheduled"); + (axum::http::StatusCode::CREATED, axum::Json(response)) + } + Err(err) => { + eprintln!("Error: {err:?}"); + response.message = String::from("Error inserting"); + (axum::http::StatusCode::INTERNAL_SERVER_ERROR, axum::Json(response)) + } + } } else { response.message = String::from("Cannot schedule message"); (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) @@ -73,6 +90,6 @@ pub mod endpoint { } fn can_schedule(scheduled_time: &Option) -> bool { - false + scheduled_time.is_some_and(|t| t - time::OffsetDateTime::now_utc() >= time::Duration::minutes(10)) } } diff --git a/src/config/mod.rs b/src/config/mod.rs index 111e1b0..8b627ed 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -16,10 +16,14 @@ pub mod init { use crate::caller::contact as contact_caller; use crate::caller::message as message_caller; + use crate::caller::message::scheduling as scheduling_caller; + use contact_caller::endpoint as contact_endpoints; use contact_caller::response as contact_responses; use message_caller::endpoint as message_endpoints; use message_caller::response as message_responses; + use scheduling_caller::response as scheduling_responses; + use scheduling_caller::endpoint as scheduling_endpoints; mod cors { pub async fn configure_cors() -> tower_http::cors::CorsLayer { @@ -77,8 +81,11 @@ pub mod init { #[derive(utoipa::OpenApi)] #[openapi( paths(contact_endpoints::create_contact, - message_endpoints::create_message), - components(schemas(contact_responses::AddContactResponse, message_responses::AddMessageResponse)), + message_endpoints::create_message, + scheduling_endpoints::schedule_message, + ), + components(schemas(contact_responses::AddContactResponse, message_responses::AddMessageResponse, + scheduling_responses::ScheduleMessageResponse)), tags( (name = "textsender API", description = "Web API to manage texting") ) @@ -117,6 +124,12 @@ pub mod init { crate::auth::auth::, )), ) + .route( + crate::caller::endpoints::SCHEDULE_MESSAGE, + get(scheduling_endpoints::schedule_message).route_layer(axum::middleware::from_fn( + crate::auth::auth::, + )), + ) .layer(cors::configure_cors().await) } -- 2.47.3 From 20bd0f9e4df633298fb284ab851f5a95e3bd81a2 Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 17:07:25 -0400 Subject: [PATCH 10/19] Got it working --- src/caller/message/scheduling.rs | 5 ++++- src/caller/mod.rs | 2 +- src/config/mod.rs | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/caller/message/scheduling.rs b/src/caller/message/scheduling.rs index b35f626..67c1b89 100644 --- a/src/caller/message/scheduling.rs +++ b/src/caller/message/scheduling.rs @@ -62,14 +62,17 @@ pub mod endpoint { } else { if can_schedule(&payload.scheduled) { let mut scheduled_message = textsender_models::message::scheduling::ScheduledMessage { - user_id: payload.user_id, + scheduled: payload.scheduled, + status: payload.status, ..Default::default() }; match scheduling_repo::insert(&pool, &scheduled_message, &payload.user_id).await { Ok((id, created)) => { scheduled_message.id = id; scheduled_message.created = Some(created); + scheduled_message.user_id = payload.user_id; response.message = String::from("Message scheduled"); + response.data.push(scheduled_message); (axum::http::StatusCode::CREATED, axum::Json(response)) } Err(err) => { diff --git a/src/caller/mod.rs b/src/caller/mod.rs index 3c9a585..d436f86 100644 --- a/src/caller/mod.rs +++ b/src/caller/mod.rs @@ -15,7 +15,7 @@ pub mod endpoints { /// Constant for getting messages endpoint pub const GET_MESSAGE: &str = "/api/v1/message"; /// Constant for scheduling message endpoint - pub const SCHEDULE_MESSAGE: &str = "api/v1/schedule/message"; + pub const SCHEDULE_MESSAGE: &str = "/api/v1/schedule/message"; } pub mod response { diff --git a/src/config/mod.rs b/src/config/mod.rs index 8b627ed..08c7dd9 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -126,7 +126,7 @@ pub mod init { ) .route( crate::caller::endpoints::SCHEDULE_MESSAGE, - get(scheduling_endpoints::schedule_message).route_layer(axum::middleware::from_fn( + post(scheduling_endpoints::schedule_message).route_layer(axum::middleware::from_fn( crate::auth::auth::, )), ) -- 2.47.3 From a78078bddd435bf07b98ed2908899d0dc83b3394 Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 17:08:21 -0400 Subject: [PATCH 11/19] Code cleanup --- src/caller/message/scheduling.rs | 24 +++++++++++++++--------- src/config/mod.rs | 8 ++++---- src/repo/scheduling.rs | 1 - 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/caller/message/scheduling.rs b/src/caller/message/scheduling.rs index 67c1b89..de9f85e 100644 --- a/src/caller/message/scheduling.rs +++ b/src/caller/message/scheduling.rs @@ -24,7 +24,7 @@ pub mod response { #[derive(Debug, Default, Deserialize, Serialize, ToSchema)] pub struct ScheduleMessageResponse { pub message: String, - pub data: Vec + pub data: Vec, } } @@ -61,12 +61,14 @@ pub mod endpoint { (axum::http::StatusCode::BAD_REQUEST, axum::Json(response)) } else { if can_schedule(&payload.scheduled) { - let mut scheduled_message = textsender_models::message::scheduling::ScheduledMessage { - scheduled: payload.scheduled, - status: payload.status, - ..Default::default() - }; - match scheduling_repo::insert(&pool, &scheduled_message, &payload.user_id).await { + let mut scheduled_message = + textsender_models::message::scheduling::ScheduledMessage { + scheduled: payload.scheduled, + status: payload.status, + ..Default::default() + }; + match scheduling_repo::insert(&pool, &scheduled_message, &payload.user_id).await + { Ok((id, created)) => { scheduled_message.id = id; scheduled_message.created = Some(created); @@ -78,7 +80,10 @@ pub mod endpoint { Err(err) => { eprintln!("Error: {err:?}"); response.message = String::from("Error inserting"); - (axum::http::StatusCode::INTERNAL_SERVER_ERROR, axum::Json(response)) + ( + axum::http::StatusCode::INTERNAL_SERVER_ERROR, + axum::Json(response), + ) } } } else { @@ -93,6 +98,7 @@ pub mod endpoint { } fn can_schedule(scheduled_time: &Option) -> bool { - scheduled_time.is_some_and(|t| t - time::OffsetDateTime::now_utc() >= time::Duration::minutes(10)) + scheduled_time + .is_some_and(|t| t - time::OffsetDateTime::now_utc() >= time::Duration::minutes(10)) } } diff --git a/src/config/mod.rs b/src/config/mod.rs index 08c7dd9..7199ff2 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -22,8 +22,8 @@ pub mod init { use contact_caller::response as contact_responses; use message_caller::endpoint as message_endpoints; use message_caller::response as message_responses; - use scheduling_caller::response as scheduling_responses; use scheduling_caller::endpoint as scheduling_endpoints; + use scheduling_caller::response as scheduling_responses; mod cors { pub async fn configure_cors() -> tower_http::cors::CorsLayer { @@ -126,9 +126,9 @@ pub mod init { ) .route( crate::caller::endpoints::SCHEDULE_MESSAGE, - post(scheduling_endpoints::schedule_message).route_layer(axum::middleware::from_fn( - crate::auth::auth::, - )), + post(scheduling_endpoints::schedule_message).route_layer( + axum::middleware::from_fn(crate::auth::auth::), + ), ) .layer(cors::configure_cors().await) } diff --git a/src/repo/scheduling.rs b/src/repo/scheduling.rs index 9f87472..b03e93c 100644 --- a/src/repo/scheduling.rs +++ b/src/repo/scheduling.rs @@ -25,4 +25,3 @@ pub async fn insert( Err(_) => Err(sqlx::Error::RowNotFound), } } - -- 2.47.3 From aff351915c2d7f9b1f59d88d40fff635a9beb027 Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 17:16:56 -0400 Subject: [PATCH 12/19] Fixing tests --- tests/test.rs | 66 ++++++++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/tests/test.rs b/tests/test.rs index 6bb0b09..5683360 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -43,6 +43,29 @@ mod db_mgr { } } + pub async fn get_database_ready() -> ( + sqlx::Pool, + String, + sqlx::Pool, + ) { + let tm_pool = get_pool().await.unwrap(); + let db_name = generate_db_name().await; + + match create_database(&tm_pool, &db_name).await { + Ok(_) => { + println!("Success"); + } + Err(err) => { + assert!(false, "Error: {:?}", err); + } + } + + let pool = connect_to_db(&db_name).await.unwrap(); + migrations(&pool).await; + // db::migrations(&pool).await; + (tm_pool, db_name, pool) + } + // Function to drop a database pub async fn drop_database( template_pool: &sqlx::PgPool, @@ -73,16 +96,9 @@ mod db_mgr { } } - /* pub async fn migrations(pool: &sqlx::PgPool) { - // Run migrations using the sqlx::migrate! macro - // Assumes your test migrations are in a ./test_migrations folder relative to Cargo.toml - sqlx::migrate!("./migrations") - .run(pool) - .await - .expect("Failed to run migrations"); + super::db::migrations(pool).await; } - */ } mod init { @@ -519,21 +535,7 @@ async fn test_update_contact_names() { #[tokio::test] async fn test_create_message() { - let tm_pool = db_mgr::get_pool().await.unwrap(); - let db_name = db_mgr::generate_db_name().await; - - match db_mgr::create_database(&tm_pool, &db_name).await { - Ok(_) => { - println!("Success"); - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - } - - let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); - db::migrations(&pool).await; - + let (tm_pool, db_name, pool) = db_mgr::get_database_ready().await; let app = init::app(pool).await; // Send request @@ -560,20 +562,7 @@ async fn test_create_message() { #[tokio::test] async fn test_get_message() { - let tm_pool = db_mgr::get_pool().await.unwrap(); - let db_name = db_mgr::generate_db_name().await; - - match db_mgr::create_database(&tm_pool, &db_name).await { - Ok(_) => { - println!("Success"); - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - } - - let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); - db::migrations(&pool).await; + let (tm_pool, db_name, pool) = db_mgr::get_database_ready().await; let app = init::app(pool).await; let mut message_result: Option = None; @@ -617,3 +606,6 @@ async fn test_get_message() { let _ = db_mgr::drop_database(&tm_pool, &db_name).await; } + +#[tokio::test] +async fn test_schedule_message() {} -- 2.47.3 From cf051c8aa712fd949e714bdc87213b33fa926d8f Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 17:19:54 -0400 Subject: [PATCH 13/19] Test refactor --- tests/test.rs | 49 +++---------------------------------------------- 1 file changed, 3 insertions(+), 46 deletions(-) diff --git a/tests/test.rs b/tests/test.rs index 5683360..eb80177 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -353,21 +353,7 @@ mod request { #[tokio::test] async fn test_create_contact() { - let tm_pool = db_mgr::get_pool().await.unwrap(); - let db_name = db_mgr::generate_db_name().await; - - match db_mgr::create_database(&tm_pool, &db_name).await { - Ok(_) => { - println!("Success"); - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - } - - let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); - db::migrations(&pool).await; - + let (tm_pool, db_name, pool) = db_mgr::get_database_ready().await; let app = init::app(pool).await; // Send request @@ -389,21 +375,7 @@ async fn test_create_contact() { #[tokio::test] async fn test_get_contact() { - let tm_pool = db_mgr::get_pool().await.unwrap(); - let db_name = db_mgr::generate_db_name().await; - - match db_mgr::create_database(&tm_pool, &db_name).await { - Ok(_) => { - println!("Success"); - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - } - - let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); - db::migrations(&pool).await; - + let (tm_pool, db_name, pool) = db_mgr::get_database_ready().await; let app = init::app(pool).await; // Send request @@ -444,21 +416,7 @@ async fn test_get_contact() { #[tokio::test] async fn test_update_contact_names() { - let tm_pool = db_mgr::get_pool().await.unwrap(); - let db_name = db_mgr::generate_db_name().await; - - match db_mgr::create_database(&tm_pool, &db_name).await { - Ok(_) => { - println!("Success"); - } - Err(err) => { - assert!(false, "Error: {:?}", err); - } - } - - let pool = db_mgr::connect_to_db(&db_name).await.unwrap(); - db::migrations(&pool).await; - + let (tm_pool, db_name, pool) = db_mgr::get_database_ready().await; let app = init::app(pool).await; let mut opt_contact: Option = None; @@ -563,7 +521,6 @@ async fn test_create_message() { #[tokio::test] async fn test_get_message() { let (tm_pool, db_name, pool) = db_mgr::get_database_ready().await; - let app = init::app(pool).await; let mut message_result: Option = None; -- 2.47.3 From a3443c0fa3a8460bdebed77cb45c00f423760a1e Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 17:33:06 -0400 Subject: [PATCH 14/19] bump: textsender_models --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9814f13..3989e6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2293,7 +2293,7 @@ dependencies = [ [[package]] name = "textsender_api" -version = "0.1.9" +version = "0.1.10" dependencies = [ "axum", "axum-extra", diff --git a/Cargo.toml b/Cargo.toml index b2323a3..c5beac2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "textsender_api" -version = "0.1.9" +version = "0.1.10" edition = "2024" rust-version = "1.96" -- 2.47.3 From fe1ce848e1113ebc3cc5db04c506ac65d4bfba39 Mon Sep 17 00:00:00 2001 From: phoenix Date: Wed, 17 Jun 2026 17:33:15 -0400 Subject: [PATCH 15/19] Added code to test --- tests/test.rs | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/tests/test.rs b/tests/test.rs index eb80177..0c20028 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -317,6 +317,46 @@ mod request { Err(err) => Err(err), } } + + pub mod scheduling { + use tower::ServiceExt; + + pub async fn create_scheduled_message( + app: &axum::Router, + ) -> Result { + /* + let twenty_minutes_from_now = time::OffsetDateTime::now_utc().checked_add_signed( + time::Duration::