From beabe988ba83cee55091c748129292d01cd3cc34 Mon Sep 17 00:00:00 2001 From: Aleh Zasypkin Date: Sat, 25 Jan 2025 13:11:47 +0200 Subject: [PATCH] fix(tests): switch to `test-log` crate and use dedicated mock server paths for scheduler tests --- Cargo.lock | 66 ++++++++++++------- Cargo.toml | 2 +- .../scheduler_jobs/trackers_run_job.rs | 60 +++++++++-------- 3 files changed, 77 insertions(+), 51 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 62e212f..24dd86d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1707,6 +1707,27 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "env_filter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +dependencies = [ + "log", +] + +[[package]] +name = "env_logger" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "log", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -4043,6 +4064,7 @@ dependencies = [ "serde_with", "similar", "sqlx", + "test-log", "thiserror 2.0.11", "time", "tokio", @@ -4051,7 +4073,6 @@ dependencies = [ "tracing", "tracing-actix-web", "tracing-subscriber", - "tracing-test", "trust-dns-resolver", "url", "urlencoding", @@ -5082,6 +5103,28 @@ dependencies = [ "winapi", ] +[[package]] +name = "test-log" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f46083d221181166e5b6f6b1e5f1d499f3a76888826e6cb1d057554157cd0f" +dependencies = [ + "env_logger", + "test-log-macros", + "tracing-subscriber", +] + +[[package]] +name = "test-log-macros" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "888d0c3c6db53c0fdab160d2ed5e12ba745383d3e85813f2ea0f2b1475ab553f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -5462,27 +5505,6 @@ dependencies = [ "tracing-serde", ] -[[package]] -name = "tracing-test" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "557b891436fe0d5e0e363427fc7f217abf9ccd510d5136549847bdcbcd011d68" -dependencies = [ - "tracing-core", - "tracing-subscriber", - "tracing-test-macro", -] - -[[package]] -name = "tracing-test-macro" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" -dependencies = [ - "quote", - "syn 2.0.96", -] - [[package]] name = "trust-dns-proto" version = "0.23.2" diff --git a/Cargo.toml b/Cargo.toml index b9eae75..befad49 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,8 +70,8 @@ uuid = "1.12.1" [dev-dependencies] httpmock = "0.7.0" insta = "1.42.0" +test-log = "0.2.17" toml = "0.8.19" -tracing-test = "0.2.5" [features] default = [ diff --git a/src/scheduler/scheduler_jobs/trackers_run_job.rs b/src/scheduler/scheduler_jobs/trackers_run_job.rs index bdf1253..5fc6a35 100644 --- a/src/scheduler/scheduler_jobs/trackers_run_job.rs +++ b/src/scheduler/scheduler_jobs/trackers_run_job.rs @@ -429,8 +429,8 @@ mod tests { use serde_json::json; use sqlx::PgPool; use std::{ops::Add, sync::Arc, time::Duration}; + use test_log::test; use time::OffsetDateTime; - use tracing_test::traced_test; use uuid::uuid; #[sqlx::test] @@ -827,7 +827,7 @@ mod tests { Ok(()) } - #[sqlx::test] + #[test(sqlx::test)] async fn when_run_removes_job_if_does_not_reference_tracker( pool: PgPool, ) -> anyhow::Result<()> { @@ -854,7 +854,7 @@ mod tests { Ok(()) } - #[sqlx::test] + #[test(sqlx::test)] async fn when_run_removes_job_if_tracker_does_not_support_tracking( pool: PgPool, ) -> anyhow::Result<()> { @@ -892,7 +892,7 @@ mod tests { Ok(()) } - #[sqlx::test] + #[test(sqlx::test)] async fn when_run_removes_retry_job_if_tracker_does_not_support_retries( pool: PgPool, ) -> anyhow::Result<()> { @@ -938,7 +938,7 @@ mod tests { Ok(()) } - #[sqlx::test] + #[test(sqlx::test)] async fn when_run_removes_job_if_tracker_does_not_support_revisions( pool: PgPool, ) -> anyhow::Result<()> { @@ -984,7 +984,7 @@ mod tests { Ok(()) } - #[sqlx::test] + #[test(sqlx::test)] async fn when_run_removes_job_if_tracker_is_disabled(pool: PgPool) -> anyhow::Result<()> { let mut scheduler = mock_scheduler(&pool).await?; let api = Arc::new(mock_api(pool).await?); @@ -1024,7 +1024,7 @@ mod tests { Ok(()) } - #[sqlx::test] + #[test(sqlx::test)] async fn can_run(pool: PgPool) -> anyhow::Result<()> { let mut scheduler = mock_scheduler(&pool).await?; let api = Arc::new(mock_api(pool).await?); @@ -1034,10 +1034,10 @@ mod tests { let trackers = api.trackers(); let tracker = trackers .create_tracker( - TrackerCreateParamsBuilder::new("tracker") + TrackerCreateParamsBuilder::new("tracker-normal-job") .with_schedule("0 0 * * * *") .with_target(TrackerTarget::Api(ApiTarget { - requests: vec![TargetRequest::new(server.url("/api").parse()?)], + requests: vec![TargetRequest::new(server.url("/api-normal-job").parse()?)], configurator: None, extractor: None, })) @@ -1058,7 +1058,7 @@ mod tests { // Create server mock. let content = TrackerDataValue::new(json!("some-content")); let content_mock = server.mock(|when, then| { - when.method(httpmock::Method::GET).path("/api"); + when.method(httpmock::Method::GET).path("/api-normal-job"); then.status(200) .header("Content-Type", "application/json") .json_body_obj(content.value()) @@ -1125,16 +1125,16 @@ mod tests { Ok(()) } - #[sqlx::test] + #[test(sqlx::test)] async fn can_run_retry_job(pool: PgPool) -> anyhow::Result<()> { let mut scheduler = mock_scheduler(&pool).await?; let api = Arc::new(mock_api(pool).await?); let server = MockServer::start(); // Create tracker with retry strategy. - let mut create_params = TrackerCreateParamsBuilder::new("tracker") + let mut create_params = TrackerCreateParamsBuilder::new("tracker-retry-job") .with_target(TrackerTarget::Api(ApiTarget { - requests: vec![TargetRequest::new(server.url("/api").parse()?)], + requests: vec![TargetRequest::new(server.url("/api-retry-job").parse()?)], configurator: None, extractor: None, })) @@ -1169,7 +1169,7 @@ mod tests { // Create server mock. let content = TrackerDataValue::new(json!("some-content")); let content_mock = server.mock(|when, then| { - when.method(httpmock::Method::GET).path("/api"); + when.method(httpmock::Method::GET).path("/api-retry-job"); then.status(200) .header("Content-Type", "application/json") .json_body_obj(content.value()) @@ -1219,7 +1219,7 @@ mod tests { Ok(()) } - #[sqlx::test] + #[test(sqlx::test)] async fn resets_job_and_report_error_if_job_fails(pool: PgPool) -> anyhow::Result<()> { let mut config = mock_config()?; config.smtp = config.smtp.map(|config| SmtpConfig { @@ -1238,10 +1238,10 @@ mod tests { let trackers = api.trackers(); let tracker = trackers .create_tracker( - TrackerCreateParamsBuilder::new("tracker") + TrackerCreateParamsBuilder::new("tracker-failed-job") .with_schedule("0 0 * * * *") .with_target(TrackerTarget::Api(ApiTarget { - requests: vec![TargetRequest::new(server.url("/api").parse()?)], + requests: vec![TargetRequest::new(server.url("/api-failed-job").parse()?)], configurator: None, extractor: None, })) @@ -1261,10 +1261,10 @@ mod tests { // Create server mock. let content_mock = server.mock(|when, then| { - when.method(httpmock::Method::GET).path("/api"); + when.method(httpmock::Method::GET).path("/api-failed-job"); then.status(400) .header("Content-Type", "application/json") - .body("Uh oh!") + .body("Uh oh (failed-job)!") .delay(Duration::from_secs(2)); }); @@ -1337,7 +1337,9 @@ mod tests { content: EmailContent::Template(EmailTemplate::TrackerCheckResult { tracker_id: tracker.id, tracker_name: tracker.name, - result: Err("Failed to execute API target request (0): Uh oh!".to_string()) + result: Err( + "Failed to execute API target request (0): Uh oh (failed-job)!".to_string() + ) }) }) ); @@ -1345,7 +1347,7 @@ mod tests { Ok(()) } - #[sqlx::test] + #[test(sqlx::test)] async fn removes_job_and_report_error_if_last_retry_fails(pool: PgPool) -> anyhow::Result<()> { let mut config = mock_config()?; config.smtp = config.smtp.map(|config| SmtpConfig { @@ -1361,9 +1363,9 @@ mod tests { let server = MockServer::start(); // Create tracker with retry strategy. - let mut create_params = TrackerCreateParamsBuilder::new("tracker") + let mut create_params = TrackerCreateParamsBuilder::new("tracker-failed-retry") .with_target(TrackerTarget::Api(ApiTarget { - requests: vec![TargetRequest::new(server.url("/api").parse()?)], + requests: vec![TargetRequest::new(server.url("/api-failed-retry").parse()?)], configurator: None, extractor: None, })) @@ -1395,10 +1397,10 @@ mod tests { // Create server mock. let content_mock = server.mock(|when, then| { - when.method(httpmock::Method::GET).path("/api"); + when.method(httpmock::Method::GET).path("/api-failed-retry"); then.status(400) .header("Content-Type", "application/json") - .body("Uh oh!") + .body("Uh oh (failed retry)!") .delay(Duration::from_secs(2)); }); @@ -1460,7 +1462,10 @@ mod tests { content: EmailContent::Template(EmailTemplate::TrackerCheckResult { tracker_id: tracker.id, tracker_name: tracker.name, - result: Err("Failed to execute API target request (0): Uh oh!".to_string()) + result: Err( + "Failed to execute API target request (0): Uh oh (failed retry)!" + .to_string() + ) }) }) ); @@ -1468,8 +1473,7 @@ mod tests { Ok(()) } - #[sqlx::test] - #[traced_test] + #[test(sqlx::test)] async fn can_schedule_retries_if_request_fails(pool: PgPool) -> anyhow::Result<()> { let mut config = mock_config()?; config.smtp = config.smtp.map(|config| SmtpConfig {