From 93920d2eeaaacb29ae5749314bf44cd565b89bd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Dobrzy=C5=84ski?= Date: Fri, 6 Feb 2026 23:22:48 +0100 Subject: [PATCH 1/9] [54] create the first integration test --- Cargo.toml | 1 + src/main.rs | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 88b4dbc..bbf55d2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,3 +29,4 @@ argon2 = "0.5.3" chrono = { version = "0.4.39", features = ["serde"] } rand = "0.8.5" sha2 = "0.10.8" +reqwest = "0.13.2" diff --git a/src/main.rs b/src/main.rs index ed40f43..6ac365f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -45,3 +45,39 @@ async fn main() { } }; } + +#[cfg(test)] +mod integration_tests { + use super::*; + use reqwest::{Client, StatusCode}; + use std::future::IntoFuture; + + #[tokio::test] + async fn test_teapot() { + setup::read_environmental_variables(); + setup::check_secret_env_var(); + + let state = setup::create_app_state().await; + database::perform_migrations(&state.connection_pool).await; + guarantee_infrastructure_admin_exists(&state.connection_pool).await; + + let app = Router::new() + .merge(routes::routes()) + .with_state(state) + .layer(setup::configure_cors()) + .layer(CookieManagerLayer::new()); + + let addr = setup::get_socket_addr(); + let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); + let server = axum::serve(listener, app).into_future(); + tokio::spawn(server); + + let client = Client::new(); + let res = client + .get("http://localhost:2023/brew-coffee") + .send() + .await + .unwrap(); + assert_eq!(res.status(), StatusCode::IM_A_TEAPOT); + } +} From bc83126dacbe16daf84ae511f5f6c569c4f0cc3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Dobrzy=C5=84ski?= Date: Sat, 7 Feb 2026 13:46:17 +0100 Subject: [PATCH 2/9] [54] refactor the teapot test + Cargo.lock throwback --- Cargo.lock | 856 ++++++++++++++++++++++++++++++++++++------- src/main.rs | 37 +- src/routes/teapot.rs | 30 ++ src/test/mod.rs | 30 ++ 4 files changed, 783 insertions(+), 170 deletions(-) create mode 100644 src/test/mod.rs diff --git a/Cargo.lock b/Cargo.lock index c8e8363..1c72e17 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,15 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" -dependencies = [ - "gimli", -] - [[package]] name = "adler2" version = "2.0.0" @@ -100,12 +91,40 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "aws-lc-rs" +version = "1.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7b6141e96a8c160799cc2d5adecd5cbbe5054cb8c7c4af53da0f83bb7ad256" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c34dda4df7017c8db52132f0f8a2e0f8161649d15723ed63fc00c82d0f2081a" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + [[package]] name = "axum" version = "0.7.9" @@ -133,7 +152,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper", "tokio", "tower", "tower-layer", @@ -156,7 +175,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.1", + "sync_wrapper", "tower-layer", "tower-service", "tracing", @@ -173,21 +192,6 @@ dependencies = [ "syn 2.0.87", ] -[[package]] -name = "backtrace" -version = "0.3.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-targets 0.52.6", -] - [[package]] name = "base64" version = "0.22.1" @@ -247,13 +251,22 @@ checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "cc" -version = "1.2.16" +version = "1.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cfg-if" version = "1.0.0" @@ -281,6 +294,25 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "cmake" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +dependencies = [ + "cc", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -307,6 +339,26 @@ dependencies = [ "version_check", ] +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -431,6 +483,12 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "either" version = "1.13.0" @@ -440,6 +498,15 @@ dependencies = [ "serde", ] +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -484,6 +551,12 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + [[package]] name = "flate2" version = "1.0.34" @@ -520,6 +593,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futures-channel" version = "0.3.31" @@ -621,15 +700,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasip2", + "wasm-bindgen", ] [[package]] -name = "gimli" -version = "0.31.1" +name = "h2" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] [[package]] name = "hashbrown" @@ -749,19 +857,22 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.5.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", + "h2", "http", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -787,21 +898,27 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ + "base64", "bytes", "futures-channel", "futures-util", "http", "http-body", "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry 0.6.1", ] [[package]] @@ -983,18 +1100,61 @@ version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +[[package]] +name = "iri-string" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "itoa" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -1058,6 +1218,12 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "matchit" version = "0.7.3" @@ -1139,7 +1305,7 @@ version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -1154,7 +1320,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand", + "rand 0.8.5", "smallvec", "zeroize", ] @@ -1216,21 +1382,18 @@ dependencies = [ "syn 2.0.87", ] -[[package]] -name = "object" -version = "0.36.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + [[package]] name = "parking" version = "2.2.1" @@ -1267,7 +1430,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" dependencies = [ "base64ct", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1390,37 +1553,44 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", "rustc-hash", "rustls", - "socket2", - "thiserror 1.0.69", + "socket2 0.6.2", + "thiserror 2.0.9", "tokio", "tracing", + "web-time", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ + "aws-lc-rs", "bytes", - "rand", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", "ring", "rustc-hash", "rustls", + "rustls-pki-types", "slab", - "thiserror 1.0.69", + "thiserror 2.0.9", "tinyvec", "tracing", + "web-time", ] [[package]] @@ -1432,7 +1602,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.5.7", "tracing", "windows-sys 0.59.0", ] @@ -1446,6 +1616,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "rand" version = "0.8.5" @@ -1453,8 +1629,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", ] [[package]] @@ -1464,7 +1650,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", ] [[package]] @@ -1473,7 +1669,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", ] [[package]] @@ -1545,7 +1750,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper", "tokio", "tokio-rustls", "tower-service", @@ -1554,7 +1759,45 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "webpki-roots", - "windows-registry", + "windows-registry 0.2.0", +] + +[[package]] +name = "reqwest" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "mime", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "rustls-platform-verifier", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http 0.6.8", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] @@ -1565,7 +1808,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", "untrusted", "windows-sys 0.52.0", @@ -1584,7 +1827,7 @@ dependencies = [ "num-traits", "pkcs1", "pkcs8", - "rand_core", + "rand_core 0.6.4", "signature", "spki", "subtle", @@ -1625,12 +1868,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - [[package]] name = "rustc-hash" version = "2.0.0" @@ -1652,10 +1889,11 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.20" +version = "0.23.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" dependencies = [ + "aws-lc-rs", "once_cell", "ring", "rustls-pki-types", @@ -1664,6 +1902,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -1675,16 +1925,48 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -1711,18 +1993,51 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "serde" -version = "1.0.215" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -1737,11 +2052,20 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", @@ -1835,7 +2159,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -1866,6 +2190,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + [[package]] name = "spin" version = "0.9.8" @@ -2018,7 +2352,7 @@ dependencies = [ "memchr", "once_cell", "percent-encoding", - "rand", + "rand 0.8.5", "rsa", "serde", "sha1", @@ -2059,7 +2393,7 @@ dependencies = [ "md-5", "memchr", "once_cell", - "rand", + "rand 0.8.5", "serde", "serde_json", "sha2", @@ -2163,12 +2497,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "sync_wrapper" version = "1.0.1" @@ -2189,6 +2517,27 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "system-configuration" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" +dependencies = [ + "bitflags", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "tau" version = "0.0.1" @@ -2198,7 +2547,8 @@ dependencies = [ "base64", "chrono", "dotenvy", - "rand", + "rand 0.8.5", + "reqwest 0.13.2", "serde", "serde-inline-default", "serde_json", @@ -2208,7 +2558,7 @@ dependencies = [ "thiserror 2.0.9", "tokio", "tower-cookies", - "tower-http", + "tower-http 0.5.2", "tracing", "tracing-subscriber", "url", @@ -2338,27 +2688,26 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.1" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "492a604e2fd7f814268a378409e6c92b5525d747d10db9a229723f55a417958c" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ - "backtrace", "bytes", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.6.2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", @@ -2387,6 +2736,19 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-util" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml_datetime" version = "0.6.8" @@ -2406,14 +2768,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", "pin-project-lite", - "sync_wrapper 0.1.2", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -2453,6 +2815,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -2639,7 +3019,7 @@ dependencies = [ "axum", "mime_guess", "regex", - "reqwest", + "reqwest 0.12.9", "rust-embed", "serde", "serde_json", @@ -2654,7 +3034,7 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ - "getrandom", + "getrandom 0.2.15", "serde", ] @@ -2701,6 +3081,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasite" version = "0.1.0" @@ -2709,27 +3098,14 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.87", "wasm-bindgen-shared", ] @@ -2747,9 +3123,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2757,22 +3133,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn 2.0.87", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" @@ -2784,6 +3163,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "webpki-roots" version = "0.26.6" @@ -2821,17 +3219,34 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-registry" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ - "windows-result", - "windows-strings", + "windows-result 0.2.0", + "windows-strings 0.1.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + [[package]] name = "windows-result" version = "0.2.0" @@ -2841,16 +3256,43 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-strings" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-result", + "windows-result 0.2.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -2878,6 +3320,39 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -2902,13 +3377,36 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -2921,6 +3419,18 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -2933,6 +3443,18 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -2945,12 +3467,30 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -2963,6 +3503,18 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -2975,6 +3527,18 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -2987,6 +3551,18 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -2999,6 +3575,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + [[package]] name = "winnow" version = "0.6.20" @@ -3008,6 +3590,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" + [[package]] name = "write16" version = "1.0.0" diff --git a/src/main.rs b/src/main.rs index 6ac365f..b9b390e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ mod database; mod omni_error; mod routes; mod setup; +mod test; mod tournament; mod users; @@ -45,39 +46,3 @@ async fn main() { } }; } - -#[cfg(test)] -mod integration_tests { - use super::*; - use reqwest::{Client, StatusCode}; - use std::future::IntoFuture; - - #[tokio::test] - async fn test_teapot() { - setup::read_environmental_variables(); - setup::check_secret_env_var(); - - let state = setup::create_app_state().await; - database::perform_migrations(&state.connection_pool).await; - guarantee_infrastructure_admin_exists(&state.connection_pool).await; - - let app = Router::new() - .merge(routes::routes()) - .with_state(state) - .layer(setup::configure_cors()) - .layer(CookieManagerLayer::new()); - - let addr = setup::get_socket_addr(); - let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); - let server = axum::serve(listener, app).into_future(); - tokio::spawn(server); - - let client = Client::new(); - let res = client - .get("http://localhost:2023/brew-coffee") - .send() - .await - .unwrap(); - assert_eq!(res.status(), StatusCode::IM_A_TEAPOT); - } -} diff --git a/src/routes/teapot.rs b/src/routes/teapot.rs index 3b5cd12..d4fb300 100644 --- a/src/routes/teapot.rs +++ b/src/routes/teapot.rs @@ -13,3 +13,33 @@ pub fn route() -> Router { fn im_a_teapot() -> (StatusCode, &'static str) { (StatusCode::IM_A_TEAPOT, IM_A_TEAPOT_RESPONSE) } + +#[cfg(test)] +mod tests { + use std::future::IntoFuture; + + use reqwest::{Client, StatusCode}; + + use crate::{setup::get_socket_addr, test}; + + #[tokio::test] + async fn test_teapot() { + // GIVEN + let socket_address = get_socket_addr().to_string(); + let app = test::create_app().await; + let listener = test::create_listener().await; + let server = axum::serve(listener, app).into_future(); + tokio::spawn(server); + + // WHEN + let client = Client::new(); + let res = client + .get(format!("http://{}/brew-coffee", socket_address)) + .send() + .await + .unwrap(); + + // THEN + assert_eq!(res.status(), StatusCode::IM_A_TEAPOT); + } +} diff --git a/src/test/mod.rs b/src/test/mod.rs new file mode 100644 index 0000000..b9775ff --- /dev/null +++ b/src/test/mod.rs @@ -0,0 +1,30 @@ +use axum::{routing::IntoMakeService, Router}; +use tokio::net::TcpListener; +use tower_cookies::CookieManagerLayer; + +use crate::{ + database, routes, + setup::{self, AppState}, + users::infradmin::guarantee_infrastructure_admin_exists, +}; + +pub async fn create_app() -> IntoMakeService { + setup::read_environmental_variables(); + setup::check_secret_env_var(); + + let state = setup::create_app_state().await; + database::perform_migrations(&state.connection_pool).await; + guarantee_infrastructure_admin_exists(&state.connection_pool).await; + + Router::new() + .merge(routes::routes()) + .with_state(state) + .layer(setup::configure_cors()) + .layer(CookieManagerLayer::new()) + .into_make_service() +} + +pub async fn create_listener() -> TcpListener { + let addr = setup::get_socket_addr(); + TcpListener::bind(addr).await.unwrap() +} From 440665670e3504d175d2878df335828554e3c567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Dobrzy=C5=84ski?= Date: Sat, 7 Feb 2026 14:20:38 +0100 Subject: [PATCH 3/9] [54] extract integration tests from the crate --- src/lib.rs | 6 ++++++ src/main.rs | 7 +++---- src/routes/teapot.rs | 30 ------------------------------ {src/test => tests}/mod.rs | 28 ++++++++++++++++++++++++++-- 4 files changed, 35 insertions(+), 36 deletions(-) create mode 100644 src/lib.rs rename {src/test => tests}/mod.rs (57%) diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..206a576 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,6 @@ +pub mod database; +mod omni_error; +pub mod routes; +pub mod setup; +mod tournament; +pub mod users; diff --git a/src/main.rs b/src/main.rs index b9b390e..a9e3f7e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,11 +4,10 @@ use tower_cookies::CookieManagerLayer; use tracing::error; use users::infradmin::guarantee_infrastructure_admin_exists; -mod database; +use tau::database; +use tau::setup; mod omni_error; -mod routes; -mod setup; -mod test; +use tau::routes; mod tournament; mod users; diff --git a/src/routes/teapot.rs b/src/routes/teapot.rs index d4fb300..3b5cd12 100644 --- a/src/routes/teapot.rs +++ b/src/routes/teapot.rs @@ -13,33 +13,3 @@ pub fn route() -> Router { fn im_a_teapot() -> (StatusCode, &'static str) { (StatusCode::IM_A_TEAPOT, IM_A_TEAPOT_RESPONSE) } - -#[cfg(test)] -mod tests { - use std::future::IntoFuture; - - use reqwest::{Client, StatusCode}; - - use crate::{setup::get_socket_addr, test}; - - #[tokio::test] - async fn test_teapot() { - // GIVEN - let socket_address = get_socket_addr().to_string(); - let app = test::create_app().await; - let listener = test::create_listener().await; - let server = axum::serve(listener, app).into_future(); - tokio::spawn(server); - - // WHEN - let client = Client::new(); - let res = client - .get(format!("http://{}/brew-coffee", socket_address)) - .send() - .await - .unwrap(); - - // THEN - assert_eq!(res.status(), StatusCode::IM_A_TEAPOT); - } -} diff --git a/src/test/mod.rs b/tests/mod.rs similarity index 57% rename from src/test/mod.rs rename to tests/mod.rs index b9775ff..9709397 100644 --- a/src/test/mod.rs +++ b/tests/mod.rs @@ -1,10 +1,13 @@ +use std::future::IntoFuture; + use axum::{routing::IntoMakeService, Router}; +use reqwest::{Client, StatusCode}; use tokio::net::TcpListener; use tower_cookies::CookieManagerLayer; -use crate::{ +use tau::{ database, routes, - setup::{self, AppState}, + setup::{self, get_socket_addr}, users::infradmin::guarantee_infrastructure_admin_exists, }; @@ -28,3 +31,24 @@ pub async fn create_listener() -> TcpListener { let addr = setup::get_socket_addr(); TcpListener::bind(addr).await.unwrap() } + +#[tokio::test] +async fn test_teapot() { + // GIVEN + let socket_address = get_socket_addr().to_string(); + let app = create_app().await; + let listener = create_listener().await; + let server = axum::serve(listener, app).into_future(); + tokio::spawn(server); + + // WHEN + let client = Client::new(); + let res = client + .get(format!("http://{}/brew-coffee", socket_address)) + .send() + .await + .unwrap(); + + // THEN + assert_eq!(res.status(), StatusCode::IM_A_TEAPOT); +} From 6f44abb7d8cd19579c042cfbbeaf1abddf926c0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Dobrzy=C5=84ski?= Date: Sat, 7 Feb 2026 16:53:44 +0100 Subject: [PATCH 4/9] [54] clear database on test start and refactor --- .github/workflows/rust.yml | 4 +-- src/database.rs | 23 ++++++++++++++-- tests/common/mod.rs | 36 +++++++++++++++++++++++++ tests/mod.rs | 54 -------------------------------------- tests/teapot_tests.rs | 33 +++++++++++++++++++++++ 5 files changed, 92 insertions(+), 58 deletions(-) create mode 100644 tests/common/mod.rs delete mode 100644 tests/mod.rs create mode 100644 tests/teapot_tests.rs diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 2e4910d..07b5d55 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -17,6 +17,6 @@ jobs: steps: - uses: actions/checkout@v4 - name: Build - run: cargo build --verbose + run: cargo build --lib --verbose - name: Run tests - run: cargo test --verbose + run: cargo test --lib --verbose diff --git a/src/database.rs b/src/database.rs index 49f4b21..f4afe79 100644 --- a/src/database.rs +++ b/src/database.rs @@ -1,6 +1,6 @@ -use sqlx::{migrate, postgres::PgConnectOptions, Pool, Postgres}; +use sqlx::{migrate, postgres::PgConnectOptions, query, Pool, Postgres}; use std::{env, str::FromStr}; -use tracing::{error, info}; +use tracing::{error, info, span::Record}; pub async fn get_connection_pool() -> Pool { info!("Attempting to connect to a database..."); @@ -35,3 +35,22 @@ pub async fn perform_migrations(pool: &Pool) { } } } + +pub async fn clear_database(pool: &Pool) { + let result = query!( + "SELECT table_name +FROM information_schema.tables +WHERE table_schema = 'public'; +" + ) + .fetch_all(pool) + .await + .unwrap(); + for table in result { + let table_name = table.table_name.unwrap(); + let drop = format!("DROP TABLE IF EXISTS {} CASCADE", table_name); + if query(&drop).execute(pool).await.is_err() { + panic!("Failed to drop table {}", table_name) + } + } +} diff --git a/tests/common/mod.rs b/tests/common/mod.rs new file mode 100644 index 0000000..1be17d9 --- /dev/null +++ b/tests/common/mod.rs @@ -0,0 +1,36 @@ +use std::future::IntoFuture; + +use axum::{routing::IntoMakeService, Router}; +use reqwest::{Client, StatusCode}; +use sqlx::{Pool, Postgres}; +use tokio::net::TcpListener; +use tower_cookies::CookieManagerLayer; + +use tau::{ + database, routes, + setup::{self, get_socket_addr, AppState}, + users::infradmin::guarantee_infrastructure_admin_exists, +}; + +pub async fn prepare_empty_database(pool: &Pool) { + database::clear_database(pool).await; + database::perform_migrations(pool).await; + guarantee_infrastructure_admin_exists(pool).await; +} + +pub async fn create_app(state: AppState) -> IntoMakeService { + setup::read_environmental_variables(); + setup::check_secret_env_var(); + + Router::new() + .merge(routes::routes()) + .with_state(state) + .layer(setup::configure_cors()) + .layer(CookieManagerLayer::new()) + .into_make_service() +} + +pub async fn create_listener() -> TcpListener { + let addr = setup::get_socket_addr(); + TcpListener::bind(addr).await.unwrap() +} diff --git a/tests/mod.rs b/tests/mod.rs deleted file mode 100644 index 9709397..0000000 --- a/tests/mod.rs +++ /dev/null @@ -1,54 +0,0 @@ -use std::future::IntoFuture; - -use axum::{routing::IntoMakeService, Router}; -use reqwest::{Client, StatusCode}; -use tokio::net::TcpListener; -use tower_cookies::CookieManagerLayer; - -use tau::{ - database, routes, - setup::{self, get_socket_addr}, - users::infradmin::guarantee_infrastructure_admin_exists, -}; - -pub async fn create_app() -> IntoMakeService { - setup::read_environmental_variables(); - setup::check_secret_env_var(); - - let state = setup::create_app_state().await; - database::perform_migrations(&state.connection_pool).await; - guarantee_infrastructure_admin_exists(&state.connection_pool).await; - - Router::new() - .merge(routes::routes()) - .with_state(state) - .layer(setup::configure_cors()) - .layer(CookieManagerLayer::new()) - .into_make_service() -} - -pub async fn create_listener() -> TcpListener { - let addr = setup::get_socket_addr(); - TcpListener::bind(addr).await.unwrap() -} - -#[tokio::test] -async fn test_teapot() { - // GIVEN - let socket_address = get_socket_addr().to_string(); - let app = create_app().await; - let listener = create_listener().await; - let server = axum::serve(listener, app).into_future(); - tokio::spawn(server); - - // WHEN - let client = Client::new(); - let res = client - .get(format!("http://{}/brew-coffee", socket_address)) - .send() - .await - .unwrap(); - - // THEN - assert_eq!(res.status(), StatusCode::IM_A_TEAPOT); -} diff --git a/tests/teapot_tests.rs b/tests/teapot_tests.rs new file mode 100644 index 0000000..8c0fafb --- /dev/null +++ b/tests/teapot_tests.rs @@ -0,0 +1,33 @@ +use std::future::IntoFuture; + +use reqwest::{Client, StatusCode}; +use tau::setup::{self, get_socket_addr}; + +use crate::common::{create_app, create_listener, prepare_empty_database}; + +mod common; + +#[tokio::test] +async fn test_teapot() { + // GIVEN + setup::read_environmental_variables(); + setup::check_secret_env_var(); + let socket_address = get_socket_addr().to_string(); + let state = setup::create_app_state().await; + prepare_empty_database(&state.connection_pool).await; + let app = create_app(state).await; + let listener = create_listener().await; + let server = axum::serve(listener, app).into_future(); + tokio::spawn(server); + + // WHEN + let client = Client::new(); + let res = client + .get(format!("http://{}/brew-coffee", socket_address)) + .send() + .await + .unwrap(); + + // THEN + assert_eq!(res.status(), StatusCode::IM_A_TEAPOT); +} From b61e4ce053fbac2c66080bc9afefeffb8facb526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Dobrzy=C5=84ski?= Date: Sat, 7 Feb 2026 17:26:52 +0100 Subject: [PATCH 5/9] [54] test infrastructure admin login scenario --- CONTRIBUTING.md | 0 Cargo.toml | 2 +- tests/auth_tests.rs | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 CONTRIBUTING.md create mode 100644 tests/auth_tests.rs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e69de29 diff --git a/Cargo.toml b/Cargo.toml index bbf55d2..937eb7a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,4 +29,4 @@ argon2 = "0.5.3" chrono = { version = "0.4.39", features = ["serde"] } rand = "0.8.5" sha2 = "0.10.8" -reqwest = "0.13.2" +reqwest = { version = "0.13.2", features = ["json"] } diff --git a/tests/auth_tests.rs b/tests/auth_tests.rs new file mode 100644 index 0000000..a8885d1 --- /dev/null +++ b/tests/auth_tests.rs @@ -0,0 +1,36 @@ +use reqwest::{Client, StatusCode}; +use std::{collections::HashMap, future::IntoFuture}; +use tau::setup::{self, get_socket_addr}; + +use crate::common::{create_app, create_listener, prepare_empty_database}; +mod common; + +#[tokio::test] +async fn login_as_infraadmin_should_work_out_of_the_box() { + // GIVEN + setup::read_environmental_variables(); + setup::check_secret_env_var(); + let socket_address = get_socket_addr().to_string(); + let state = setup::create_app_state().await; + prepare_empty_database(&state.connection_pool).await; + let app = create_app(state).await; + let listener = create_listener().await; + let server = axum::serve(listener, app).into_future(); + tokio::spawn(server); + + let mut request_body = HashMap::new(); + request_body.insert("login", "admin"); + request_body.insert("password", "admin"); + + // WHEN + let client = Client::new(); + let res = client + .post(format!("http://{}/auth/login", socket_address)) + .json(&request_body) + .header("accept", "text/plain") + .header("Content-Type", "application/json") + .send() + .await; + // THEN + assert_eq!(res.unwrap().status(), StatusCode::OK); +} From e5a8f42929d07a766bfb7b57b54680a300562c8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Dobrzy=C5=84ski?= Date: Sat, 7 Feb 2026 21:15:52 +0100 Subject: [PATCH 6/9] [54] ensue multiple tests run in serial, create test utils structure --- Cargo.lock | 44 +++++++++++++++ Cargo.toml | 1 + src/lib.rs | 2 +- src/tournament/mod.rs | 1 - tests/auth_tests.rs | 31 +++++------ tests/common/auth_utils.rs | 39 ++++++++++++++ tests/common/mod.rs | 7 ++- tests/common/tournament_utils.rs | 26 +++++++++ tests/tournament_tests.rs | 91 ++++++++++++++++++++++++++++++++ 9 files changed, 218 insertions(+), 24 deletions(-) create mode 100644 tests/common/auth_utils.rs create mode 100644 tests/common/tournament_utils.rs create mode 100644 tests/tournament_tests.rs diff --git a/Cargo.lock b/Cargo.lock index 1c72e17..d459ef1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1788,6 +1788,8 @@ dependencies = [ "rustls", "rustls-pki-types", "rustls-platform-verifier", + "serde", + "serde_json", "sync_wrapper", "tokio", "tokio-rustls", @@ -1993,6 +1995,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "scc" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" +dependencies = [ + "sdd", +] + [[package]] name = "schannel" version = "0.1.28" @@ -2008,6 +2019,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sdd" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" + [[package]] name = "security-framework" version = "3.5.1" @@ -2106,6 +2123,32 @@ dependencies = [ "serde", ] +[[package]] +name = "serial_test" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d0b343e184fc3b7bb44dff0705fffcf4b3756ba6aff420dddd8b24ca145e555" +dependencies = [ + "futures-executor", + "futures-util", + "log", + "once_cell", + "parking_lot", + "scc", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f50427f258fb77356e4cd4aa0e87e2bd2c66dbcee41dc405282cae2bfc26c83" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "sha1" version = "0.10.6" @@ -2552,6 +2595,7 @@ dependencies = [ "serde", "serde-inline-default", "serde_json", + "serial_test", "sha2", "sqlx", "strum", diff --git a/Cargo.toml b/Cargo.toml index 937eb7a..ded499a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,3 +30,4 @@ chrono = { version = "0.4.39", features = ["serde"] } rand = "0.8.5" sha2 = "0.10.8" reqwest = { version = "0.13.2", features = ["json"] } +serial_test = "3.3.1" diff --git a/src/lib.rs b/src/lib.rs index 206a576..8ab3b09 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,5 @@ pub mod database; -mod omni_error; +pub mod omni_error; pub mod routes; pub mod setup; mod tournament; diff --git a/src/tournament/mod.rs b/src/tournament/mod.rs index 7fb62ed..1425c6c 100644 --- a/src/tournament/mod.rs +++ b/src/tournament/mod.rs @@ -8,7 +8,6 @@ use utoipa::ToSchema; use uuid::Uuid; use crate::omni_error::OmniError; -use crate::users; pub(crate) mod attendee; pub(crate) mod debate; diff --git a/tests/auth_tests.rs b/tests/auth_tests.rs index a8885d1..f3f585a 100644 --- a/tests/auth_tests.rs +++ b/tests/auth_tests.rs @@ -1,16 +1,20 @@ -use reqwest::{Client, StatusCode}; -use std::{collections::HashMap, future::IntoFuture}; -use tau::setup::{self, get_socket_addr}; +use reqwest::StatusCode; +use serial_test::serial; +use std::future::IntoFuture; +use tau::setup::{self}; -use crate::common::{create_app, create_listener, prepare_empty_database}; +use crate::common::{ + auth_utils::login_with_credentials, create_app, create_listener, + prepare_empty_database, +}; mod common; #[tokio::test] +#[serial] async fn login_as_infraadmin_should_work_out_of_the_box() { // GIVEN setup::read_environmental_variables(); setup::check_secret_env_var(); - let socket_address = get_socket_addr().to_string(); let state = setup::create_app_state().await; prepare_empty_database(&state.connection_pool).await; let app = create_app(state).await; @@ -18,19 +22,10 @@ async fn login_as_infraadmin_should_work_out_of_the_box() { let server = axum::serve(listener, app).into_future(); tokio::spawn(server); - let mut request_body = HashMap::new(); - request_body.insert("login", "admin"); - request_body.insert("password", "admin"); - // WHEN - let client = Client::new(); - let res = client - .post(format!("http://{}/auth/login", socket_address)) - .json(&request_body) - .header("accept", "text/plain") - .header("Content-Type", "application/json") - .send() - .await; + let res = login_with_credentials("admin", "admin").await; + // THEN - assert_eq!(res.unwrap().status(), StatusCode::OK); + assert_eq!(res.status(), StatusCode::OK); + assert_eq!(res.text().await.is_ok(), true); } diff --git a/tests/common/auth_utils.rs b/tests/common/auth_utils.rs new file mode 100644 index 0000000..145d72f --- /dev/null +++ b/tests/common/auth_utils.rs @@ -0,0 +1,39 @@ +use std::collections::HashMap; + +use reqwest::{Client, Response, StatusCode}; +use tau::{omni_error::OmniError, setup::get_socket_addr}; + +pub async fn get_session_token_for_infrastructure_admin() -> Result { + get_session_token_for("admin", "admin").await +} + +pub async fn get_session_token_for( + handle: &str, + password: &str, +) -> Result { + let response = login_with_credentials(handle, password).await; + match response.status() { + StatusCode::OK => Ok(response.text().await.unwrap()), + _ => Err(OmniError::ExplicitError { + status: response.status(), + message: response.text().await.unwrap(), + }), + } +} + +pub async fn login_with_credentials(handle: &str, password: &str) -> Response { + let mut request_body = HashMap::new(); + request_body.insert("login", handle); + request_body.insert("password", password); + let socket_address = get_socket_addr().to_string(); + + let client = Client::new(); + client + .post(format!("http://{}/auth/login", socket_address)) + .json(&request_body) + .header("accept", "text/plain") + .header("Content-Type", "application/json") + .send() + .await + .unwrap() +} diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 1be17d9..25ab074 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -1,14 +1,13 @@ -use std::future::IntoFuture; - use axum::{routing::IntoMakeService, Router}; -use reqwest::{Client, StatusCode}; use sqlx::{Pool, Postgres}; use tokio::net::TcpListener; use tower_cookies::CookieManagerLayer; +pub mod auth_utils; +pub mod tournament_utils; use tau::{ database, routes, - setup::{self, get_socket_addr, AppState}, + setup::{self, AppState}, users::infradmin::guarantee_infrastructure_admin_exists, }; diff --git a/tests/common/tournament_utils.rs b/tests/common/tournament_utils.rs new file mode 100644 index 0000000..3fe484a --- /dev/null +++ b/tests/common/tournament_utils.rs @@ -0,0 +1,26 @@ +use std::collections::HashMap; + +use reqwest::{Client, Response}; +use tau::setup::get_socket_addr; + +pub async fn create_tournament( + full_name: &str, + shortened_name: &str, + token: &str, +) -> Response { + let socket_address = get_socket_addr(); + let mut request_body = HashMap::new(); + request_body.insert("full_name", full_name); + request_body.insert("shortened_name", shortened_name); + + let client = Client::new(); + client + .post(format!("http://{}/tournament", socket_address)) + .json(&request_body) + .header("accept", "text/plain") + .header("Content-Type", "application/json") + .bearer_auth(token) + .send() + .await + .unwrap() +} diff --git a/tests/tournament_tests.rs b/tests/tournament_tests.rs new file mode 100644 index 0000000..af5b8eb --- /dev/null +++ b/tests/tournament_tests.rs @@ -0,0 +1,91 @@ +use std::{collections::HashMap, future::IntoFuture}; + +use reqwest::{Client, StatusCode}; +use serial_test::serial; +use tau::setup::{self, get_socket_addr}; + +use crate::common::{ + auth_utils::get_session_token_for_infrastructure_admin, create_app, create_listener, + prepare_empty_database, tournament_utils::create_tournament, +}; +mod common; + +#[tokio::test] +#[serial] +async fn tournament_creation_should_require_login() { + // GIVEN + setup::read_environmental_variables(); + setup::check_secret_env_var(); + let state = setup::create_app_state().await; + prepare_empty_database(&state.connection_pool).await; + let app = create_app(state).await; + let listener = create_listener().await; + let server = axum::serve(listener, app).into_future(); + tokio::spawn(server); + + // WHEN + let socket_address = get_socket_addr(); + let mut request_body = HashMap::new(); + request_body.insert("full_name", "Wrocławska Liga Debat"); + request_body.insert("shortened_name", "WrLD"); + + let client = Client::new(); + let res = client + .post(format!("http://{}/tournament", socket_address)) + .json(&request_body) + .header("accept", "text/plain") + .header("Content-Type", "application/json") + .send() + .await + .unwrap(); + + // THEN + assert_eq!(res.status(), StatusCode::UNAUTHORIZED); +} + +#[tokio::test] +#[serial] +async fn tournament_creation_should_be_possible_for_infrastructure_admin() { + // GIVEN + setup::read_environmental_variables(); + setup::check_secret_env_var(); + let state = setup::create_app_state().await; + prepare_empty_database(&state.connection_pool).await; + let app = create_app(state).await; + let listener = create_listener().await; + let server = axum::serve(listener, app).into_future(); + tokio::spawn(server); + + // WHEN + let token = get_session_token_for_infrastructure_admin().await.unwrap(); + let res = create_tournament("Wrocławska Liga Debat", "WrLD", &token).await; + + // THEN + assert_eq!(res.status(), StatusCode::OK); +} + +#[tokio::test] +#[serial] +async fn tournament_names_should_not_allow_duplicates() { + // GIVEN + setup::read_environmental_variables(); + setup::check_secret_env_var(); + let state = setup::create_app_state().await; + prepare_empty_database(&state.connection_pool).await; + let app = create_app(state).await; + let listener = create_listener().await; + let server = axum::serve(listener, app).into_future(); + tokio::spawn(server); + + let full_name = "Wrocławska Liga Debat"; + let shortened_name = "WrLD"; + + // WHEN + let token = get_session_token_for_infrastructure_admin().await.unwrap(); + let first_response = create_tournament(full_name, shortened_name, &token).await; + let second_response = create_tournament(full_name, shortened_name, &token).await; + + // THEN + assert_eq!(first_response.status(), StatusCode::OK); + assert_eq!(second_response.status(), StatusCode::CONFLICT); +} From ffc4ecf791723fd304b8e0703d035a528ad2a028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Dobrzy=C5=84ski?= Date: Sat, 7 Feb 2026 21:39:12 +0100 Subject: [PATCH 7/9] [54] more tournament tests --- tests/common/mod.rs | 1 + tests/common/user_utils.rs | 23 +++++++++++++++++++++++ tests/tournament_tests.rs | 36 ++++++++++++++++++++++++++++++++---- 3 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 tests/common/user_utils.rs diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 25ab074..5e457a2 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -4,6 +4,7 @@ use tokio::net::TcpListener; use tower_cookies::CookieManagerLayer; pub mod auth_utils; pub mod tournament_utils; +pub mod user_utils; use tau::{ database, routes, diff --git a/tests/common/user_utils.rs b/tests/common/user_utils.rs new file mode 100644 index 0000000..6fb4028 --- /dev/null +++ b/tests/common/user_utils.rs @@ -0,0 +1,23 @@ +use std::collections::HashMap; + +use reqwest::{Client, Response}; +use tau::setup::get_socket_addr; + +pub async fn create_user(handle: &str, password: &str, token: &str) -> Response { + let socket_address = get_socket_addr(); + let mut request_body = HashMap::new(); + let client = Client::new(); + + request_body.insert("handle", handle); + request_body.insert("password", password); + + client + .post(format!("http://{}/user", socket_address)) + .json(&request_body) + .header("accept", "text/plain") + .header("Content-Type", "application/json") + .bearer_auth(token) + .send() + .await + .unwrap() +} diff --git a/tests/tournament_tests.rs b/tests/tournament_tests.rs index af5b8eb..a488eb7 100644 --- a/tests/tournament_tests.rs +++ b/tests/tournament_tests.rs @@ -5,8 +5,10 @@ use serial_test::serial; use tau::setup::{self, get_socket_addr}; use crate::common::{ - auth_utils::get_session_token_for_infrastructure_admin, create_app, create_listener, - prepare_empty_database, tournament_utils::create_tournament, + auth_utils::{get_session_token_for, get_session_token_for_infrastructure_admin}, + create_app, create_listener, prepare_empty_database, + tournament_utils::create_tournament, + user_utils::create_user, }; mod common; @@ -22,13 +24,13 @@ async fn tournament_creation_should_require_login() { let listener = create_listener().await; let server = axum::serve(listener, app).into_future(); tokio::spawn(server); - - // WHEN let socket_address = get_socket_addr(); + let mut request_body = HashMap::new(); request_body.insert("full_name", "Wrocławska Liga Debat"); request_body.insert("shortened_name", "WrLD"); + // WHEN let client = Client::new(); let res = client .post(format!("http://{}/tournament", socket_address)) @@ -64,6 +66,32 @@ async fn tournament_creation_should_be_possible_for_infrastructure_admin() { assert_eq!(res.status(), StatusCode::OK); } +#[tokio::test] +#[serial] +async fn tournament_creation_should_impossible_for_other_users() { + // GIVEN + setup::read_environmental_variables(); + setup::check_secret_env_var(); + let state = setup::create_app_state().await; + prepare_empty_database(&state.connection_pool).await; + let app = create_app(state).await; + let listener = create_listener().await; + let server = axum::serve(listener, app).into_future(); + tokio::spawn(server); + let handle = "normal_user"; + let password = "cannot_create_tournaments"; + + // WHEN + let admin_token = get_session_token_for_infrastructure_admin().await.unwrap(); + create_user(handle, password, &admin_token).await; + let user_token = get_session_token_for(handle, password).await.unwrap(); + let res = + create_tournament("illegal tournament", "will not be created", &user_token).await; + + // THEN + assert_eq!(res.status(), StatusCode::UNAUTHORIZED); +} + #[tokio::test] #[serial] async fn tournament_names_should_not_allow_duplicates() { From 6b0b8630bca00aebb32979d499d96f4334ac11bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Dobrzy=C5=84ski?= Date: Sat, 7 Feb 2026 21:50:57 +0100 Subject: [PATCH 8/9] [54] add a pull request template --- .github/pull_request_template.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..0529879 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,6 @@ +**Introduced changes** +_Briefly describe your changes_. + +**Testing** +- [ ] I have covered my code with tests. +- [ ] I have run integration tests with `cargo test --tests` and ensured that they pass. From f99ab724f090c4921f52c108e773e6c5ccbff658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Dobrzy=C5=84ski?= Date: Sun, 8 Feb 2026 00:36:40 +0100 Subject: [PATCH 9/9] [54] prepare sqlx queries --- ...ce274a17f9d19482246bd7f55f435c3922c28.json | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .sqlx/query-a014e3ef4a562096063b2d27a78ce274a17f9d19482246bd7f55f435c3922c28.json diff --git a/.sqlx/query-a014e3ef4a562096063b2d27a78ce274a17f9d19482246bd7f55f435c3922c28.json b/.sqlx/query-a014e3ef4a562096063b2d27a78ce274a17f9d19482246bd7f55f435c3922c28.json new file mode 100644 index 0000000..e701a7c --- /dev/null +++ b/.sqlx/query-a014e3ef4a562096063b2d27a78ce274a17f9d19482246bd7f55f435c3922c28.json @@ -0,0 +1,20 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT table_name \nFROM information_schema.tables \nWHERE table_schema = 'public';\n", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "table_name", + "type_info": "Name" + } + ], + "parameters": { + "Left": [] + }, + "nullable": [ + true + ] + }, + "hash": "a014e3ef4a562096063b2d27a78ce274a17f9d19482246bd7f55f435c3922c28" +}