diff --git a/Cargo.lock b/Cargo.lock index 65bb825..530bdcf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -241,6 +241,12 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "auto-future" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c1e7e457ea78e524f48639f551fd79703ac3f2237f5ecccdf4708f8a75ad373" + [[package]] name = "autocfg" version = "1.4.0" @@ -699,13 +705,47 @@ dependencies = [ "tracing", ] +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core 0.4.5", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.6.0", + "hyper-util", + "itoa", + "matchit 0.7.3", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "axum" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" dependencies = [ - "axum-core", + "axum-core 0.5.2", "bytes", "form_urlencoded", "futures-util", @@ -715,7 +755,7 @@ dependencies = [ "hyper 1.6.0", "hyper-util", "itoa", - "matchit", + "matchit 0.8.4", "memchr", "mime", "multer", @@ -734,6 +774,27 @@ dependencies = [ "tracing", ] +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper 1.0.2", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "axum-core" version = "0.5.2" @@ -754,6 +815,34 @@ dependencies = [ "tracing", ] +[[package]] +name = "axum-test" +version = "15.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac63648e380fd001402a02ec804e7686f9c4751f8cad85b7de0b53dae483a128" +dependencies = [ + "anyhow", + "auto-future", + "axum 0.7.9", + "bytes", + "cookie", + "http 1.3.1", + "http-body-util", + "hyper 1.6.0", + "hyper-util", + "mime", + "pretty_assertions", + "reserve-port", + "rust-multipart-rfc7578_2", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "tokio", + "tower", + "url", +] + [[package]] name = "backtrace" version = "0.3.75" @@ -1187,6 +1276,16 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1426,6 +1525,12 @@ dependencies = [ "syn 2.0.103", ] +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + [[package]] name = "digest" version = "0.10.7" @@ -1570,7 +1675,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2694,7 +2799,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.53.2", ] [[package]] @@ -2821,6 +2926,12 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "matchit" version = "0.8.4" @@ -3501,6 +3612,16 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + [[package]] name = "prettyplease" version = "0.2.34" @@ -3748,7 +3869,8 @@ dependencies = [ "aws-credential-types", "aws-sdk-s3", "aws-types", - "axum", + "axum 0.8.4", + "axum-test", "base64ct", "bcrypt", "chrono", @@ -3966,6 +4088,15 @@ dependencies = [ "web-sys", ] +[[package]] +name = "reserve-port" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21918d6644020c6f6ef1993242989bf6d4952d2e025617744f184c02df51c356" +dependencies = [ + "thiserror 2.0.12", +] + [[package]] name = "rfc6979" version = "0.3.1" @@ -4051,6 +4182,22 @@ dependencies = [ "walkdir", ] +[[package]] +name = "rust-multipart-rfc7578_2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b748410c0afdef2ebbe3685a6a862e2ee937127cdaae623336a459451c8d57" +dependencies = [ + "bytes", + "futures-core", + "futures-util", + "http 0.2.12", + "mime", + "mime_guess", + "rand 0.8.5", + "thiserror 1.0.69", +] + [[package]] name = "rustc-demangle" version = "0.1.25" @@ -4082,7 +4229,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.4.15", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4095,7 +4242,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.9.4", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4969,7 +5116,7 @@ dependencies = [ "getrandom 0.3.3", "once_cell", "rustix 1.0.7", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5552,7 +5699,7 @@ version = "9.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d047458f1b5b65237c2f6dc6db136945667f40a7668627b3490b9513a3d43a55" dependencies = [ - "axum", + "axum 0.8.4", "base64 0.22.1", "mime_guess", "regex", @@ -5822,7 +5969,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -6248,6 +6395,12 @@ version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "yoke" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index 4e4994e..a8d1cff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,6 +70,7 @@ tempfile = "3" wiremock = "0.6" tokio-test = "0.4" futures = "0.3" +axum-test = "15" # Database testing dependencies testcontainers = "0.24" testcontainers-modules = { version = "0.12", features = ["postgres"] } diff --git a/src/test_utils.rs b/src/test_utils.rs index daa0768..535ee2a 100644 --- a/src/test_utils.rs +++ b/src/test_utils.rs @@ -304,9 +304,24 @@ impl TestConfigBuilder { } } +/// Create test app with provided AppState +#[cfg(any(test, feature = "test-utils"))] +pub fn create_test_app(state: Arc) -> Router { + Router::new() + .nest("/api/auth", crate::routes::auth::router()) + .nest("/api/documents", crate::routes::documents::router()) + .nest("/api/search", crate::routes::search::router()) + .nest("/api/settings", crate::routes::settings::router()) + .nest("/api/users", crate::routes::users::router()) + .nest("/api/ignored-files", crate::routes::ignored_files::ignored_files_routes()) + .nest("/api/ocr", crate::routes::ocr::router()) + .nest("/api/queue", crate::routes::queue::router()) + .with_state(state) +} + /// Legacy function for backward compatibility - will be deprecated #[cfg(any(test, feature = "test-utils"))] -pub async fn create_test_app() -> (Router, ContainerAsync) { +pub async fn create_test_app_with_container() -> (Router, ContainerAsync) { let ctx = TestContext::new().await; (ctx.app, ctx.container) } diff --git a/tests/integration_ocr_language_endpoints.rs b/tests/integration_ocr_language_endpoints.rs index da746cc..a58718b 100644 --- a/tests/integration_ocr_language_endpoints.rs +++ b/tests/integration_ocr_language_endpoints.rs @@ -1,4 +1,4 @@ -use readur::app::AppState; +use readur::AppState; use readur::config::Config; use readur::db::Database; use readur::ocr::health::OcrHealthChecker; @@ -74,15 +74,25 @@ impl TestHarness { .await .expect("Failed to create user settings"); + // Create a shared OCR queue service + let queue_service = Arc::new(readur::ocr::queue::OcrQueueService::new( + db.clone(), + db.get_pool().clone(), + 2 + )); + // Create app state let app_state = Arc::new(AppState { db, config, - ocr_health_checker: OcrHealthChecker::new(tessdata_path), + webdav_scheduler: None, + source_scheduler: None, + queue_service, + oidc_client: None, }); - // Create test server - let app = readur::app::create_app(app_state); + // Create test server with router + let app = readur::test_utils::create_test_app(app_state.clone()); let server = TestServer::new(app).expect("Failed to create test server"); // Generate a test token (simplified for testing)