From 05c67387497ee357a75a83e35c0bc56935ff20bf Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Sun, 27 Oct 2024 10:18:55 +0000 Subject: [PATCH 001/138] use latest teloxide --- Cargo.lock | 300 +++++++------------------------------- teloxide_tests/Cargo.toml | 2 +- 2 files changed, 55 insertions(+), 247 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aa0323d..215e5c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,7 +30,7 @@ dependencies = [ "actix-service", "actix-utils", "ahash", - "base64 0.22.1", + "base64", "bitflags 2.6.0", "brotli", "bytes", @@ -432,15 +432,9 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-targets", ] -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -495,6 +489,12 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "bytemuck" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" + [[package]] name = "byteorder" version = "1.5.0" @@ -550,7 +550,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -1133,17 +1133,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -1163,7 +1152,7 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.1", + "http-body", "pin-project-lite", ] @@ -1185,30 +1174,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[package]] -name = "hyper" -version = "0.14.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.5.0" @@ -1220,7 +1185,7 @@ dependencies = [ "futures-util", "h2 0.4.6", "http 1.1.0", - "http-body 1.0.1", + "http-body", "httparse", "itoa", "pin-project-lite", @@ -1237,7 +1202,7 @@ checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.5.0", + "hyper", "hyper-util", "rustls", "rustls-pki-types", @@ -1246,19 +1211,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.31", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "hyper-tls" version = "0.6.0" @@ -1267,7 +1219,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.0", + "hyper", "hyper-util", "native-tls", "tokio", @@ -1285,8 +1237,8 @@ dependencies = [ "futures-channel", "futures-util", "http 1.1.0", - "http-body 1.0.1", - "hyper 1.5.0", + "http-body", + "hyper", "pin-project-lite", "socket2", "tokio", @@ -1663,7 +1615,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -1872,92 +1824,61 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.31", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration 0.5.1", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "winreg", -] - [[package]] name = "reqwest" version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "encoding_rs", "futures-core", "futures-util", "h2 0.4.6", "http 1.1.0", - "http-body 1.0.1", + "http-body", "http-body-util", - "hyper 1.5.0", + "hyper", "hyper-rustls", - "hyper-tls 0.6.0", + "hyper-tls", "hyper-util", "ipnet", "js-sys", "log", "mime", + "mime_guess", "native-tls", "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile 2.2.0", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", - "system-configuration 0.6.1", + "sync_wrapper", + "system-configuration", "tokio", "tokio-native-tls", + "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", + "wasm-streams", "web-sys", "windows-registry", ] +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +dependencies = [ + "bytemuck", +] + [[package]] name = "ring" version = "0.17.8" @@ -2014,15 +1935,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -2334,12 +2246,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" @@ -2349,17 +2255,6 @@ dependencies = [ "futures-core", ] -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys 0.5.0", -] - [[package]] name = "system-configuration" version = "0.6.1" @@ -2368,17 +2263,7 @@ checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags 2.6.0", "core-foundation", - "system-configuration-sys 0.6.0", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", + "system-configuration-sys", ] [[package]] @@ -2406,8 +2291,7 @@ checksum = "20f34339676cdcab560c9a82300c4c2581f68b9369aedf0fae86f2ff9565ff3e" [[package]] name = "teloxide" version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f79dd283eb21b90451c03fa7c7f83b9985130efb876b33bad89a2c208ccbc16" +source = "git+https://github.com/teloxide/teloxide.git?rev=24a8d5f#24a8d5f9d5f5467eabdbfe165839bf5a44cbddf9" dependencies = [ "aquamarine", "bytes", @@ -2432,8 +2316,7 @@ dependencies = [ [[package]] name = "teloxide-core" version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1642a7ef10e7af63b8298c8d13c0f986d4fc646d42649ff060359607f62f69" +source = "git+https://github.com/teloxide/teloxide.git?rev=24a8d5f#24a8d5f9d5f5467eabdbfe165839bf5a44cbddf9" dependencies = [ "bitflags 1.3.2", "bytes", @@ -2446,7 +2329,8 @@ dependencies = [ "once_cell", "pin-project", "rc-box", - "reqwest 0.11.27", + "reqwest", + "rgb", "serde", "serde_json", "serde_with", @@ -2491,7 +2375,7 @@ dependencies = [ "parking_lot", "pretty_env_logger", "rand", - "reqwest 0.12.8", + "reqwest", "serde", "serde_json", "serial_test", @@ -2956,7 +2840,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2967,7 +2851,7 @@ checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ "windows-result", "windows-strings", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2976,7 +2860,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2986,16 +2870,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ "windows-result", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", + "windows-targets", ] [[package]] @@ -3004,7 +2879,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -3013,22 +2888,7 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-targets", ] [[package]] @@ -3037,46 +2897,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "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", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -3089,64 +2931,30 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "zerocopy" version = "0.7.35" diff --git a/teloxide_tests/Cargo.toml b/teloxide_tests/Cargo.toml index 471a075..7cafdd6 100644 --- a/teloxide_tests/Cargo.toml +++ b/teloxide_tests/Cargo.toml @@ -20,7 +20,7 @@ log = "0.4" pretty_env_logger = "0.5" url = "2.5.1" reqwest = "0.12.5" -teloxide = { version = "0.13.0", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" From 19fb1c12389642fe001d7d716960c9bc144ea201 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Sun, 27 Oct 2024 10:39:27 +0000 Subject: [PATCH 002/138] Add missing fields for chat --- teloxide_tests/src/dataset/chat.rs | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/teloxide_tests/src/dataset/chat.rs b/teloxide_tests/src/dataset/chat.rs index 046f665..c8dcafb 100644 --- a/teloxide_tests/src/dataset/chat.rs +++ b/teloxide_tests/src/dataset/chat.rs @@ -91,13 +91,13 @@ macro_rules! PublicChat { // A specialization of Chat!, again, to not repeat my } pub(crate) fn build_public_chat(self, public_chat_kind: PublicChatKind) -> Chat { - self.clone().build_chat(ChatKind::Public(ChatPublic { + self.clone().build_chat(ChatKind::Public(Box::new(ChatPublic { title: self.title, kind: public_chat_kind, description: self.description, invite_link: self.invite_link, has_protected_content: self.has_protected_content, - })) + }))) } } } @@ -200,6 +200,8 @@ PublicChat! { pub location: Option, pub join_to_send_messages: Option, pub join_by_request: Option, + pub custom_emoji_sticker_set_name: Option, + pub unrestrict_boost_count: Option, } } @@ -229,6 +231,8 @@ impl MockSupergroupChat { None, None, None, + None, + None, ) } @@ -255,6 +259,8 @@ impl MockSupergroupChat { location: self.location, join_to_send_messages: self.join_to_send_messages, join_by_request: self.join_by_request, + custom_emoji_sticker_set_name: self.custom_emoji_sticker_set_name, + unrestrict_boost_count: self.unrestrict_boost_count, })) } } @@ -268,6 +274,11 @@ Chat! { pub bio: Option, pub has_private_forwards: Option, pub has_restricted_voice_and_video_messages: Option, + pub birthdate: Option, + pub business_intro: Option, + pub business_location: Option, + pub business_opening_hours: Option, + pub personal_chat: Option>, } } @@ -283,7 +294,10 @@ impl MockPrivateChat { /// ``` /// pub fn new() -> Self { - Self::new_chat(None, None, None, None, None, None).id(MockUser::ID as i64) + Self::new_chat( + None, None, None, None, None, None, None, None, None, None, None, + ) + .id(MockUser::ID as i64) } /// Builds the private chat @@ -303,6 +317,11 @@ impl MockPrivateChat { bio: self.bio, has_private_forwards: self.has_private_forwards, has_restricted_voice_and_video_messages: self.has_restricted_voice_and_video_messages, + birthdate: self.birthdate, + business_intro: self.business_intro, + business_location: self.business_location, + business_opening_hours: self.business_opening_hours, + personal_chat: self.personal_chat, })) } } From 00f774cc5af5d26d4a920eeea728d2f34011baff Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Sun, 27 Oct 2024 10:39:56 +0000 Subject: [PATCH 003/138] Fix typo --- teloxide_tests/src/dataset/message_common.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teloxide_tests/src/dataset/message_common.rs b/teloxide_tests/src/dataset/message_common.rs index 8fe2982..42a53a8 100644 --- a/teloxide_tests/src/dataset/message_common.rs +++ b/teloxide_tests/src/dataset/message_common.rs @@ -7,7 +7,7 @@ use core::sync::atomic::{AtomicI32, Ordering}; use mime::Mime; use teloxide::types::*; -macro_rules! MessageCommon { // Rust was supposed to be used withot inheritance, and yet here i am, reinventing it... +macro_rules! MessageCommon { // Rust was supposed to be used without inheritance, and yet here i am, reinventing it... ( #[derive($($derive:meta),*)] $pub:vis struct $name:ident { From 394d5759a4fc24b9537aaa514806a00eea319453 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Sun, 27 Oct 2024 10:46:25 +0000 Subject: [PATCH 004/138] Update MessageCommon fields --- teloxide_tests/src/dataset/message_common.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/teloxide_tests/src/dataset/message_common.rs b/teloxide_tests/src/dataset/message_common.rs index 42a53a8..2574d9c 100644 --- a/teloxide_tests/src/dataset/message_common.rs +++ b/teloxide_tests/src/dataset/message_common.rs @@ -26,12 +26,18 @@ macro_rules! MessageCommon { // Rust was supposed to be used without inheritanc pub reply_markup: Option, pub is_automatic_forward: bool, pub has_protected_content: bool, + pub is_from_offline: bool, + pub business_connection_id: Option, + pub reply_to_story: Option, + pub sender_boost_count: Option, + $($fpub $field : $type,)* // Just all of the other fields, nothig too scary here } } impl $name { // Implements common functions pub const IS_AUTOMATIC_FORWARD: bool = false; pub const HAS_PROTECTED_CONTENT: bool = false; + pub const IS_FROM_OFFLINE: bool = false; pub(crate) fn new_message_common($($field:$type,)*) -> Self { $name::new_message( @@ -44,6 +50,10 @@ macro_rules! MessageCommon { // Rust was supposed to be used without inheritanc None, $name::IS_AUTOMATIC_FORWARD, $name::HAS_PROTECTED_CONTENT, + $name::IS_FROM_OFFLINE, + None, + None, + None, $($field,)* // All of the other fields from the child struct ) } @@ -60,6 +70,10 @@ macro_rules! MessageCommon { // Rust was supposed to be used without inheritanc media_kind, is_automatic_forward: self.is_automatic_forward, has_protected_content: self.has_protected_content, + business_connection_id: self.business_connection_id, + is_from_offline: self.is_from_offline, + reply_to_story: self.reply_to_story, + sender_boost_count: self.sender_boost_count, })) } } From 3361e8418bdd4b6ae0c16f7697723bea68dca4a9 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Sun, 27 Oct 2024 11:20:53 +0000 Subject: [PATCH 005/138] Add sender_business_bot field --- teloxide_tests/src/dataset/message.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/teloxide_tests/src/dataset/message.rs b/teloxide_tests/src/dataset/message.rs index 2ed0660..f03e53b 100644 --- a/teloxide_tests/src/dataset/message.rs +++ b/teloxide_tests/src/dataset/message.rs @@ -1,9 +1,9 @@ use super::chat::MockPrivateChat; use crate::proc_macros::Changeable; +use crate::MockUser; use chrono::{DateTime, Utc}; use core::sync::atomic::{AtomicI32, Ordering}; use teloxide::types::*; -use crate::MockUser; macro_rules! Message { ( @@ -22,6 +22,7 @@ macro_rules! Message { pub chat: Chat, pub is_topic_message: bool, pub via_bot: Option, + pub sender_business_bot: Option, $($fpub $field : $type,)* } impl $name { @@ -36,6 +37,7 @@ macro_rules! Message { chat: MockPrivateChat::new().build(), is_topic_message: false, via_bot: None, + sender_business_bot: None, $($field,)* } } @@ -51,6 +53,7 @@ macro_rules! Message { is_topic_message: self.is_topic_message, via_bot: self.via_bot, kind: message_kind, + sender_business_bot: self.sender_business_bot, } } } From 712186eeb8c6dd6632981986e0a498c35de700d1 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Sun, 27 Oct 2024 11:22:48 +0000 Subject: [PATCH 006/138] Add can_connect_to_business --- teloxide_tests/src/dataset/mod.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/teloxide_tests/src/dataset/mod.rs b/teloxide_tests/src/dataset/mod.rs index e81f010..7a5e502 100644 --- a/teloxide_tests/src/dataset/mod.rs +++ b/teloxide_tests/src/dataset/mod.rs @@ -5,7 +5,8 @@ use chrono::{DateTime, Utc}; use mime::Mime; use proc_macros::Changeable; use teloxide::types::{ - ChatFullInfo, ChatPhoto, FileMeta, LinkPreviewOptions, Location, Me, PhotoSize, Seconds, Update, User, UserId, Video + ChatFullInfo, ChatPhoto, FileMeta, LinkPreviewOptions, Location, Me, PhotoSize, Seconds, + Update, User, UserId, Video, }; pub mod chat; @@ -117,6 +118,7 @@ pub struct MockMe { pub can_join_groups: bool, pub can_read_all_group_messages: bool, pub supports_inline_queries: bool, + pub can_connect_to_business: bool, } impl MockMe { @@ -129,6 +131,7 @@ impl MockMe { pub const CAN_JOIN_GROUPS: bool = false; pub const CAN_READ_ALL_GROUP_MESSAGES: bool = false; pub const SUPPORTS_INLINE_QUERIES: bool = false; + pub const CAN_CONNECT_TO_BUSINESS: bool = false; /// Creates a new easily changable me builder /// @@ -151,6 +154,7 @@ impl MockMe { can_join_groups: Self::CAN_JOIN_GROUPS, can_read_all_group_messages: Self::CAN_READ_ALL_GROUP_MESSAGES, supports_inline_queries: Self::SUPPORTS_INLINE_QUERIES, + can_connect_to_business: Self::CAN_CONNECT_TO_BUSINESS, } } @@ -178,6 +182,7 @@ impl MockMe { can_join_groups: self.can_join_groups, can_read_all_group_messages: self.can_read_all_group_messages, supports_inline_queries: self.supports_inline_queries, + can_connect_to_business: self.can_connect_to_business, } } } From 406259a90e82e019d879cdd50758013ea9cc330d Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:06:32 +0000 Subject: [PATCH 007/138] formatter --- teloxide_tests/src/server/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 8038118..9438a81 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -10,8 +10,8 @@ use routes::{ restrict_chat_member::*, send_animation::*, send_audio::*, send_chat_action::*, send_contact::*, send_dice::*, send_document::*, send_location::*, send_media_group::*, send_message::*, send_photo::*, send_poll::*, send_sticker::*, send_venue::*, send_video::*, - send_video_note::*, send_voice::*, unban_chat_member::*, unpin_all_chat_messages::*, - unpin_chat_message::*, set_message_reaction::*, + send_video_note::*, send_voice::*, set_message_reaction::*, unban_chat_member::*, + unpin_all_chat_messages::*, unpin_chat_message::*, }; use serde::Serialize; use std::sync::{ @@ -302,7 +302,7 @@ pub struct Responses { /// Telegram doesn't return anything, because there isn't anything to return, so there is no /// `.message` field. pub sent_chat_actions: Vec, - + /// This has only the requests that were sent to the fake server to set message reactions. /// Telegram doesn't return anything, because there isn't anything to return, so there is no /// `.message` field. From 4e97a179f7cbe98ec2dacb3f49fcfcc1edc4f948 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:06:44 +0000 Subject: [PATCH 008/138] add route for SetMyCommands --- teloxide_tests/src/server/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 9438a81..3ea8610 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -502,6 +502,7 @@ pub async fn main(port: Mutex, me: Me) { "/bot{token}/SetMessageReaction", web::post().to(set_message_reaction), ) + .route("/bot{token}/SetMyCommands", web::post().to(set_my_commands)) .route("/file/bot{token}/{file_name}", web::get().to(download_file)) } }) From 63674c05325f7e93aeaad2b061c24b4642393dfe Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:07:58 +0000 Subject: [PATCH 009/138] formatter --- teloxide_tests/src/server/routes/mod.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/teloxide_tests/src/server/routes/mod.rs b/teloxide_tests/src/server/routes/mod.rs index b9ff2fa..09cfa1c 100644 --- a/teloxide_tests/src/server/routes/mod.rs +++ b/teloxide_tests/src/server/routes/mod.rs @@ -41,10 +41,10 @@ pub mod send_venue; pub mod send_video; pub mod send_video_note; pub mod send_voice; +pub mod set_message_reaction; pub mod unban_chat_member; pub mod unpin_all_chat_messages; pub mod unpin_chat_message; -pub mod set_message_reaction; /// Telegram accepts both `i64` and `String` for chat_id, /// so it is a wrapper for both @@ -329,9 +329,7 @@ pub(crate) mod reply_markup_deserialize { Ok(None) } } - None => { - Ok(None) - } + None => Ok(None), } } From fa603a48fce14417c7e985986d97ddbc8c2e0b63 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:13:17 +0000 Subject: [PATCH 010/138] add set_my_commands handler --- teloxide_tests/src/server/mod.rs | 4 ++-- teloxide_tests/src/server/routes/mod.rs | 1 + teloxide_tests/src/server/routes/set_my_commands.rs | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 teloxide_tests/src/server/routes/set_my_commands.rs diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 3ea8610..dc5fbe3 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -10,8 +10,8 @@ use routes::{ restrict_chat_member::*, send_animation::*, send_audio::*, send_chat_action::*, send_contact::*, send_dice::*, send_document::*, send_location::*, send_media_group::*, send_message::*, send_photo::*, send_poll::*, send_sticker::*, send_venue::*, send_video::*, - send_video_note::*, send_voice::*, set_message_reaction::*, unban_chat_member::*, - unpin_all_chat_messages::*, unpin_chat_message::*, + send_video_note::*, send_voice::*, set_message_reaction::*, set_my_commands::*, + unban_chat_member::*, unpin_all_chat_messages::*, unpin_chat_message::*, }; use serde::Serialize; use std::sync::{ diff --git a/teloxide_tests/src/server/routes/mod.rs b/teloxide_tests/src/server/routes/mod.rs index 09cfa1c..965f490 100644 --- a/teloxide_tests/src/server/routes/mod.rs +++ b/teloxide_tests/src/server/routes/mod.rs @@ -42,6 +42,7 @@ pub mod send_video; pub mod send_video_note; pub mod send_voice; pub mod set_message_reaction; +pub mod set_my_commands; pub mod unban_chat_member; pub mod unpin_all_chat_messages; pub mod unpin_chat_message; diff --git a/teloxide_tests/src/server/routes/set_my_commands.rs b/teloxide_tests/src/server/routes/set_my_commands.rs new file mode 100644 index 0000000..6d98e35 --- /dev/null +++ b/teloxide_tests/src/server/routes/set_my_commands.rs @@ -0,0 +1,8 @@ +use actix_web::Responder; + +use super::make_telegram_result; + +pub async fn set_my_commands() -> impl Responder { + // Dummy response + make_telegram_result(true) +} From c42495cde85ae21eb910d95458e821923e686010 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Tue, 5 Nov 2024 16:25:03 +0200 Subject: [PATCH 011/138] Fixed stack overflow and updated deps --- Cargo.lock | 467 +++++++++++---- examples/Cargo.lock | 802 ++++++++++++++------------ examples/album_bot/Cargo.toml | 2 +- examples/calculator_bot/Cargo.toml | 2 +- examples/deep_linking_bot/Cargo.toml | 2 +- examples/file_download_bot/Cargo.toml | 2 +- examples/hello_world_bot/Cargo.toml | 2 +- examples/phrase_bot/Cargo.toml | 2 +- teloxide_tests/src/mock_bot.rs | 42 +- teloxide_tests/src/tests.rs | 19 +- 10 files changed, 834 insertions(+), 508 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 215e5c2..89cae7a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -103,7 +103,7 @@ dependencies = [ "parse-size", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -220,7 +220,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -269,7 +269,7 @@ checksum = "4c221da13534b9352f3f79fcbbd6095f6d8aee63bdf1da8a73d36f9eeea17d5a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -341,9 +341,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -356,36 +356,36 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -399,7 +399,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -503,9 +503,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "bytestring" @@ -518,9 +518,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.30" +version = "1.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" +checksum = "0f57c4b4da2a9d619dd035f27316d7a426305b75be93d09e92f2b9229c34feaf" dependencies = [ "jobserver", "libc", @@ -555,9 +555,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "convert_case" @@ -696,7 +696,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -718,7 +718,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -740,7 +740,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -760,7 +760,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", "unicode-xid", ] @@ -774,6 +774,17 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "dotenv" version = "0.15.0" @@ -797,9 +808,9 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -979,7 +990,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -1089,9 +1100,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" [[package]] name = "heck" @@ -1229,9 +1240,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -1269,6 +1280,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1277,12 +1406,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -1399,9 +1539,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "linux-raw-sys" @@ -1409,6 +1549,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "local-channel" version = "0.1.5" @@ -1574,7 +1720,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -1638,29 +1784,29 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -1725,9 +1871,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.88" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -1791,9 +1937,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -1826,9 +1972,9 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64", "bytes", @@ -1911,9 +2057,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" dependencies = [ "bitflags 2.6.0", "errno", @@ -1924,9 +2070,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.15" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "once_cell", "rustls-pki-types", @@ -1969,9 +2115,9 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "scc" -version = "2.2.2" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c1f7fc6deb21665a9060dfc7d271be784669295a31babdcd4dd2c79ae8cbfb" +checksum = "d8d25269dd3a12467afe2e510f69fb0b46b698e5afb296b59f2145259deaf8e8" dependencies = [ "sdd", ] @@ -2028,22 +2174,22 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -2061,9 +2207,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -2146,7 +2292,7 @@ checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -2206,6 +2352,12 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "strsim" version = "0.10.0" @@ -2237,9 +2389,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -2255,6 +2407,17 @@ dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "system-configuration" version = "0.6.1" @@ -2391,7 +2554,7 @@ version = "0.2.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -2402,7 +2565,7 @@ checksum = "4a6bc538b4fd0adfd705c62a79db2eca5fad350347fb2e6af54358ea0c52095a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -2429,22 +2592,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.64" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -2479,25 +2642,20 @@ dependencies = [ ] [[package]] -name = "tinyvec" -version = "1.8.0" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ - "tinyvec_macros", + "displaydoc", + "zerovec", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", @@ -2519,7 +2677,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -2593,7 +2751,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", ] [[package]] @@ -2619,18 +2777,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-ident" @@ -2638,15 +2787,6 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-xid" version = "0.2.6" @@ -2661,9 +2801,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna", @@ -2671,6 +2811,18 @@ dependencies = [ "serde", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -2735,7 +2887,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -2769,7 +2921,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2782,9 +2934,9 @@ checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-streams" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -2955,6 +3107,42 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -2973,7 +3161,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.87", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", ] [[package]] @@ -2982,6 +3191,28 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "zstd" version = "0.13.2" diff --git a/examples/Cargo.lock b/examples/Cargo.lock index fff70e7..3551646 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "actix-codec" @@ -35,7 +35,7 @@ dependencies = [ "brotli", "bytes", "bytestring", - "derive_more 0.99.18", + "derive_more", "encoding_rs", "flate2", "futures-core", @@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -77,7 +77,7 @@ dependencies = [ "actix-multipart-derive", "actix-utils", "actix-web", - "derive_more 0.99.18", + "derive_more", "futures-core", "futures-util", "httparse", @@ -103,7 +103,7 @@ dependencies = [ "parse-size", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -189,7 +189,7 @@ dependencies = [ "bytestring", "cfg-if", "cookie", - "derive_more 0.99.18", + "derive_more", "encoding_rs", "futures-core", "futures-util", @@ -220,14 +220,14 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "actix-web-lab" -version = "0.22.0" +version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a965e3e826aa4737af33666aa09ed949aa1837706fda2adee07039347be50d6" +checksum = "7675c1a84eec1b179c844cdea8488e3e409d8e4984026e92fa96c87dd86f33c6" dependencies = [ "actix-http", "actix-router", @@ -237,16 +237,16 @@ dependencies = [ "actix-web-lab-derive", "ahash", "arc-swap", + "async-trait", "bytes", "bytestring", "csv", - "derive_more 1.0.0", - "form_urlencoded", + "derive_more", "futures-core", "futures-util", "http 0.2.12", "impl-more", - "itertools 0.13.0", + "itertools 0.12.1", "local-channel", "mediatype", "mime", @@ -256,7 +256,6 @@ dependencies = [ "serde", "serde_html_form", "serde_json", - "serde_path_to_error", "tokio", "tokio-stream", "tracing", @@ -264,20 +263,20 @@ dependencies = [ [[package]] name = "actix-web-lab-derive" -version = "0.22.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008f98f5a68eeacf5e6d44ed74ce03c1b906baa53eabfb41faf0f5f40bd685f8" +checksum = "9aa0b287c8de4a76b691f29dbb5451e8dd5b79d777eaf87350c9b0cbfdb5e968" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -352,55 +351,6 @@ dependencies = [ "libc", ] -[[package]] -name = "anstream" -version = "0.6.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" - -[[package]] -name = "anstyle-parse" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - [[package]] name = "aquamarine" version = "0.5.0" @@ -412,7 +362,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -423,13 +373,13 @@ checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -440,9 +390,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" @@ -527,9 +477,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] name = "bytestring" @@ -556,9 +506,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.21" +version = "1.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" +checksum = "0f57c4b4da2a9d619dd035f27316d7a426305b75be93d09e92f2b9229c34feaf" dependencies = [ "jobserver", "libc", @@ -591,12 +541,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "colorchoice" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" - [[package]] name = "combine" version = "4.6.7" @@ -748,7 +692,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -770,7 +714,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -835,28 +779,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.77", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", - "unicode-xid", + "syn 2.0.87", ] [[package]] @@ -882,7 +805,7 @@ dependencies = [ "dsl_auto_type", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -891,7 +814,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" dependencies = [ - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -904,6 +827,17 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "dotenv" version = "0.15.0" @@ -930,7 +864,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -941,23 +875,13 @@ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] -[[package]] -name = "env_filter" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" -dependencies = [ - "log", - "regex", -] - [[package]] name = "env_logger" version = "0.10.2" @@ -971,19 +895,6 @@ dependencies = [ "termcolor", ] -[[package]] -name = "env_logger" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" -dependencies = [ - "anstream", - "anstyle", - "env_filter", - "humantime", - "log", -] - [[package]] name = "equivalent" version = "1.0.1" @@ -1039,9 +950,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide", @@ -1079,9 +990,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1094,9 +1005,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1104,15 +1015,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1121,38 +1032,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1199,9 +1110,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "h2" @@ -1249,9 +1160,9 @@ checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" [[package]] name = "heck" @@ -1345,9 +1256,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1363,9 +1274,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.30" +version = "0.14.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" dependencies = [ "bytes", "futures-channel", @@ -1387,9 +1298,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", @@ -1413,7 +1324,7 @@ checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-util", "rustls", "rustls-pki-types", @@ -1429,7 +1340,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.30", + "hyper 0.14.31", "native-tls", "tokio", "tokio-native-tls", @@ -1443,7 +1354,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-util", "native-tls", "tokio", @@ -1453,20 +1364,19 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.1", - "hyper 1.4.1", + "hyper 1.5.0", "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] @@ -1494,6 +1404,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1502,19 +1530,30 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] name = "impl-more" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" +checksum = "aae21c3177a27788957044151cc2800043d127acaa460a47ebb9b84dfa2c6aa0" [[package]] name = "include_dir" @@ -1537,9 +1576,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown", @@ -1547,9 +1586,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is-terminal" @@ -1562,12 +1601,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - [[package]] name = "itertools" version = "0.10.5" @@ -1579,9 +1612,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.13.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] @@ -1603,9 +1636,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -1624,9 +1657,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "linux-raw-sys" @@ -1634,6 +1667,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "local-channel" version = "0.1.5" @@ -1773,24 +1812,24 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -1809,7 +1848,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -1820,9 +1859,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -1888,29 +1927,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -1920,9 +1959,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "powerfmt" @@ -1954,7 +1993,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" dependencies = [ - "env_logger 0.10.2", + "env_logger", "log", ] @@ -1984,9 +2023,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ "unicode-ident", ] @@ -2060,18 +2099,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -2081,9 +2120,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -2098,9 +2137,9 @@ checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" @@ -2116,7 +2155,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper 0.14.31", "hyper-tls 0.5.0", "ipnet", "js-sys", @@ -2147,9 +2186,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", @@ -2160,7 +2199,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.1", "http-body-util", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-rustls", "hyper-tls 0.6.0", "hyper-util", @@ -2172,7 +2211,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile 2.1.3", + "rustls-pemfile 2.2.0", "serde", "serde_json", "serde_urlencoded", @@ -2220,9 +2259,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" dependencies = [ "bitflags 2.6.0", "errno", @@ -2233,9 +2272,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "once_cell", "rustls-pki-types", @@ -2255,19 +2294,18 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" @@ -2288,9 +2326,9 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -2316,9 +2354,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -2332,9 +2370,9 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] @@ -2351,13 +2389,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2375,9 +2413,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -2385,16 +2423,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_path_to_error" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" -dependencies = [ - "itoa", - "serde", -] - [[package]] name = "serde_plain" version = "1.0.2" @@ -2495,6 +2523,12 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "strsim" version = "0.10.0" @@ -2526,9 +2560,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -2550,6 +2584,17 @@ dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "system-configuration" version = "0.5.1" @@ -2613,7 +2658,7 @@ dependencies = [ "aquamarine", "bytes", "deadpool-redis", - "derive_more 0.99.18", + "derive_more", "dptree", "either", "futures", @@ -2641,7 +2686,7 @@ dependencies = [ "bitflags 1.3.2", "bytes", "chrono", - "derive_more 0.99.18", + "derive_more", "either", "futures", "log", @@ -2677,6 +2722,8 @@ dependencies = [ [[package]] name = "teloxide_tests" version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e7d8270f4b1c1be07a16320b424b29cfefd48e6250eeb69020ec847bc0faa" dependencies = [ "actix-multipart", "actix-web", @@ -2684,7 +2731,7 @@ dependencies = [ "chrono", "ctrlc", "dotenv", - "env_logger 0.11.5", + "env_logger", "futures-util", "gag", "lazy_static", @@ -2694,7 +2741,7 @@ dependencies = [ "parking_lot", "pretty_env_logger", "rand", - "reqwest 0.12.7", + "reqwest 0.12.9", "serde", "serde_json", "teloxide", @@ -2711,14 +2758,14 @@ checksum = "4a6bc538b4fd0adfd705c62a79db2eca5fad350347fb2e6af54358ea0c52095a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] name = "tempfile" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", @@ -2738,22 +2785,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2788,25 +2835,20 @@ dependencies = [ ] [[package]] -name = "tinyvec" -version = "1.8.0" +name = "tinystr" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ - "tinyvec_macros", + "displaydoc", + "zerovec", ] -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", @@ -2828,7 +2870,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2876,27 +2918,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - [[package]] name = "tower-service" version = "0.3.3" @@ -2923,7 +2944,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2949,18 +2970,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-ident" @@ -2968,21 +2980,6 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" -[[package]] -name = "unicode-normalization" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "untrusted" version = "0.9.0" @@ -2991,9 +2988,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna", @@ -3002,16 +2999,22 @@ dependencies = [ ] [[package]] -name = "utf8parse" -version = "0.2.2" +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", ] @@ -3045,9 +3048,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -3056,24 +3059,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -3083,9 +3086,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3093,28 +3096,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -3125,9 +3128,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -3361,6 +3364,42 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -3379,7 +3418,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", +] + +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", ] [[package]] @@ -3388,6 +3448,28 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "zstd" version = "0.13.2" diff --git a/examples/album_bot/Cargo.toml b/examples/album_bot/Cargo.toml index 897a7f3..f035bca 100644 --- a/examples/album_bot/Cargo.toml +++ b/examples/album_bot/Cargo.toml @@ -11,4 +11,4 @@ log = "0.4" pretty_env_logger = "0.5" [dev-dependencies] -teloxide_tests = { path = "../../teloxide_tests" } +teloxide_tests = "0.2.0" diff --git a/examples/calculator_bot/Cargo.toml b/examples/calculator_bot/Cargo.toml index 1b9c05b..8902617 100644 --- a/examples/calculator_bot/Cargo.toml +++ b/examples/calculator_bot/Cargo.toml @@ -13,4 +13,4 @@ log = "0.4" pretty_env_logger = "0.5" [dev-dependencies] -teloxide_tests = { path = "../../teloxide_tests" } +teloxide_tests = "0.2.0" diff --git a/examples/deep_linking_bot/Cargo.toml b/examples/deep_linking_bot/Cargo.toml index 5cb46f6..c3f4a65 100644 --- a/examples/deep_linking_bot/Cargo.toml +++ b/examples/deep_linking_bot/Cargo.toml @@ -11,4 +11,4 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" [dev-dependencies] -teloxide_tests = { path = "../../teloxide_tests" } +teloxide_tests = "0.2.0" diff --git a/examples/file_download_bot/Cargo.toml b/examples/file_download_bot/Cargo.toml index 7e8a3cc..ca8fd83 100644 --- a/examples/file_download_bot/Cargo.toml +++ b/examples/file_download_bot/Cargo.toml @@ -9,4 +9,4 @@ tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" [dev-dependencies] -teloxide_tests = { path = "../../teloxide_tests" } +teloxide_tests = "0.2.0" diff --git a/examples/hello_world_bot/Cargo.toml b/examples/hello_world_bot/Cargo.toml index 89d476f..b324108 100644 --- a/examples/hello_world_bot/Cargo.toml +++ b/examples/hello_world_bot/Cargo.toml @@ -9,4 +9,4 @@ tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" [dev-dependencies] -teloxide_tests = { path = "../../teloxide_tests" } +teloxide_tests = "0.2.0" diff --git a/examples/phrase_bot/Cargo.toml b/examples/phrase_bot/Cargo.toml index 01b6040..b3510cd 100644 --- a/examples/phrase_bot/Cargo.toml +++ b/examples/phrase_bot/Cargo.toml @@ -14,4 +14,4 @@ pretty_env_logger = "0.5" diesel = { version = "2.1.6", features = ["postgres"] } [dev-dependencies] -teloxide_tests = { path = "../../teloxide_tests" } +teloxide_tests = "0.2.0" diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index c3b516e..4af70cf 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -13,7 +13,6 @@ use teloxide::{ types::{File, FileMeta, MaybeInaccessibleMessage, MessageId, MessageKind}, }; use teloxide::{dptree::deps, types::UpdateKind}; -use tokio::task::JoinHandle; use crate::dataset::{IntoUpdate, MockMe}; use crate::server::{self, Responses, FILES, MESSAGES}; @@ -119,6 +118,8 @@ pub struct MockBot { pub dependencies: Mutex, /// Caught responses from the server pub responses: Mutex>, + /// Stack size used for dispatching + pub stack_size: Mutex, bot_lock: Mutex>>, // Maybe in the future ill make something like an atomic // bool that says if the bot is locked or not, and implement a custom Drop trait } @@ -126,6 +127,7 @@ pub struct MockBot { impl MockBot { const CURRENT_UPDATE_ID: AtomicI32 = AtomicI32::new(0); // So that every update is different const PORT: Mutex = Mutex::new(6504); + const DEFAULT_STACK_SIZE: usize = 8 * 1024 * 1024; /// Creates a new MockBot, using something that can be turned into Updates, and a handler tree. /// You can't create a new bot while you have another bot in scope. Otherwise you will have a @@ -206,6 +208,7 @@ impl MockBot { handler_tree, responses: Mutex::new(None), dependencies: Mutex::new(DependencyMap::new()), + stack_size: Mutex::new(Self::DEFAULT_STACK_SIZE), bot_lock: Mutex::new(Some(lock)), // This makes a lock that forbids the creation of // other bots until this one goes out of scope. That way there will be no race // conditions! @@ -231,7 +234,7 @@ impl MockBot { *self.updates.lock().unwrap() = update.into_update(Self::CURRENT_UPDATE_ID); } - fn collect_handles(&self, handles: &mut Vec>) { + fn collect_handles(&self, handles: &mut Vec>) { let updates_lock = self.updates.lock().unwrap().clone(); let self_deps = self.dependencies.lock().unwrap().clone(); for mut update_lock in updates_lock { @@ -257,23 +260,34 @@ impl MockBot { self.me.lock().unwrap().clone(), update_lock.clone() // This actually makes an update go through the dptree ]; + let stack_size = self.stack_size.lock().unwrap().clone(); deps.insert_container(self_deps.clone()); // These are nessessary for the dispatch // This, too, will need to be redone in the ideal world, but it just waits until the server is up let handler_tree = self.handler_tree.clone(); - handles.push(tokio::spawn(async move { - let result = handler_tree.dispatch(deps.clone()).await; - if let ControlFlow::Break(result) = result { - // If it returned `ControlFlow::Break`, everything is fine, but we need to check, if the - // handler didn't error out - assert!(result.is_ok(), "Error in handler: {:?}", result); - } else { - log::error!("Update didn't get handled!"); - panic!("Unhandled update!"); - } - })); + // To fix the stack overflow, a new thread with a new runtime is needed + let builder = std::thread::Builder::new().stack_size(stack_size); + handles.push(builder.spawn(move || { + let runtime = tokio::runtime::Builder::new_multi_thread() + .thread_stack_size(stack_size) // Not needed, but just in case + .enable_all() + .build() + .unwrap(); + + runtime.block_on(async move { + let result = handler_tree.dispatch(deps.clone()).await; + if let ControlFlow::Break(result) = result { + // If it returned `ControlFlow::Break`, everything is fine, but we need to check, if the + // handler didn't error out + assert!(result.is_ok(), "Error in handler: {:?}", result); + } else { + log::error!("Update didn't get handled!"); + panic!("Unhandled update!"); + } + }) + }).unwrap()); } } @@ -342,7 +356,7 @@ impl MockBot { for handle in handles { // Waits until every update has been sent - match handle.await { + match handle.join() { Ok(_) => {} Err(_) => { // Something panicked, we need to free the bot lock and exit diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index 9ab9d89..53aada2 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -8,11 +8,9 @@ use teloxide::payloads::{ BanChatMemberSetters, CopyMessageSetters, SendPhotoSetters, SendPollSetters, }; use teloxide::requests::Requester; +use teloxide::sugar::request::RequestReplyExt; use teloxide::types::{ - ChatAction, ChatPermissions, DiceEmoji, InlineKeyboardButton, InlineKeyboardMarkup, InputFile, - InputMedia, InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo, - LinkPreviewOptions, Message, MessageEntity, PollOption, PollType, ReactionType, - ReplyParameters, Seconds, Update, + ChatAction, ChatPermissions, DiceEmoji, InlineKeyboardButton, InlineKeyboardMarkup, InputFile, InputMedia, InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo, LinkPreviewOptions, Message, MessageEntity, MessageId, PollOption, PollType, ReactionType, ReplyParameters, Seconds, Update }; use teloxide::{ dispatching::{ @@ -156,6 +154,8 @@ pub enum AllCommands { ChatAction, #[command()] SetMessageReaction, + #[command()] + Panic, } type MyDialogue = Dialogue>; @@ -385,6 +385,10 @@ async fn handler( }]) .await?; } + AllCommands::Panic => { + // This message id does not exist + bot.send_message(msg.chat.id, "test").reply_to(MessageId(344382918)).await?; + } } Ok(()) } @@ -425,15 +429,10 @@ async fn test_echo() { #[should_panic] async fn test_panic() { // Nothing else should fail because it panics - let bot = MockBot::new(MockMessageText::new().text("/echo echo"), get_schema()); + let bot = MockBot::new(MockMessageText::new().text("/panic"), get_schema()); bot.dispatch().await; - let last_response = bot.get_responses().sent_messages.pop().unwrap(); - if last_response.text() == Some("/echo echo") { - panic!("panic!"); - } - drop(bot); } From e8d02f928a6bb66508c97de4871419fada26ba8f Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:49:34 +0000 Subject: [PATCH 012/138] run cargo fmt --- teloxide_tests/src/mock_bot.rs | 42 ++++++++++--------- .../src/server/routes/forward_message.rs | 4 +- .../src/server/routes/send_media_group.rs | 4 +- .../src/server/routes/send_photo.rs | 4 +- teloxide_tests/src/server/routes/send_poll.rs | 4 +- .../src/server/routes/set_message_reaction.rs | 19 ++++----- teloxide_tests/src/tests.rs | 9 +++- 7 files changed, 49 insertions(+), 37 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 4af70cf..6b6569f 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -269,25 +269,29 @@ impl MockBot { // To fix the stack overflow, a new thread with a new runtime is needed let builder = std::thread::Builder::new().stack_size(stack_size); - handles.push(builder.spawn(move || { - let runtime = tokio::runtime::Builder::new_multi_thread() - .thread_stack_size(stack_size) // Not needed, but just in case - .enable_all() - .build() - .unwrap(); - - runtime.block_on(async move { - let result = handler_tree.dispatch(deps.clone()).await; - if let ControlFlow::Break(result) = result { - // If it returned `ControlFlow::Break`, everything is fine, but we need to check, if the - // handler didn't error out - assert!(result.is_ok(), "Error in handler: {:?}", result); - } else { - log::error!("Update didn't get handled!"); - panic!("Unhandled update!"); - } - }) - }).unwrap()); + handles.push( + builder + .spawn(move || { + let runtime = tokio::runtime::Builder::new_multi_thread() + .thread_stack_size(stack_size) // Not needed, but just in case + .enable_all() + .build() + .unwrap(); + + runtime.block_on(async move { + let result = handler_tree.dispatch(deps.clone()).await; + if let ControlFlow::Break(result) = result { + // If it returned `ControlFlow::Break`, everything is fine, but we need to check, if the + // handler didn't error out + assert!(result.is_ok(), "Error in handler: {:?}", result); + } else { + log::error!("Update didn't get handled!"); + panic!("Unhandled update!"); + } + }) + }) + .unwrap(), + ); } } diff --git a/teloxide_tests/src/server/routes/forward_message.rs b/teloxide_tests/src/server/routes/forward_message.rs index 2ee279d..906183b 100644 --- a/teloxide_tests/src/server/routes/forward_message.rs +++ b/teloxide_tests/src/server/routes/forward_message.rs @@ -1,9 +1,9 @@ +use crate::server::ForwardedMessage; +use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::{ChatKind, Me, MessageId, MessageKind, MessageOrigin, PublicChatKind}; -use crate::server::ForwardedMessage; -use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; use super::{make_telegram_result, BodyChatId}; diff --git a/teloxide_tests/src/server/routes/send_media_group.rs b/teloxide_tests/src/server/routes/send_media_group.rs index 2969b57..aeadc55 100644 --- a/teloxide_tests/src/server/routes/send_media_group.rs +++ b/teloxide_tests/src/server/routes/send_media_group.rs @@ -35,7 +35,9 @@ pub async fn send_media_group(mut payload: Multipart, me: web::Data) -> impl if let Some(reply_parameters) = &body.reply_parameters { check_if_message_exists!(reply_parameters.message_id.0); // All of messages in the media group are replying to the same message - reply_to_message = Some(Box::new(MESSAGES.get_message(reply_parameters.message_id.0).unwrap())); + reply_to_message = Some(Box::new( + MESSAGES.get_message(reply_parameters.message_id.0).unwrap(), + )); } let media_group_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 16); diff --git a/teloxide_tests/src/server/routes/send_photo.rs b/teloxide_tests/src/server/routes/send_photo.rs index 327d1e3..689b004 100644 --- a/teloxide_tests/src/server/routes/send_photo.rs +++ b/teloxide_tests/src/server/routes/send_photo.rs @@ -9,7 +9,9 @@ use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; -use teloxide::types::{LinkPreviewOptions, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters}; +use teloxide::types::{ + LinkPreviewOptions, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, +}; use crate::server::{ routes::check_if_message_exists, SentMessagePhoto, FILES, MESSAGES, RESPONSES, diff --git a/teloxide_tests/src/server/routes/send_poll.rs b/teloxide_tests/src/server/routes/send_poll.rs index 3a0a626..2ce28fc 100644 --- a/teloxide_tests/src/server/routes/send_poll.rs +++ b/teloxide_tests/src/server/routes/send_poll.rs @@ -4,7 +4,9 @@ use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use chrono::DateTime; use serde::Deserialize; -use teloxide::types::{Me, MessageEntity, ParseMode, PollOption, PollType, ReplyMarkup, ReplyParameters, Seconds}; +use teloxide::types::{ + Me, MessageEntity, ParseMode, PollOption, PollType, ReplyMarkup, ReplyParameters, Seconds, +}; use crate::server::routes::check_if_message_exists; diff --git a/teloxide_tests/src/server/routes/set_message_reaction.rs b/teloxide_tests/src/server/routes/set_message_reaction.rs index fdebfe5..15ee9fb 100644 --- a/teloxide_tests/src/server/routes/set_message_reaction.rs +++ b/teloxide_tests/src/server/routes/set_message_reaction.rs @@ -2,9 +2,7 @@ use crate::server::SetMessageReaction; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; -use teloxide::types:: - ReactionType -; +use teloxide::types::ReactionType; use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; @@ -18,16 +16,15 @@ pub struct SetMessageReactionBody { pub is_big: Option, } -pub async fn set_message_reaction( - body: web::Json, -) -> impl Responder { +pub async fn set_message_reaction(body: web::Json) -> impl Responder { check_if_message_exists!(body.message_id); - + let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.set_message_reaction.push(SetMessageReaction { - bot_request: body.into_inner(), - }); + responses_lock + .set_message_reaction + .push(SetMessageReaction { + bot_request: body.into_inner(), + }); make_telegram_result(true) } - diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index 53aada2..c9bf0c1 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -10,7 +10,10 @@ use teloxide::payloads::{ use teloxide::requests::Requester; use teloxide::sugar::request::RequestReplyExt; use teloxide::types::{ - ChatAction, ChatPermissions, DiceEmoji, InlineKeyboardButton, InlineKeyboardMarkup, InputFile, InputMedia, InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo, LinkPreviewOptions, Message, MessageEntity, MessageId, PollOption, PollType, ReactionType, ReplyParameters, Seconds, Update + ChatAction, ChatPermissions, DiceEmoji, InlineKeyboardButton, InlineKeyboardMarkup, InputFile, + InputMedia, InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo, + LinkPreviewOptions, Message, MessageEntity, MessageId, PollOption, PollType, ReactionType, + ReplyParameters, Seconds, Update, }; use teloxide::{ dispatching::{ @@ -387,7 +390,9 @@ async fn handler( } AllCommands::Panic => { // This message id does not exist - bot.send_message(msg.chat.id, "test").reply_to(MessageId(344382918)).await?; + bot.send_message(msg.chat.id, "test") + .reply_to(MessageId(344382918)) + .await?; } } Ok(()) From 62ff207f857e67110c30bf0419933c9fd366383a Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Wed, 6 Nov 2024 19:20:21 +0000 Subject: [PATCH 013/138] split responses into a module --- teloxide_tests/src/server/mod.rs | 292 +----------------------- teloxide_tests/src/server/responses.rs | 300 +++++++++++++++++++++++++ 2 files changed, 303 insertions(+), 289 deletions(-) create mode 100644 teloxide_tests/src/server/responses.rs diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index dc5fbe3..837bca6 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -3,6 +3,7 @@ pub mod routes; use actix_web::{dev::ServerHandle, web, App, HttpResponse, HttpServer, Responder}; use actix_web_lab::extract::Path; use lazy_static::lazy_static; +pub use responses::*; use routes::{ answer_callback_query::*, ban_chat_member::*, copy_message::*, delete_message::*, download_file::download_file, edit_message_caption::*, edit_message_reply_markup::*, @@ -18,296 +19,9 @@ use std::sync::{ atomic::{AtomicI32, Ordering}, Mutex, }; -use teloxide::types::{File, Me, Message, MessageId, ReplyMarkup}; +use teloxide::types::{File, Me, Message, ReplyMarkup}; -#[derive(Clone, Debug)] -pub struct SentMessageText { - // For better syntax, this is a struct, not a tuple - pub message: Message, - pub bot_request: SendMessageTextBody, -} - -#[derive(Clone, Debug)] -pub struct SentMessagePhoto { - pub message: Message, - pub bot_request: SendMessagePhotoBody, -} - -#[derive(Clone, Debug)] -pub struct SentMessageVideo { - pub message: Message, - pub bot_request: SendMessageVideoBody, -} - -#[derive(Clone, Debug)] -pub struct SentMessageAudio { - pub message: Message, - pub bot_request: SendMessageAudioBody, -} - -#[derive(Clone, Debug)] -pub struct SentMessageVoice { - pub message: Message, - pub bot_request: SendMessageVoiceBody, -} - -#[derive(Clone, Debug)] -pub struct SentMessageVideoNote { - pub message: Message, - pub bot_request: SendMessageVideoNoteBody, -} - -#[derive(Clone, Debug)] -pub struct SentMessageDocument { - pub message: Message, - pub bot_request: SendMessageDocumentBody, -} - -#[derive(Clone, Debug)] -pub struct SentMessageAnimation { - pub message: Message, - pub bot_request: SendMessageAnimationBody, -} - -#[derive(Clone, Debug)] -pub struct SentMessageLocation { - pub message: Message, - pub bot_request: SendMessageLocationBody, -} - -#[derive(Clone, Debug)] -pub struct SentMessageVenue { - pub message: Message, - pub bot_request: SendMessageVenueBody, -} - -#[derive(Clone, Debug)] -pub struct SentMessageContact { - pub message: Message, - pub bot_request: SendMessageContactBody, -} - -#[derive(Clone, Debug)] -pub struct SentMessageDice { - pub message: Message, - pub bot_request: SendMessageDiceBody, -} - -#[derive(Clone, Debug)] -pub struct SentMessagePoll { - pub message: Message, - pub bot_request: SendMessagePollBody, -} - -#[derive(Clone, Debug)] -pub struct SentMessageSticker { - pub message: Message, - pub bot_request: SendMessageStickerBody, -} - -#[derive(Clone, Debug)] -pub struct SentMediaGroup { - pub messages: Vec, - pub bot_request: SendMediaGroupBody, -} - -#[derive(Clone, Debug)] -pub struct EditedMessageText { - pub message: Message, - pub bot_request: EditMessageTextBody, -} - -#[derive(Clone, Debug)] -pub struct EditedMessageCaption { - pub message: Message, - pub bot_request: EditMessageCaptionBody, -} - -#[derive(Clone, Debug)] -pub struct DeletedMessage { - pub message: Message, - pub bot_request: DeleteMessageBody, -} - -#[derive(Clone, Debug)] -pub struct EditedMessageReplyMarkup { - pub message: Message, - pub bot_request: EditMessageReplyMarkupBody, -} - -#[derive(Clone, Debug)] -pub struct ForwardedMessage { - pub message: Message, - pub bot_request: ForwardMessageBody, -} - -#[derive(Clone, Debug)] -pub struct CopiedMessage { - pub message_id: MessageId, - pub bot_request: CopyMessageBody, -} - -#[derive(Clone, Debug)] -pub struct SetMessageReaction { - pub bot_request: SetMessageReactionBody, -} - -#[derive(Clone, Debug, Default)] -pub struct Responses { - /// All of the sent messages, including text, photo, audio, etc. - /// Be warned, editing or deleting messages do not affect this list! - pub sent_messages: Vec, - - /// This has only messages that are text messages, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_text: Vec, - - /// This has only messages that are photo messages, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_photo: Vec, - - /// This has only messages that are video messages, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_video: Vec, - - /// This has only messages that are audio messages, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_audio: Vec, - - /// This has only messages that are voice messages, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_voice: Vec, - - /// This has only messages that are video note messages, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_video_note: Vec, - - /// This has only messages that are document messages, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_document: Vec, - - /// This has only messages that are animation messages, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_animation: Vec, - - /// This has only messages that are location messages, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_location: Vec, - - /// This has only messages that are venue messages, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_venue: Vec, - - /// This has only messages that are contact messages, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_contact: Vec, - - /// This has only messages that are dice messages, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_dice: Vec, - - /// This has only messages that are poll messages, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_poll: Vec, - - /// This has only messages that are stickers, sent by the bot. - /// The `.message` field has the sent by bot message, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_messages_sticker: Vec, - - /// This has only messages that are media group messages, sent by the bot. - /// The `.messages` field has the sent by bot messages, and `.bot_request` - /// has the request that was sent to the fake server - pub sent_media_group: Vec, - - /// This has only edited by the bot text messages. - /// The `.message` field has the new edited message, and `.bot_request` - /// has the request that was sent to the fake server - pub edited_messages_text: Vec, - - /// This has only edited by the bot caption messages. - /// The `.message` field has the new edited message, and `.bot_request` - /// has the request that was sent to the fake server - pub edited_messages_caption: Vec, - - /// This has only messages whos reply markup was edited by the bot. - /// The `.message` field has the new edited message, and `.bot_request` - /// has the request that was sent to the fake server - pub edited_messages_reply_markup: Vec, - - /// This has only messages which were deleted by the bot. - /// The `.message` field has the deleted message, and `.bot_request` - /// has the request that was sent to the fake server - pub deleted_messages: Vec, - - /// This has only the requests that were sent to the fake server to forward messages. - /// The `.message` field has the forwarded message, and `.bot_request` - /// has the request that was sent to the fake server - pub forwarded_messages: Vec, - - /// This has only the requests that were sent to the fake server to copy messages. - /// The `.message_id` field has the copied message id, and `.bot_request` - /// has the request that was sent to the fake server - pub copied_messages: Vec, - - /// This has only the requests that were sent to the fake server to answer callback queries. - /// Telegram doesn't return anything, because there isn't anything to return, so there is no - /// `.message` field. - pub answered_callback_queries: Vec, - - /// This has only the requests that were sent to the fake server to pin messages. - /// Telegram doesn't return anything, because there isn't anything to return, so there is no - /// `.message` field. - pub pinned_chat_messages: Vec, - - /// This has only the requests that were sent to the fake server to unpin messages. - /// Telegram doesn't return anything, because there isn't anything to return, so there is no - /// `.message` field. - pub unpinned_chat_messages: Vec, - - /// This has only the requests that were sent to the fake server to unpin all messages. - /// Telegram doesn't return anything, because there isn't anything to return, so there is no - /// `.message` field. - pub unpinned_all_chat_messages: Vec, - - /// This has only the requests that were sent to the fake server to ban chat members. - /// Telegram doesn't return anything, because there isn't anything to return, so there is no - /// `.message` field. - pub banned_chat_members: Vec, - - /// This has only the requests that were sent to the fake server to unban chat members. - /// Telegram doesn't return anything, because there isn't anything to return, so there is no - /// `.message` field. - pub unbanned_chat_members: Vec, - - /// This has only the requests that were sent to the fake server to restrict chat members. - /// Telegram doesn't return anything, because there isn't anything to return, so there is no - /// `.message` field. - pub restricted_chat_members: Vec, - - /// This has only the requests that were sent to the fake server to send chat actions. - /// Telegram doesn't return anything, because there isn't anything to return, so there is no - /// `.message` field. - pub sent_chat_actions: Vec, - - /// This has only the requests that were sent to the fake server to set message reactions. - /// Telegram doesn't return anything, because there isn't anything to return, so there is no - /// `.message` field. - pub set_message_reaction: Vec, -} +pub mod responses; lazy_static! { pub static ref MESSAGES: Mutex> = Mutex::new(vec![]); // Messages storage, just in case diff --git a/teloxide_tests/src/server/responses.rs b/teloxide_tests/src/server/responses.rs new file mode 100644 index 0000000..9ac7ff9 --- /dev/null +++ b/teloxide_tests/src/server/responses.rs @@ -0,0 +1,300 @@ +use super::routes::{ + answer_callback_query::*, ban_chat_member::*, copy_message::*, delete_message::*, + edit_message_caption::*, edit_message_reply_markup::*, edit_message_text::*, + forward_message::*, pin_chat_message::*, restrict_chat_member::*, send_animation::*, + send_audio::*, send_chat_action::*, send_contact::*, send_dice::*, send_document::*, + send_location::*, send_media_group::*, send_message::*, send_photo::*, send_poll::*, + send_sticker::*, send_venue::*, send_video::*, send_video_note::*, send_voice::*, + set_message_reaction::*, unban_chat_member::*, unpin_all_chat_messages::*, + unpin_chat_message::*, +}; +use teloxide::types::{Message, MessageId}; + +#[derive(Clone, Debug)] +pub struct SentMessageText { + // For better syntax, this is a struct, not a tuple + pub message: Message, + pub bot_request: SendMessageTextBody, +} + +#[derive(Clone, Debug)] +pub struct SentMessagePhoto { + pub message: Message, + pub bot_request: SendMessagePhotoBody, +} + +#[derive(Clone, Debug)] +pub struct SentMessageVideo { + pub message: Message, + pub bot_request: SendMessageVideoBody, +} + +#[derive(Clone, Debug)] +pub struct SentMessageAudio { + pub message: Message, + pub bot_request: SendMessageAudioBody, +} + +#[derive(Clone, Debug)] +pub struct SentMessageVoice { + pub message: Message, + pub bot_request: SendMessageVoiceBody, +} + +#[derive(Clone, Debug)] +pub struct SentMessageVideoNote { + pub message: Message, + pub bot_request: SendMessageVideoNoteBody, +} + +#[derive(Clone, Debug)] +pub struct SentMessageDocument { + pub message: Message, + pub bot_request: SendMessageDocumentBody, +} + +#[derive(Clone, Debug)] +pub struct SentMessageAnimation { + pub message: Message, + pub bot_request: SendMessageAnimationBody, +} + +#[derive(Clone, Debug)] +pub struct SentMessageLocation { + pub message: Message, + pub bot_request: SendMessageLocationBody, +} + +#[derive(Clone, Debug)] +pub struct SentMessageVenue { + pub message: Message, + pub bot_request: SendMessageVenueBody, +} + +#[derive(Clone, Debug)] +pub struct SentMessageContact { + pub message: Message, + pub bot_request: SendMessageContactBody, +} + +#[derive(Clone, Debug)] +pub struct SentMessageDice { + pub message: Message, + pub bot_request: SendMessageDiceBody, +} + +#[derive(Clone, Debug)] +pub struct SentMessagePoll { + pub message: Message, + pub bot_request: SendMessagePollBody, +} + +#[derive(Clone, Debug)] +pub struct SentMessageSticker { + pub message: Message, + pub bot_request: SendMessageStickerBody, +} + +#[derive(Clone, Debug)] +pub struct SentMediaGroup { + pub messages: Vec, + pub bot_request: SendMediaGroupBody, +} + +#[derive(Clone, Debug)] +pub struct EditedMessageText { + pub message: Message, + pub bot_request: EditMessageTextBody, +} + +#[derive(Clone, Debug)] +pub struct EditedMessageCaption { + pub message: Message, + pub bot_request: EditMessageCaptionBody, +} + +#[derive(Clone, Debug)] +pub struct DeletedMessage { + pub message: Message, + pub bot_request: DeleteMessageBody, +} + +#[derive(Clone, Debug)] +pub struct EditedMessageReplyMarkup { + pub message: Message, + pub bot_request: EditMessageReplyMarkupBody, +} + +#[derive(Clone, Debug)] +pub struct ForwardedMessage { + pub message: Message, + pub bot_request: ForwardMessageBody, +} + +#[derive(Clone, Debug)] +pub struct CopiedMessage { + pub message_id: MessageId, + pub bot_request: CopyMessageBody, +} + +#[derive(Clone, Debug)] +pub struct SetMessageReaction { + pub bot_request: SetMessageReactionBody, +} + +#[derive(Clone, Debug, Default)] +pub struct Responses { + /// All of the sent messages, including text, photo, audio, etc. + /// Be warned, editing or deleting messages do not affect this list! + pub sent_messages: Vec, + + /// This has only messages that are text messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_text: Vec, + + /// This has only messages that are photo messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_photo: Vec, + + /// This has only messages that are video messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_video: Vec, + + /// This has only messages that are audio messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_audio: Vec, + + /// This has only messages that are voice messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_voice: Vec, + + /// This has only messages that are video note messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_video_note: Vec, + + /// This has only messages that are document messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_document: Vec, + + /// This has only messages that are animation messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_animation: Vec, + + /// This has only messages that are location messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_location: Vec, + + /// This has only messages that are venue messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_venue: Vec, + + /// This has only messages that are contact messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_contact: Vec, + + /// This has only messages that are dice messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_dice: Vec, + + /// This has only messages that are poll messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_poll: Vec, + + /// This has only messages that are stickers, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_sticker: Vec, + + /// This has only messages that are media group messages, sent by the bot. + /// The `.messages` field has the sent by bot messages, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_media_group: Vec, + + /// This has only edited by the bot text messages. + /// The `.message` field has the new edited message, and `.bot_request` + /// has the request that was sent to the fake server + pub edited_messages_text: Vec, + + /// This has only edited by the bot caption messages. + /// The `.message` field has the new edited message, and `.bot_request` + /// has the request that was sent to the fake server + pub edited_messages_caption: Vec, + + /// This has only messages whos reply markup was edited by the bot. + /// The `.message` field has the new edited message, and `.bot_request` + /// has the request that was sent to the fake server + pub edited_messages_reply_markup: Vec, + + /// This has only messages which were deleted by the bot. + /// The `.message` field has the deleted message, and `.bot_request` + /// has the request that was sent to the fake server + pub deleted_messages: Vec, + + /// This has only the requests that were sent to the fake server to forward messages. + /// The `.message` field has the forwarded message, and `.bot_request` + /// has the request that was sent to the fake server + pub forwarded_messages: Vec, + + /// This has only the requests that were sent to the fake server to copy messages. + /// The `.message_id` field has the copied message id, and `.bot_request` + /// has the request that was sent to the fake server + pub copied_messages: Vec, + + /// This has only the requests that were sent to the fake server to answer callback queries. + /// Telegram doesn't return anything, because there isn't anything to return, so there is no + /// `.message` field. + pub answered_callback_queries: Vec, + + /// This has only the requests that were sent to the fake server to pin messages. + /// Telegram doesn't return anything, because there isn't anything to return, so there is no + /// `.message` field. + pub pinned_chat_messages: Vec, + + /// This has only the requests that were sent to the fake server to unpin messages. + /// Telegram doesn't return anything, because there isn't anything to return, so there is no + /// `.message` field. + pub unpinned_chat_messages: Vec, + + /// This has only the requests that were sent to the fake server to unpin all messages. + /// Telegram doesn't return anything, because there isn't anything to return, so there is no + /// `.message` field. + pub unpinned_all_chat_messages: Vec, + + /// This has only the requests that were sent to the fake server to ban chat members. + /// Telegram doesn't return anything, because there isn't anything to return, so there is no + /// `.message` field. + pub banned_chat_members: Vec, + + /// This has only the requests that were sent to the fake server to unban chat members. + /// Telegram doesn't return anything, because there isn't anything to return, so there is no + /// `.message` field. + pub unbanned_chat_members: Vec, + + /// This has only the requests that were sent to the fake server to restrict chat members. + /// Telegram doesn't return anything, because there isn't anything to return, so there is no + /// `.message` field. + pub restricted_chat_members: Vec, + + /// This has only the requests that were sent to the fake server to send chat actions. + /// Telegram doesn't return anything, because there isn't anything to return, so there is no + /// `.message` field. + pub sent_chat_actions: Vec, + + /// This has only the requests that were sent to the fake server to set message reactions. + /// Telegram doesn't return anything, because there isn't anything to return, so there is no + /// `.message` field. + pub set_message_reaction: Vec, +} From a969ad15393db6702d793e6026b185345d2c06a7 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Wed, 6 Nov 2024 19:26:06 +0000 Subject: [PATCH 014/138] make server struct The constructor is named `start` instead of `new` since will be slow --- teloxide_tests/src/server/mod.rs | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 837bca6..6a88296 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -15,9 +15,12 @@ use routes::{ unban_chat_member::*, unpin_all_chat_messages::*, unpin_chat_message::*, }; use serde::Serialize; -use std::sync::{ - atomic::{AtomicI32, Ordering}, - Mutex, +use std::{ + net::{SocketAddr, TcpListener}, + sync::{ + atomic::{AtomicI32, Ordering}, + Mutex, + }, }; use teloxide::types::{File, Me, Message, ReplyMarkup}; @@ -121,6 +124,18 @@ async fn stop(Path(graceful): Path, stop_handle: web::Data) -> HttpResponse::NoContent().finish() } +pub struct Server { + listener: TcpListener, +} + +impl Server { + pub fn start() -> Self { + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + + Self { listener } + } +} + pub async fn main(port: Mutex, me: Me) { // MESSAGES don't care if they are cleaned or not *RESPONSES.lock().unwrap() = Responses::default(); From 37364e4bfdc8fc0f3695bfe79644ce9ae59d02ff Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Wed, 6 Nov 2024 19:28:07 +0000 Subject: [PATCH 015/138] add addr fn --- teloxide_tests/src/server/mod.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 6a88296..31951be 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -134,6 +134,10 @@ impl Server { Self { listener } } + + pub fn addr(&self) -> SocketAddr { + self.listener.local_addr().unwrap() + } } pub async fn main(port: Mutex, me: Me) { From a44049f5ab96cbcfaa3f688cac378bb7d87fba22 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Wed, 6 Nov 2024 19:36:43 +0000 Subject: [PATCH 016/138] store server in mock bot --- teloxide_tests/src/mock_bot.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 6b6569f..6d4d9fb 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -14,8 +14,11 @@ use teloxide::{ }; use teloxide::{dptree::deps, types::UpdateKind}; -use crate::dataset::{IntoUpdate, MockMe}; use crate::server::{self, Responses, FILES, MESSAGES}; +use crate::{ + dataset::{IntoUpdate, MockMe}, + server::Server, +}; use teloxide::{ dispatching::{ dialogue::{GetChatId, InMemStorage, Storage}, @@ -120,6 +123,7 @@ pub struct MockBot { pub responses: Mutex>, /// Stack size used for dispatching pub stack_size: Mutex, + server: Server, bot_lock: Mutex>>, // Maybe in the future ill make something like an atomic // bool that says if the bot is locked or not, and implement a custom Drop trait } @@ -200,8 +204,10 @@ impl MockBot { .unwrap(), ); let lock = BOT_LOCK.lock().unwrap_or_else(PoisonError::into_inner); + let server = Server::start(); // If the lock is poisoned, we don't care, some other bot panicked and can't do anything Self { + server, bot, me: Mutex::new(MockMe::new().build()), updates: Mutex::new(update.into_update(Self::CURRENT_UPDATE_ID)), From 4c2b85b8fc74785e5aa662a10a65acca34a8dfc2 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Wed, 6 Nov 2024 19:37:33 +0000 Subject: [PATCH 017/138] return Result from addr --- teloxide_tests/src/server/mod.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 31951be..b264048 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -16,6 +16,7 @@ use routes::{ }; use serde::Serialize; use std::{ + io, net::{SocketAddr, TcpListener}, sync::{ atomic::{AtomicI32, Ordering}, @@ -135,8 +136,8 @@ impl Server { Self { listener } } - pub fn addr(&self) -> SocketAddr { - self.listener.local_addr().unwrap() + pub fn addr(&self) -> io::Result { + self.listener.local_addr() } } From cf679919566d481d0e7bc5777f4208b6c751c46c Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Wed, 6 Nov 2024 19:47:08 +0000 Subject: [PATCH 018/138] rename to Server::new --- teloxide_tests/src/mock_bot.rs | 2 +- teloxide_tests/src/server/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 6d4d9fb..be84d17 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -204,7 +204,7 @@ impl MockBot { .unwrap(), ); let lock = BOT_LOCK.lock().unwrap_or_else(PoisonError::into_inner); - let server = Server::start(); + let server = Server::new(); // If the lock is poisoned, we don't care, some other bot panicked and can't do anything Self { server, diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index b264048..1a54ace 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -130,7 +130,7 @@ pub struct Server { } impl Server { - pub fn start() -> Self { + pub fn new() -> Self { let listener = TcpListener::bind("127.0.0.1:0").unwrap(); Self { listener } From 10eeb1a7f32117eb58d57603868f807a3e36fdc5 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 00:21:35 +0000 Subject: [PATCH 019/138] remove check for running server --- teloxide_tests/src/server/mod.rs | 198 +++++++++++++++---------------- 1 file changed, 96 insertions(+), 102 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index dc5fbe3..4a269af 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -411,110 +411,104 @@ pub async fn main(port: Mutex, me: Me) { // MESSAGES don't care if they are cleaned or not *RESPONSES.lock().unwrap() = Responses::default(); - let pong = reqwest::get(format!("http://127.0.0.1:{}/ping", port.lock().unwrap())).await; - - if pong.is_err() - // If it errored, no server is running, we need to start it - { - let stop_handle = web::Data::new(StopHandle::default()); - // let _ = env_logger::builder() - // .filter_level(log::LevelFilter::Info) - // .format_target(false) - // .format_timestamp(None) - // .try_init(); - let server = HttpServer::new({ - let stop_handle = stop_handle.clone(); - - move || { - App::new() - // .wrap(actix_web::middleware::Logger::default()) - .app_data(stop_handle.clone()) - .app_data(web::Data::new(me.clone())) - .route("/ping", web::get().to(ping)) - .route("/stop/{graceful}", web::post().to(stop)) - .route("/bot{token}/GetFile", web::post().to(get_file)) - .route("/bot{token}/SendMessage", web::post().to(send_message)) - .route("/bot{token}/SendPhoto", web::post().to(send_photo)) - .route("/bot{token}/SendVideo", web::post().to(send_video)) - .route("/bot{token}/SendVoice", web::post().to(send_voice)) - .route("/bot{token}/SendAudio", web::post().to(send_audio)) - .route("/bot{token}/SendVideoNote", web::post().to(send_video_note)) - .route("/bot{token}/SendDocument", web::post().to(send_document)) - .route("/bot{token}/SendAnimation", web::post().to(send_animation)) - .route("/bot{token}/SendLocation", web::post().to(send_location)) - .route("/bot{token}/SendVenue", web::post().to(send_venue)) - .route("/bot{token}/SendContact", web::post().to(send_contact)) - .route("/bot{token}/SendSticker", web::post().to(send_sticker)) - .route( - "/bot{token}/SendChatAction", - web::post().to(send_chat_action), - ) - .route("/bot{token}/SendDice", web::post().to(send_dice)) - .route("/bot{token}/SendPoll", web::post().to(send_poll)) - .route( - "/bot{token}/SendMediaGroup", - web::post().to(send_media_group), - ) - .route( - "/bot{token}/EditMessageText", - web::post().to(edit_message_text), - ) - .route( - "/bot{token}/EditMessageCaption", - web::post().to(edit_message_caption), - ) - .route( - "/bot{token}/EditMessageReplyMarkup", - web::post().to(edit_message_reply_markup), - ) - .route("/bot{token}/DeleteMessage", web::post().to(delete_message)) - .route( - "/bot{token}/ForwardMessage", - web::post().to(forward_message), - ) - .route("/bot{token}/CopyMessage", web::post().to(copy_message)) - .route( - "/bot{token}/AnswerCallbackQuery", - web::post().to(answer_callback_query), - ) - .route( - "/bot{token}/PinChatMessage", - web::post().to(pin_chat_message), - ) - .route( - "/bot{token}/UnpinChatMessage", - web::post().to(unpin_chat_message), - ) - .route( - "/bot{token}/UnpinAllChatMessages", - web::post().to(unpin_all_chat_messages), - ) - .route("/bot{token}/BanChatMember", web::post().to(ban_chat_member)) - .route( - "/bot{token}/UnbanChatMember", - web::post().to(unban_chat_member), - ) - .route( - "/bot{token}/RestrictChatMember", - web::post().to(restrict_chat_member), - ) - .route( - "/bot{token}/SetMessageReaction", - web::post().to(set_message_reaction), - ) - .route("/bot{token}/SetMyCommands", web::post().to(set_my_commands)) - .route("/file/bot{token}/{file_name}", web::get().to(download_file)) - } - }) - .bind(format!("127.0.0.1:{}", port.lock().unwrap().to_string())) - .unwrap() - .workers(1) - .run(); + let stop_handle = web::Data::new(StopHandle::default()); + // let _ = env_logger::builder() + // .filter_level(log::LevelFilter::Info) + // .format_target(false) + // .format_timestamp(None) + // .try_init(); + let server = HttpServer::new({ + let stop_handle = stop_handle.clone(); + + move || { + App::new() + // .wrap(actix_web::middleware::Logger::default()) + .app_data(stop_handle.clone()) + .app_data(web::Data::new(me.clone())) + .route("/ping", web::get().to(ping)) + .route("/stop/{graceful}", web::post().to(stop)) + .route("/bot{token}/GetFile", web::post().to(get_file)) + .route("/bot{token}/SendMessage", web::post().to(send_message)) + .route("/bot{token}/SendPhoto", web::post().to(send_photo)) + .route("/bot{token}/SendVideo", web::post().to(send_video)) + .route("/bot{token}/SendVoice", web::post().to(send_voice)) + .route("/bot{token}/SendAudio", web::post().to(send_audio)) + .route("/bot{token}/SendVideoNote", web::post().to(send_video_note)) + .route("/bot{token}/SendDocument", web::post().to(send_document)) + .route("/bot{token}/SendAnimation", web::post().to(send_animation)) + .route("/bot{token}/SendLocation", web::post().to(send_location)) + .route("/bot{token}/SendVenue", web::post().to(send_venue)) + .route("/bot{token}/SendContact", web::post().to(send_contact)) + .route("/bot{token}/SendSticker", web::post().to(send_sticker)) + .route( + "/bot{token}/SendChatAction", + web::post().to(send_chat_action), + ) + .route("/bot{token}/SendDice", web::post().to(send_dice)) + .route("/bot{token}/SendPoll", web::post().to(send_poll)) + .route( + "/bot{token}/SendMediaGroup", + web::post().to(send_media_group), + ) + .route( + "/bot{token}/EditMessageText", + web::post().to(edit_message_text), + ) + .route( + "/bot{token}/EditMessageCaption", + web::post().to(edit_message_caption), + ) + .route( + "/bot{token}/EditMessageReplyMarkup", + web::post().to(edit_message_reply_markup), + ) + .route("/bot{token}/DeleteMessage", web::post().to(delete_message)) + .route( + "/bot{token}/ForwardMessage", + web::post().to(forward_message), + ) + .route("/bot{token}/CopyMessage", web::post().to(copy_message)) + .route( + "/bot{token}/AnswerCallbackQuery", + web::post().to(answer_callback_query), + ) + .route( + "/bot{token}/PinChatMessage", + web::post().to(pin_chat_message), + ) + .route( + "/bot{token}/UnpinChatMessage", + web::post().to(unpin_chat_message), + ) + .route( + "/bot{token}/UnpinAllChatMessages", + web::post().to(unpin_all_chat_messages), + ) + .route("/bot{token}/BanChatMember", web::post().to(ban_chat_member)) + .route( + "/bot{token}/UnbanChatMember", + web::post().to(unban_chat_member), + ) + .route( + "/bot{token}/RestrictChatMember", + web::post().to(restrict_chat_member), + ) + .route( + "/bot{token}/SetMessageReaction", + web::post().to(set_message_reaction), + ) + .route("/bot{token}/SetMyCommands", web::post().to(set_my_commands)) + .route("/file/bot{token}/{file_name}", web::get().to(download_file)) + } + }) + .bind(format!("127.0.0.1:{}", port.lock().unwrap().to_string())) + .unwrap() + .workers(1) + .run(); - stop_handle.register(server.handle()); + stop_handle.register(server.handle()); - server.await.unwrap(); - }; + server.await.unwrap(); } #[cfg(test)] From 3767a4deb001408632b848fe2b9a8571115649f4 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 01:12:41 +0000 Subject: [PATCH 020/138] use cancel token --- Cargo.lock | 1 + teloxide_tests/Cargo.toml | 1 + teloxide_tests/src/mock_bot.rs | 9 ++++++++- teloxide_tests/src/server/mod.rs | 10 +++++++++- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 89cae7a..b6c940a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2545,6 +2545,7 @@ dependencies = [ "teloxide", "teloxide_tests_macros 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio", + "tokio-util", "url", ] diff --git a/teloxide_tests/Cargo.toml b/teloxide_tests/Cargo.toml index 7cafdd6..ec30449 100644 --- a/teloxide_tests/Cargo.toml +++ b/teloxide_tests/Cargo.toml @@ -36,6 +36,7 @@ lazy_static = "1.5.0" futures-util = "0.3" actix-web = "4.9" env_logger = "0.11.5" +tokio-util = "0.7.12" [dev-dependencies] serial_test = { version = "3.1.1" } diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 6b6569f..6263aa1 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -13,6 +13,7 @@ use teloxide::{ types::{File, FileMeta, MaybeInaccessibleMessage, MessageId, MessageKind}, }; use teloxide::{dptree::deps, types::UpdateKind}; +use tokio_util::sync::CancellationToken; use crate::dataset::{IntoUpdate, MockMe}; use crate::server::{self, Responses, FILES, MESSAGES}; @@ -334,7 +335,12 @@ impl MockBot { } } - let server = tokio::spawn(server::main(Self::PORT, self.me.lock().unwrap().clone())); // This starts the server in the background + let cancel_token = CancellationToken::new(); + let server = tokio::spawn(server::main( + Self::PORT, + self.me.lock().unwrap().clone(), + cancel_token.clone(), + )); // This starts the server in the background let mut left_tries = 200; while reqwest::get(format!( @@ -373,6 +379,7 @@ impl MockBot { *self.responses.lock().unwrap() = Some(server::RESPONSES.lock().unwrap().clone()); // Store the responses // before they are erased + cancel_token.cancel(); stop_server().await; server.await.unwrap(); // Waits before the server is shut down } diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 4a269af..6072f9f 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -19,6 +19,7 @@ use std::sync::{ Mutex, }; use teloxide::types::{File, Me, Message, MessageId, ReplyMarkup}; +use tokio_util::sync::CancellationToken; #[derive(Clone, Debug)] pub struct SentMessageText { @@ -407,7 +408,7 @@ async fn stop(Path(graceful): Path, stop_handle: web::Data) -> HttpResponse::NoContent().finish() } -pub async fn main(port: Mutex, me: Me) { +pub async fn main(port: Mutex, me: Me, cancel_token: CancellationToken) { // MESSAGES don't care if they are cleaned or not *RESPONSES.lock().unwrap() = Responses::default(); @@ -508,6 +509,13 @@ pub async fn main(port: Mutex, me: Me) { stop_handle.register(server.handle()); + let server_handle = server.handle(); + + tokio::spawn(async move { + cancel_token.cancelled().await; + server_handle.stop(false).await; + }); + server.await.unwrap(); } From 29371dda0082c22f835acc6d5ac3b06f44436187 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 01:39:07 +0000 Subject: [PATCH 021/138] delete a stop_server --- teloxide_tests/src/mock_bot.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 6263aa1..a0a272e 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -380,7 +380,6 @@ impl MockBot { // before they are erased cancel_token.cancel(); - stop_server().await; server.await.unwrap(); // Waits before the server is shut down } From c2632734e5ae9536fb1ceb78789a134e3569b792 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 01:39:41 +0000 Subject: [PATCH 022/138] delete another stop_server block I don't think this is needed anymore since there should only be one bot instance --- teloxide_tests/src/mock_bot.rs | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index a0a272e..1536be6 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -313,28 +313,6 @@ impl MockBot { std::process::exit(1); }); - // In the future, this will need to be redone nicely, but right now it works. - // It prevents a race condition for different bot instances to try to use the same server - // (like in docstring) - stop_server().await; - let mut left_tries = 200; - while reqwest::get(format!( - "http://127.0.0.1:{}/ping", - Self::PORT.lock().unwrap().clone() - )) - .await - .is_ok() - { - left_tries -= 1; - if left_tries == 0 { - self.close_bot().await; - panic!( - "Failed to unbind the server on the port {}!", - Self::PORT.lock().unwrap().clone() - ); - } - } - let cancel_token = CancellationToken::new(); let server = tokio::spawn(server::main( Self::PORT, From ccdb2d9a7c9f4f9c607c7d1e2bdd48d6a5c0e5d5 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 01:42:53 +0000 Subject: [PATCH 023/138] make the ctrl c handler use the cancel token --- teloxide_tests/src/mock_bot.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 1536be6..0732f0f 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -306,14 +306,15 @@ impl MockBot { /// with `get_responses`. All the responses are unique to that dispatch, and will be erased for /// every new dispatch. pub async fn dispatch(&self) { - let runtime = tokio::runtime::Handle::current(); + let cancel_token = CancellationToken::new(); + // If the user presses ctrl-c, the server will be shut down + let cancel_token_clone = cancel_token.clone(); let _ = ctrlc::set_handler(move || { - runtime.block_on(stop_server()); + cancel_token_clone.cancel(); std::process::exit(1); }); - let cancel_token = CancellationToken::new(); let server = tokio::spawn(server::main( Self::PORT, self.me.lock().unwrap().clone(), From da340a0a3c8e99e209fe8d43f06c95d14059118c Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 01:51:34 +0000 Subject: [PATCH 024/138] remove stop_server --- teloxide_tests/src/mock_bot.rs | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 0732f0f..0fdd2bf 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -91,17 +91,6 @@ fn add_message(message: &mut Message) { MESSAGES.add_message(message.clone()); } -async fn stop_server() { - let client = reqwest::Client::new(); - let _ = client - .post(format!( - "http://127.0.0.1:{}/stop/false", - MockBot::PORT.lock().unwrap().clone() - )) - .send() - .await; -} - /// A mocked bot that sends requests to the fake server /// Please check the `new` function docs and [github examples](https://github.com/LasterAlex/teloxide_tests/tree/master/examples) for more information. #[allow(dead_code)] @@ -297,7 +286,6 @@ impl MockBot { } async fn close_bot(&self) { - stop_server().await; *self.bot_lock.lock().unwrap() = None; } @@ -331,6 +319,7 @@ impl MockBot { { left_tries -= 1; if left_tries == 0 { + cancel_token.cancel(); self.close_bot().await; panic!( "Failed to get the server on the port {}!", @@ -349,6 +338,8 @@ impl MockBot { Ok(_) => {} Err(_) => { // Something panicked, we need to free the bot lock and exit + cancel_token.cancel(); + server.await.unwrap(); self.close_bot().await; panic!("Something went wrong and the bot panicked!"); } From 900fb0c22095148f54396590e0d505c47d022db0 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 01:55:00 +0000 Subject: [PATCH 025/138] remove old stop endpoint --- teloxide_tests/src/server/mod.rs | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 6072f9f..9de7504 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -385,49 +385,22 @@ pub async fn log_request(body: web::Json) -> impl Responder { HttpResponse::Ok() } -#[derive(Default)] -struct StopHandle { - inner: parking_lot::Mutex>, -} - -impl StopHandle { - /// Sets the server handle to stop. - pub(crate) fn register(&self, handle: ServerHandle) { - *self.inner.lock() = Some(handle); - } - - /// Sends stop signal through contained server handle. - pub(crate) fn stop(&self, graceful: bool) { - #[allow(clippy::let_underscore_future)] - let _ = self.inner.lock().as_ref().unwrap().stop(graceful); - } -} - -async fn stop(Path(graceful): Path, stop_handle: web::Data) -> HttpResponse { - stop_handle.stop(graceful); - HttpResponse::NoContent().finish() -} - pub async fn main(port: Mutex, me: Me, cancel_token: CancellationToken) { // MESSAGES don't care if they are cleaned or not *RESPONSES.lock().unwrap() = Responses::default(); - let stop_handle = web::Data::new(StopHandle::default()); // let _ = env_logger::builder() // .filter_level(log::LevelFilter::Info) // .format_target(false) // .format_timestamp(None) // .try_init(); - let server = HttpServer::new({ - let stop_handle = stop_handle.clone(); + let server = HttpServer::new({ move || { App::new() // .wrap(actix_web::middleware::Logger::default()) - .app_data(stop_handle.clone()) .app_data(web::Data::new(me.clone())) .route("/ping", web::get().to(ping)) - .route("/stop/{graceful}", web::post().to(stop)) .route("/bot{token}/GetFile", web::post().to(get_file)) .route("/bot{token}/SendMessage", web::post().to(send_message)) .route("/bot{token}/SendPhoto", web::post().to(send_photo)) @@ -507,8 +480,6 @@ pub async fn main(port: Mutex, me: Me, cancel_token: CancellationToken) { .workers(1) .run(); - stop_handle.register(server.handle()); - let server_handle = server.handle(); tokio::spawn(async move { From 6150800abc35c8bfe26cb75ef56311f53310504e Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 02:04:02 +0000 Subject: [PATCH 026/138] remove some unused imports --- teloxide_tests/src/server/mod.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 9de7504..7d33aee 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -1,7 +1,6 @@ //! A fake telegram bot API for testing purposes. Read more in teloxide_tests crate. pub mod routes; -use actix_web::{dev::ServerHandle, web, App, HttpResponse, HttpServer, Responder}; -use actix_web_lab::extract::Path; +use actix_web::{web, App, HttpResponse, HttpServer, Responder}; use lazy_static::lazy_static; use routes::{ answer_callback_query::*, ban_chat_member::*, copy_message::*, delete_message::*, From 0bf22d94bbc1fbf570303b6f667216b8c7deb417 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 03:42:18 +0000 Subject: [PATCH 027/138] fix a couple of clippy warnings --- teloxide_tests/src/server/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 68b4833..880f93d 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -47,7 +47,7 @@ impl MESSAGES { let message = messages.iter().find(|m| m.id.0 == message_id)?; // Find the message // (return None if not found) - let mut json = serde_json::to_value(&message).ok()?; // Convert the message to JSON + let mut json = serde_json::to_value(message).ok()?; // Convert the message to JSON json[field] = serde_json::to_value(value).ok()?; // Edit the field let new_message: Message = serde_json::from_value(json).ok()?; // Convert back to Message @@ -208,7 +208,7 @@ pub async fn main(port: Mutex, me: Me, cancel_token: CancellationToken) { .route("/file/bot{token}/{file_name}", web::get().to(download_file)) } }) - .bind(format!("127.0.0.1:{}", port.lock().unwrap().to_string())) + .bind(format!("127.0.0.1:{}", port.lock().unwrap())) .unwrap() .workers(1) .run(); From 6a450e1220ea505bb9f38f9e23e9be7d6fc169db Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 03:45:18 +0000 Subject: [PATCH 028/138] remove a clone --- teloxide_tests/src/mock_bot.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 034e973..fde799d 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -256,7 +256,7 @@ impl MockBot { self.me.lock().unwrap().clone(), update_lock.clone() // This actually makes an update go through the dptree ]; - let stack_size = self.stack_size.lock().unwrap().clone(); + let stack_size = *self.stack_size.lock().unwrap(); deps.insert_container(self_deps.clone()); // These are nessessary for the dispatch From a8f3e10ee82e0cb8761c58e99d2d406cc4f891f1 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 03:45:27 +0000 Subject: [PATCH 029/138] use an if let --- teloxide_tests/src/mock_bot.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index fde799d..8d9868b 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -50,10 +50,10 @@ fn find_file(value: Value) -> Option { } } } - if file_id.is_some() && file_unique_id.is_some() { + if let (Some(id), Some(unique_id)) = (file_id, file_unique_id) { return Some(FileMeta { - id: file_id.unwrap(), - unique_id: file_unique_id.unwrap(), + id, + unique_id, size: file_size.unwrap_or(0), }); } From 653def6adb621d4772a30c6d6dce0030f012a3e6 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 03:45:47 +0000 Subject: [PATCH 030/138] remove a question mark --- teloxide_tests/src/mock_bot.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 8d9868b..0619fed 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -65,7 +65,7 @@ fn find_chat_id(value: Value) -> Option { if let Value::Object(map) = value { for (k, v) in map { if k == "chat" { - return Some(v["id"].as_i64()?); + return v["id"].as_i64(); } else if let Some(found) = find_chat_id(v) { return Some(found); } From ffc7ddd766c7e082db6ddb5bb4a5657d1d121200 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 03:46:32 +0000 Subject: [PATCH 031/138] remove a borrow --- teloxide_tests/src/mock_bot.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 0619fed..e18132d 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -533,7 +533,7 @@ impl MockBot { let update_lock = updates.first().expect("No updates were detected!"); let chat_id = match update_lock.chat_id() { Some(chat_id) => chat_id, - None => match find_chat_id(serde_json::to_value(&update_lock).unwrap()) { + None => match find_chat_id(serde_json::to_value(update_lock).unwrap()) { Some(id) => ChatId(id), None => { *self.bot_lock.lock().unwrap() = None; From 9ac9ed4776494d285a3c28c2832b9e983d782628 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 11:38:21 +0000 Subject: [PATCH 032/138] remove close_bot The lock should be automatically released when the bot is dropped --- teloxide_tests/src/mock_bot.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index e18132d..602fff1 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -291,10 +291,6 @@ impl MockBot { } } - async fn close_bot(&self) { - *self.bot_lock.lock().unwrap() = None; - } - /// Actually dispatches the bot, calling the update through the handler tree. /// All the requests made through the bot will be stored in `responses`, and can be retrieved /// with `get_responses`. All the responses are unique to that dispatch, and will be erased for @@ -326,7 +322,6 @@ impl MockBot { left_tries -= 1; if left_tries == 0 { cancel_token.cancel(); - self.close_bot().await; panic!( "Failed to get the server on the port {}!", Self::PORT.lock().unwrap().clone() @@ -346,7 +341,6 @@ impl MockBot { // Something panicked, we need to free the bot lock and exit cancel_token.cancel(); server.await.unwrap(); - self.close_bot().await; panic!("Something went wrong and the bot panicked!"); } }; @@ -494,7 +488,6 @@ impl MockBot { Some(id) => ChatId(id), None => { log::error!("No chat id was detected in the update! Did you send an update without a chat identifier? Like MockCallbackQuery without an attached message?"); - self.close_bot().await; panic!("No chat id was detected!"); } }, @@ -514,7 +507,6 @@ impl MockBot { .await .expect("Failed to update dialogue"); } else { - self.close_bot().await; log::error!("No storage was detected! Did you add it to bot.dependencies(deps![get_bot_storage().await]); ?"); panic!("No storage was detected!"); } From b4eea58a899d78f0340cf48583dd2edf904d4fa6 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 11:49:36 +0000 Subject: [PATCH 033/138] simplify bot lock implementation --- teloxide_tests/src/mock_bot.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 602fff1..ae02230 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -20,6 +20,7 @@ use crate::{ dataset::{IntoUpdate, MockMe}, server::Server, }; +use lazy_static::lazy_static; use teloxide::{ dispatching::{ dialogue::{GetChatId, InMemStorage, Storage}, @@ -29,8 +30,11 @@ use teloxide::{ types::Me, }; +lazy_static! { + static ref BOT_LOCK: Arc> = Arc::new(Mutex::new(())); +} + static GET_POTENTIAL_STORAGE_LOCK: Mutex<()> = Mutex::new(()); -static BOT_LOCK: Mutex<()> = Mutex::new(()); fn find_file(value: Value) -> Option { // Recursively searches for file meta @@ -114,8 +118,7 @@ pub struct MockBot { /// Stack size used for dispatching pub stack_size: Mutex, server: Server, - bot_lock: Mutex>>, // Maybe in the future ill make something like an atomic - // bool that says if the bot is locked or not, and implement a custom Drop trait + bot_lock: MutexGuard<'static, ()>, } impl MockBot { @@ -205,9 +208,7 @@ impl MockBot { responses: Mutex::new(None), dependencies: Mutex::new(DependencyMap::new()), stack_size: Mutex::new(Self::DEFAULT_STACK_SIZE), - bot_lock: Mutex::new(Some(lock)), // This makes a lock that forbids the creation of - // other bots until this one goes out of scope. That way there will be no race - // conditions! + bot_lock: lock, } } @@ -528,7 +529,6 @@ impl MockBot { None => match find_chat_id(serde_json::to_value(update_lock).unwrap()) { Some(id) => ChatId(id), None => { - *self.bot_lock.lock().unwrap() = None; panic!("No chat id was detected!"); } }, From 745393841dc3d1e6c897dd2b7d99ba489f7c340e Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 11:54:32 +0000 Subject: [PATCH 034/138] pass in bot token instead of using env --- teloxide_tests/src/mock_bot.rs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index ae02230..0dfe1e6 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -2,7 +2,6 @@ use gag::Gag; use serde_json::Value; use std::{ - env, mem::discriminant, panic, sync::{atomic::AtomicI32, Arc, Mutex, MutexGuard, PoisonError}, @@ -180,16 +179,11 @@ impl MockBot { where T: IntoUpdate, // And that code just "proves" that it can be turned into an update { - unsafe { - env::set_var( - // So that teloxide bot doesn't complain - "TELOXIDE_TOKEN", - "1234567890:QWERTYUIOPASDFGHJKLZXCVBNMQWERTYUIO", - ); - } let _ = pretty_env_logger::try_init(); - let bot = Bot::from_env().set_api_url( + let token = "1234567890:QWERTYUIOPASDFGHJKLZXCVBNMQWERTYUIO"; + + let bot = Bot::new(token).set_api_url( reqwest::Url::parse(&format!( "http://localhost:{}", Self::PORT.lock().unwrap().clone() From 9eb297078021fdbba6b06d8b5b60b781240ab7b8 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 11:57:18 +0000 Subject: [PATCH 035/138] remove the mutex around port --- teloxide_tests/src/mock_bot.rs | 25 +++++++------------------ teloxide_tests/src/server/mod.rs | 4 ++-- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 0dfe1e6..a4d3ac4 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -122,7 +122,7 @@ pub struct MockBot { impl MockBot { const CURRENT_UPDATE_ID: AtomicI32 = AtomicI32::new(0); // So that every update is different - const PORT: Mutex = Mutex::new(6504); + const PORT: u16 = 6504; const DEFAULT_STACK_SIZE: usize = 8 * 1024 * 1024; /// Creates a new MockBot, using something that can be turned into Updates, and a handler tree. @@ -183,13 +183,8 @@ impl MockBot { let token = "1234567890:QWERTYUIOPASDFGHJKLZXCVBNMQWERTYUIO"; - let bot = Bot::new(token).set_api_url( - reqwest::Url::parse(&format!( - "http://localhost:{}", - Self::PORT.lock().unwrap().clone() - )) - .unwrap(), - ); + let bot = Bot::new(token) + .set_api_url(reqwest::Url::parse(&format!("http://localhost:{}", Self::PORT)).unwrap()); let lock = BOT_LOCK.lock().unwrap_or_else(PoisonError::into_inner); let server = Server::new(); // If the lock is poisoned, we don't care, some other bot panicked and can't do anything @@ -307,20 +302,14 @@ impl MockBot { )); // This starts the server in the background let mut left_tries = 200; - while reqwest::get(format!( - "http://127.0.0.1:{}/ping", - Self::PORT.lock().unwrap().clone() - )) - .await - .is_err() + while reqwest::get(format!("http://127.0.0.1:{}/ping", Self::PORT)) + .await + .is_err() { left_tries -= 1; if left_tries == 0 { cancel_token.cancel(); - panic!( - "Failed to get the server on the port {}!", - Self::PORT.lock().unwrap().clone() - ); + panic!("Failed to get the server on the port {}!", Self::PORT); } } diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 880f93d..b6d2512 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -118,7 +118,7 @@ impl Server { } } -pub async fn main(port: Mutex, me: Me, cancel_token: CancellationToken) { +pub async fn main(port: u16, me: Me, cancel_token: CancellationToken) { // MESSAGES don't care if they are cleaned or not *RESPONSES.lock().unwrap() = Responses::default(); @@ -208,7 +208,7 @@ pub async fn main(port: Mutex, me: Me, cancel_token: CancellationToken) { .route("/file/bot{token}/{file_name}", web::get().to(download_file)) } }) - .bind(format!("127.0.0.1:{}", port.lock().unwrap())) + .bind(format!("127.0.0.1:{}", port)) .unwrap() .workers(1) .run(); From 709edc3bfe751e39f84d3a2c39d70f80393f3021 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:09:21 +0000 Subject: [PATCH 036/138] ! remove mutex from responses This is, unfortunately, a breaking change to the api. The dispatch function does modify the bot, so I think it is clearer to use a mut reference rather than interior mutability with a mutex. --- teloxide_tests/src/mock_bot.rs | 30 +++++++++-------- teloxide_tests/src/tests.rs | 60 +++++++++++++++++----------------- 2 files changed, 46 insertions(+), 44 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index a4d3ac4..16deb14 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -113,7 +113,7 @@ pub struct MockBot { /// If you have something like a state, you should add the storage here using .dependencies() pub dependencies: Mutex, /// Caught responses from the server - pub responses: Mutex>, + pub responses: Option, /// Stack size used for dispatching pub stack_size: Mutex, server: Server, @@ -160,7 +160,7 @@ impl MockBot { /// /// #[tokio::main] // Change for tokio::test in your implementation /// async fn main() { - /// let bot = MockBot::new(MockMessageText::new().text("Hi!"), handler_tree()); + /// let mut bot = MockBot::new(MockMessageText::new().text("Hi!"), handler_tree()); /// bot.dispatch().await; /// let responses = bot.get_responses(); /// let message = responses @@ -194,7 +194,7 @@ impl MockBot { me: Mutex::new(MockMe::new().build()), updates: Mutex::new(update.into_update(Self::CURRENT_UPDATE_ID)), handler_tree, - responses: Mutex::new(None), + responses: None, dependencies: Mutex::new(DependencyMap::new()), stack_size: Mutex::new(Self::DEFAULT_STACK_SIZE), bot_lock: lock, @@ -285,7 +285,7 @@ impl MockBot { /// All the requests made through the bot will be stored in `responses`, and can be retrieved /// with `get_responses`. All the responses are unique to that dispatch, and will be erased for /// every new dispatch. - pub async fn dispatch(&self) { + pub async fn dispatch(&mut self) { let cancel_token = CancellationToken::new(); // If the user presses ctrl-c, the server will be shut down @@ -330,8 +330,7 @@ impl MockBot { }; } - *self.responses.lock().unwrap() = Some(server::RESPONSES.lock().unwrap().clone()); // Store the responses - // before they are erased + self.responses = Some(server::RESPONSES.lock().unwrap().clone()); // Store the responses before they are erased cancel_token.cancel(); server.await.unwrap(); // Waits before the server is shut down @@ -341,7 +340,7 @@ impl MockBot { /// Panics if no dispatching was done. /// Should be treated as a variable, because it kinda is pub fn get_responses(&self) -> server::Responses { - let responses = self.responses.lock().unwrap().clone(); + let responses = self.responses.clone(); match responses { Some(responses) => responses, None => { @@ -439,7 +438,7 @@ impl MockBot { /// /// #[tokio::main] /// async fn main() { - /// let bot = MockBot::new(MockMessageText::new().text("Hi!"), handler_tree()); + /// let mut bot = MockBot::new(MockMessageText::new().text("Hi!"), handler_tree()); /// bot.dependencies(deps![InMemStorage::::new()]); /// bot.set_state(State::Start).await; /// // Yes, Start is the default state, but this just shows how it works @@ -544,7 +543,7 @@ impl MockBot { /// Dispatches and checks the last sent message text or caption. Pass in an empty string if you /// want the text or caption to be None - pub async fn dispatch_and_check_last_text(&self, text_or_caption: &str) { + pub async fn dispatch_and_check_last_text(&mut self, text_or_caption: &str) { self.dispatch().await; let responses = self.get_responses(); @@ -564,8 +563,11 @@ impl MockBot { /// Same as `dispatch_and_check_last_text`, but also checks the state. You need to derive /// PartialEq, Clone and Debug for the state like in `set_state` example - pub async fn dispatch_and_check_last_text_and_state(&self, text_or_caption: &str, state: S) - where + pub async fn dispatch_and_check_last_text_and_state( + &mut self, + text_or_caption: &str, + state: S, + ) where S: Send + 'static + Clone + std::fmt::Debug + PartialEq, { self.dispatch().await; @@ -592,7 +594,7 @@ impl MockBot { /// /// For example, `State::Start { some_field: "value" }` and `State::Start { some_field: "other value" }` are the same in this function pub async fn dispatch_and_check_last_text_and_state_discriminant( - &self, + &mut self, text_or_caption: &str, state: S, ) where @@ -623,7 +625,7 @@ impl MockBot { } /// Just checks the state after dispathing the update, like `dispatch_and_check_last_text_and_state` - pub async fn dispatch_and_check_state(&self, state: S) + pub async fn dispatch_and_check_state(&mut self, state: S) where S: Send + 'static + Clone + std::fmt::Debug + PartialEq, { @@ -633,7 +635,7 @@ impl MockBot { } /// Just checks the state discriminant after dispathing the update, like `dispatch_and_check_last_text_and_state_discriminant` - pub async fn dispatch_and_check_state_discriminant(&self, state: S) + pub async fn dispatch_and_check_state_discriminant(&mut self, state: S) where S: Send + 'static + Clone, { diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index c9bf0c1..e345a18 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -68,7 +68,7 @@ fn get_dialogue_schema() -> UpdateHandler::new(); bot.dependencies(deps![storage]); bot.set_state(State::Start).await; @@ -84,7 +84,7 @@ async fn test_echo_with_start_state() { #[tokio::test] async fn test_echo_with_not_start_test() { - let bot = MockBot::new(MockMessageText::new().text("test"), get_dialogue_schema()); + let mut bot = MockBot::new(MockMessageText::new().text("test"), get_dialogue_schema()); let storage = InMemStorage::::new(); bot.dependencies(deps![storage]); bot.set_state(State::NotStart).await; @@ -421,7 +421,7 @@ fn get_schema() -> UpdateHandler Date: Thu, 7 Nov 2024 12:12:15 +0000 Subject: [PATCH 037/138] remove a borrow --- teloxide_tests/src/mock_bot.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 16deb14..43bbe13 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -467,7 +467,7 @@ impl MockBot { let update_lock = updates.first().expect("No updates were detected!"); let chat_id = match update_lock.chat_id() { Some(chat_id) => chat_id, - None => match find_chat_id(serde_json::to_value(&update_lock).unwrap()) { + None => match find_chat_id(serde_json::to_value(update_lock).unwrap()) { Some(id) => ChatId(id), None => { log::error!("No chat id was detected in the update! Did you send an update without a chat identifier? Like MockCallbackQuery without an attached message?"); From 87882eb785b01b696d58dfe13b9605c3740ec0f2 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:14:11 +0000 Subject: [PATCH 038/138] just use a constant for stack size --- teloxide_tests/src/mock_bot.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 43bbe13..a585dc4 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -114,8 +114,6 @@ pub struct MockBot { pub dependencies: Mutex, /// Caught responses from the server pub responses: Option, - /// Stack size used for dispatching - pub stack_size: Mutex, server: Server, bot_lock: MutexGuard<'static, ()>, } @@ -196,7 +194,6 @@ impl MockBot { handler_tree, responses: None, dependencies: Mutex::new(DependencyMap::new()), - stack_size: Mutex::new(Self::DEFAULT_STACK_SIZE), bot_lock: lock, } } @@ -246,7 +243,6 @@ impl MockBot { self.me.lock().unwrap().clone(), update_lock.clone() // This actually makes an update go through the dptree ]; - let stack_size = *self.stack_size.lock().unwrap(); deps.insert_container(self_deps.clone()); // These are nessessary for the dispatch @@ -254,12 +250,12 @@ impl MockBot { let handler_tree = self.handler_tree.clone(); // To fix the stack overflow, a new thread with a new runtime is needed - let builder = std::thread::Builder::new().stack_size(stack_size); + let builder = std::thread::Builder::new().stack_size(Self::DEFAULT_STACK_SIZE); handles.push( builder .spawn(move || { let runtime = tokio::runtime::Builder::new_multi_thread() - .thread_stack_size(stack_size) // Not needed, but just in case + .thread_stack_size(Self::DEFAULT_STACK_SIZE) // Not needed, but just in case .enable_all() .build() .unwrap(); From 127613f5ed4bedc5f192f146c0e563045cb65b36 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:17:57 +0000 Subject: [PATCH 039/138] remove mutex from updates --- teloxide_tests/src/mock_bot.rs | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index a585dc4..bab7833 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -105,9 +105,8 @@ pub struct MockBot { pub bot: Bot, /// The thing that dptree::entry() returns pub handler_tree: UpdateHandler>, - // Mutexes is here to not worry about mut references, its easier for the user without them /// Updates to send as user - pub updates: Mutex>, + pub updates: Vec, /// Bot parameters are here pub me: Mutex, /// If you have something like a state, you should add the storage here using .dependencies() @@ -190,7 +189,7 @@ impl MockBot { server, bot, me: Mutex::new(MockMe::new().build()), - updates: Mutex::new(update.into_update(Self::CURRENT_UPDATE_ID)), + updates: update.into_update(Self::CURRENT_UPDATE_ID), handler_tree, responses: None, dependencies: Mutex::new(DependencyMap::new()), @@ -213,19 +212,18 @@ impl MockBot { /// Sets the updates. Useful for reusing the same mocked bot instance in different tests /// Reminder: You can pass in vec![MockMessagePhoto] or something else! - pub fn update(&self, update: T) { - *self.updates.lock().unwrap() = update.into_update(Self::CURRENT_UPDATE_ID); + pub fn update(&mut self, update: T) { + self.updates = update.into_update(Self::CURRENT_UPDATE_ID); } fn collect_handles(&self, handles: &mut Vec>) { - let updates_lock = self.updates.lock().unwrap().clone(); let self_deps = self.dependencies.lock().unwrap().clone(); - for mut update_lock in updates_lock { - match update_lock.kind.clone() { + for mut update in self.updates.clone() { + match update.kind.clone() { UpdateKind::Message(mut message) => { // Add the message to the list of messages, so the bot can interact with it add_message(&mut message); - update_lock.kind = UpdateKind::Message(message.clone()); + update.kind = UpdateKind::Message(message.clone()); } UpdateKind::CallbackQuery(mut callback) => { if let Some(MaybeInaccessibleMessage::Regular(ref mut message)) = @@ -233,7 +231,7 @@ impl MockBot { { add_message(message); } - update_lock.kind = UpdateKind::CallbackQuery(callback.clone()); + update.kind = UpdateKind::CallbackQuery(callback.clone()); } _ => {} } @@ -241,7 +239,7 @@ impl MockBot { let mut deps = deps![ self.bot.clone(), self.me.lock().unwrap().clone(), - update_lock.clone() // This actually makes an update go through the dptree + update.clone() // This actually makes an update go through the dptree ]; deps.insert_container(self_deps.clone()); // These are nessessary for the dispatch @@ -459,8 +457,7 @@ impl MockBot { S: Send + 'static + Clone, { let (in_mem_storage, erased_storage) = self.get_potential_storages().await; - let updates = self.updates.lock().unwrap().clone(); - let update_lock = updates.first().expect("No updates were detected!"); + let update_lock = self.updates.first().expect("No updates were detected!"); let chat_id = match update_lock.chat_id() { Some(chat_id) => chat_id, None => match find_chat_id(serde_json::to_value(update_lock).unwrap()) { @@ -500,8 +497,7 @@ impl MockBot { S: Send + 'static + Clone, { let (in_mem_storage, erased_storage) = self.get_potential_storages().await; - let updates = self.updates.lock().unwrap().clone(); - let update_lock = updates.first().expect("No updates were detected!"); + let update_lock = self.updates.first().expect("No updates were detected!"); let chat_id = match update_lock.chat_id() { Some(chat_id) => chat_id, None => match find_chat_id(serde_json::to_value(update_lock).unwrap()) { From e6f3c303a359f4802a8974b1f39730b4556af4d9 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:50:49 +0000 Subject: [PATCH 040/138] allow dead code in server struct for the moment --- teloxide_tests/src/server/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index b6d2512..2bb97ba 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -102,10 +102,12 @@ pub async fn log_request(body: web::Json) -> impl Responder { HttpResponse::Ok() } +#[allow(dead_code)] pub struct Server { listener: TcpListener, } +#[allow(dead_code)] impl Server { pub fn new() -> Self { let listener = TcpListener::bind("127.0.0.1:0").unwrap(); From 27b9ac07ebacc7cb5a1ed06d8e3da2f58f7fc3e0 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 12:59:58 +0000 Subject: [PATCH 041/138] change how current update id works --- teloxide_tests/src/dataset/message.rs | 14 ++++++++------ teloxide_tests/src/dataset/mod.rs | 9 ++++++--- teloxide_tests/src/dataset/queries.rs | 14 ++++++++------ teloxide_tests/src/dataset/tests.rs | 4 ++-- teloxide_tests/src/mock_bot.rs | 8 +++++--- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/teloxide_tests/src/dataset/message.rs b/teloxide_tests/src/dataset/message.rs index f03e53b..a83d214 100644 --- a/teloxide_tests/src/dataset/message.rs +++ b/teloxide_tests/src/dataset/message.rs @@ -64,15 +64,17 @@ macro_rules! Message { /// # Example /// ``` /// use teloxide_tests::IntoUpdate; + /// use teloxide::types::{UpdateId, UpdateKind::Message}; + /// use std::sync::atomic::AtomicI32; + /// /// let mock_message = teloxide_tests::MockMessageText::new(); - /// let update = mock_message.clone().into_update(1.into())[0].clone(); - /// assert_eq!(update.id, teloxide::types::UpdateId(1)); - /// assert_eq!(update.kind, teloxide::types::UpdateKind::Message( - /// mock_message.build()) - /// ); + /// let update = mock_message.clone().into_update(&AtomicI32::new(42))[0].clone(); + /// + /// assert_eq!(update.id, UpdateId(42)); + /// assert_eq!(update.kind, Message(mock_message.build())); /// ``` /// - fn into_update(self, id: AtomicI32) -> Vec { + fn into_update(self, id: &AtomicI32) -> Vec { vec![Update { id: UpdateId(id.fetch_add(1, Ordering::Relaxed) as u32), kind: UpdateKind::Message(self.build()), diff --git a/teloxide_tests/src/dataset/mod.rs b/teloxide_tests/src/dataset/mod.rs index 7a5e502..b30a585 100644 --- a/teloxide_tests/src/dataset/mod.rs +++ b/teloxide_tests/src/dataset/mod.rs @@ -23,16 +23,19 @@ mod tests; pub trait IntoUpdate { /// Converts the mocked struct into an update vector, incrementing the id by 1 - fn into_update(self, id: AtomicI32) -> Vec; + fn into_update(self, id: &AtomicI32) -> Vec; } impl IntoUpdate for Vec where T: IntoUpdate, { - fn into_update(self, id: AtomicI32) -> Vec { + fn into_update(self, id: &AtomicI32) -> Vec { self.into_iter() - .map(|u| u.into_update(id.fetch_add(1, Ordering::Relaxed).into())) + .map(|u| { + id.fetch_add(1, Ordering::Relaxed); + u.into_update(id) + }) .flatten() .collect() } diff --git a/teloxide_tests/src/dataset/queries.rs b/teloxide_tests/src/dataset/queries.rs index 58218bb..ef232c4 100644 --- a/teloxide_tests/src/dataset/queries.rs +++ b/teloxide_tests/src/dataset/queries.rs @@ -109,15 +109,17 @@ impl crate::dataset::IntoUpdate for MockCallbackQuery { /// # Example /// ``` /// use teloxide_tests::IntoUpdate; + /// use teloxide::types::{UpdateId, UpdateKind::CallbackQuery}; + /// use std::sync::atomic::AtomicI32; + /// /// let mock_callback_query = teloxide_tests::MockCallbackQuery::new(); - /// let update = mock_callback_query.clone().into_update(1.into())[0].clone(); - /// assert_eq!(update.id, teloxide::types::UpdateId(1)); - /// assert_eq!(update.kind, teloxide::types::UpdateKind::CallbackQuery( - /// mock_callback_query.build()) - /// ); + /// let update = mock_callback_query.clone().into_update(&AtomicI32::new(42))[0].clone(); + /// + /// assert_eq!(update.id, UpdateId(42)); + /// assert_eq!(update.kind, CallbackQuery(mock_callback_query.build())); /// ``` /// - fn into_update(self, id: AtomicI32) -> Vec { + fn into_update(self, id: &AtomicI32) -> Vec { vec![Update { id: UpdateId(id.fetch_add(1, Ordering::Relaxed) as u32), kind: UpdateKind::CallbackQuery(self.build()), diff --git a/teloxide_tests/src/dataset/tests.rs b/teloxide_tests/src/dataset/tests.rs index 4aab71e..9abb1dd 100644 --- a/teloxide_tests/src/dataset/tests.rs +++ b/teloxide_tests/src/dataset/tests.rs @@ -150,9 +150,9 @@ fn test_message_common_text() { fn test_into_update() { let message = MockMessageText::new().text("text"); - let update = message.into_update(1.into())[0].clone(); + let update = message.into_update(&AtomicI32::new(42))[0].clone(); - assert_eq!(update.id, UpdateId(1)); + assert_eq!(update.id, UpdateId(42)); assert_eq!(update.chat_id(), Some(ChatId(MockUser::ID as i64))); } diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index bab7833..a1a5781 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -115,10 +115,10 @@ pub struct MockBot { pub responses: Option, server: Server, bot_lock: MutexGuard<'static, ()>, + current_update_id: AtomicI32, } impl MockBot { - const CURRENT_UPDATE_ID: AtomicI32 = AtomicI32::new(0); // So that every update is different const PORT: u16 = 6504; const DEFAULT_STACK_SIZE: usize = 8 * 1024 * 1024; @@ -184,16 +184,18 @@ impl MockBot { .set_api_url(reqwest::Url::parse(&format!("http://localhost:{}", Self::PORT)).unwrap()); let lock = BOT_LOCK.lock().unwrap_or_else(PoisonError::into_inner); let server = Server::new(); + let current_update_id = AtomicI32::new(42); // If the lock is poisoned, we don't care, some other bot panicked and can't do anything Self { server, bot, me: Mutex::new(MockMe::new().build()), - updates: update.into_update(Self::CURRENT_UPDATE_ID), + updates: update.into_update(¤t_update_id), handler_tree, responses: None, dependencies: Mutex::new(DependencyMap::new()), bot_lock: lock, + current_update_id, } } @@ -213,7 +215,7 @@ impl MockBot { /// Sets the updates. Useful for reusing the same mocked bot instance in different tests /// Reminder: You can pass in vec![MockMessagePhoto] or something else! pub fn update(&mut self, update: T) { - self.updates = update.into_update(Self::CURRENT_UPDATE_ID); + self.updates = update.into_update(&self.current_update_id); } fn collect_handles(&self, handles: &mut Vec>) { From b0f94cab74c96733cbfbb0a52f9031b919ceeb0b Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:04:10 +0000 Subject: [PATCH 042/138] put lock comment back in right place --- teloxide_tests/src/mock_bot.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index a1a5781..6cd9586 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -182,10 +182,12 @@ impl MockBot { let bot = Bot::new(token) .set_api_url(reqwest::Url::parse(&format!("http://localhost:{}", Self::PORT)).unwrap()); - let lock = BOT_LOCK.lock().unwrap_or_else(PoisonError::into_inner); let server = Server::new(); let current_update_id = AtomicI32::new(42); + // If the lock is poisoned, we don't care, some other bot panicked and can't do anything + let lock = BOT_LOCK.lock().unwrap_or_else(PoisonError::into_inner); + Self { server, bot, From 2b3324c5aa60aa14885ec28da6fb554b47059fca Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:09:49 +0000 Subject: [PATCH 043/138] set the bot url within the dispatch function --- teloxide_tests/src/mock_bot.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 6cd9586..2df2da5 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -180,8 +180,7 @@ impl MockBot { let token = "1234567890:QWERTYUIOPASDFGHJKLZXCVBNMQWERTYUIO"; - let bot = Bot::new(token) - .set_api_url(reqwest::Url::parse(&format!("http://localhost:{}", Self::PORT)).unwrap()); + let bot = Bot::new(token); let server = Server::new(); let current_update_id = AtomicI32::new(42); @@ -220,7 +219,7 @@ impl MockBot { self.updates = update.into_update(&self.current_update_id); } - fn collect_handles(&self, handles: &mut Vec>) { + fn collect_handles(&self, handles: &mut Vec>, bot: Bot) { let self_deps = self.dependencies.lock().unwrap().clone(); for mut update in self.updates.clone() { match update.kind.clone() { @@ -241,7 +240,7 @@ impl MockBot { } let mut deps = deps![ - self.bot.clone(), + bot.clone(), self.me.lock().unwrap().clone(), update.clone() // This actually makes an update go through the dptree ]; @@ -284,6 +283,11 @@ impl MockBot { /// with `get_responses`. All the responses are unique to that dispatch, and will be erased for /// every new dispatch. pub async fn dispatch(&mut self) { + let bot = self + .bot + .clone() + .set_api_url(reqwest::Url::parse(&format!("http://localhost:{}", Self::PORT)).unwrap()); + let cancel_token = CancellationToken::new(); // If the user presses ctrl-c, the server will be shut down @@ -313,7 +317,7 @@ impl MockBot { // Gets all of the updates to send let mut handles = vec![]; - self.collect_handles(&mut handles); + self.collect_handles(&mut handles, bot.clone()); for handle in handles { // Waits until every update has been sent From 5b8085d147ddaa2eda4a4dcd9ae452edbed6e040 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:23:21 +0000 Subject: [PATCH 044/138] use a new port each time --- teloxide_tests/src/mock_bot.rs | 17 +++++++++-------- teloxide_tests/src/server/mod.rs | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 2df2da5..dc1827b 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -3,6 +3,7 @@ use gag::Gag; use serde_json::Value; use std::{ mem::discriminant, + net::TcpListener, panic, sync::{atomic::AtomicI32, Arc, Mutex, MutexGuard, PoisonError}, }; @@ -119,7 +120,6 @@ pub struct MockBot { } impl MockBot { - const PORT: u16 = 6504; const DEFAULT_STACK_SIZE: usize = 8 * 1024 * 1024; /// Creates a new MockBot, using something that can be turned into Updates, and a handler tree. @@ -283,10 +283,11 @@ impl MockBot { /// with `get_responses`. All the responses are unique to that dispatch, and will be erased for /// every new dispatch. pub async fn dispatch(&mut self) { - let bot = self - .bot - .clone() - .set_api_url(reqwest::Url::parse(&format!("http://localhost:{}", Self::PORT)).unwrap()); + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + let port = listener.local_addr().unwrap().port(); + let api_url = reqwest::Url::parse(&format!("http://127.0.0.1:{}", port)).unwrap(); + + let bot = self.bot.clone().set_api_url(api_url); let cancel_token = CancellationToken::new(); @@ -298,20 +299,20 @@ impl MockBot { }); let server = tokio::spawn(server::main( - Self::PORT, + listener, self.me.lock().unwrap().clone(), cancel_token.clone(), )); // This starts the server in the background let mut left_tries = 200; - while reqwest::get(format!("http://127.0.0.1:{}/ping", Self::PORT)) + while reqwest::get(format!("http://127.0.0.1:{}/ping", port)) .await .is_err() { left_tries -= 1; if left_tries == 0 { cancel_token.cancel(); - panic!("Failed to get the server on the port {}!", Self::PORT); + panic!("Failed to get the server on the port {}!", port); } } diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 2bb97ba..18d6818 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -120,7 +120,7 @@ impl Server { } } -pub async fn main(port: u16, me: Me, cancel_token: CancellationToken) { +pub async fn main(listener: TcpListener, me: Me, cancel_token: CancellationToken) { // MESSAGES don't care if they are cleaned or not *RESPONSES.lock().unwrap() = Responses::default(); @@ -210,7 +210,7 @@ pub async fn main(port: u16, me: Me, cancel_token: CancellationToken) { .route("/file/bot{token}/{file_name}", web::get().to(download_file)) } }) - .bind(format!("127.0.0.1:{}", port)) + .listen(listener) .unwrap() .workers(1) .run(); From 598a02911d3cf2de77d30c5851f601bdc644f9a0 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:31:03 +0000 Subject: [PATCH 045/138] create the server in the dispatch function --- teloxide_tests/src/mock_bot.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index dc1827b..be6fd70 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -114,7 +114,6 @@ pub struct MockBot { pub dependencies: Mutex, /// Caught responses from the server pub responses: Option, - server: Server, bot_lock: MutexGuard<'static, ()>, current_update_id: AtomicI32, } @@ -179,16 +178,13 @@ impl MockBot { let _ = pretty_env_logger::try_init(); let token = "1234567890:QWERTYUIOPASDFGHJKLZXCVBNMQWERTYUIO"; - let bot = Bot::new(token); - let server = Server::new(); let current_update_id = AtomicI32::new(42); // If the lock is poisoned, we don't care, some other bot panicked and can't do anything let lock = BOT_LOCK.lock().unwrap_or_else(PoisonError::into_inner); Self { - server, bot, me: Mutex::new(MockMe::new().build()), updates: update.into_update(¤t_update_id), @@ -283,6 +279,8 @@ impl MockBot { /// with `get_responses`. All the responses are unique to that dispatch, and will be erased for /// every new dispatch. pub async fn dispatch(&mut self) { + let server = Server::new(); + let listener = TcpListener::bind("127.0.0.1:0").unwrap(); let port = listener.local_addr().unwrap().port(); let api_url = reqwest::Url::parse(&format!("http://127.0.0.1:{}", port)).unwrap(); From 62fa750c9ec8b4874137b7a00b90b879195f0712 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:34:39 +0000 Subject: [PATCH 046/138] turn the addr function into a port function --- teloxide_tests/src/server/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 18d6818..b1d9259 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -115,8 +115,8 @@ impl Server { Self { listener } } - pub fn addr(&self) -> io::Result { - self.listener.local_addr() + pub fn port(&self) -> io::Result { + Ok(self.listener.local_addr()?.port()) } } From f6ecf4dd60e16e801d8bbac275a9d4000c79e461 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:37:11 +0000 Subject: [PATCH 047/138] turn new into start make it async make it return a result --- teloxide_tests/src/mock_bot.rs | 2 +- teloxide_tests/src/server/mod.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index be6fd70..e5c2c42 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -279,7 +279,7 @@ impl MockBot { /// with `get_responses`. All the responses are unique to that dispatch, and will be erased for /// every new dispatch. pub async fn dispatch(&mut self) { - let server = Server::new(); + let server = Server::start().await.unwrap(); let listener = TcpListener::bind("127.0.0.1:0").unwrap(); let port = listener.local_addr().unwrap().port(); diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index b1d9259..a9f365f 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -109,10 +109,10 @@ pub struct Server { #[allow(dead_code)] impl Server { - pub fn new() -> Self { - let listener = TcpListener::bind("127.0.0.1:0").unwrap(); + pub async fn start() -> io::Result { + let listener = TcpListener::bind("127.0.0.1:0")?; - Self { listener } + Ok(Self { listener }) } pub fn port(&self) -> io::Result { From 1158ca183adc39da30a1e7548796dafd82ba204e Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 14:37:45 +0000 Subject: [PATCH 048/138] expose the port as a field --- teloxide_tests/src/server/mod.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index a9f365f..0065083 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -104,19 +104,16 @@ pub async fn log_request(body: web::Json) -> impl Responder { #[allow(dead_code)] pub struct Server { - listener: TcpListener, + pub port: u16, } #[allow(dead_code)] impl Server { pub async fn start() -> io::Result { let listener = TcpListener::bind("127.0.0.1:0")?; + let port = listener.local_addr()?.port(); - Ok(Self { listener }) - } - - pub fn port(&self) -> io::Result { - Ok(self.listener.local_addr()?.port()) + Ok(Self { port }) } } From 9b46173a8ce4f7c2f8953730225aa2c0c1175f72 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 14:53:18 +0000 Subject: [PATCH 049/138] remove the mutex around me --- teloxide_tests/src/mock_bot.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index e5c2c42..ec3d963 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -109,7 +109,7 @@ pub struct MockBot { /// Updates to send as user pub updates: Vec, /// Bot parameters are here - pub me: Mutex, + pub me: Me, /// If you have something like a state, you should add the storage here using .dependencies() pub dependencies: Mutex, /// Caught responses from the server @@ -186,7 +186,7 @@ impl MockBot { Self { bot, - me: Mutex::new(MockMe::new().build()), + me: MockMe::new().build(), updates: update.into_update(¤t_update_id), handler_tree, responses: None, @@ -205,8 +205,8 @@ impl MockBot { } /// Sets the bot parameters, like supports_inline_queries, first_name, etc. - pub fn me(&self, me: MockMe) { - *self.me.lock().unwrap() = me.build(); + pub fn me(&mut self, me: MockMe) { + self.me = me.build(); } /// Sets the updates. Useful for reusing the same mocked bot instance in different tests @@ -237,7 +237,7 @@ impl MockBot { let mut deps = deps![ bot.clone(), - self.me.lock().unwrap().clone(), + self.me.clone(), update.clone() // This actually makes an update go through the dptree ]; @@ -298,7 +298,7 @@ impl MockBot { let server = tokio::spawn(server::main( listener, - self.me.lock().unwrap().clone(), + self.me.clone(), cancel_token.clone(), )); // This starts the server in the background From 521626627d2bb141608fb842fa9e7fad8d800043 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 14:55:30 +0000 Subject: [PATCH 050/138] remove unused import --- teloxide_tests/src/server/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 0065083..6cf891f 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -16,7 +16,7 @@ use routes::{ use serde::Serialize; use std::{ io, - net::{SocketAddr, TcpListener}, + net::TcpListener, sync::{ atomic::{AtomicI32, Ordering}, Mutex, From ec63e9d9d1c8298506264512a1d81752f320668d Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:13:36 +0000 Subject: [PATCH 051/138] actually use the server struct --- teloxide_tests/src/mock_bot.rs | 43 +++----------------------------- teloxide_tests/src/server/mod.rs | 38 ++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 41 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index ec3d963..32d7400 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -3,7 +3,6 @@ use gag::Gag; use serde_json::Value; use std::{ mem::discriminant, - net::TcpListener, panic, sync::{atomic::AtomicI32, Arc, Mutex, MutexGuard, PoisonError}, }; @@ -13,7 +12,6 @@ use teloxide::{ types::{File, FileMeta, MaybeInaccessibleMessage, MessageId, MessageKind}, }; use teloxide::{dptree::deps, types::UpdateKind}; -use tokio_util::sync::CancellationToken; use crate::server::{self, Responses, FILES, MESSAGES}; use crate::{ @@ -279,41 +277,11 @@ impl MockBot { /// with `get_responses`. All the responses are unique to that dispatch, and will be erased for /// every new dispatch. pub async fn dispatch(&mut self) { - let server = Server::start().await.unwrap(); - - let listener = TcpListener::bind("127.0.0.1:0").unwrap(); - let port = listener.local_addr().unwrap().port(); - let api_url = reqwest::Url::parse(&format!("http://127.0.0.1:{}", port)).unwrap(); + let server = Server::start(self.me.clone()).await.unwrap(); + let api_url = reqwest::Url::parse(&format!("http://127.0.0.1:{}", server.port)).unwrap(); let bot = self.bot.clone().set_api_url(api_url); - let cancel_token = CancellationToken::new(); - - // If the user presses ctrl-c, the server will be shut down - let cancel_token_clone = cancel_token.clone(); - let _ = ctrlc::set_handler(move || { - cancel_token_clone.cancel(); - std::process::exit(1); - }); - - let server = tokio::spawn(server::main( - listener, - self.me.clone(), - cancel_token.clone(), - )); // This starts the server in the background - - let mut left_tries = 200; - while reqwest::get(format!("http://127.0.0.1:{}/ping", port)) - .await - .is_err() - { - left_tries -= 1; - if left_tries == 0 { - cancel_token.cancel(); - panic!("Failed to get the server on the port {}!", port); - } - } - // Gets all of the updates to send let mut handles = vec![]; self.collect_handles(&mut handles, bot.clone()); @@ -323,9 +291,7 @@ impl MockBot { match handle.join() { Ok(_) => {} Err(_) => { - // Something panicked, we need to free the bot lock and exit - cancel_token.cancel(); - server.await.unwrap(); + server.stop().await.unwrap(); panic!("Something went wrong and the bot panicked!"); } }; @@ -333,8 +299,7 @@ impl MockBot { self.responses = Some(server::RESPONSES.lock().unwrap().clone()); // Store the responses before they are erased - cancel_token.cancel(); - server.await.unwrap(); // Waits before the server is shut down + server.stop().await.unwrap(); } /// Returns the responses stored in `responses` diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 6cf891f..349bea1 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -23,6 +23,7 @@ use std::{ }, }; use teloxide::types::{File, Me, Message, ReplyMarkup}; +use tokio::task::{JoinError, JoinHandle}; use tokio_util::sync::CancellationToken; pub mod responses; @@ -105,15 +106,48 @@ pub async fn log_request(body: web::Json) -> impl Responder { #[allow(dead_code)] pub struct Server { pub port: u16, + server: JoinHandle<()>, + cancel_token: CancellationToken, } #[allow(dead_code)] impl Server { - pub async fn start() -> io::Result { + pub async fn start(me: Me) -> io::Result { let listener = TcpListener::bind("127.0.0.1:0")?; let port = listener.local_addr()?.port(); - Ok(Self { port }) + let cancel_token = CancellationToken::new(); + + let cancel_token_clone = cancel_token.clone(); + let _ = ctrlc::set_handler(move || { + cancel_token_clone.cancel(); + std::process::exit(1); + }); + + let server = tokio::spawn(main(listener, me, cancel_token.clone())); + + let mut left_tries = 200; + while reqwest::get(format!("http://127.0.0.1:{}/ping", port)) + .await + .is_err() + { + left_tries -= 1; + if left_tries == 0 { + cancel_token.cancel(); + panic!("Failed to get the server on the port {}!", port); + } + } + + Ok(Self { + port, + cancel_token, + server, + }) + } + + pub async fn stop(self) -> Result<(), JoinError> { + self.cancel_token.cancel(); + self.server.await } } From 7a56e2a1ff4b13d4c35ddd640e20210bc30be866 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:12:25 +0000 Subject: [PATCH 052/138] factor out wait for server --- teloxide_tests/src/server/mod.rs | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 349bea1..c961136 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -15,7 +15,7 @@ use routes::{ }; use serde::Serialize; use std::{ - io, + error::Error, net::TcpListener, sync::{ atomic::{AtomicI32, Ordering}, @@ -112,7 +112,7 @@ pub struct Server { #[allow(dead_code)] impl Server { - pub async fn start(me: Me) -> io::Result { + pub async fn start(me: Me) -> Result> { let listener = TcpListener::bind("127.0.0.1:0")?; let port = listener.local_addr()?.port(); @@ -126,16 +126,10 @@ impl Server { let server = tokio::spawn(main(listener, me, cancel_token.clone())); - let mut left_tries = 200; - while reqwest::get(format!("http://127.0.0.1:{}/ping", port)) - .await - .is_err() - { - left_tries -= 1; - if left_tries == 0 { - cancel_token.cancel(); - panic!("Failed to get the server on the port {}!", port); - } + if let Err(err) = Self::wait_for_server(port).await { + cancel_token.cancel(); + server.await?; + return Err(err.into()); } Ok(Self { @@ -149,6 +143,19 @@ impl Server { self.cancel_token.cancel(); self.server.await } + + async fn wait_for_server(port: u16) -> Result<(), String> { + let url = format!("http://127.0.0.1:{}/ping", port); + let max_tries = 200; + + for _ in 0..max_tries { + if reqwest::get(&url).await.is_ok() { + return Ok(()); + } + } + + Err(format!("Failed to get the server on the port {}!", port)) + } } pub async fn main(listener: TcpListener, me: Me, cancel_token: CancellationToken) { From 554dd98499cd18d0c3ba21271c41971995946cc2 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:13:08 +0000 Subject: [PATCH 053/138] remove dead code disable --- teloxide_tests/src/server/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index c961136..208fa3d 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -110,7 +110,6 @@ pub struct Server { cancel_token: CancellationToken, } -#[allow(dead_code)] impl Server { pub async fn start(me: Me) -> Result> { let listener = TcpListener::bind("127.0.0.1:0")?; From 648c67c2bc05537dff31c652b9bd85b0db90f91b Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:13:50 +0000 Subject: [PATCH 054/138] warn on unwrap used on Server --- teloxide_tests/src/server/mod.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 208fa3d..ca3a694 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -110,6 +110,7 @@ pub struct Server { cancel_token: CancellationToken, } +#[warn(clippy::unwrap_used)] impl Server { pub async fn start(me: Me) -> Result> { let listener = TcpListener::bind("127.0.0.1:0")?; From e94699805e71747342ca207e14d09c3c0eaef01f Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:17:41 +0000 Subject: [PATCH 055/138] put back stack size --- teloxide_tests/src/mock_bot.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 32d7400..0ce4379 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -114,6 +114,7 @@ pub struct MockBot { pub responses: Option, bot_lock: MutexGuard<'static, ()>, current_update_id: AtomicI32, + stack_size: usize, } impl MockBot { @@ -191,6 +192,7 @@ impl MockBot { dependencies: Mutex::new(DependencyMap::new()), bot_lock: lock, current_update_id, + stack_size: Self::DEFAULT_STACK_SIZE, } } @@ -244,13 +246,15 @@ impl MockBot { // This, too, will need to be redone in the ideal world, but it just waits until the server is up let handler_tree = self.handler_tree.clone(); + let stack_size = self.stack_size; + // To fix the stack overflow, a new thread with a new runtime is needed - let builder = std::thread::Builder::new().stack_size(Self::DEFAULT_STACK_SIZE); + let builder = std::thread::Builder::new().stack_size(self.stack_size); handles.push( builder .spawn(move || { let runtime = tokio::runtime::Builder::new_multi_thread() - .thread_stack_size(Self::DEFAULT_STACK_SIZE) // Not needed, but just in case + .thread_stack_size(stack_size) // Not needed, but just in case .enable_all() .build() .unwrap(); From b7ebe8e0c3984e0b358563dda43d335ffa5782ca Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:18:59 +0000 Subject: [PATCH 056/138] update_lock -> first_update --- teloxide_tests/src/mock_bot.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 0ce4379..2d25037 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -433,10 +433,10 @@ impl MockBot { S: Send + 'static + Clone, { let (in_mem_storage, erased_storage) = self.get_potential_storages().await; - let update_lock = self.updates.first().expect("No updates were detected!"); - let chat_id = match update_lock.chat_id() { + let first_update = self.updates.first().expect("No updates were detected!"); + let chat_id = match first_update.chat_id() { Some(chat_id) => chat_id, - None => match find_chat_id(serde_json::to_value(update_lock).unwrap()) { + None => match find_chat_id(serde_json::to_value(first_update).unwrap()) { Some(id) => ChatId(id), None => { log::error!("No chat id was detected in the update! Did you send an update without a chat identifier? Like MockCallbackQuery without an attached message?"); @@ -473,10 +473,10 @@ impl MockBot { S: Send + 'static + Clone, { let (in_mem_storage, erased_storage) = self.get_potential_storages().await; - let update_lock = self.updates.first().expect("No updates were detected!"); - let chat_id = match update_lock.chat_id() { + let first_update = self.updates.first().expect("No updates were detected!"); + let chat_id = match first_update.chat_id() { Some(chat_id) => chat_id, - None => match find_chat_id(serde_json::to_value(update_lock).unwrap()) { + None => match find_chat_id(serde_json::to_value(first_update).unwrap()) { Some(id) => ChatId(id), None => { panic!("No chat id was detected!"); From 44e2e027fa28e687a9104be88c5d3f750b1be9ae Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:25:04 +0000 Subject: [PATCH 057/138] newline between pub and private fields --- teloxide_tests/src/mock_bot.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 2d25037..e72f9f9 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -112,6 +112,7 @@ pub struct MockBot { pub dependencies: Mutex, /// Caught responses from the server pub responses: Option, + bot_lock: MutexGuard<'static, ()>, current_update_id: AtomicI32, stack_size: usize, From fbc2690b78065dfee643e999908fa14293de70ce Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:29:40 +0000 Subject: [PATCH 058/138] remove the mutex from deps --- teloxide_tests/src/mock_bot.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index e72f9f9..c3af9e5 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -109,7 +109,7 @@ pub struct MockBot { /// Bot parameters are here pub me: Me, /// If you have something like a state, you should add the storage here using .dependencies() - pub dependencies: Mutex, + pub dependencies: DependencyMap, /// Caught responses from the server pub responses: Option, @@ -190,7 +190,7 @@ impl MockBot { updates: update.into_update(¤t_update_id), handler_tree, responses: None, - dependencies: Mutex::new(DependencyMap::new()), + dependencies: DependencyMap::new(), bot_lock: lock, current_update_id, stack_size: Self::DEFAULT_STACK_SIZE, @@ -201,8 +201,8 @@ impl MockBot { /// Just like in this teloxide example: /// You can use it to add dependencies to your handler tree. /// For more examples - look into `get_state` method documentation - pub fn dependencies(&self, deps: DependencyMap) { - *self.dependencies.lock().unwrap() = deps; + pub fn dependencies(&mut self, deps: DependencyMap) { + self.dependencies = deps; } /// Sets the bot parameters, like supports_inline_queries, first_name, etc. @@ -217,7 +217,7 @@ impl MockBot { } fn collect_handles(&self, handles: &mut Vec>, bot: Bot) { - let self_deps = self.dependencies.lock().unwrap().clone(); + let self_deps = self.dependencies.clone(); for mut update in self.updates.clone() { match update.kind.clone() { UpdateKind::Message(mut message) => { @@ -337,7 +337,7 @@ impl MockBot { let in_mem_storage: Option>>>; let erased_storage: Option>>>; // No trace storage cuz who uses it - let dependencies = Arc::new(self.dependencies.lock().unwrap().clone()); + let dependencies = Arc::new(self.dependencies.clone()); // Get dependencies into Arc cuz otherwise it complaints about &self being moved panic::set_hook(Box::new(|_| { @@ -351,7 +351,7 @@ impl MockBot { .join() .ok(); - let dependencies = Arc::new(self.dependencies.lock().unwrap().clone()); + let dependencies = Arc::new(self.dependencies.clone()); // Dependencies were moved to a prev. thread, so create a new one erased_storage = std::thread::spawn(move || { // The same for ErasedStorage From 55282ea5e816ff9d294406d5291c65a486b6e11a Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:33:11 +0000 Subject: [PATCH 059/138] move run server function to Server and disable unwrap used lint for the moment --- teloxide_tests/src/server/mod.rs | 206 +++++++++++++++---------------- 1 file changed, 103 insertions(+), 103 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index ca3a694..a25583d 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -110,7 +110,7 @@ pub struct Server { cancel_token: CancellationToken, } -#[warn(clippy::unwrap_used)] +// #[warn(clippy::unwrap_used)] impl Server { pub async fn start(me: Me) -> Result> { let listener = TcpListener::bind("127.0.0.1:0")?; @@ -124,7 +124,7 @@ impl Server { std::process::exit(1); }); - let server = tokio::spawn(main(listener, me, cancel_token.clone())); + let server = tokio::spawn(Self::run_server(listener, me, cancel_token.clone())); if let Err(err) = Self::wait_for_server(port).await { cancel_token.cancel(); @@ -156,111 +156,111 @@ impl Server { Err(format!("Failed to get the server on the port {}!", port)) } -} -pub async fn main(listener: TcpListener, me: Me, cancel_token: CancellationToken) { - // MESSAGES don't care if they are cleaned or not - *RESPONSES.lock().unwrap() = Responses::default(); - - // let _ = env_logger::builder() - // .filter_level(log::LevelFilter::Info) - // .format_target(false) - // .format_timestamp(None) - // .try_init(); - - let server = HttpServer::new({ - move || { - App::new() - // .wrap(actix_web::middleware::Logger::default()) - .app_data(web::Data::new(me.clone())) - .route("/ping", web::get().to(ping)) - .route("/bot{token}/GetFile", web::post().to(get_file)) - .route("/bot{token}/SendMessage", web::post().to(send_message)) - .route("/bot{token}/SendPhoto", web::post().to(send_photo)) - .route("/bot{token}/SendVideo", web::post().to(send_video)) - .route("/bot{token}/SendVoice", web::post().to(send_voice)) - .route("/bot{token}/SendAudio", web::post().to(send_audio)) - .route("/bot{token}/SendVideoNote", web::post().to(send_video_note)) - .route("/bot{token}/SendDocument", web::post().to(send_document)) - .route("/bot{token}/SendAnimation", web::post().to(send_animation)) - .route("/bot{token}/SendLocation", web::post().to(send_location)) - .route("/bot{token}/SendVenue", web::post().to(send_venue)) - .route("/bot{token}/SendContact", web::post().to(send_contact)) - .route("/bot{token}/SendSticker", web::post().to(send_sticker)) - .route( - "/bot{token}/SendChatAction", - web::post().to(send_chat_action), - ) - .route("/bot{token}/SendDice", web::post().to(send_dice)) - .route("/bot{token}/SendPoll", web::post().to(send_poll)) - .route( - "/bot{token}/SendMediaGroup", - web::post().to(send_media_group), - ) - .route( - "/bot{token}/EditMessageText", - web::post().to(edit_message_text), - ) - .route( - "/bot{token}/EditMessageCaption", - web::post().to(edit_message_caption), - ) - .route( - "/bot{token}/EditMessageReplyMarkup", - web::post().to(edit_message_reply_markup), - ) - .route("/bot{token}/DeleteMessage", web::post().to(delete_message)) - .route( - "/bot{token}/ForwardMessage", - web::post().to(forward_message), - ) - .route("/bot{token}/CopyMessage", web::post().to(copy_message)) - .route( - "/bot{token}/AnswerCallbackQuery", - web::post().to(answer_callback_query), - ) - .route( - "/bot{token}/PinChatMessage", - web::post().to(pin_chat_message), - ) - .route( - "/bot{token}/UnpinChatMessage", - web::post().to(unpin_chat_message), - ) - .route( - "/bot{token}/UnpinAllChatMessages", - web::post().to(unpin_all_chat_messages), - ) - .route("/bot{token}/BanChatMember", web::post().to(ban_chat_member)) - .route( - "/bot{token}/UnbanChatMember", - web::post().to(unban_chat_member), - ) - .route( - "/bot{token}/RestrictChatMember", - web::post().to(restrict_chat_member), - ) - .route( - "/bot{token}/SetMessageReaction", - web::post().to(set_message_reaction), - ) - .route("/bot{token}/SetMyCommands", web::post().to(set_my_commands)) - .route("/file/bot{token}/{file_name}", web::get().to(download_file)) - } - }) - .listen(listener) - .unwrap() - .workers(1) - .run(); + async fn run_server(listener: TcpListener, me: Me, cancel_token: CancellationToken) { + // MESSAGES don't care if they are cleaned or not + *RESPONSES.lock().unwrap() = Responses::default(); + + // let _ = env_logger::builder() + // .filter_level(log::LevelFilter::Info) + // .format_target(false) + // .format_timestamp(None) + // .try_init(); + + let server = HttpServer::new({ + move || { + App::new() + // .wrap(actix_web::middleware::Logger::default()) + .app_data(web::Data::new(me.clone())) + .route("/ping", web::get().to(ping)) + .route("/bot{token}/GetFile", web::post().to(get_file)) + .route("/bot{token}/SendMessage", web::post().to(send_message)) + .route("/bot{token}/SendPhoto", web::post().to(send_photo)) + .route("/bot{token}/SendVideo", web::post().to(send_video)) + .route("/bot{token}/SendVoice", web::post().to(send_voice)) + .route("/bot{token}/SendAudio", web::post().to(send_audio)) + .route("/bot{token}/SendVideoNote", web::post().to(send_video_note)) + .route("/bot{token}/SendDocument", web::post().to(send_document)) + .route("/bot{token}/SendAnimation", web::post().to(send_animation)) + .route("/bot{token}/SendLocation", web::post().to(send_location)) + .route("/bot{token}/SendVenue", web::post().to(send_venue)) + .route("/bot{token}/SendContact", web::post().to(send_contact)) + .route("/bot{token}/SendSticker", web::post().to(send_sticker)) + .route( + "/bot{token}/SendChatAction", + web::post().to(send_chat_action), + ) + .route("/bot{token}/SendDice", web::post().to(send_dice)) + .route("/bot{token}/SendPoll", web::post().to(send_poll)) + .route( + "/bot{token}/SendMediaGroup", + web::post().to(send_media_group), + ) + .route( + "/bot{token}/EditMessageText", + web::post().to(edit_message_text), + ) + .route( + "/bot{token}/EditMessageCaption", + web::post().to(edit_message_caption), + ) + .route( + "/bot{token}/EditMessageReplyMarkup", + web::post().to(edit_message_reply_markup), + ) + .route("/bot{token}/DeleteMessage", web::post().to(delete_message)) + .route( + "/bot{token}/ForwardMessage", + web::post().to(forward_message), + ) + .route("/bot{token}/CopyMessage", web::post().to(copy_message)) + .route( + "/bot{token}/AnswerCallbackQuery", + web::post().to(answer_callback_query), + ) + .route( + "/bot{token}/PinChatMessage", + web::post().to(pin_chat_message), + ) + .route( + "/bot{token}/UnpinChatMessage", + web::post().to(unpin_chat_message), + ) + .route( + "/bot{token}/UnpinAllChatMessages", + web::post().to(unpin_all_chat_messages), + ) + .route("/bot{token}/BanChatMember", web::post().to(ban_chat_member)) + .route( + "/bot{token}/UnbanChatMember", + web::post().to(unban_chat_member), + ) + .route( + "/bot{token}/RestrictChatMember", + web::post().to(restrict_chat_member), + ) + .route( + "/bot{token}/SetMessageReaction", + web::post().to(set_message_reaction), + ) + .route("/bot{token}/SetMyCommands", web::post().to(set_my_commands)) + .route("/file/bot{token}/{file_name}", web::get().to(download_file)) + } + }) + .listen(listener) + .unwrap() + .workers(1) + .run(); - let server_handle = server.handle(); + let server_handle = server.handle(); - tokio::spawn(async move { - cancel_token.cancelled().await; - server_handle.stop(false).await; - }); + tokio::spawn(async move { + cancel_token.cancelled().await; + server_handle.stop(false).await; + }); - server.await.unwrap(); + server.await.unwrap(); + } } #[cfg(test)] From 43f099eb91cd20597773b3fe9540d957c9c501de Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:34:16 +0000 Subject: [PATCH 060/138] remove commented out logger init --- teloxide_tests/src/server/mod.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index a25583d..e68f8ac 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -161,12 +161,6 @@ impl Server { // MESSAGES don't care if they are cleaned or not *RESPONSES.lock().unwrap() = Responses::default(); - // let _ = env_logger::builder() - // .filter_level(log::LevelFilter::Info) - // .format_target(false) - // .format_timestamp(None) - // .try_init(); - let server = HttpServer::new({ move || { App::new() From 39ee0af7d3f15e060ca52813944cb61acca09496 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:27:24 +0000 Subject: [PATCH 061/138] Run prettier over ci.yml --- .github/workflows/ci.yml | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0018273..b49080a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,8 +1,8 @@ on: push: - branches: [ "master" ] + branches: ["master"] pull_request: - branches: [ "master" ] + branches: ["master"] name: Continuous integration @@ -36,27 +36,27 @@ jobs: - nightly steps: - - uses: actions/checkout@v4 - - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 - - - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} - - - name: Build - run: cargo build --verbose - - - name: Run tests - run: cargo test --verbose + - uses: actions/checkout@v4 + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - run: rustup update ${{ matrix.toolchain }} && rustup default ${{ matrix.toolchain }} + + - name: Build + run: cargo build --verbose + + - name: Run tests + run: cargo test --verbose check-examples: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - - name: Cache Dependencies - uses: Swatinem/rust-cache@v2 + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 - - name: Check examples - run: cargo check --manifest-path=./examples/Cargo.toml + - name: Check examples + run: cargo check --manifest-path=./examples/Cargo.toml From 819e606cba2642df118605a012f4c0e0ec2137e9 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:27:38 +0000 Subject: [PATCH 062/138] Run CI on PRs to any branch --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b49080a..f65c499 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ on: push: branches: ["master"] pull_request: - branches: ["master"] + branches: ["*"] name: Continuous integration From f4dc9f39b4dd06138ebf525dbe2e8a2464d96f5a Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:34:24 +0000 Subject: [PATCH 063/138] Add cargo fmt check --- .github/workflows/ci.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f65c499..4290105 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,3 +60,15 @@ jobs: - name: Check examples run: cargo check --manifest-path=./examples/Cargo.toml + + check-formatting: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: Check formatting + run: cargo fmt --all -- --check From 78dd4d72b7bf6e5fff70c57f0e384d581bd33c7b Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:37:05 +0000 Subject: [PATCH 064/138] Add clippy check --- .github/workflows/ci.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4290105..aae9868 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,3 +72,15 @@ jobs: - name: Check formatting run: cargo fmt --all -- --check + + check-clippy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Cache Dependencies + uses: Swatinem/rust-cache@v2 + + - name: Check clippy + run: cargo clippy --all-targets -- -D warnings From 75b861d061951f1bd10ff2bc0e8fb3bfd7453d2c Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:51:01 +0000 Subject: [PATCH 065/138] Add clippy allows in teloxide_tests --- teloxide_tests/src/lib.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/teloxide_tests/src/lib.rs b/teloxide_tests/src/lib.rs index 80b2275..f6986a9 100644 --- a/teloxide_tests/src/lib.rs +++ b/teloxide_tests/src/lib.rs @@ -140,6 +140,23 @@ html_logo_url = "https://github.com/user-attachments/assets/627beca8-5852-4c70-97e0-5f4fcb5e2040", html_favicon_url = "https://github.com/user-attachments/assets/627beca8-5852-4c70-97e0-5f4fcb5e2040" )] +#![allow(clippy::to_string_in_format_args)] +#![allow(clippy::match_single_binding)] +#![allow(clippy::to_string_in_format_args)] +#![allow(clippy::new_without_default)] +#![allow(clippy::too_many_arguments)] +#![allow(clippy::map_flatten)] +#![allow(clippy::unnecessary_unwrap)] +#![allow(clippy::needless_question_mark)] +#![allow(clippy::borrow_interior_mutable_const)] +#![allow(clippy::declare_interior_mutable_const)] +#![allow(clippy::clone_on_copy)] +#![allow(clippy::needless_borrows_for_generic_args)] +#![allow(clippy::search_is_some)] +#![allow(clippy::unwrap_or_default)] +#![allow(clippy::enum_variant_names)] +#![allow(clippy::needless_return)] + mod dataset; pub mod mock_bot; mod server; From 3b084857f394dcb098427362d6752d219e498f07 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:52:11 +0000 Subject: [PATCH 066/138] Add clippy allows in teloxide_tests_macros --- teloxide_tests_macros/src/lib.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/teloxide_tests_macros/src/lib.rs b/teloxide_tests_macros/src/lib.rs index 10fb338..2479b77 100644 --- a/teloxide_tests_macros/src/lib.rs +++ b/teloxide_tests_macros/src/lib.rs @@ -1,4 +1,8 @@ //! Proc macros for teloxide_tests crate + +#![allow(clippy::match_single_binding)] +#![allow(clippy::to_string_in_format_args)] + use proc_macro::TokenStream; use quote::{quote, ToTokens}; use syn::{parse_macro_input, Data, DeriveInput, Fields, PathArguments, Type, TypeGroup}; From b3f7f19078c3aff91b542456df4d28139c9a2c00 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:53:04 +0000 Subject: [PATCH 067/138] Remove unnecessary clippy disables teloxide_tests --- teloxide_tests/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/teloxide_tests/src/lib.rs b/teloxide_tests/src/lib.rs index f6986a9..749ad8e 100644 --- a/teloxide_tests/src/lib.rs +++ b/teloxide_tests/src/lib.rs @@ -141,8 +141,6 @@ html_favicon_url = "https://github.com/user-attachments/assets/627beca8-5852-4c70-97e0-5f4fcb5e2040" )] #![allow(clippy::to_string_in_format_args)] -#![allow(clippy::match_single_binding)] -#![allow(clippy::to_string_in_format_args)] #![allow(clippy::new_without_default)] #![allow(clippy::too_many_arguments)] #![allow(clippy::map_flatten)] From abfc4febcd3858e98de976674a2bf4f1c3627d05 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:54:51 +0000 Subject: [PATCH 068/138] Add clippy disable for tests --- teloxide_tests/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/teloxide_tests/src/lib.rs b/teloxide_tests/src/lib.rs index 749ad8e..c9a082f 100644 --- a/teloxide_tests/src/lib.rs +++ b/teloxide_tests/src/lib.rs @@ -154,6 +154,7 @@ #![allow(clippy::unwrap_or_default)] #![allow(clippy::enum_variant_names)] #![allow(clippy::needless_return)] +#![allow(clippy::bool_assert_comparison)] mod dataset; pub mod mock_bot; From bb5ece9187fe2c998b143b9a9c2f156ba40c451e Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 22:22:54 +0000 Subject: [PATCH 069/138] rename to ServerManager --- teloxide_tests/src/mock_bot.rs | 4 ++-- teloxide_tests/src/server/mod.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index c3af9e5..34a28c9 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -16,7 +16,7 @@ use teloxide::{dptree::deps, types::UpdateKind}; use crate::server::{self, Responses, FILES, MESSAGES}; use crate::{ dataset::{IntoUpdate, MockMe}, - server::Server, + server::ServerManager, }; use lazy_static::lazy_static; use teloxide::{ @@ -282,7 +282,7 @@ impl MockBot { /// with `get_responses`. All the responses are unique to that dispatch, and will be erased for /// every new dispatch. pub async fn dispatch(&mut self) { - let server = Server::start(self.me.clone()).await.unwrap(); + let server = ServerManager::start(self.me.clone()).await.unwrap(); let api_url = reqwest::Url::parse(&format!("http://127.0.0.1:{}", server.port)).unwrap(); let bot = self.bot.clone().set_api_url(api_url); diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index e68f8ac..619e157 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -104,14 +104,14 @@ pub async fn log_request(body: web::Json) -> impl Responder { } #[allow(dead_code)] -pub struct Server { +pub struct ServerManager { pub port: u16, server: JoinHandle<()>, cancel_token: CancellationToken, } // #[warn(clippy::unwrap_used)] -impl Server { +impl ServerManager { pub async fn start(me: Me) -> Result> { let listener = TcpListener::bind("127.0.0.1:0")?; let port = listener.local_addr()?.port(); From 5eaadfe130afbc76bd4e475b965f18d17dfeaa25 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 22:29:34 +0000 Subject: [PATCH 070/138] split out routes --- teloxide_tests/src/server/mod.rs | 150 ++++++++++++++++--------------- 1 file changed, 77 insertions(+), 73 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 619e157..3b74e88 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -166,79 +166,7 @@ impl ServerManager { App::new() // .wrap(actix_web::middleware::Logger::default()) .app_data(web::Data::new(me.clone())) - .route("/ping", web::get().to(ping)) - .route("/bot{token}/GetFile", web::post().to(get_file)) - .route("/bot{token}/SendMessage", web::post().to(send_message)) - .route("/bot{token}/SendPhoto", web::post().to(send_photo)) - .route("/bot{token}/SendVideo", web::post().to(send_video)) - .route("/bot{token}/SendVoice", web::post().to(send_voice)) - .route("/bot{token}/SendAudio", web::post().to(send_audio)) - .route("/bot{token}/SendVideoNote", web::post().to(send_video_note)) - .route("/bot{token}/SendDocument", web::post().to(send_document)) - .route("/bot{token}/SendAnimation", web::post().to(send_animation)) - .route("/bot{token}/SendLocation", web::post().to(send_location)) - .route("/bot{token}/SendVenue", web::post().to(send_venue)) - .route("/bot{token}/SendContact", web::post().to(send_contact)) - .route("/bot{token}/SendSticker", web::post().to(send_sticker)) - .route( - "/bot{token}/SendChatAction", - web::post().to(send_chat_action), - ) - .route("/bot{token}/SendDice", web::post().to(send_dice)) - .route("/bot{token}/SendPoll", web::post().to(send_poll)) - .route( - "/bot{token}/SendMediaGroup", - web::post().to(send_media_group), - ) - .route( - "/bot{token}/EditMessageText", - web::post().to(edit_message_text), - ) - .route( - "/bot{token}/EditMessageCaption", - web::post().to(edit_message_caption), - ) - .route( - "/bot{token}/EditMessageReplyMarkup", - web::post().to(edit_message_reply_markup), - ) - .route("/bot{token}/DeleteMessage", web::post().to(delete_message)) - .route( - "/bot{token}/ForwardMessage", - web::post().to(forward_message), - ) - .route("/bot{token}/CopyMessage", web::post().to(copy_message)) - .route( - "/bot{token}/AnswerCallbackQuery", - web::post().to(answer_callback_query), - ) - .route( - "/bot{token}/PinChatMessage", - web::post().to(pin_chat_message), - ) - .route( - "/bot{token}/UnpinChatMessage", - web::post().to(unpin_chat_message), - ) - .route( - "/bot{token}/UnpinAllChatMessages", - web::post().to(unpin_all_chat_messages), - ) - .route("/bot{token}/BanChatMember", web::post().to(ban_chat_member)) - .route( - "/bot{token}/UnbanChatMember", - web::post().to(unban_chat_member), - ) - .route( - "/bot{token}/RestrictChatMember", - web::post().to(restrict_chat_member), - ) - .route( - "/bot{token}/SetMessageReaction", - web::post().to(set_message_reaction), - ) - .route("/bot{token}/SetMyCommands", web::post().to(set_my_commands)) - .route("/file/bot{token}/{file_name}", web::get().to(download_file)) + .configure(set_routes) } }) .listen(listener) @@ -257,6 +185,82 @@ impl ServerManager { } } +fn set_routes(cfg: &mut web::ServiceConfig) { + cfg.route("/ping", web::get().to(ping)) + .route("/bot{token}/GetFile", web::post().to(get_file)) + .route("/bot{token}/SendMessage", web::post().to(send_message)) + .route("/bot{token}/SendPhoto", web::post().to(send_photo)) + .route("/bot{token}/SendVideo", web::post().to(send_video)) + .route("/bot{token}/SendVoice", web::post().to(send_voice)) + .route("/bot{token}/SendAudio", web::post().to(send_audio)) + .route("/bot{token}/SendVideoNote", web::post().to(send_video_note)) + .route("/bot{token}/SendDocument", web::post().to(send_document)) + .route("/bot{token}/SendAnimation", web::post().to(send_animation)) + .route("/bot{token}/SendLocation", web::post().to(send_location)) + .route("/bot{token}/SendVenue", web::post().to(send_venue)) + .route("/bot{token}/SendContact", web::post().to(send_contact)) + .route("/bot{token}/SendSticker", web::post().to(send_sticker)) + .route( + "/bot{token}/SendChatAction", + web::post().to(send_chat_action), + ) + .route("/bot{token}/SendDice", web::post().to(send_dice)) + .route("/bot{token}/SendPoll", web::post().to(send_poll)) + .route( + "/bot{token}/SendMediaGroup", + web::post().to(send_media_group), + ) + .route( + "/bot{token}/EditMessageText", + web::post().to(edit_message_text), + ) + .route( + "/bot{token}/EditMessageCaption", + web::post().to(edit_message_caption), + ) + .route( + "/bot{token}/EditMessageReplyMarkup", + web::post().to(edit_message_reply_markup), + ) + .route("/bot{token}/DeleteMessage", web::post().to(delete_message)) + .route( + "/bot{token}/ForwardMessage", + web::post().to(forward_message), + ) + .route("/bot{token}/CopyMessage", web::post().to(copy_message)) + .route( + "/bot{token}/AnswerCallbackQuery", + web::post().to(answer_callback_query), + ) + .route( + "/bot{token}/PinChatMessage", + web::post().to(pin_chat_message), + ) + .route( + "/bot{token}/UnpinChatMessage", + web::post().to(unpin_chat_message), + ) + .route( + "/bot{token}/UnpinAllChatMessages", + web::post().to(unpin_all_chat_messages), + ) + .route("/bot{token}/BanChatMember", web::post().to(ban_chat_member)) + .route( + "/bot{token}/UnbanChatMember", + web::post().to(unban_chat_member), + ) + .route( + "/bot{token}/RestrictChatMember", + web::post().to(restrict_chat_member), + ) + .route( + "/bot{token}/SetMessageReaction", + web::post().to(set_message_reaction), + ) + .route("/bot{token}/SetMyCommands", web::post().to(set_my_commands)) + .route("/file/bot{token}/{file_name}", web::get().to(download_file)); +} + #[cfg(test)] mod tests { use super::*; From 6d0bf8f2fbc4a34272175ce5b6f63474fdca2eb6 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 22:30:09 +0000 Subject: [PATCH 071/138] change order of routes --- teloxide_tests/src/server/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 3b74e88..7dce73e 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -187,6 +187,7 @@ impl ServerManager { fn set_routes(cfg: &mut web::ServiceConfig) { cfg.route("/ping", web::get().to(ping)) + .route("/file/bot{token}/{file_name}", web::get().to(download_file)) .route("/bot{token}/GetFile", web::post().to(get_file)) .route("/bot{token}/SendMessage", web::post().to(send_message)) .route("/bot{token}/SendPhoto", web::post().to(send_photo)) @@ -257,8 +258,7 @@ fn set_routes(cfg: &mut web::ServiceConfig) { "/bot{token}/SetMessageReaction", web::post().to(set_message_reaction), ) - .route("/bot{token}/SetMyCommands", web::post().to(set_my_commands)) - .route("/file/bot{token}/{file_name}", web::get().to(download_file)); + .route("/bot{token}/SetMyCommands", web::post().to(set_my_commands)); } #[cfg(test)] From 28045683eee52c25c261ac6387720e16cd76d11c Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 22:31:52 +0000 Subject: [PATCH 072/138] split out run_server again --- teloxide_tests/src/server/mod.rs | 46 ++++++++++++++++---------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 7dce73e..28ae13b 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -124,7 +124,7 @@ impl ServerManager { std::process::exit(1); }); - let server = tokio::spawn(Self::run_server(listener, me, cancel_token.clone())); + let server = tokio::spawn(run_server(listener, me, cancel_token.clone())); if let Err(err) = Self::wait_for_server(port).await { cancel_token.cancel(); @@ -156,33 +156,33 @@ impl ServerManager { Err(format!("Failed to get the server on the port {}!", port)) } +} - async fn run_server(listener: TcpListener, me: Me, cancel_token: CancellationToken) { - // MESSAGES don't care if they are cleaned or not - *RESPONSES.lock().unwrap() = Responses::default(); +async fn run_server(listener: TcpListener, me: Me, cancel_token: CancellationToken) { + // MESSAGES don't care if they are cleaned or not + *RESPONSES.lock().unwrap() = Responses::default(); - let server = HttpServer::new({ - move || { - App::new() - // .wrap(actix_web::middleware::Logger::default()) - .app_data(web::Data::new(me.clone())) - .configure(set_routes) - } - }) - .listen(listener) - .unwrap() - .workers(1) - .run(); + let server = HttpServer::new({ + move || { + App::new() + // .wrap(actix_web::middleware::Logger::default()) + .app_data(web::Data::new(me.clone())) + .configure(set_routes) + } + }) + .listen(listener) + .unwrap() + .workers(1) + .run(); - let server_handle = server.handle(); + let server_handle = server.handle(); - tokio::spawn(async move { - cancel_token.cancelled().await; - server_handle.stop(false).await; - }); + tokio::spawn(async move { + cancel_token.cancelled().await; + server_handle.stop(false).await; + }); - server.await.unwrap(); - } + server.await.unwrap(); } fn set_routes(cfg: &mut web::ServiceConfig) { From 5b94c56ccbffae91573629d17d37b56b630cbad5 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 22:35:49 +0000 Subject: [PATCH 073/138] separate bot token routes --- teloxide_tests/src/server/mod.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 28ae13b..0c43ae1 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -188,7 +188,11 @@ async fn run_server(listener: TcpListener, me: Me, cancel_token: CancellationTok fn set_routes(cfg: &mut web::ServiceConfig) { cfg.route("/ping", web::get().to(ping)) .route("/file/bot{token}/{file_name}", web::get().to(download_file)) - .route("/bot{token}/GetFile", web::post().to(get_file)) + .configure(set_bot_routes); +} + +fn set_bot_routes(cfg: &mut web::ServiceConfig) { + cfg.route("/bot{token}/GetFile", web::post().to(get_file)) .route("/bot{token}/SendMessage", web::post().to(send_message)) .route("/bot{token}/SendPhoto", web::post().to(send_photo)) .route("/bot{token}/SendVideo", web::post().to(send_video)) From 4523da4ea12997f89ce4c3bbeca1b6db7e71750c Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 22:40:50 +0000 Subject: [PATCH 074/138] factor out the common bot token prefix --- teloxide_tests/src/server/mod.rs | 101 +++++++++++-------------------- 1 file changed, 37 insertions(+), 64 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 0c43ae1..97f8bac 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -1,6 +1,9 @@ //! A fake telegram bot API for testing purposes. Read more in teloxide_tests crate. pub mod routes; -use actix_web::{web, App, HttpResponse, HttpServer, Responder}; +use actix_web::{ + web::{self, scope}, + App, HttpResponse, HttpServer, Responder, +}; use lazy_static::lazy_static; pub use responses::*; use routes::{ @@ -188,81 +191,51 @@ async fn run_server(listener: TcpListener, me: Me, cancel_token: CancellationTok fn set_routes(cfg: &mut web::ServiceConfig) { cfg.route("/ping", web::get().to(ping)) .route("/file/bot{token}/{file_name}", web::get().to(download_file)) - .configure(set_bot_routes); + .service(scope("/bot{token}").configure(set_bot_routes)); } fn set_bot_routes(cfg: &mut web::ServiceConfig) { - cfg.route("/bot{token}/GetFile", web::post().to(get_file)) - .route("/bot{token}/SendMessage", web::post().to(send_message)) - .route("/bot{token}/SendPhoto", web::post().to(send_photo)) - .route("/bot{token}/SendVideo", web::post().to(send_video)) - .route("/bot{token}/SendVoice", web::post().to(send_voice)) - .route("/bot{token}/SendAudio", web::post().to(send_audio)) - .route("/bot{token}/SendVideoNote", web::post().to(send_video_note)) - .route("/bot{token}/SendDocument", web::post().to(send_document)) - .route("/bot{token}/SendAnimation", web::post().to(send_animation)) - .route("/bot{token}/SendLocation", web::post().to(send_location)) - .route("/bot{token}/SendVenue", web::post().to(send_venue)) - .route("/bot{token}/SendContact", web::post().to(send_contact)) - .route("/bot{token}/SendSticker", web::post().to(send_sticker)) - .route( - "/bot{token}/SendChatAction", - web::post().to(send_chat_action), - ) - .route("/bot{token}/SendDice", web::post().to(send_dice)) - .route("/bot{token}/SendPoll", web::post().to(send_poll)) + cfg.route("/GetFile", web::post().to(get_file)) + .route("/SendMessage", web::post().to(send_message)) + .route("/SendPhoto", web::post().to(send_photo)) + .route("/SendVideo", web::post().to(send_video)) + .route("/SendVoice", web::post().to(send_voice)) + .route("/SendAudio", web::post().to(send_audio)) + .route("/SendVideoNote", web::post().to(send_video_note)) + .route("/SendDocument", web::post().to(send_document)) + .route("/SendAnimation", web::post().to(send_animation)) + .route("/SendLocation", web::post().to(send_location)) + .route("/SendVenue", web::post().to(send_venue)) + .route("/SendContact", web::post().to(send_contact)) + .route("/SendSticker", web::post().to(send_sticker)) + .route("/SendChatAction", web::post().to(send_chat_action)) + .route("/SendDice", web::post().to(send_dice)) + .route("/SendPoll", web::post().to(send_poll)) + .route("/SendMediaGroup", web::post().to(send_media_group)) + .route("/EditMessageText", web::post().to(edit_message_text)) + .route("/EditMessageCaption", web::post().to(edit_message_caption)) .route( - "/bot{token}/SendMediaGroup", - web::post().to(send_media_group), - ) - .route( - "/bot{token}/EditMessageText", - web::post().to(edit_message_text), - ) - .route( - "/bot{token}/EditMessageCaption", - web::post().to(edit_message_caption), - ) - .route( - "/bot{token}/EditMessageReplyMarkup", + "/EditMessageReplyMarkup", web::post().to(edit_message_reply_markup), ) - .route("/bot{token}/DeleteMessage", web::post().to(delete_message)) - .route( - "/bot{token}/ForwardMessage", - web::post().to(forward_message), - ) - .route("/bot{token}/CopyMessage", web::post().to(copy_message)) + .route("/DeleteMessage", web::post().to(delete_message)) + .route("/ForwardMessage", web::post().to(forward_message)) + .route("/CopyMessage", web::post().to(copy_message)) .route( - "/bot{token}/AnswerCallbackQuery", + "/AnswerCallbackQuery", web::post().to(answer_callback_query), ) + .route("/PinChatMessage", web::post().to(pin_chat_message)) + .route("/UnpinChatMessage", web::post().to(unpin_chat_message)) .route( - "/bot{token}/PinChatMessage", - web::post().to(pin_chat_message), - ) - .route( - "/bot{token}/UnpinChatMessage", - web::post().to(unpin_chat_message), - ) - .route( - "/bot{token}/UnpinAllChatMessages", + "/UnpinAllChatMessages", web::post().to(unpin_all_chat_messages), ) - .route("/bot{token}/BanChatMember", web::post().to(ban_chat_member)) - .route( - "/bot{token}/UnbanChatMember", - web::post().to(unban_chat_member), - ) - .route( - "/bot{token}/RestrictChatMember", - web::post().to(restrict_chat_member), - ) - .route( - "/bot{token}/SetMessageReaction", - web::post().to(set_message_reaction), - ) - .route("/bot{token}/SetMyCommands", web::post().to(set_my_commands)); + .route("/BanChatMember", web::post().to(ban_chat_member)) + .route("/UnbanChatMember", web::post().to(unban_chat_member)) + .route("/RestrictChatMember", web::post().to(restrict_chat_member)) + .route("/SetMessageReaction", web::post().to(set_message_reaction)) + .route("/SetMyCommands", web::post().to(set_my_commands)); } #[cfg(test)] From 1b807f46f777cd76829e16dc6ae1e1552de0d9d9 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 22:47:27 +0000 Subject: [PATCH 075/138] import web stuff rather than qualify --- teloxide_tests/src/server/mod.rs | 84 +++++++++++++++----------------- 1 file changed, 39 insertions(+), 45 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 97f8bac..e4bf913 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -1,7 +1,7 @@ //! A fake telegram bot API for testing purposes. Read more in teloxide_tests crate. pub mod routes; use actix_web::{ - web::{self, scope}, + web::{get, post, scope, Data, Json, ServiceConfig}, App, HttpResponse, HttpServer, Responder, }; use lazy_static::lazy_static; @@ -101,7 +101,7 @@ pub async fn ping() -> impl Responder { } #[allow(dead_code)] -pub async fn log_request(body: web::Json) -> impl Responder { +pub async fn log_request(body: Json) -> impl Responder { dbg!(body); HttpResponse::Ok() } @@ -169,7 +169,7 @@ async fn run_server(listener: TcpListener, me: Me, cancel_token: CancellationTok move || { App::new() // .wrap(actix_web::middleware::Logger::default()) - .app_data(web::Data::new(me.clone())) + .app_data(Data::new(me.clone())) .configure(set_routes) } }) @@ -188,54 +188,48 @@ async fn run_server(listener: TcpListener, me: Me, cancel_token: CancellationTok server.await.unwrap(); } -fn set_routes(cfg: &mut web::ServiceConfig) { - cfg.route("/ping", web::get().to(ping)) - .route("/file/bot{token}/{file_name}", web::get().to(download_file)) +fn set_routes(cfg: &mut ServiceConfig) { + cfg.route("/ping", get().to(ping)) + .route("/file/bot{token}/{file_name}", get().to(download_file)) .service(scope("/bot{token}").configure(set_bot_routes)); } -fn set_bot_routes(cfg: &mut web::ServiceConfig) { - cfg.route("/GetFile", web::post().to(get_file)) - .route("/SendMessage", web::post().to(send_message)) - .route("/SendPhoto", web::post().to(send_photo)) - .route("/SendVideo", web::post().to(send_video)) - .route("/SendVoice", web::post().to(send_voice)) - .route("/SendAudio", web::post().to(send_audio)) - .route("/SendVideoNote", web::post().to(send_video_note)) - .route("/SendDocument", web::post().to(send_document)) - .route("/SendAnimation", web::post().to(send_animation)) - .route("/SendLocation", web::post().to(send_location)) - .route("/SendVenue", web::post().to(send_venue)) - .route("/SendContact", web::post().to(send_contact)) - .route("/SendSticker", web::post().to(send_sticker)) - .route("/SendChatAction", web::post().to(send_chat_action)) - .route("/SendDice", web::post().to(send_dice)) - .route("/SendPoll", web::post().to(send_poll)) - .route("/SendMediaGroup", web::post().to(send_media_group)) - .route("/EditMessageText", web::post().to(edit_message_text)) - .route("/EditMessageCaption", web::post().to(edit_message_caption)) +fn set_bot_routes(cfg: &mut ServiceConfig) { + cfg.route("/GetFile", post().to(get_file)) + .route("/SendMessage", post().to(send_message)) + .route("/SendPhoto", post().to(send_photo)) + .route("/SendVideo", post().to(send_video)) + .route("/SendVoice", post().to(send_voice)) + .route("/SendAudio", post().to(send_audio)) + .route("/SendVideoNote", post().to(send_video_note)) + .route("/SendDocument", post().to(send_document)) + .route("/SendAnimation", post().to(send_animation)) + .route("/SendLocation", post().to(send_location)) + .route("/SendVenue", post().to(send_venue)) + .route("/SendContact", post().to(send_contact)) + .route("/SendSticker", post().to(send_sticker)) + .route("/SendChatAction", post().to(send_chat_action)) + .route("/SendDice", post().to(send_dice)) + .route("/SendPoll", post().to(send_poll)) + .route("/SendMediaGroup", post().to(send_media_group)) + .route("/EditMessageText", post().to(edit_message_text)) + .route("/EditMessageCaption", post().to(edit_message_caption)) .route( "/EditMessageReplyMarkup", - web::post().to(edit_message_reply_markup), + post().to(edit_message_reply_markup), ) - .route("/DeleteMessage", web::post().to(delete_message)) - .route("/ForwardMessage", web::post().to(forward_message)) - .route("/CopyMessage", web::post().to(copy_message)) - .route( - "/AnswerCallbackQuery", - web::post().to(answer_callback_query), - ) - .route("/PinChatMessage", web::post().to(pin_chat_message)) - .route("/UnpinChatMessage", web::post().to(unpin_chat_message)) - .route( - "/UnpinAllChatMessages", - web::post().to(unpin_all_chat_messages), - ) - .route("/BanChatMember", web::post().to(ban_chat_member)) - .route("/UnbanChatMember", web::post().to(unban_chat_member)) - .route("/RestrictChatMember", web::post().to(restrict_chat_member)) - .route("/SetMessageReaction", web::post().to(set_message_reaction)) - .route("/SetMyCommands", web::post().to(set_my_commands)); + .route("/DeleteMessage", post().to(delete_message)) + .route("/ForwardMessage", post().to(forward_message)) + .route("/CopyMessage", post().to(copy_message)) + .route("/AnswerCallbackQuery", post().to(answer_callback_query)) + .route("/PinChatMessage", post().to(pin_chat_message)) + .route("/UnpinChatMessage", post().to(unpin_chat_message)) + .route("/UnpinAllChatMessages", post().to(unpin_all_chat_messages)) + .route("/BanChatMember", post().to(ban_chat_member)) + .route("/UnbanChatMember", post().to(unban_chat_member)) + .route("/RestrictChatMember", post().to(restrict_chat_member)) + .route("/SetMessageReaction", post().to(set_message_reaction)) + .route("/SetMyCommands", post().to(set_my_commands)); } #[cfg(test)] From b8ab275bd9574809b707d19772bbec744161309e Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 22:59:09 +0000 Subject: [PATCH 076/138] factor out create server --- teloxide_tests/src/server/mod.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index e4bf913..1826c9f 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -19,6 +19,7 @@ use routes::{ use serde::Serialize; use std::{ error::Error, + io, net::TcpListener, sync::{ atomic::{AtomicI32, Ordering}, @@ -165,19 +166,7 @@ async fn run_server(listener: TcpListener, me: Me, cancel_token: CancellationTok // MESSAGES don't care if they are cleaned or not *RESPONSES.lock().unwrap() = Responses::default(); - let server = HttpServer::new({ - move || { - App::new() - // .wrap(actix_web::middleware::Logger::default()) - .app_data(Data::new(me.clone())) - .configure(set_routes) - } - }) - .listen(listener) - .unwrap() - .workers(1) - .run(); - + let server = create_server(listener, me).unwrap(); let server_handle = server.handle(); tokio::spawn(async move { @@ -188,6 +177,17 @@ async fn run_server(listener: TcpListener, me: Me, cancel_token: CancellationTok server.await.unwrap(); } +fn create_server(listener: TcpListener, me: Me) -> io::Result { + Ok(HttpServer::new(move || { + App::new() + .app_data(Data::new(me.clone())) + .configure(set_routes) + }) + .listen(listener)? + .workers(1) + .run()) +} + fn set_routes(cfg: &mut ServiceConfig) { cfg.route("/ping", get().to(ping)) .route("/file/bot{token}/{file_name}", get().to(download_file)) From b7776c4ef7cda48a0cf6018eb769c035a2c2dbc2 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 23:04:31 +0000 Subject: [PATCH 077/138] move wait_for_server out of Server --- teloxide_tests/src/server/mod.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 1826c9f..dc93b3b 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -130,7 +130,7 @@ impl ServerManager { let server = tokio::spawn(run_server(listener, me, cancel_token.clone())); - if let Err(err) = Self::wait_for_server(port).await { + if let Err(err) = wait_for_server(port).await { cancel_token.cancel(); server.await?; return Err(err.into()); @@ -147,19 +147,19 @@ impl ServerManager { self.cancel_token.cancel(); self.server.await } +} - async fn wait_for_server(port: u16) -> Result<(), String> { - let url = format!("http://127.0.0.1:{}/ping", port); - let max_tries = 200; +async fn wait_for_server(port: u16) -> Result<(), String> { + let url = format!("http://127.0.0.1:{}/ping", port); + let max_tries = 200; - for _ in 0..max_tries { - if reqwest::get(&url).await.is_ok() { - return Ok(()); - } + for _ in 0..max_tries { + if reqwest::get(&url).await.is_ok() { + return Ok(()); } - - Err(format!("Failed to get the server on the port {}!", port)) } + + Err(format!("Failed to get the server on the port {}!", port)) } async fn run_server(listener: TcpListener, me: Me, cancel_token: CancellationToken) { From 91828ad376b2c6a45ec059793490378b66e97c17 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 23:05:13 +0000 Subject: [PATCH 078/138] turn on unwrap_used again --- teloxide_tests/src/server/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index dc93b3b..ee462a8 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -114,7 +114,7 @@ pub struct ServerManager { cancel_token: CancellationToken, } -// #[warn(clippy::unwrap_used)] +#[warn(clippy::unwrap_used)] impl ServerManager { pub async fn start(me: Me) -> Result> { let listener = TcpListener::bind("127.0.0.1:0")?; From 36bd146b43a1d3c35bca8c2498f5619c291b279e Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 7 Nov 2024 23:38:26 +0000 Subject: [PATCH 079/138] change control c handler setup --- teloxide_tests/src/server/mod.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index ee462a8..78a3f2f 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -122,11 +122,13 @@ impl ServerManager { let cancel_token = CancellationToken::new(); - let cancel_token_clone = cancel_token.clone(); - let _ = ctrlc::set_handler(move || { - cancel_token_clone.cancel(); - std::process::exit(1); - }); + { + let cancel_token = cancel_token.clone(); + ctrlc::set_handler(move || { + cancel_token.cancel(); + std::process::exit(1); + })?; + } let server = tokio::spawn(run_server(listener, me, cancel_token.clone())); From 40854a12e4661381fc016c41b40f0c086ea121f7 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 00:12:03 +0000 Subject: [PATCH 080/138] delete ctrlc handler As it turns out, set_handler was erroring the whole time. This value was just being ignored. So I'm removing this for the moment --- teloxide_tests/src/server/mod.rs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 78a3f2f..620e7cd 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -121,15 +121,6 @@ impl ServerManager { let port = listener.local_addr()?.port(); let cancel_token = CancellationToken::new(); - - { - let cancel_token = cancel_token.clone(); - ctrlc::set_handler(move || { - cancel_token.cancel(); - std::process::exit(1); - })?; - } - let server = tokio::spawn(run_server(listener, me, cancel_token.clone())); if let Err(err) = wait_for_server(port).await { From 208854b8d4d0965bfe2994bd148dbcecec2476f0 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 00:15:13 +0000 Subject: [PATCH 081/138] inject ServerState to hold files etc. --- teloxide_tests/src/server/mod.rs | 34 +++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 620e7cd..3fdad47 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -23,7 +23,7 @@ use std::{ net::TcpListener, sync::{ atomic::{AtomicI32, Ordering}, - Mutex, + Arc, Mutex, }, }; use teloxide::types::{File, Me, Message, ReplyMarkup}; @@ -107,11 +107,17 @@ pub async fn log_request(body: Json) -> impl Responder { HttpResponse::Ok() } +#[derive(Default)] +struct ServerState { + files: Mutex>, +} + #[allow(dead_code)] pub struct ServerManager { pub port: u16, server: JoinHandle<()>, cancel_token: CancellationToken, + state: Arc, } #[warn(clippy::unwrap_used)] @@ -121,7 +127,14 @@ impl ServerManager { let port = listener.local_addr()?.port(); let cancel_token = CancellationToken::new(); - let server = tokio::spawn(run_server(listener, me, cancel_token.clone())); + let state = Arc::new(ServerState::default()); + + let server = tokio::spawn(run_server( + listener, + me, + state.clone(), + cancel_token.clone(), + )); if let Err(err) = wait_for_server(port).await { cancel_token.cancel(); @@ -133,6 +146,7 @@ impl ServerManager { port, cancel_token, server, + state, }) } @@ -155,11 +169,16 @@ async fn wait_for_server(port: u16) -> Result<(), String> { Err(format!("Failed to get the server on the port {}!", port)) } -async fn run_server(listener: TcpListener, me: Me, cancel_token: CancellationToken) { +async fn run_server( + listener: TcpListener, + me: Me, + state: Arc, + cancel_token: CancellationToken, +) { // MESSAGES don't care if they are cleaned or not *RESPONSES.lock().unwrap() = Responses::default(); - let server = create_server(listener, me).unwrap(); + let server = create_server(listener, me, state).unwrap(); let server_handle = server.handle(); tokio::spawn(async move { @@ -170,10 +189,15 @@ async fn run_server(listener: TcpListener, me: Me, cancel_token: CancellationTok server.await.unwrap(); } -fn create_server(listener: TcpListener, me: Me) -> io::Result { +fn create_server( + listener: TcpListener, + me: Me, + state: Arc, +) -> io::Result { Ok(HttpServer::new(move || { App::new() .app_data(Data::new(me.clone())) + .app_data(Data::from(state.clone())) .configure(set_routes) }) .listen(listener)? From 9c92e0f86ceaf9acb042f9bdb368f144c0db7570 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 01:16:24 +0000 Subject: [PATCH 082/138] rename ServerState to State --- teloxide_tests/src/server/mod.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 3fdad47..91309b4 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -108,7 +108,7 @@ pub async fn log_request(body: Json) -> impl Responder { } #[derive(Default)] -struct ServerState { +struct State { files: Mutex>, } @@ -117,7 +117,7 @@ pub struct ServerManager { pub port: u16, server: JoinHandle<()>, cancel_token: CancellationToken, - state: Arc, + state: Arc, } #[warn(clippy::unwrap_used)] @@ -127,7 +127,7 @@ impl ServerManager { let port = listener.local_addr()?.port(); let cancel_token = CancellationToken::new(); - let state = Arc::new(ServerState::default()); + let state = Arc::new(State::default()); let server = tokio::spawn(run_server( listener, @@ -172,7 +172,7 @@ async fn wait_for_server(port: u16) -> Result<(), String> { async fn run_server( listener: TcpListener, me: Me, - state: Arc, + state: Arc, cancel_token: CancellationToken, ) { // MESSAGES don't care if they are cleaned or not @@ -192,7 +192,7 @@ async fn run_server( fn create_server( listener: TcpListener, me: Me, - state: Arc, + state: Arc, ) -> io::Result { Ok(HttpServer::new(move || { App::new() From dd1a1ed35b7b92e7bb762915e770077dd20b02dd Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 01:17:23 +0000 Subject: [PATCH 083/138] move State to mock_bot --- teloxide_tests/src/mock_bot.rs | 5 +++++ teloxide_tests/src/server/mod.rs | 7 ++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 34a28c9..2910011 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -96,6 +96,11 @@ fn add_message(message: &mut Message) { MESSAGES.add_message(message.clone()); } +#[derive(Default)] +pub struct State { + files: Mutex>, +} + /// A mocked bot that sends requests to the fake server /// Please check the `new` function docs and [github examples](https://github.com/LasterAlex/teloxide_tests/tree/master/examples) for more information. #[allow(dead_code)] diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 91309b4..ca56a5a 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -30,6 +30,8 @@ use teloxide::types::{File, Me, Message, ReplyMarkup}; use tokio::task::{JoinError, JoinHandle}; use tokio_util::sync::CancellationToken; +use crate::mock_bot::State; + pub mod responses; lazy_static! { @@ -107,11 +109,6 @@ pub async fn log_request(body: Json) -> impl Responder { HttpResponse::Ok() } -#[derive(Default)] -struct State { - files: Mutex>, -} - #[allow(dead_code)] pub struct ServerManager { pub port: u16, From 6b08c280183ca4afff1f856d5051f83c7eefa5ca Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 01:20:41 +0000 Subject: [PATCH 084/138] store state in mock bot not server --- teloxide_tests/src/mock_bot.rs | 7 ++++++- teloxide_tests/src/server/mod.rs | 5 +---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 2910011..36e6e31 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -121,6 +121,7 @@ pub struct MockBot { bot_lock: MutexGuard<'static, ()>, current_update_id: AtomicI32, stack_size: usize, + state: Arc, } impl MockBot { @@ -185,6 +186,7 @@ impl MockBot { let token = "1234567890:QWERTYUIOPASDFGHJKLZXCVBNMQWERTYUIO"; let bot = Bot::new(token); let current_update_id = AtomicI32::new(42); + let state = Arc::new(State::default()); // If the lock is poisoned, we don't care, some other bot panicked and can't do anything let lock = BOT_LOCK.lock().unwrap_or_else(PoisonError::into_inner); @@ -199,6 +201,7 @@ impl MockBot { bot_lock: lock, current_update_id, stack_size: Self::DEFAULT_STACK_SIZE, + state, } } @@ -287,7 +290,9 @@ impl MockBot { /// with `get_responses`. All the responses are unique to that dispatch, and will be erased for /// every new dispatch. pub async fn dispatch(&mut self) { - let server = ServerManager::start(self.me.clone()).await.unwrap(); + let server = ServerManager::start(self.me.clone(), self.state.clone()) + .await + .unwrap(); let api_url = reqwest::Url::parse(&format!("http://127.0.0.1:{}", server.port)).unwrap(); let bot = self.bot.clone().set_api_url(api_url); diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index ca56a5a..c10a161 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -114,17 +114,15 @@ pub struct ServerManager { pub port: u16, server: JoinHandle<()>, cancel_token: CancellationToken, - state: Arc, } #[warn(clippy::unwrap_used)] impl ServerManager { - pub async fn start(me: Me) -> Result> { + pub async fn start(me: Me, state: Arc) -> Result> { let listener = TcpListener::bind("127.0.0.1:0")?; let port = listener.local_addr()?.port(); let cancel_token = CancellationToken::new(); - let state = Arc::new(State::default()); let server = tokio::spawn(run_server( listener, @@ -143,7 +141,6 @@ impl ServerManager { port, cancel_token, server, - state, }) } From 4b37b4ade2851352db785811769cc2114a99da72 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 01:31:19 +0000 Subject: [PATCH 085/138] replace global FILES --- teloxide_tests/src/mock_bot.rs | 14 +++++++------- teloxide_tests/src/server/mod.rs | 5 ++--- .../src/server/routes/download_file.rs | 10 +++++++--- teloxide_tests/src/server/routes/get_file.rs | 6 +++--- .../src/server/routes/send_animation.rs | 11 ++++++++--- teloxide_tests/src/server/routes/send_audio.rs | 11 ++++++++--- .../src/server/routes/send_document.rs | 13 ++++++++----- .../src/server/routes/send_media_group.rs | 17 +++++++++++------ teloxide_tests/src/server/routes/send_photo.rs | 14 +++++++++----- .../src/server/routes/send_sticker.rs | 11 ++++++++--- teloxide_tests/src/server/routes/send_video.rs | 13 ++++++++----- .../src/server/routes/send_video_note.rs | 11 ++++++++--- teloxide_tests/src/server/routes/send_voice.rs | 11 ++++++++--- 13 files changed, 95 insertions(+), 52 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 36e6e31..4b7f1bf 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -13,7 +13,7 @@ use teloxide::{ }; use teloxide::{dptree::deps, types::UpdateKind}; -use crate::server::{self, Responses, FILES, MESSAGES}; +use crate::server::{self, Responses, MESSAGES}; use crate::{ dataset::{IntoUpdate, MockMe}, server::ServerManager, @@ -76,7 +76,7 @@ fn find_chat_id(value: Value) -> Option { None } -fn add_message(message: &mut Message) { +fn add_message(message: &mut Message, state: Arc) { let max_id = MESSAGES.max_message_id(); if message.id.0 <= max_id || MESSAGES.get_message(message.id.0).is_some() { message.id = MessageId(max_id + 1); @@ -86,11 +86,11 @@ fn add_message(message: &mut Message) { meta: file_meta, path: "some_path.txt".to_string(), // This doesn't really matter }; - FILES.lock().unwrap().push(file); + state.files.lock().unwrap().push(file); } if let MessageKind::Common(ref mut message_kind) = message.kind { if let Some(ref mut reply_message) = message_kind.reply_to_message { - add_message(reply_message); + add_message(reply_message, state); } } MESSAGES.add_message(message.clone()); @@ -98,7 +98,7 @@ fn add_message(message: &mut Message) { #[derive(Default)] pub struct State { - files: Mutex>, + pub files: Mutex>, } /// A mocked bot that sends requests to the fake server @@ -230,14 +230,14 @@ impl MockBot { match update.kind.clone() { UpdateKind::Message(mut message) => { // Add the message to the list of messages, so the bot can interact with it - add_message(&mut message); + add_message(&mut message, self.state.clone()); update.kind = UpdateKind::Message(message.clone()); } UpdateKind::CallbackQuery(mut callback) => { if let Some(MaybeInaccessibleMessage::Regular(ref mut message)) = callback.message { - add_message(message); + add_message(message, self.state.clone()); } update.kind = UpdateKind::CallbackQuery(callback.clone()); } diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index c10a161..4baaf48 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -26,7 +26,7 @@ use std::{ Arc, Mutex, }, }; -use teloxide::types::{File, Me, Message, ReplyMarkup}; +use teloxide::types::{Me, Message, ReplyMarkup}; use tokio::task::{JoinError, JoinHandle}; use tokio_util::sync::CancellationToken; @@ -36,8 +36,7 @@ pub mod responses; lazy_static! { pub static ref MESSAGES: Mutex> = Mutex::new(vec![]); // Messages storage, just in case - pub static ref FILES: Mutex> = Mutex::new(vec![]); // Messages storage, just in case - pub static ref RESPONSES: Mutex = Mutex::new(Responses::default()); // + pub static ref RESPONSES: Mutex = Mutex::new(Responses::default()); pub static ref LAST_MESSAGE_ID: AtomicI32 = AtomicI32::new(0); } diff --git a/teloxide_tests/src/server/routes/download_file.rs b/teloxide_tests/src/server/routes/download_file.rs index 0fc890c..1172273 100644 --- a/teloxide_tests/src/server/routes/download_file.rs +++ b/teloxide_tests/src/server/routes/download_file.rs @@ -7,10 +7,14 @@ use actix_web::{ }; use futures_util::{future::ok, stream::once}; -use crate::server::FILES; +use crate::mock_bot::State; -pub async fn download_file(path: web::Path<(String, String)>) -> HttpResponse { - if FILES +pub async fn download_file( + path: web::Path<(String, String)>, + state: web::Data, +) -> HttpResponse { + if state + .files .lock() .unwrap() .clone() diff --git a/teloxide_tests/src/server/routes/get_file.rs b/teloxide_tests/src/server/routes/get_file.rs index a8af917..5272aa9 100644 --- a/teloxide_tests/src/server/routes/get_file.rs +++ b/teloxide_tests/src/server/routes/get_file.rs @@ -1,7 +1,7 @@ use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use crate::server::FILES; +use crate::mock_bot::State; use super::make_telegram_result; @@ -10,8 +10,8 @@ pub struct GetFileQuery { file_id: String, } -pub async fn get_file(query: web::Json) -> impl Responder { - let lock = FILES.lock().unwrap(); +pub async fn get_file(query: web::Json, state: web::Data) -> impl Responder { + let lock = state.files.lock().unwrap(); let Some(file) = lock.iter().find(|f| f.id == query.file_id) else { return ErrorBadRequest("File not found").into(); }; diff --git a/teloxide_tests/src/server/routes/send_animation.rs b/teloxide_tests/src/server/routes/send_animation.rs index 700275a..c430560 100644 --- a/teloxide_tests/src/server/routes/send_animation.rs +++ b/teloxide_tests/src/server/routes/send_animation.rs @@ -1,3 +1,4 @@ +use crate::mock_bot::State; use crate::server::routes::Attachment; use crate::server::routes::{FileType, SerializeRawFields}; use crate::server::SentMessageAnimation; @@ -14,11 +15,15 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, FILES, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; -pub async fn send_animation(mut payload: Multipart, me: web::Data) -> impl Responder { +pub async fn send_animation( + mut payload: Multipart, + me: web::Data, + state: web::Data, +) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageAnimationBody::serialize_raw_fields(&fields, &attachments, FileType::Animation) @@ -61,7 +66,7 @@ pub async fn send_animation(mut payload: Multipart, me: web::Data) -> impl R let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - FILES.lock().unwrap().push(teloxide::types::File { + state.files.lock().unwrap().push(teloxide::types::File { meta: message.animation().unwrap().file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_audio.rs b/teloxide_tests/src/server/routes/send_audio.rs index 7907ee1..7d66dde 100644 --- a/teloxide_tests/src/server/routes/send_audio.rs +++ b/teloxide_tests/src/server/routes/send_audio.rs @@ -1,3 +1,4 @@ +use crate::mock_bot::State; use crate::server::routes::Attachment; use crate::{ server::{ @@ -17,11 +18,15 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, FILES, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; -pub async fn send_audio(mut payload: Multipart, me: web::Data) -> impl Responder { +pub async fn send_audio( + mut payload: Multipart, + me: web::Data, + state: web::Data, +) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageAudioBody::serialize_raw_fields(&fields, &attachments, FileType::Audio).unwrap(); @@ -57,7 +62,7 @@ pub async fn send_audio(mut payload: Multipart, me: web::Data) -> impl Respo let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - FILES.lock().unwrap().push(teloxide::types::File { + state.files.lock().unwrap().push(teloxide::types::File { meta: message.audio().unwrap().file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_document.rs b/teloxide_tests/src/server/routes/send_document.rs index 8cc07b0..d005884 100644 --- a/teloxide_tests/src/server/routes/send_document.rs +++ b/teloxide_tests/src/server/routes/send_document.rs @@ -1,3 +1,4 @@ +use crate::mock_bot::State; use crate::server::routes::Attachment; use crate::server::routes::{FileType, SerializeRawFields}; use std::collections::HashMap; @@ -13,13 +14,15 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters}; -use crate::server::{ - routes::check_if_message_exists, SentMessageDocument, FILES, MESSAGES, RESPONSES, -}; +use crate::server::{routes::check_if_message_exists, SentMessageDocument, MESSAGES, RESPONSES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; -pub async fn send_document(mut payload: Multipart, me: web::Data) -> impl Responder { +pub async fn send_document( + mut payload: Multipart, + me: web::Data, + state: web::Data, +) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageDocumentBody::serialize_raw_fields(&fields, &attachments, FileType::Document) @@ -58,7 +61,7 @@ pub async fn send_document(mut payload: Multipart, me: web::Data) -> impl Re let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - FILES.lock().unwrap().push(teloxide::types::File { + state.files.lock().unwrap().push(teloxide::types::File { meta: message.document().unwrap().file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_media_group.rs b/teloxide_tests/src/server/routes/send_media_group.rs index aeadc55..5ac882b 100644 --- a/teloxide_tests/src/server/routes/send_media_group.rs +++ b/teloxide_tests/src/server/routes/send_media_group.rs @@ -1,4 +1,5 @@ -use crate::server::{SentMediaGroup, FILES, MESSAGES, RESPONSES}; +use crate::mock_bot::State; +use crate::server::{SentMediaGroup, MESSAGES, RESPONSES}; use crate::{ MockMessageAudio, MockMessageDocument, MockMessagePhoto, MockMessageVideo, MockPhotoSize, MockVideo, @@ -21,7 +22,11 @@ use super::{ MediaGroupInputMediaVideo, }; -pub async fn send_media_group(mut payload: Multipart, me: web::Data) -> impl Responder { +pub async fn send_media_group( + mut payload: Multipart, + me: web::Data, + state: web::Data, +) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMediaGroupBody::serialize_raw_fields(&fields, &attachments).unwrap(); if body.media.len() > 10 { @@ -72,7 +77,7 @@ pub async fn send_media_group(mut payload: Multipart, me: web::Data) -> impl mock_message.id = MessageId(last_id + 1); message = mock_message.build(); - FILES.lock().unwrap().push(teloxide::types::File { + state.files.lock().unwrap().push(teloxide::types::File { meta: message.audio().unwrap().file.clone(), path: audio.file_name.clone(), }); @@ -98,7 +103,7 @@ pub async fn send_media_group(mut payload: Multipart, me: web::Data) -> impl mock_message.id = MessageId(last_id + 1); message = mock_message.build(); - FILES.lock().unwrap().push(teloxide::types::File { + state.files.lock().unwrap().push(teloxide::types::File { meta: message.document().unwrap().file.clone(), path: document.file_name.clone(), }); @@ -125,7 +130,7 @@ pub async fn send_media_group(mut payload: Multipart, me: web::Data) -> impl mock_message.id = MessageId(last_id + 1); message = mock_message.build(); - FILES.lock().unwrap().push(teloxide::types::File { + state.files.lock().unwrap().push(teloxide::types::File { meta: message.photo().unwrap().first().unwrap().clone().file, path: photo.file_name.clone(), }); @@ -157,7 +162,7 @@ pub async fn send_media_group(mut payload: Multipart, me: web::Data) -> impl mock_message.id = MessageId(last_id + 1); message = mock_message.build(); - FILES.lock().unwrap().push(teloxide::types::File { + state.files.lock().unwrap().push(teloxide::types::File { meta: message.video().unwrap().file.clone(), path: video.file_name.clone(), }); diff --git a/teloxide_tests/src/server/routes/send_photo.rs b/teloxide_tests/src/server/routes/send_photo.rs index 689b004..d736e36 100644 --- a/teloxide_tests/src/server/routes/send_photo.rs +++ b/teloxide_tests/src/server/routes/send_photo.rs @@ -1,5 +1,7 @@ +use crate::mock_bot::State; use crate::server::routes::Attachment; use crate::server::routes::{FileType, SerializeRawFields}; + use std::collections::HashMap; use crate::dataset::{MockMessagePhoto, MockPhotoSize}; @@ -13,13 +15,15 @@ use teloxide::types::{ LinkPreviewOptions, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, }; -use crate::server::{ - routes::check_if_message_exists, SentMessagePhoto, FILES, MESSAGES, RESPONSES, -}; +use crate::server::{routes::check_if_message_exists, SentMessagePhoto, MESSAGES, RESPONSES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; -pub async fn send_photo(mut payload: Multipart, me: web::Data) -> impl Responder { +pub async fn send_photo( + mut payload: Multipart, + me: web::Data, + state: web::Data, +) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessagePhotoBody::serialize_raw_fields(&fields, &attachments, FileType::Photo).unwrap(); @@ -53,7 +57,7 @@ pub async fn send_photo(mut payload: Multipart, me: web::Data) -> impl Respo let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - FILES.lock().unwrap().push(teloxide::types::File { + state.files.lock().unwrap().push(teloxide::types::File { meta: message.photo().unwrap()[0].file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_sticker.rs b/teloxide_tests/src/server/routes/send_sticker.rs index 19f10fa..15c0a93 100644 --- a/teloxide_tests/src/server/routes/send_sticker.rs +++ b/teloxide_tests/src/server/routes/send_sticker.rs @@ -1,3 +1,4 @@ +use crate::mock_bot::State; use crate::server::routes::Attachment; use crate::server::routes::{FileType, SerializeRawFields}; use crate::server::SentMessageSticker; @@ -11,11 +12,15 @@ use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::{Me, ReplyMarkup, ReplyParameters}; -use crate::server::{routes::check_if_message_exists, FILES, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; -pub async fn send_sticker(mut payload: Multipart, me: web::Data) -> impl Responder { +pub async fn send_sticker( + mut payload: Multipart, + me: web::Data, + state: web::Data, +) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageStickerBody::serialize_raw_fields(&fields, &attachments, FileType::Sticker) @@ -42,7 +47,7 @@ pub async fn send_sticker(mut payload: Multipart, me: web::Data) -> impl Res let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - FILES.lock().unwrap().push(teloxide::types::File { + state.files.lock().unwrap().push(teloxide::types::File { meta: message.sticker().unwrap().file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_video.rs b/teloxide_tests/src/server/routes/send_video.rs index 78bdba0..81c72fe 100644 --- a/teloxide_tests/src/server/routes/send_video.rs +++ b/teloxide_tests/src/server/routes/send_video.rs @@ -1,3 +1,4 @@ +use crate::mock_bot::State; use crate::server::routes::Attachment; use crate::server::routes::{FileType, SerializeRawFields}; use std::collections::HashMap; @@ -13,13 +14,15 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{ - routes::check_if_message_exists, SentMessageVideo, FILES, MESSAGES, RESPONSES, -}; +use crate::server::{routes::check_if_message_exists, SentMessageVideo, MESSAGES, RESPONSES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; -pub async fn send_video(mut payload: Multipart, me: web::Data) -> impl Responder { +pub async fn send_video( + mut payload: Multipart, + me: web::Data, + state: web::Data, +) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageVideoBody::serialize_raw_fields(&fields, &attachments, FileType::Video).unwrap(); @@ -58,7 +61,7 @@ pub async fn send_video(mut payload: Multipart, me: web::Data) -> impl Respo let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - FILES.lock().unwrap().push(teloxide::types::File { + state.files.lock().unwrap().push(teloxide::types::File { meta: message.video().unwrap().file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_video_note.rs b/teloxide_tests/src/server/routes/send_video_note.rs index 9dd50b3..75e4d95 100644 --- a/teloxide_tests/src/server/routes/send_video_note.rs +++ b/teloxide_tests/src/server/routes/send_video_note.rs @@ -1,3 +1,4 @@ +use crate::mock_bot::State; use crate::server::routes::Attachment; use crate::{ server::{ @@ -16,11 +17,15 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, FILES, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; -pub async fn send_video_note(mut payload: Multipart, me: web::Data) -> impl Responder { +pub async fn send_video_note( + mut payload: Multipart, + me: web::Data, + state: web::Data, +) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageVideoNoteBody::serialize_raw_fields(&fields, &attachments, FileType::Voice) @@ -52,7 +57,7 @@ pub async fn send_video_note(mut payload: Multipart, me: web::Data) -> impl let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - FILES.lock().unwrap().push(teloxide::types::File { + state.files.lock().unwrap().push(teloxide::types::File { meta: message.video_note().unwrap().file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_voice.rs b/teloxide_tests/src/server/routes/send_voice.rs index 0a398e7..2bbdb44 100644 --- a/teloxide_tests/src/server/routes/send_voice.rs +++ b/teloxide_tests/src/server/routes/send_voice.rs @@ -1,3 +1,4 @@ +use crate::mock_bot::State; use crate::server::routes::Attachment; use crate::{ server::{ @@ -17,11 +18,15 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, FILES, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; -pub async fn send_voice(mut payload: Multipart, me: web::Data) -> impl Responder { +pub async fn send_voice( + mut payload: Multipart, + me: web::Data, + state: web::Data, +) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageVoiceBody::serialize_raw_fields(&fields, &attachments, FileType::Voice).unwrap(); @@ -54,7 +59,7 @@ pub async fn send_voice(mut payload: Multipart, me: web::Data) -> impl Respo let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - FILES.lock().unwrap().push(teloxide::types::File { + state.files.lock().unwrap().push(teloxide::types::File { meta: message.voice().unwrap().file.clone(), path: body.file_name.to_owned(), }); From d4031509aecbd2c88b627b44655a7d59790b02db Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 01:33:25 +0000 Subject: [PATCH 086/138] remove dead code disable on MockBot --- teloxide_tests/src/mock_bot.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 4b7f1bf..e3404bd 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -103,7 +103,6 @@ pub struct State { /// A mocked bot that sends requests to the fake server /// Please check the `new` function docs and [github examples](https://github.com/LasterAlex/teloxide_tests/tree/master/examples) for more information. -#[allow(dead_code)] pub struct MockBot { /// The bot with a fake server url pub bot: Bot, @@ -118,10 +117,10 @@ pub struct MockBot { /// Caught responses from the server pub responses: Option, - bot_lock: MutexGuard<'static, ()>, current_update_id: AtomicI32, stack_size: usize, state: Arc, + _bot_lock: MutexGuard<'static, ()>, } impl MockBot { @@ -198,7 +197,7 @@ impl MockBot { handler_tree, responses: None, dependencies: DependencyMap::new(), - bot_lock: lock, + _bot_lock: lock, current_update_id, stack_size: Self::DEFAULT_STACK_SIZE, state, From 25abc8f0c212c8bbef08214c623c472c361c061a Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 12:19:44 +0000 Subject: [PATCH 087/138] put the mutex around all of State --- teloxide_tests/src/mock_bot.rs | 10 +++++----- teloxide_tests/src/server/mod.rs | 6 +++--- teloxide_tests/src/server/routes/download_file.rs | 6 +++--- teloxide_tests/src/server/routes/get_file.rs | 11 ++++++++--- teloxide_tests/src/server/routes/send_animation.rs | 5 +++-- teloxide_tests/src/server/routes/send_audio.rs | 5 +++-- teloxide_tests/src/server/routes/send_document.rs | 5 +++-- teloxide_tests/src/server/routes/send_media_group.rs | 11 ++++++----- teloxide_tests/src/server/routes/send_photo.rs | 5 +++-- teloxide_tests/src/server/routes/send_sticker.rs | 5 +++-- teloxide_tests/src/server/routes/send_video.rs | 5 +++-- teloxide_tests/src/server/routes/send_video_note.rs | 5 +++-- teloxide_tests/src/server/routes/send_voice.rs | 5 +++-- 13 files changed, 49 insertions(+), 35 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index e3404bd..e1cf4d5 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -76,7 +76,7 @@ fn find_chat_id(value: Value) -> Option { None } -fn add_message(message: &mut Message, state: Arc) { +fn add_message(message: &mut Message, state: Arc>) { let max_id = MESSAGES.max_message_id(); if message.id.0 <= max_id || MESSAGES.get_message(message.id.0).is_some() { message.id = MessageId(max_id + 1); @@ -86,7 +86,7 @@ fn add_message(message: &mut Message, state: Arc) { meta: file_meta, path: "some_path.txt".to_string(), // This doesn't really matter }; - state.files.lock().unwrap().push(file); + state.lock().unwrap().files.push(file); } if let MessageKind::Common(ref mut message_kind) = message.kind { if let Some(ref mut reply_message) = message_kind.reply_to_message { @@ -98,7 +98,7 @@ fn add_message(message: &mut Message, state: Arc) { #[derive(Default)] pub struct State { - pub files: Mutex>, + pub files: Vec, } /// A mocked bot that sends requests to the fake server @@ -119,7 +119,7 @@ pub struct MockBot { current_update_id: AtomicI32, stack_size: usize, - state: Arc, + state: Arc>, _bot_lock: MutexGuard<'static, ()>, } @@ -185,7 +185,7 @@ impl MockBot { let token = "1234567890:QWERTYUIOPASDFGHJKLZXCVBNMQWERTYUIO"; let bot = Bot::new(token); let current_update_id = AtomicI32::new(42); - let state = Arc::new(State::default()); + let state = Arc::new(Mutex::new(State::default())); // If the lock is poisoned, we don't care, some other bot panicked and can't do anything let lock = BOT_LOCK.lock().unwrap_or_else(PoisonError::into_inner); diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 4baaf48..f942f32 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -117,7 +117,7 @@ pub struct ServerManager { #[warn(clippy::unwrap_used)] impl ServerManager { - pub async fn start(me: Me, state: Arc) -> Result> { + pub async fn start(me: Me, state: Arc>) -> Result> { let listener = TcpListener::bind("127.0.0.1:0")?; let port = listener.local_addr()?.port(); @@ -165,7 +165,7 @@ async fn wait_for_server(port: u16) -> Result<(), String> { async fn run_server( listener: TcpListener, me: Me, - state: Arc, + state: Arc>, cancel_token: CancellationToken, ) { // MESSAGES don't care if they are cleaned or not @@ -185,7 +185,7 @@ async fn run_server( fn create_server( listener: TcpListener, me: Me, - state: Arc, + state: Arc>, ) -> io::Result { Ok(HttpServer::new(move || { App::new() diff --git a/teloxide_tests/src/server/routes/download_file.rs b/teloxide_tests/src/server/routes/download_file.rs index 1172273..67d07f6 100644 --- a/teloxide_tests/src/server/routes/download_file.rs +++ b/teloxide_tests/src/server/routes/download_file.rs @@ -1,4 +1,4 @@ -use std::fmt::Error; +use std::{fmt::Error, sync::Mutex}; use actix_web::{ error::ErrorBadRequest, @@ -11,12 +11,12 @@ use crate::mock_bot::State; pub async fn download_file( path: web::Path<(String, String)>, - state: web::Data, + state: web::Data>, ) -> HttpResponse { if state - .files .lock() .unwrap() + .files .clone() .into_iter() .find(|f| f.path == path.1) diff --git a/teloxide_tests/src/server/routes/get_file.rs b/teloxide_tests/src/server/routes/get_file.rs index 5272aa9..7821b13 100644 --- a/teloxide_tests/src/server/routes/get_file.rs +++ b/teloxide_tests/src/server/routes/get_file.rs @@ -1,3 +1,5 @@ +use std::sync::Mutex; + use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; @@ -10,9 +12,12 @@ pub struct GetFileQuery { file_id: String, } -pub async fn get_file(query: web::Json, state: web::Data) -> impl Responder { - let lock = state.files.lock().unwrap(); - let Some(file) = lock.iter().find(|f| f.id == query.file_id) else { +pub async fn get_file( + query: web::Json, + state: web::Data>, +) -> impl Responder { + let lock = state.lock().unwrap(); + let Some(file) = lock.files.iter().find(|f| f.id == query.file_id) else { return ErrorBadRequest("File not found").into(); }; make_telegram_result(file) diff --git a/teloxide_tests/src/server/routes/send_animation.rs b/teloxide_tests/src/server/routes/send_animation.rs index c430560..3af2f29 100644 --- a/teloxide_tests/src/server/routes/send_animation.rs +++ b/teloxide_tests/src/server/routes/send_animation.rs @@ -5,6 +5,7 @@ use crate::server::SentMessageAnimation; use crate::MockMessageAnimation; use std::collections::HashMap; use std::str::FromStr; +use std::sync::Mutex; use crate::proc_macros::SerializeRawFields; use actix_multipart::Multipart; @@ -22,7 +23,7 @@ use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; pub async fn send_animation( mut payload: Multipart, me: web::Data, - state: web::Data, + state: web::Data>, ) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = @@ -66,7 +67,7 @@ pub async fn send_animation( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.files.lock().unwrap().push(teloxide::types::File { + state.lock().unwrap().files.push(teloxide::types::File { meta: message.animation().unwrap().file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_audio.rs b/teloxide_tests/src/server/routes/send_audio.rs index 7d66dde..3259e49 100644 --- a/teloxide_tests/src/server/routes/send_audio.rs +++ b/teloxide_tests/src/server/routes/send_audio.rs @@ -7,6 +7,7 @@ use crate::{ }, MockMessageAudio, }; +use std::sync::Mutex; use std::{collections::HashMap, str::FromStr}; use crate::proc_macros::SerializeRawFields; @@ -25,7 +26,7 @@ use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; pub async fn send_audio( mut payload: Multipart, me: web::Data, - state: web::Data, + state: web::Data>, ) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = @@ -62,7 +63,7 @@ pub async fn send_audio( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.files.lock().unwrap().push(teloxide::types::File { + state.lock().unwrap().files.push(teloxide::types::File { meta: message.audio().unwrap().file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_document.rs b/teloxide_tests/src/server/routes/send_document.rs index d005884..adc12da 100644 --- a/teloxide_tests/src/server/routes/send_document.rs +++ b/teloxide_tests/src/server/routes/send_document.rs @@ -3,6 +3,7 @@ use crate::server::routes::Attachment; use crate::server::routes::{FileType, SerializeRawFields}; use std::collections::HashMap; use std::str::FromStr; +use std::sync::Mutex; use crate::dataset::MockMessageDocument; use crate::proc_macros::SerializeRawFields; @@ -21,7 +22,7 @@ use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; pub async fn send_document( mut payload: Multipart, me: web::Data, - state: web::Data, + state: web::Data>, ) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = @@ -61,7 +62,7 @@ pub async fn send_document( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.files.lock().unwrap().push(teloxide::types::File { + state.lock().unwrap().files.push(teloxide::types::File { meta: message.document().unwrap().file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_media_group.rs b/teloxide_tests/src/server/routes/send_media_group.rs index 5ac882b..969ddc5 100644 --- a/teloxide_tests/src/server/routes/send_media_group.rs +++ b/teloxide_tests/src/server/routes/send_media_group.rs @@ -5,6 +5,7 @@ use crate::{ MockVideo, }; use std::collections::HashMap; +use std::sync::Mutex; use actix_multipart::Multipart; use actix_web::Responder; @@ -25,7 +26,7 @@ use super::{ pub async fn send_media_group( mut payload: Multipart, me: web::Data, - state: web::Data, + state: web::Data>, ) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMediaGroupBody::serialize_raw_fields(&fields, &attachments).unwrap(); @@ -77,7 +78,7 @@ pub async fn send_media_group( mock_message.id = MessageId(last_id + 1); message = mock_message.build(); - state.files.lock().unwrap().push(teloxide::types::File { + state.lock().unwrap().files.push(teloxide::types::File { meta: message.audio().unwrap().file.clone(), path: audio.file_name.clone(), }); @@ -103,7 +104,7 @@ pub async fn send_media_group( mock_message.id = MessageId(last_id + 1); message = mock_message.build(); - state.files.lock().unwrap().push(teloxide::types::File { + state.lock().unwrap().files.push(teloxide::types::File { meta: message.document().unwrap().file.clone(), path: document.file_name.clone(), }); @@ -130,7 +131,7 @@ pub async fn send_media_group( mock_message.id = MessageId(last_id + 1); message = mock_message.build(); - state.files.lock().unwrap().push(teloxide::types::File { + state.lock().unwrap().files.push(teloxide::types::File { meta: message.photo().unwrap().first().unwrap().clone().file, path: photo.file_name.clone(), }); @@ -162,7 +163,7 @@ pub async fn send_media_group( mock_message.id = MessageId(last_id + 1); message = mock_message.build(); - state.files.lock().unwrap().push(teloxide::types::File { + state.lock().unwrap().files.push(teloxide::types::File { meta: message.video().unwrap().file.clone(), path: video.file_name.clone(), }); diff --git a/teloxide_tests/src/server/routes/send_photo.rs b/teloxide_tests/src/server/routes/send_photo.rs index d736e36..25b3eb9 100644 --- a/teloxide_tests/src/server/routes/send_photo.rs +++ b/teloxide_tests/src/server/routes/send_photo.rs @@ -3,6 +3,7 @@ use crate::server::routes::Attachment; use crate::server::routes::{FileType, SerializeRawFields}; use std::collections::HashMap; +use std::sync::Mutex; use crate::dataset::{MockMessagePhoto, MockPhotoSize}; use crate::proc_macros::SerializeRawFields; @@ -22,7 +23,7 @@ use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; pub async fn send_photo( mut payload: Multipart, me: web::Data, - state: web::Data, + state: web::Data>, ) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = @@ -57,7 +58,7 @@ pub async fn send_photo( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.files.lock().unwrap().push(teloxide::types::File { + state.lock().unwrap().files.push(teloxide::types::File { meta: message.photo().unwrap()[0].file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_sticker.rs b/teloxide_tests/src/server/routes/send_sticker.rs index 15c0a93..49812d9 100644 --- a/teloxide_tests/src/server/routes/send_sticker.rs +++ b/teloxide_tests/src/server/routes/send_sticker.rs @@ -4,6 +4,7 @@ use crate::server::routes::{FileType, SerializeRawFields}; use crate::server::SentMessageSticker; use crate::MockMessageSticker; use std::collections::HashMap; +use std::sync::Mutex; use crate::proc_macros::SerializeRawFields; use actix_multipart::Multipart; @@ -19,7 +20,7 @@ use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; pub async fn send_sticker( mut payload: Multipart, me: web::Data, - state: web::Data, + state: web::Data>, ) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = @@ -47,7 +48,7 @@ pub async fn send_sticker( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.files.lock().unwrap().push(teloxide::types::File { + state.lock().unwrap().files.push(teloxide::types::File { meta: message.sticker().unwrap().file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_video.rs b/teloxide_tests/src/server/routes/send_video.rs index 81c72fe..2ccdfe1 100644 --- a/teloxide_tests/src/server/routes/send_video.rs +++ b/teloxide_tests/src/server/routes/send_video.rs @@ -3,6 +3,7 @@ use crate::server::routes::Attachment; use crate::server::routes::{FileType, SerializeRawFields}; use std::collections::HashMap; use std::str::FromStr; +use std::sync::Mutex; use crate::dataset::{MockMessageVideo, MockVideo}; use crate::proc_macros::SerializeRawFields; @@ -21,7 +22,7 @@ use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; pub async fn send_video( mut payload: Multipart, me: web::Data, - state: web::Data, + state: web::Data>, ) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = @@ -61,7 +62,7 @@ pub async fn send_video( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.files.lock().unwrap().push(teloxide::types::File { + state.lock().unwrap().files.push(teloxide::types::File { meta: message.video().unwrap().file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_video_note.rs b/teloxide_tests/src/server/routes/send_video_note.rs index 75e4d95..f66c5b5 100644 --- a/teloxide_tests/src/server/routes/send_video_note.rs +++ b/teloxide_tests/src/server/routes/send_video_note.rs @@ -8,6 +8,7 @@ use crate::{ MockMessageVideoNote, }; use std::collections::HashMap; +use std::sync::Mutex; use crate::proc_macros::SerializeRawFields; use actix_multipart::Multipart; @@ -24,7 +25,7 @@ use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; pub async fn send_video_note( mut payload: Multipart, me: web::Data, - state: web::Data, + state: web::Data>, ) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = @@ -57,7 +58,7 @@ pub async fn send_video_note( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.files.lock().unwrap().push(teloxide::types::File { + state.lock().unwrap().files.push(teloxide::types::File { meta: message.video_note().unwrap().file.clone(), path: body.file_name.to_owned(), }); diff --git a/teloxide_tests/src/server/routes/send_voice.rs b/teloxide_tests/src/server/routes/send_voice.rs index 2bbdb44..a3bf24e 100644 --- a/teloxide_tests/src/server/routes/send_voice.rs +++ b/teloxide_tests/src/server/routes/send_voice.rs @@ -7,6 +7,7 @@ use crate::{ }, MockMessageVoice, }; +use std::sync::Mutex; use std::{collections::HashMap, str::FromStr}; use crate::proc_macros::SerializeRawFields; @@ -25,7 +26,7 @@ use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; pub async fn send_voice( mut payload: Multipart, me: web::Data, - state: web::Data, + state: web::Data>, ) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = @@ -59,7 +60,7 @@ pub async fn send_voice( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.files.lock().unwrap().push(teloxide::types::File { + state.lock().unwrap().files.push(teloxide::types::File { meta: message.voice().unwrap().file.clone(), path: body.file_name.to_owned(), }); From 9cd7a9658c150eaaadb5fabffeeb6c769ddf6a7e Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 12:33:47 +0000 Subject: [PATCH 088/138] remove parking_lot from the top level at least --- Cargo.lock | 1 - teloxide_tests/Cargo.toml | 1 - 2 files changed, 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b6c940a..663e832 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2535,7 +2535,6 @@ dependencies = [ "log", "mime", "mime_guess", - "parking_lot", "pretty_env_logger", "rand", "reqwest", diff --git a/teloxide_tests/Cargo.toml b/teloxide_tests/Cargo.toml index ec30449..5834782 100644 --- a/teloxide_tests/Cargo.toml +++ b/teloxide_tests/Cargo.toml @@ -28,7 +28,6 @@ teloxide_tests_macros = "0.2.0" mime = "0.3.17" chrono = "0.4.38" actix-web-lab = "0.23.0" -parking_lot = "0.12.3" mime_guess = "2.0.5" rand = "0.8.5" actix-multipart = "0.7.2" From deed987113338ba4f68d101168d82c22edd91b6b Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 12:34:11 +0000 Subject: [PATCH 089/138] remove RESPONSES Handlers still need to be changed --- teloxide_tests/src/mock_bot.rs | 23 ++++++++++------------- teloxide_tests/src/server/mod.rs | 4 ---- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index e1cf4d5..2ae2945 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -99,6 +99,13 @@ fn add_message(message: &mut Message, state: Arc>) { #[derive(Default)] pub struct State { pub files: Vec, + pub responses: Responses, +} + +impl State { + pub fn reset(&mut self) { + self.responses = Responses::default(); + } } /// A mocked bot that sends requests to the fake server @@ -114,8 +121,6 @@ pub struct MockBot { pub me: Me, /// If you have something like a state, you should add the storage here using .dependencies() pub dependencies: DependencyMap, - /// Caught responses from the server - pub responses: Option, current_update_id: AtomicI32, stack_size: usize, @@ -195,7 +200,6 @@ impl MockBot { me: MockMe::new().build(), updates: update.into_update(¤t_update_id), handler_tree, - responses: None, dependencies: DependencyMap::new(), _bot_lock: lock, current_update_id, @@ -289,6 +293,8 @@ impl MockBot { /// with `get_responses`. All the responses are unique to that dispatch, and will be erased for /// every new dispatch. pub async fn dispatch(&mut self) { + self.state.lock().unwrap().reset(); + let server = ServerManager::start(self.me.clone(), self.state.clone()) .await .unwrap(); @@ -311,8 +317,6 @@ impl MockBot { }; } - self.responses = Some(server::RESPONSES.lock().unwrap().clone()); // Store the responses before they are erased - server.stop().await.unwrap(); } @@ -320,14 +324,7 @@ impl MockBot { /// Panics if no dispatching was done. /// Should be treated as a variable, because it kinda is pub fn get_responses(&self) -> server::Responses { - let responses = self.responses.clone(); - match responses { - Some(responses) => responses, - None => { - log::error!("No responses received! Maybe you forgot to dispatch the mocked bot?"); - panic!("No responses received! Maybe you forgot to dispatch the mocked bot?") - } - } + self.state.lock().unwrap().responses.clone() } async fn get_potential_storages( diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index f942f32..44ff20b 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -36,7 +36,6 @@ pub mod responses; lazy_static! { pub static ref MESSAGES: Mutex> = Mutex::new(vec![]); // Messages storage, just in case - pub static ref RESPONSES: Mutex = Mutex::new(Responses::default()); pub static ref LAST_MESSAGE_ID: AtomicI32 = AtomicI32::new(0); } @@ -168,9 +167,6 @@ async fn run_server( state: Arc>, cancel_token: CancellationToken, ) { - // MESSAGES don't care if they are cleaned or not - *RESPONSES.lock().unwrap() = Responses::default(); - let server = create_server(listener, me, state).unwrap(); let server_handle = server.handle(); From 3fae785da414d7efcb7ccf8bb1540fdaccea153f Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 13:04:01 +0000 Subject: [PATCH 090/138] fix handlers --- .../src/server/routes/answer_callback_query.rs | 13 +++++++++---- .../src/server/routes/ban_chat_member.rs | 14 ++++++++++---- .../src/server/routes/copy_message.rs | 17 ++++++++++++----- .../src/server/routes/delete_message.rs | 14 ++++++++++---- .../src/server/routes/edit_message_caption.rs | 14 ++++++++++---- .../server/routes/edit_message_reply_markup.rs | 10 +++++++--- .../src/server/routes/edit_message_text.rs | 16 ++++++++++++---- .../src/server/routes/forward_message.rs | 12 ++++++++---- .../src/server/routes/pin_chat_message.rs | 14 ++++++++++---- .../src/server/routes/restrict_chat_member.rs | 14 +++++++++----- .../src/server/routes/send_animation.rs | 8 ++++---- teloxide_tests/src/server/routes/send_audio.rs | 10 +++++----- .../src/server/routes/send_chat_action.rs | 14 +++++++++----- .../src/server/routes/send_contact.rs | 12 ++++++++---- teloxide_tests/src/server/routes/send_dice.rs | 16 +++++++++++----- .../src/server/routes/send_document.rs | 10 +++++----- .../src/server/routes/send_location.rs | 12 ++++++++---- .../src/server/routes/send_media_group.rs | 8 ++++---- .../src/server/routes/send_message.rs | 12 ++++++++---- teloxide_tests/src/server/routes/send_photo.rs | 10 +++++----- teloxide_tests/src/server/routes/send_poll.rs | 17 ++++++++++++----- .../src/server/routes/send_sticker.rs | 11 ++++++----- teloxide_tests/src/server/routes/send_venue.rs | 12 ++++++++---- teloxide_tests/src/server/routes/send_video.rs | 8 ++++---- .../src/server/routes/send_video_note.rs | 10 +++++----- teloxide_tests/src/server/routes/send_voice.rs | 11 ++++++----- .../src/server/routes/set_message_reaction.rs | 14 ++++++++++---- .../src/server/routes/unban_chat_member.rs | 14 +++++++++----- .../server/routes/unpin_all_chat_messages.rs | 14 +++++++++----- .../src/server/routes/unpin_chat_message.rs | 14 ++++++++++---- 30 files changed, 243 insertions(+), 132 deletions(-) diff --git a/teloxide_tests/src/server/routes/answer_callback_query.rs b/teloxide_tests/src/server/routes/answer_callback_query.rs index b37b297..7927316 100644 --- a/teloxide_tests/src/server/routes/answer_callback_query.rs +++ b/teloxide_tests/src/server/routes/answer_callback_query.rs @@ -1,7 +1,9 @@ +use std::sync::Mutex; + use actix_web::{web, Responder}; use serde::Deserialize; -use crate::server::RESPONSES; +use crate::mock_bot::State; use super::make_telegram_result; @@ -14,9 +16,12 @@ pub struct AnswerCallbackQueryBody { pub cache_time: Option, } -pub async fn answer_callback_query(body: web::Json) -> impl Responder { - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock +pub async fn answer_callback_query( + state: web::Data>, + body: web::Json, +) -> impl Responder { + let mut lock = state.lock().unwrap(); + lock.responses .answered_callback_queries .push(body.into_inner()); make_telegram_result(true) diff --git a/teloxide_tests/src/server/routes/ban_chat_member.rs b/teloxide_tests/src/server/routes/ban_chat_member.rs index 9a4e08e..7306c43 100644 --- a/teloxide_tests/src/server/routes/ban_chat_member.rs +++ b/teloxide_tests/src/server/routes/ban_chat_member.rs @@ -1,8 +1,11 @@ +use std::sync::Mutex; + use actix_web::{web, Responder}; use serde::Deserialize; +use crate::mock_bot::State; use crate::server::routes::make_telegram_result; -use crate::server::{MESSAGES, RESPONSES}; +use crate::server::MESSAGES; use super::BodyChatId; @@ -14,7 +17,10 @@ pub struct BanChatMemberBody { pub revoke_messages: Option, } -pub async fn ban_chat_member(body: web::Json) -> impl Responder { +pub async fn ban_chat_member( + state: web::Data>, + body: web::Json, +) -> impl Responder { let chat_id = body.chat_id.id(); let messages = MESSAGES.lock().unwrap().clone(); if body.revoke_messages.is_some() && body.revoke_messages.unwrap() { @@ -27,8 +33,8 @@ pub async fn ban_chat_member(body: web::Json) -> impl Respond } } } - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.banned_chat_members.push(body.into_inner()); + let mut lock = state.lock().unwrap(); + lock.responses.banned_chat_members.push(body.into_inner()); make_telegram_result(true) } diff --git a/teloxide_tests/src/server/routes/copy_message.rs b/teloxide_tests/src/server/routes/copy_message.rs index 36e88b5..e3fb297 100644 --- a/teloxide_tests/src/server/routes/copy_message.rs +++ b/teloxide_tests/src/server/routes/copy_message.rs @@ -1,3 +1,5 @@ +use std::sync::Mutex; + use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; @@ -7,8 +9,9 @@ use teloxide::types::{ MessageEntity, MessageId, MessageKind, ParseMode, ReplyMarkup, }; +use crate::mock_bot::State; use crate::server::CopiedMessage; -use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, MESSAGES}; use super::{make_telegram_result, BodyChatId}; @@ -28,7 +31,11 @@ pub struct CopyMessageBody { pub reply_markup: Option, } -pub async fn copy_message(body: web::Json, me: web::Data) -> impl Responder { +pub async fn copy_message( + body: web::Json, + me: web::Data, + state: web::Data>, +) -> impl Responder { let chat = body.chat_id.chat(); check_if_message_exists!(body.message_id); let mut message = MESSAGES.get_message(body.message_id).unwrap(); @@ -85,9 +92,9 @@ pub async fn copy_message(body: web::Json, me: web::Data) - message.chat = body.chat_id.chat(); let message = MESSAGES.add_message(message); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock.copied_messages.push(CopiedMessage { + let mut lock = state.lock().unwrap(); + lock.responses.sent_messages.push(message.clone()); + lock.responses.copied_messages.push(CopiedMessage { message_id: message.id, bot_request: body.into_inner(), }); diff --git a/teloxide_tests/src/server/routes/delete_message.rs b/teloxide_tests/src/server/routes/delete_message.rs index 3fe6563..494fda0 100644 --- a/teloxide_tests/src/server/routes/delete_message.rs +++ b/teloxide_tests/src/server/routes/delete_message.rs @@ -1,9 +1,12 @@ +use std::sync::Mutex; + use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; +use crate::mock_bot::State; use crate::server::routes::make_telegram_result; -use crate::server::{DeletedMessage, MESSAGES, RESPONSES}; +use crate::server::{DeletedMessage, MESSAGES}; use super::{check_if_message_exists, BodyChatId}; @@ -13,11 +16,14 @@ pub struct DeleteMessageBody { pub message_id: i32, } -pub async fn delete_message(body: web::Json) -> impl Responder { +pub async fn delete_message( + state: web::Data>, + body: web::Json, +) -> impl Responder { check_if_message_exists!(body.message_id); let deleted_message = MESSAGES.delete_message(body.message_id).unwrap(); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.deleted_messages.push(DeletedMessage { + let mut lock = state.lock().unwrap(); + lock.responses.deleted_messages.push(DeletedMessage { message: deleted_message.clone(), bot_request: body.into_inner(), }); diff --git a/teloxide_tests/src/server/routes/edit_message_caption.rs b/teloxide_tests/src/server/routes/edit_message_caption.rs index eb686d2..74e53b4 100644 --- a/teloxide_tests/src/server/routes/edit_message_caption.rs +++ b/teloxide_tests/src/server/routes/edit_message_caption.rs @@ -1,10 +1,13 @@ +use std::sync::Mutex; + use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::{MessageEntity, ParseMode, ReplyMarkup}; +use crate::mock_bot::State; use crate::server::routes::make_telegram_result; -use crate::server::{EditedMessageCaption, MESSAGES, RESPONSES}; +use crate::server::{EditedMessageCaption, MESSAGES}; use super::{check_if_message_exists, BodyChatId}; @@ -21,7 +24,10 @@ pub struct EditMessageCaptionBody { pub reply_markup: Option, } -pub async fn edit_message_caption(body: web::Json) -> impl Responder { +pub async fn edit_message_caption( + state: web::Data>, + body: web::Json, +) -> impl Responder { match ( body.chat_id.clone(), body.message_id, @@ -40,8 +46,8 @@ pub async fn edit_message_caption(body: web::Json) -> im .edit_message_reply_markup(message_id, body.reply_markup.clone()) .unwrap(); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock + let mut lock = state.lock().unwrap(); + lock.responses .edited_messages_caption .push(EditedMessageCaption { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs index 5cbc0b4..8c4c4a4 100644 --- a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs +++ b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs @@ -1,10 +1,13 @@ +use std::sync::Mutex; + +use crate::mock_bot::State; use crate::server::routes::{check_if_message_exists, make_telegram_result}; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::ReplyMarkup; -use crate::server::{EditedMessageReplyMarkup, MESSAGES, RESPONSES}; +use crate::server::{EditedMessageReplyMarkup, MESSAGES}; use super::BodyChatId; @@ -19,6 +22,7 @@ pub struct EditMessageReplyMarkupBody { pub async fn edit_message_reply_markup( body: web::Json, + state: web::Data>, ) -> impl Responder { match ( body.chat_id.clone(), @@ -37,8 +41,8 @@ pub async fn edit_message_reply_markup( .unwrap(), }; - let mut response_lock = RESPONSES.lock().unwrap(); - response_lock + let mut lock = state.lock().unwrap(); + lock.responses .edited_messages_reply_markup .push(EditedMessageReplyMarkup { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/edit_message_text.rs b/teloxide_tests/src/server/routes/edit_message_text.rs index 5fd86d4..e0074ad 100644 --- a/teloxide_tests/src/server/routes/edit_message_text.rs +++ b/teloxide_tests/src/server/routes/edit_message_text.rs @@ -1,8 +1,13 @@ +use std::sync::Mutex; + use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; use teloxide::types::{LinkPreviewOptions, MessageEntity, ParseMode, ReplyMarkup}; -use crate::server::{routes::make_telegram_result, EditedMessageText, MESSAGES, RESPONSES}; +use crate::{ + mock_bot::State, + server::{routes::make_telegram_result, EditedMessageText, MESSAGES}, +}; use super::{check_if_message_exists, BodyChatId}; @@ -19,7 +24,10 @@ pub struct EditMessageTextBody { pub reply_markup: Option, } -pub async fn edit_message_text(body: web::Json) -> impl Responder { +pub async fn edit_message_text( + body: web::Json, + state: web::Data>, +) -> impl Responder { match ( body.chat_id.clone(), body.message_id, @@ -38,8 +46,8 @@ pub async fn edit_message_text(body: web::Json) -> impl Res .edit_message_reply_markup(message_id, body.reply_markup.clone()) .unwrap(); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.edited_messages_text.push(EditedMessageText { + let mut lock = state.lock().unwrap(); + lock.responses.edited_messages_text.push(EditedMessageText { message: message.clone(), bot_request: body.into_inner(), }); diff --git a/teloxide_tests/src/server/routes/forward_message.rs b/teloxide_tests/src/server/routes/forward_message.rs index 906183b..83bf715 100644 --- a/teloxide_tests/src/server/routes/forward_message.rs +++ b/teloxide_tests/src/server/routes/forward_message.rs @@ -1,5 +1,8 @@ +use std::sync::Mutex; + +use crate::mock_bot::State; use crate::server::ForwardedMessage; -use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, MESSAGES}; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; @@ -20,6 +23,7 @@ pub struct ForwardMessageBody { pub async fn forward_message( body: web::Json, me: web::Data, + state: web::Data>, ) -> impl Responder { check_if_message_exists!(body.message_id); let mut message = MESSAGES.get_message(body.message_id).unwrap(); @@ -68,9 +72,9 @@ pub async fn forward_message( message.from = Some(me.user.clone()); let message = MESSAGES.add_message(message); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock.forwarded_messages.push(ForwardedMessage { + let mut lock = state.lock().unwrap(); + lock.responses.sent_messages.push(message.clone()); + lock.responses.forwarded_messages.push(ForwardedMessage { message: message.clone(), bot_request: body.into_inner(), }); diff --git a/teloxide_tests/src/server/routes/pin_chat_message.rs b/teloxide_tests/src/server/routes/pin_chat_message.rs index e5bdd3c..d4496a8 100644 --- a/teloxide_tests/src/server/routes/pin_chat_message.rs +++ b/teloxide_tests/src/server/routes/pin_chat_message.rs @@ -1,9 +1,12 @@ +use std::sync::Mutex; + use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; +use crate::mock_bot::State; use crate::server::routes::make_telegram_result; -use crate::server::{MESSAGES, RESPONSES}; +use crate::server::MESSAGES; use super::{check_if_message_exists, BodyChatId}; @@ -14,10 +17,13 @@ pub struct PinChatMessageBody { pub disable_notification: Option, } -pub async fn pin_chat_message(body: web::Json) -> impl Responder { +pub async fn pin_chat_message( + state: web::Data>, + body: web::Json, +) -> impl Responder { check_if_message_exists!(body.message_id); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.pinned_chat_messages.push(body.into_inner()); + let mut lock = state.lock().unwrap(); + lock.responses.pinned_chat_messages.push(body.into_inner()); make_telegram_result(true) } diff --git a/teloxide_tests/src/server/routes/restrict_chat_member.rs b/teloxide_tests/src/server/routes/restrict_chat_member.rs index 0ebedee..3e00816 100644 --- a/teloxide_tests/src/server/routes/restrict_chat_member.rs +++ b/teloxide_tests/src/server/routes/restrict_chat_member.rs @@ -1,9 +1,10 @@ +use std::sync::Mutex; + use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::ChatPermissions; -use crate::server::routes::make_telegram_result; -use crate::server::RESPONSES; +use crate::{mock_bot::State, server::routes::make_telegram_result}; use super::BodyChatId; @@ -16,10 +17,13 @@ pub struct RestrictChatMemberBody { pub until_date: Option, } -pub async fn restrict_chat_member(body: web::Json) -> impl Responder { +pub async fn restrict_chat_member( + state: web::Data>, + body: web::Json, +) -> impl Responder { // Idk what to verify here - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock + let mut lock = state.lock().unwrap(); + lock.responses .restricted_chat_members .push(body.into_inner()); diff --git a/teloxide_tests/src/server/routes/send_animation.rs b/teloxide_tests/src/server/routes/send_animation.rs index 3af2f29..3271735 100644 --- a/teloxide_tests/src/server/routes/send_animation.rs +++ b/teloxide_tests/src/server/routes/send_animation.rs @@ -16,7 +16,7 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, MESSAGES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -71,9 +71,9 @@ pub async fn send_animation( meta: message.animation().unwrap().file.clone(), path: body.file_name.to_owned(), }); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock + let mut lock = state.lock().unwrap(); + lock.responses.sent_messages.push(message.clone()); + lock.responses .sent_messages_animation .push(SentMessageAnimation { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/send_audio.rs b/teloxide_tests/src/server/routes/send_audio.rs index 3259e49..c1b2a7d 100644 --- a/teloxide_tests/src/server/routes/send_audio.rs +++ b/teloxide_tests/src/server/routes/send_audio.rs @@ -19,7 +19,7 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, MESSAGES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -63,13 +63,13 @@ pub async fn send_audio( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.lock().unwrap().files.push(teloxide::types::File { + let mut lock = state.lock().unwrap(); + lock.files.push(teloxide::types::File { meta: message.audio().unwrap().file.clone(), path: body.file_name.to_owned(), }); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock.sent_messages_audio.push(SentMessageAudio { + lock.responses.sent_messages.push(message.clone()); + lock.responses.sent_messages_audio.push(SentMessageAudio { message: message.clone(), bot_request: body, }); diff --git a/teloxide_tests/src/server/routes/send_chat_action.rs b/teloxide_tests/src/server/routes/send_chat_action.rs index 66ac896..8a6069b 100644 --- a/teloxide_tests/src/server/routes/send_chat_action.rs +++ b/teloxide_tests/src/server/routes/send_chat_action.rs @@ -1,8 +1,9 @@ +use std::sync::Mutex; + use actix_web::{web, Responder}; use serde::Deserialize; -use crate::server::routes::make_telegram_result; -use crate::server::RESPONSES; +use crate::{mock_bot::State, server::routes::make_telegram_result}; use super::BodyChatId; @@ -13,9 +14,12 @@ pub struct SendChatActionBody { pub action: String, } -pub async fn send_chat_action(body: web::Json) -> impl Responder { - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_chat_actions.push(body.into_inner()); +pub async fn send_chat_action( + state: web::Data>, + body: web::Json, +) -> impl Responder { + let mut lock = state.lock().unwrap(); + lock.responses.sent_chat_actions.push(body.into_inner()); make_telegram_result(true) } diff --git a/teloxide_tests/src/server/routes/send_contact.rs b/teloxide_tests/src/server/routes/send_contact.rs index 846f3b2..020878a 100644 --- a/teloxide_tests/src/server/routes/send_contact.rs +++ b/teloxide_tests/src/server/routes/send_contact.rs @@ -1,4 +1,7 @@ -use crate::server::{SentMessageContact, MESSAGES, RESPONSES}; +use std::sync::Mutex; + +use crate::mock_bot::State; +use crate::server::{SentMessageContact, MESSAGES}; use crate::MockMessageContact; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; @@ -28,6 +31,7 @@ pub struct SendMessageContactBody { pub async fn send_contact( body: web::Json, me: web::Data, + state: web::Data>, ) -> impl Responder { let chat = body.chat_id.chat(); let mut message = // Creates the message, which will be mutated to fit the needed shape @@ -51,9 +55,9 @@ pub async fn send_contact( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock + let mut lock = state.lock().unwrap(); + lock.responses.sent_messages.push(message.clone()); + lock.responses .sent_messages_contact .push(SentMessageContact { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/send_dice.rs b/teloxide_tests/src/server/routes/send_dice.rs index dbee5a8..4537012 100644 --- a/teloxide_tests/src/server/routes/send_dice.rs +++ b/teloxide_tests/src/server/routes/send_dice.rs @@ -1,5 +1,8 @@ +use std::sync::Mutex; + +use crate::mock_bot::State; use crate::server::routes::check_if_message_exists; -use crate::server::{SentMessageDice, MESSAGES, RESPONSES}; +use crate::server::{SentMessageDice, MESSAGES}; use crate::MockMessageDice; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; @@ -21,7 +24,10 @@ pub struct SendMessageDiceBody { pub reply_parameters: Option, } -pub async fn send_dice(body: web::Json) -> impl Responder { +pub async fn send_dice( + state: web::Data>, + body: web::Json, +) -> impl Responder { let chat = body.chat_id.chat(); let mut message = // Creates the message, which will be mutated to fit the needed shape MockMessageDice::new().chat(chat); @@ -35,9 +41,9 @@ pub async fn send_dice(body: web::Json) -> impl Responder { let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock.sent_messages_dice.push(SentMessageDice { + let mut lock = state.lock().unwrap(); + lock.responses.sent_messages.push(message.clone()); + lock.responses.sent_messages_dice.push(SentMessageDice { message: message.clone(), bot_request: body.into_inner(), }); diff --git a/teloxide_tests/src/server/routes/send_document.rs b/teloxide_tests/src/server/routes/send_document.rs index adc12da..6224eea 100644 --- a/teloxide_tests/src/server/routes/send_document.rs +++ b/teloxide_tests/src/server/routes/send_document.rs @@ -15,7 +15,7 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters}; -use crate::server::{routes::check_if_message_exists, SentMessageDocument, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, SentMessageDocument, MESSAGES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -62,13 +62,13 @@ pub async fn send_document( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.lock().unwrap().files.push(teloxide::types::File { + let mut lock = state.lock().unwrap(); + lock.files.push(teloxide::types::File { meta: message.document().unwrap().file.clone(), path: body.file_name.to_owned(), }); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock + lock.responses.sent_messages.push(message.clone()); + lock.responses .sent_messages_document .push(SentMessageDocument { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/send_location.rs b/teloxide_tests/src/server/routes/send_location.rs index d16be6f..1c5390f 100644 --- a/teloxide_tests/src/server/routes/send_location.rs +++ b/teloxide_tests/src/server/routes/send_location.rs @@ -1,4 +1,7 @@ -use crate::server::{SentMessageLocation, MESSAGES, RESPONSES}; +use std::sync::Mutex; + +use crate::mock_bot::State; +use crate::server::{SentMessageLocation, MESSAGES}; use crate::MockMessageLocation; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; @@ -30,6 +33,7 @@ pub struct SendMessageLocationBody { pub async fn send_location( body: web::Json, me: web::Data, + state: web::Data>, ) -> impl Responder { let chat = body.chat_id.chat(); let mut message = // Creates the message, which will be mutated to fit the needed shape @@ -53,9 +57,9 @@ pub async fn send_location( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock + let mut lock = state.lock().unwrap(); + lock.responses.sent_messages.push(message.clone()); + lock.responses .sent_messages_location .push(SentMessageLocation { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/send_media_group.rs b/teloxide_tests/src/server/routes/send_media_group.rs index 969ddc5..8e4005e 100644 --- a/teloxide_tests/src/server/routes/send_media_group.rs +++ b/teloxide_tests/src/server/routes/send_media_group.rs @@ -1,5 +1,5 @@ use crate::mock_bot::State; -use crate::server::{SentMediaGroup, MESSAGES, RESPONSES}; +use crate::server::{SentMediaGroup, MESSAGES}; use crate::{ MockMessageAudio, MockMessageDocument, MockMessagePhoto, MockMessageVideo, MockPhotoSize, MockVideo, @@ -174,9 +174,9 @@ pub async fn send_media_group( MESSAGES.add_message(message); } - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.extend(messages.clone()); - responses_lock.sent_media_group.push(SentMediaGroup { + let mut lock = state.lock().unwrap(); + lock.responses.sent_messages.extend(messages.clone()); + lock.responses.sent_media_group.push(SentMediaGroup { messages: messages.clone(), bot_request: body, }); diff --git a/teloxide_tests/src/server/routes/send_message.rs b/teloxide_tests/src/server/routes/send_message.rs index 53b1e86..72d5dfa 100644 --- a/teloxide_tests/src/server/routes/send_message.rs +++ b/teloxide_tests/src/server/routes/send_message.rs @@ -1,4 +1,7 @@ +use std::sync::Mutex; + use crate::dataset::message_common::MockMessageText; +use crate::mock_bot::State; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; @@ -6,7 +9,7 @@ use teloxide::types::{ LinkPreviewOptions, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, }; -use crate::server::{routes::check_if_message_exists, SentMessageText, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, SentMessageText, MESSAGES}; use super::{make_telegram_result, BodyChatId}; @@ -29,6 +32,7 @@ pub struct SendMessageTextBody { pub async fn send_message( body: web::Json, me: web::Data, + state: web::Data>, ) -> impl Responder { let chat = body.chat_id.chat(); let mut message = // Creates the message, which will be mutated to fit the needed shape @@ -49,9 +53,9 @@ pub async fn send_message( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock.sent_messages_text.push(SentMessageText { + let mut lock = state.lock().unwrap(); + lock.responses.sent_messages.push(message.clone()); + lock.responses.sent_messages_text.push(SentMessageText { message: message.clone(), bot_request: body.into_inner(), }); diff --git a/teloxide_tests/src/server/routes/send_photo.rs b/teloxide_tests/src/server/routes/send_photo.rs index 25b3eb9..85b6fa4 100644 --- a/teloxide_tests/src/server/routes/send_photo.rs +++ b/teloxide_tests/src/server/routes/send_photo.rs @@ -16,7 +16,7 @@ use teloxide::types::{ LinkPreviewOptions, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, }; -use crate::server::{routes::check_if_message_exists, SentMessagePhoto, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, SentMessagePhoto, MESSAGES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -58,13 +58,13 @@ pub async fn send_photo( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.lock().unwrap().files.push(teloxide::types::File { + let mut lock = state.lock().unwrap(); + lock.files.push(teloxide::types::File { meta: message.photo().unwrap()[0].file.clone(), path: body.file_name.to_owned(), }); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock.sent_messages_photo.push(SentMessagePhoto { + lock.responses.sent_messages.push(message.clone()); + lock.responses.sent_messages_photo.push(SentMessagePhoto { message: message.clone(), bot_request: body, }); diff --git a/teloxide_tests/src/server/routes/send_poll.rs b/teloxide_tests/src/server/routes/send_poll.rs index 2ce28fc..49a4053 100644 --- a/teloxide_tests/src/server/routes/send_poll.rs +++ b/teloxide_tests/src/server/routes/send_poll.rs @@ -1,4 +1,7 @@ -use crate::server::{SentMessagePoll, MESSAGES, RESPONSES}; +use std::sync::Mutex; + +use crate::mock_bot::State; +use crate::server::{SentMessagePoll, MESSAGES}; use crate::MockMessagePoll; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; @@ -38,7 +41,11 @@ pub struct SendMessagePollBody { pub reply_parameters: Option, } -pub async fn send_poll(body: web::Json, me: web::Data) -> impl Responder { +pub async fn send_poll( + state: web::Data>, + body: web::Json, + me: web::Data, +) -> impl Responder { let chat = body.chat_id.chat(); let mut message = // Creates the message, which will be mutated to fit the needed shape MockMessagePoll::new().chat(chat); @@ -75,9 +82,9 @@ pub async fn send_poll(body: web::Json, me: web::Data) let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock.sent_messages_poll.push(SentMessagePoll { + let mut lock = state.lock().unwrap(); + lock.responses.sent_messages.push(message.clone()); + lock.responses.sent_messages_poll.push(SentMessagePoll { message: message.clone(), bot_request: body.into_inner(), }); diff --git a/teloxide_tests/src/server/routes/send_sticker.rs b/teloxide_tests/src/server/routes/send_sticker.rs index 49812d9..793285a 100644 --- a/teloxide_tests/src/server/routes/send_sticker.rs +++ b/teloxide_tests/src/server/routes/send_sticker.rs @@ -13,7 +13,7 @@ use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::{Me, ReplyMarkup, ReplyParameters}; -use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, MESSAGES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -48,13 +48,14 @@ pub async fn send_sticker( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.lock().unwrap().files.push(teloxide::types::File { + let mut lock = state.lock().unwrap(); + + lock.files.push(teloxide::types::File { meta: message.sticker().unwrap().file.clone(), path: body.file_name.to_owned(), }); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock + lock.responses.sent_messages.push(message.clone()); + lock.responses .sent_messages_sticker .push(SentMessageSticker { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/send_venue.rs b/teloxide_tests/src/server/routes/send_venue.rs index 86a140a..c2eb3d7 100644 --- a/teloxide_tests/src/server/routes/send_venue.rs +++ b/teloxide_tests/src/server/routes/send_venue.rs @@ -1,4 +1,7 @@ -use crate::server::{SentMessageVenue, MESSAGES, RESPONSES}; +use std::sync::Mutex; + +use crate::mock_bot::State; +use crate::server::{SentMessageVenue, MESSAGES}; use crate::{MockLocation, MockMessageVenue}; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; @@ -32,6 +35,7 @@ pub struct SendMessageVenueBody { pub async fn send_venue( body: web::Json, me: web::Data, + state: web::Data>, ) -> impl Responder { let chat = body.chat_id.chat(); let mut message = // Creates the message, which will be mutated to fit the needed shape @@ -61,9 +65,9 @@ pub async fn send_venue( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock.sent_messages_venue.push(SentMessageVenue { + let mut lock = state.lock().unwrap(); + lock.responses.sent_messages.push(message.clone()); + lock.responses.sent_messages_venue.push(SentMessageVenue { message: message.clone(), bot_request: body.into_inner(), }); diff --git a/teloxide_tests/src/server/routes/send_video.rs b/teloxide_tests/src/server/routes/send_video.rs index 2ccdfe1..a0f8325 100644 --- a/teloxide_tests/src/server/routes/send_video.rs +++ b/teloxide_tests/src/server/routes/send_video.rs @@ -15,7 +15,7 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, SentMessageVideo, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, SentMessageVideo, MESSAGES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -66,9 +66,9 @@ pub async fn send_video( meta: message.video().unwrap().file.clone(), path: body.file_name.to_owned(), }); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock.sent_messages_video.push(SentMessageVideo { + let mut lock = state.lock().unwrap(); + lock.responses.sent_messages.push(message.clone()); + lock.responses.sent_messages_video.push(SentMessageVideo { message: message.clone(), bot_request: body, }); diff --git a/teloxide_tests/src/server/routes/send_video_note.rs b/teloxide_tests/src/server/routes/send_video_note.rs index f66c5b5..732b963 100644 --- a/teloxide_tests/src/server/routes/send_video_note.rs +++ b/teloxide_tests/src/server/routes/send_video_note.rs @@ -18,7 +18,7 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, MESSAGES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -58,13 +58,13 @@ pub async fn send_video_note( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.lock().unwrap().files.push(teloxide::types::File { + let mut lock = state.lock().unwrap(); + lock.files.push(teloxide::types::File { meta: message.video_note().unwrap().file.clone(), path: body.file_name.to_owned(), }); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock + lock.responses.sent_messages.push(message.clone()); + lock.responses .sent_messages_video_note .push(SentMessageVideoNote { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/send_voice.rs b/teloxide_tests/src/server/routes/send_voice.rs index a3bf24e..02c5487 100644 --- a/teloxide_tests/src/server/routes/send_voice.rs +++ b/teloxide_tests/src/server/routes/send_voice.rs @@ -19,7 +19,7 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, MESSAGES}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -60,13 +60,14 @@ pub async fn send_voice( let last_id = MESSAGES.max_message_id(); let message = MESSAGES.add_message(message.id(last_id + 1).build()); - state.lock().unwrap().files.push(teloxide::types::File { + let mut lock = state.lock().unwrap(); + + lock.files.push(teloxide::types::File { meta: message.voice().unwrap().file.clone(), path: body.file_name.to_owned(), }); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.sent_messages.push(message.clone()); - responses_lock.sent_messages_voice.push(SentMessageVoice { + lock.responses.sent_messages.push(message.clone()); + lock.responses.sent_messages_voice.push(SentMessageVoice { message: message.clone(), bot_request: body, }); diff --git a/teloxide_tests/src/server/routes/set_message_reaction.rs b/teloxide_tests/src/server/routes/set_message_reaction.rs index 15ee9fb..72a4127 100644 --- a/teloxide_tests/src/server/routes/set_message_reaction.rs +++ b/teloxide_tests/src/server/routes/set_message_reaction.rs @@ -1,10 +1,13 @@ +use std::sync::Mutex; + +use crate::mock_bot::State; use crate::server::SetMessageReaction; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::ReactionType; -use crate::server::{routes::check_if_message_exists, MESSAGES, RESPONSES}; +use crate::server::{routes::check_if_message_exists, MESSAGES}; use super::{make_telegram_result, BodyChatId}; @@ -16,11 +19,14 @@ pub struct SetMessageReactionBody { pub is_big: Option, } -pub async fn set_message_reaction(body: web::Json) -> impl Responder { +pub async fn set_message_reaction( + state: web::Data>, + body: web::Json, +) -> impl Responder { check_if_message_exists!(body.message_id); - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock + let mut lock = state.lock().unwrap(); + lock.responses .set_message_reaction .push(SetMessageReaction { bot_request: body.into_inner(), diff --git a/teloxide_tests/src/server/routes/unban_chat_member.rs b/teloxide_tests/src/server/routes/unban_chat_member.rs index d10e734..fb4e08f 100644 --- a/teloxide_tests/src/server/routes/unban_chat_member.rs +++ b/teloxide_tests/src/server/routes/unban_chat_member.rs @@ -1,8 +1,9 @@ +use std::sync::Mutex; + use actix_web::{web, Responder}; use serde::Deserialize; -use crate::server::routes::make_telegram_result; -use crate::server::RESPONSES; +use crate::{mock_bot::State, server::routes::make_telegram_result}; use super::BodyChatId; @@ -13,10 +14,13 @@ pub struct UnbanChatMemberBody { pub only_if_banned: Option, } -pub async fn unban_chat_member(body: web::Json) -> impl Responder { +pub async fn unban_chat_member( + state: web::Data>, + body: web::Json, +) -> impl Responder { // Idk what to verify here - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock.unbanned_chat_members.push(body.into_inner()); + let mut lock = state.lock().unwrap(); + lock.responses.unbanned_chat_members.push(body.into_inner()); make_telegram_result(true) } diff --git a/teloxide_tests/src/server/routes/unpin_all_chat_messages.rs b/teloxide_tests/src/server/routes/unpin_all_chat_messages.rs index 5cf2e52..236fa8c 100644 --- a/teloxide_tests/src/server/routes/unpin_all_chat_messages.rs +++ b/teloxide_tests/src/server/routes/unpin_all_chat_messages.rs @@ -1,8 +1,9 @@ +use std::sync::Mutex; + use actix_web::{web, Responder}; use serde::Deserialize; -use crate::server::routes::make_telegram_result; -use crate::server::RESPONSES; +use crate::{mock_bot::State, server::routes::make_telegram_result}; use super::BodyChatId; @@ -11,9 +12,12 @@ pub struct UnpinAllChatMessagesBody { pub chat_id: BodyChatId, } -pub async fn unpin_all_chat_messages(body: web::Json) -> impl Responder { - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock +pub async fn unpin_all_chat_messages( + state: web::Data>, + body: web::Json, +) -> impl Responder { + let mut lock = state.lock().unwrap(); + lock.responses .unpinned_all_chat_messages .push(body.into_inner()); diff --git a/teloxide_tests/src/server/routes/unpin_chat_message.rs b/teloxide_tests/src/server/routes/unpin_chat_message.rs index c072e0c..79c3293 100644 --- a/teloxide_tests/src/server/routes/unpin_chat_message.rs +++ b/teloxide_tests/src/server/routes/unpin_chat_message.rs @@ -1,9 +1,12 @@ +use std::sync::Mutex; + use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; +use crate::mock_bot::State; use crate::server::routes::make_telegram_result; -use crate::server::{MESSAGES, RESPONSES}; +use crate::server::MESSAGES; use super::{check_if_message_exists, BodyChatId}; @@ -13,12 +16,15 @@ pub struct UnpinChatMessageBody { pub message_id: Option, } -pub async fn unpin_chat_message(body: web::Json) -> impl Responder { +pub async fn unpin_chat_message( + state: web::Data>, + body: web::Json, +) -> impl Responder { if let Some(message_id) = body.message_id { check_if_message_exists!(message_id); } - let mut responses_lock = RESPONSES.lock().unwrap(); - responses_lock + let mut lock = state.lock().unwrap(); + lock.responses .unpinned_chat_messages .push(body.into_inner()); From a62b1a8b4c16b767be451024b84c61cd2fe0ad6b Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 14:01:42 +0000 Subject: [PATCH 091/138] remove global MESSAGES --- teloxide_tests/src/mock_bot.rs | 48 ++--- teloxide_tests/src/server/messages.rs | 166 +++++++++++++++++ teloxide_tests/src/server/mod.rs | 176 +----------------- .../src/server/routes/ban_chat_member.rs | 8 +- .../src/server/routes/copy_message.rs | 12 +- .../src/server/routes/delete_message.rs | 6 +- .../src/server/routes/edit_message_caption.rs | 14 +- .../routes/edit_message_reply_markup.rs | 12 +- .../src/server/routes/edit_message_text.rs | 14 +- .../src/server/routes/forward_message.rs | 13 +- teloxide_tests/src/server/routes/mod.rs | 4 +- .../src/server/routes/pin_chat_message.rs | 4 +- .../src/server/routes/send_animation.rs | 17 +- .../src/server/routes/send_audio.rs | 15 +- .../src/server/routes/send_contact.rs | 15 +- teloxide_tests/src/server/routes/send_dice.rs | 10 +- .../src/server/routes/send_document.rs | 15 +- .../src/server/routes/send_location.rs | 16 +- .../src/server/routes/send_media_group.rs | 22 ++- .../src/server/routes/send_message.rs | 15 +- .../src/server/routes/send_photo.rs | 15 +- teloxide_tests/src/server/routes/send_poll.rs | 15 +- .../src/server/routes/send_sticker.rs | 16 +- .../src/server/routes/send_venue.rs | 15 +- .../src/server/routes/send_video.rs | 17 +- .../src/server/routes/send_video_note.rs | 16 +- .../src/server/routes/send_voice.rs | 16 +- .../src/server/routes/set_message_reaction.rs | 7 +- .../src/server/routes/unpin_chat_message.rs | 5 +- 29 files changed, 382 insertions(+), 342 deletions(-) create mode 100644 teloxide_tests/src/server/messages.rs diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 2ae2945..a8fe67d 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -13,7 +13,7 @@ use teloxide::{ }; use teloxide::{dptree::deps, types::UpdateKind}; -use crate::server::{self, Responses, MESSAGES}; +use crate::server::{self, messages::Messages, Responses}; use crate::{ dataset::{IntoUpdate, MockMe}, server::ServerManager, @@ -75,37 +75,37 @@ fn find_chat_id(value: Value) -> Option { } None } - -fn add_message(message: &mut Message, state: Arc>) { - let max_id = MESSAGES.max_message_id(); - if message.id.0 <= max_id || MESSAGES.get_message(message.id.0).is_some() { - message.id = MessageId(max_id + 1); - } - if let Some(file_meta) = find_file(serde_json::to_value(&message).unwrap()) { - let file = File { - meta: file_meta, - path: "some_path.txt".to_string(), // This doesn't really matter - }; - state.lock().unwrap().files.push(file); - } - if let MessageKind::Common(ref mut message_kind) = message.kind { - if let Some(ref mut reply_message) = message_kind.reply_to_message { - add_message(reply_message, state); - } - } - MESSAGES.add_message(message.clone()); -} - #[derive(Default)] pub struct State { pub files: Vec, pub responses: Responses, + pub messages: Messages, } impl State { pub fn reset(&mut self) { self.responses = Responses::default(); } + + fn add_message(&mut self, message: &mut Message) { + let max_id = self.messages.max_message_id(); + if message.id.0 <= max_id || self.messages.get_message(message.id.0).is_some() { + message.id = MessageId(max_id + 1); + } + if let Some(file_meta) = find_file(serde_json::to_value(&message).unwrap()) { + let file = File { + meta: file_meta, + path: "some_path.txt".to_string(), // This doesn't really matter + }; + self.files.push(file); + } + if let MessageKind::Common(ref mut message_kind) = message.kind { + if let Some(ref mut reply_message) = message_kind.reply_to_message { + self.add_message(reply_message); + } + } + self.messages.add_message(message.clone()); + } } /// A mocked bot that sends requests to the fake server @@ -233,14 +233,14 @@ impl MockBot { match update.kind.clone() { UpdateKind::Message(mut message) => { // Add the message to the list of messages, so the bot can interact with it - add_message(&mut message, self.state.clone()); + self.state.lock().unwrap().add_message(&mut message); update.kind = UpdateKind::Message(message.clone()); } UpdateKind::CallbackQuery(mut callback) => { if let Some(MaybeInaccessibleMessage::Regular(ref mut message)) = callback.message { - add_message(message, self.state.clone()); + self.state.lock().unwrap().add_message(message); } update.kind = UpdateKind::CallbackQuery(callback.clone()); } diff --git a/teloxide_tests/src/server/messages.rs b/teloxide_tests/src/server/messages.rs new file mode 100644 index 0000000..7fe4c30 --- /dev/null +++ b/teloxide_tests/src/server/messages.rs @@ -0,0 +1,166 @@ +use serde::Serialize; +use teloxide::types::{Message, ReplyMarkup}; + +#[derive(Default)] +pub struct Messages { + pub messages: Vec, + last_message_id: i32, +} + +impl Messages { + pub fn max_message_id(&self) -> i32 { + self.last_message_id + } + + pub fn edit_message(&mut self, message_id: i32, field: &str, value: T) -> Option + where + T: Serialize, + { + let message = self.messages.iter().find(|m| m.id.0 == message_id)?; // Find the message + // (return None if not found) + + let mut json = serde_json::to_value(message).ok()?; // Convert the message to JSON + json[field] = serde_json::to_value(value).ok()?; // Edit the field + let new_message: Message = serde_json::from_value(json).ok()?; // Convert back to Message + + self.messages.retain(|m| m.id.0 != message_id); // Remove the old message + self.messages.push(new_message.clone()); // Add the new message + Some(new_message) // Profit! + } + + pub fn edit_message_reply_markup( + &mut self, + message_id: i32, + reply_markup: Option, + ) -> Option { + match reply_markup { + // Only the inline keyboard can be inside of a message + Some(ReplyMarkup::InlineKeyboard(reply_markup)) => { + self.edit_message(message_id, "reply_markup", reply_markup) + } + _ => self.get_message(message_id), + } + } + + pub fn add_message(&mut self, message: Message) -> Message { + self.messages.push(message.clone()); + self.last_message_id += 1; + message + } + + pub fn get_message(&self, message_id: i32) -> Option { + self.messages.iter().find(|m| m.id.0 == message_id).cloned() + } + + pub fn delete_message(&mut self, message_id: i32) -> Option { + let message = self + .messages + .iter() + .find(|m| m.id.0 == message_id) + .cloned()?; + self.messages.retain(|m| m.id.0 != message_id); + Some(message) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::dataset::*; + use serial_test::serial; + use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup}; + + #[test] + #[serial] + fn test_add_messages() { + let mut messages = Messages::default(); + messages.add_message( + message_common::MockMessageText::new() + .text("123") + .id(1) + .build(), + ); + messages.add_message( + message_common::MockMessageText::new() + .text("123") + .id(2) + .build(), + ); + messages.add_message( + message_common::MockMessageText::new() + .text("123") + .id(3) + .build(), + ); + assert_eq!(messages.max_message_id(), 3); + } + + #[test] + #[serial] + fn test_edit_messages() { + let mut messages = Messages::default(); + messages.add_message( + message_common::MockMessageText::new() + .text("123") + .id(1) + .build(), + ); + messages.edit_message(1, "text", "1234"); + assert_eq!(messages.get_message(1).unwrap().text().unwrap(), "1234"); + } + + #[test] + #[serial] + fn test_get_messages() { + let mut messages = Messages::default(); + messages.add_message( + message_common::MockMessageText::new() + .text("123") + .id(1) + .build(), + ); + assert_eq!(messages.get_message(1).unwrap().text().unwrap(), "123"); + } + + #[test] + #[serial] + fn test_delete_messages() { + let mut messages = Messages::default(); + messages.add_message( + message_common::MockMessageText::new() + .text("123") + .id(1) + .build(), + ); + messages.delete_message(1); + assert_eq!(messages.get_message(1), None); + } + + #[test] + #[serial] + fn test_edit_message_reply_markup() { + let mut messages = Messages::default(); + messages.add_message( + message_common::MockMessageText::new() + .text("123") + .id(1) + .build(), + ); + messages.edit_message_reply_markup( + 1, + Some(ReplyMarkup::InlineKeyboard(InlineKeyboardMarkup::new( + vec![vec![InlineKeyboardButton::callback("123", "123")]], + ))), + ); + assert_eq!( + messages + .get_message(1) + .unwrap() + .reply_markup() + .unwrap() + .inline_keyboard[0][0] + .text, + "123" + ); + } +} diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 44ff20b..5c598af 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -4,7 +4,6 @@ use actix_web::{ web::{get, post, scope, Data, Json, ServiceConfig}, App, HttpResponse, HttpServer, Responder, }; -use lazy_static::lazy_static; pub use responses::*; use routes::{ answer_callback_query::*, ban_chat_member::*, copy_message::*, delete_message::*, @@ -16,87 +15,21 @@ use routes::{ send_video_note::*, send_voice::*, set_message_reaction::*, set_my_commands::*, unban_chat_member::*, unpin_all_chat_messages::*, unpin_chat_message::*, }; -use serde::Serialize; use std::{ error::Error, io, net::TcpListener, - sync::{ - atomic::{AtomicI32, Ordering}, - Arc, Mutex, - }, + sync::{Arc, Mutex}, }; -use teloxide::types::{Me, Message, ReplyMarkup}; +use teloxide::types::Me; use tokio::task::{JoinError, JoinHandle}; use tokio_util::sync::CancellationToken; use crate::mock_bot::State; +pub mod messages; pub mod responses; -lazy_static! { - pub static ref MESSAGES: Mutex> = Mutex::new(vec![]); // Messages storage, just in case - pub static ref LAST_MESSAGE_ID: AtomicI32 = AtomicI32::new(0); -} - -impl MESSAGES { - pub fn max_message_id(&self) -> i32 { - LAST_MESSAGE_ID.load(Ordering::Relaxed) - } - - pub fn edit_message(&self, message_id: i32, field: &str, value: T) -> Option - where - T: Serialize, - { - let mut messages = self.lock().unwrap(); // Get the message lock - let message = messages.iter().find(|m| m.id.0 == message_id)?; // Find the message - // (return None if not found) - - let mut json = serde_json::to_value(message).ok()?; // Convert the message to JSON - json[field] = serde_json::to_value(value).ok()?; // Edit the field - let new_message: Message = serde_json::from_value(json).ok()?; // Convert back to Message - - messages.retain(|m| m.id.0 != message_id); // Remove the old message - messages.push(new_message.clone()); // Add the new message - Some(new_message) // Profit! - } - - pub fn edit_message_reply_markup( - &self, - message_id: i32, - reply_markup: Option, - ) -> Option { - match reply_markup { - // Only the inline keyboard can be inside of a message - Some(ReplyMarkup::InlineKeyboard(reply_markup)) => { - MESSAGES.edit_message(message_id, "reply_markup", reply_markup) - } - _ => MESSAGES.get_message(message_id), - } - } - - pub fn add_message(&self, message: Message) -> Message { - self.lock().unwrap().push(message.clone()); - LAST_MESSAGE_ID.fetch_add(1, Ordering::Relaxed); - message - } - - pub fn get_message(&self, message_id: i32) -> Option { - self.lock() - .unwrap() - .iter() - .find(|m| m.id.0 == message_id) - .cloned() - } - - pub fn delete_message(&self, message_id: i32) -> Option { - let mut messages = self.lock().unwrap(); - let message = messages.iter().find(|m| m.id.0 == message_id).cloned()?; - messages.retain(|m| m.id.0 != message_id); - Some(message) - } -} - pub async fn ping() -> impl Responder { "pong" } @@ -237,106 +170,3 @@ fn set_bot_routes(cfg: &mut ServiceConfig) { .route("/SetMessageReaction", post().to(set_message_reaction)) .route("/SetMyCommands", post().to(set_my_commands)); } - -#[cfg(test)] -mod tests { - use super::*; - use crate::dataset::*; - use serial_test::serial; - use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup}; - - #[test] - #[serial] - fn test_add_messages() { - MESSAGES.lock().unwrap().clear(); - LAST_MESSAGE_ID.store(0, Ordering::Relaxed); - MESSAGES.add_message( - message_common::MockMessageText::new() - .text("123") - .id(1) - .build(), - ); - MESSAGES.add_message( - message_common::MockMessageText::new() - .text("123") - .id(2) - .build(), - ); - MESSAGES.add_message( - message_common::MockMessageText::new() - .text("123") - .id(3) - .build(), - ); - assert_eq!(MESSAGES.max_message_id(), 3); - } - - #[test] - #[serial] - fn test_edit_messages() { - MESSAGES.lock().unwrap().clear(); - MESSAGES.add_message( - message_common::MockMessageText::new() - .text("123") - .id(1) - .build(), - ); - MESSAGES.edit_message(1, "text", "1234"); - assert_eq!(MESSAGES.get_message(1).unwrap().text().unwrap(), "1234"); - } - - #[test] - #[serial] - fn test_get_messages() { - MESSAGES.lock().unwrap().clear(); - MESSAGES.add_message( - message_common::MockMessageText::new() - .text("123") - .id(1) - .build(), - ); - assert_eq!(MESSAGES.get_message(1).unwrap().text().unwrap(), "123"); - } - - #[test] - #[serial] - fn test_delete_messages() { - MESSAGES.lock().unwrap().clear(); - MESSAGES.add_message( - message_common::MockMessageText::new() - .text("123") - .id(1) - .build(), - ); - MESSAGES.delete_message(1); - assert_eq!(MESSAGES.get_message(1), None); - } - - #[test] - #[serial] - fn test_edit_message_reply_markup() { - MESSAGES.lock().unwrap().clear(); - MESSAGES.add_message( - message_common::MockMessageText::new() - .text("123") - .id(1) - .build(), - ); - MESSAGES.edit_message_reply_markup( - 1, - Some(ReplyMarkup::InlineKeyboard(InlineKeyboardMarkup::new( - vec![vec![InlineKeyboardButton::callback("123", "123")]], - ))), - ); - assert_eq!( - MESSAGES - .get_message(1) - .unwrap() - .reply_markup() - .unwrap() - .inline_keyboard[0][0] - .text, - "123" - ); - } -} diff --git a/teloxide_tests/src/server/routes/ban_chat_member.rs b/teloxide_tests/src/server/routes/ban_chat_member.rs index 7306c43..3c1489b 100644 --- a/teloxide_tests/src/server/routes/ban_chat_member.rs +++ b/teloxide_tests/src/server/routes/ban_chat_member.rs @@ -5,7 +5,6 @@ use serde::Deserialize; use crate::mock_bot::State; use crate::server::routes::make_telegram_result; -use crate::server::MESSAGES; use super::BodyChatId; @@ -21,19 +20,18 @@ pub async fn ban_chat_member( state: web::Data>, body: web::Json, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let chat_id = body.chat_id.id(); - let messages = MESSAGES.lock().unwrap().clone(); if body.revoke_messages.is_some() && body.revoke_messages.unwrap() { - for message in messages { + for message in lock.messages.messages.clone() { if message.chat.id.0 == chat_id && message.from.is_some() && message.from.unwrap().id.0 == body.user_id { - MESSAGES.delete_message(message.id.0); + lock.messages.delete_message(message.id.0); } } } - let mut lock = state.lock().unwrap(); lock.responses.banned_chat_members.push(body.into_inner()); make_telegram_result(true) diff --git a/teloxide_tests/src/server/routes/copy_message.rs b/teloxide_tests/src/server/routes/copy_message.rs index e3fb297..5351d6a 100644 --- a/teloxide_tests/src/server/routes/copy_message.rs +++ b/teloxide_tests/src/server/routes/copy_message.rs @@ -10,8 +10,8 @@ use teloxide::types::{ }; use crate::mock_bot::State; +use crate::server::routes::check_if_message_exists; use crate::server::CopiedMessage; -use crate::server::{routes::check_if_message_exists, MESSAGES}; use super::{make_telegram_result, BodyChatId}; @@ -36,9 +36,10 @@ pub async fn copy_message( me: web::Data, state: web::Data>, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let chat = body.chat_id.chat(); - check_if_message_exists!(body.message_id); - let mut message = MESSAGES.get_message(body.message_id).unwrap(); + check_if_message_exists!(lock, body.message_id); + let mut message = lock.messages.get_message(body.message_id).unwrap(); message.chat = chat; message.from = Some(me.user.clone()); @@ -87,12 +88,11 @@ pub async fn copy_message( common.has_protected_content = body.protect_content.unwrap_or(false); } - let last_id = MESSAGES.max_message_id(); + let last_id = lock.messages.max_message_id(); message.id = MessageId(last_id + 1); message.chat = body.chat_id.chat(); - let message = MESSAGES.add_message(message); + let message = lock.messages.add_message(message); - let mut lock = state.lock().unwrap(); lock.responses.sent_messages.push(message.clone()); lock.responses.copied_messages.push(CopiedMessage { message_id: message.id, diff --git a/teloxide_tests/src/server/routes/delete_message.rs b/teloxide_tests/src/server/routes/delete_message.rs index 494fda0..10584b3 100644 --- a/teloxide_tests/src/server/routes/delete_message.rs +++ b/teloxide_tests/src/server/routes/delete_message.rs @@ -6,7 +6,7 @@ use serde::Deserialize; use crate::mock_bot::State; use crate::server::routes::make_telegram_result; -use crate::server::{DeletedMessage, MESSAGES}; +use crate::server::DeletedMessage; use super::{check_if_message_exists, BodyChatId}; @@ -20,9 +20,9 @@ pub async fn delete_message( state: web::Data>, body: web::Json, ) -> impl Responder { - check_if_message_exists!(body.message_id); - let deleted_message = MESSAGES.delete_message(body.message_id).unwrap(); let mut lock = state.lock().unwrap(); + check_if_message_exists!(lock, body.message_id); + let deleted_message = lock.messages.delete_message(body.message_id).unwrap(); lock.responses.deleted_messages.push(DeletedMessage { message: deleted_message.clone(), bot_request: body.into_inner(), diff --git a/teloxide_tests/src/server/routes/edit_message_caption.rs b/teloxide_tests/src/server/routes/edit_message_caption.rs index 74e53b4..300d86c 100644 --- a/teloxide_tests/src/server/routes/edit_message_caption.rs +++ b/teloxide_tests/src/server/routes/edit_message_caption.rs @@ -7,7 +7,7 @@ use teloxide::types::{MessageEntity, ParseMode, ReplyMarkup}; use crate::mock_bot::State; use crate::server::routes::make_telegram_result; -use crate::server::{EditedMessageCaption, MESSAGES}; +use crate::server::EditedMessageCaption; use super::{check_if_message_exists, BodyChatId}; @@ -34,19 +34,21 @@ pub async fn edit_message_caption( body.inline_message_id.clone(), ) { (Some(_), Some(message_id), None) => { - check_if_message_exists!(message_id); - MESSAGES.edit_message(message_id, "caption", body.caption.clone()); - MESSAGES.edit_message( + let mut lock = state.lock().unwrap(); + check_if_message_exists!(lock, message_id); + lock.messages + .edit_message(message_id, "caption", body.caption.clone()); + lock.messages.edit_message( message_id, "caption_entities", body.caption_entities.clone().unwrap_or_default(), ); - let message = MESSAGES + let message = lock + .messages .edit_message_reply_markup(message_id, body.reply_markup.clone()) .unwrap(); - let mut lock = state.lock().unwrap(); lock.responses .edited_messages_caption .push(EditedMessageCaption { diff --git a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs index 8c4c4a4..2301d00 100644 --- a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs +++ b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs @@ -7,7 +7,7 @@ use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::ReplyMarkup; -use crate::server::{EditedMessageReplyMarkup, MESSAGES}; +use crate::server::EditedMessageReplyMarkup; use super::BodyChatId; @@ -30,18 +30,20 @@ pub async fn edit_message_reply_markup( body.inline_message_id.clone(), ) { (Some(_), Some(message_id), None) => { - check_if_message_exists!(message_id); + let mut lock = state.lock().unwrap(); + check_if_message_exists!(lock, message_id); let message = match body.reply_markup.clone() { - Some(reply_markup) => MESSAGES + Some(reply_markup) => lock + .messages .edit_message(message_id, "reply_markup", reply_markup) .unwrap(), - None => MESSAGES + None => lock + .messages .edit_message(message_id, "reply_markup", None::<()>) .unwrap(), }; - let mut lock = state.lock().unwrap(); lock.responses .edited_messages_reply_markup .push(EditedMessageReplyMarkup { diff --git a/teloxide_tests/src/server/routes/edit_message_text.rs b/teloxide_tests/src/server/routes/edit_message_text.rs index e0074ad..d554967 100644 --- a/teloxide_tests/src/server/routes/edit_message_text.rs +++ b/teloxide_tests/src/server/routes/edit_message_text.rs @@ -6,7 +6,7 @@ use teloxide::types::{LinkPreviewOptions, MessageEntity, ParseMode, ReplyMarkup} use crate::{ mock_bot::State, - server::{routes::make_telegram_result, EditedMessageText, MESSAGES}, + server::{routes::make_telegram_result, EditedMessageText}, }; use super::{check_if_message_exists, BodyChatId}; @@ -34,19 +34,21 @@ pub async fn edit_message_text( body.inline_message_id.clone(), ) { (Some(_), Some(message_id), None) => { - check_if_message_exists!(message_id); + let mut lock = state.lock().unwrap(); + check_if_message_exists!(lock, message_id); - MESSAGES.edit_message(message_id, "text", body.text.clone()); - MESSAGES.edit_message( + lock.messages + .edit_message(message_id, "text", body.text.clone()); + lock.messages.edit_message( message_id, "entities", body.entities.clone().unwrap_or(vec![]), ); - let message = MESSAGES + let message = lock + .messages .edit_message_reply_markup(message_id, body.reply_markup.clone()) .unwrap(); - let mut lock = state.lock().unwrap(); lock.responses.edited_messages_text.push(EditedMessageText { message: message.clone(), bot_request: body.into_inner(), diff --git a/teloxide_tests/src/server/routes/forward_message.rs b/teloxide_tests/src/server/routes/forward_message.rs index 83bf715..5b90930 100644 --- a/teloxide_tests/src/server/routes/forward_message.rs +++ b/teloxide_tests/src/server/routes/forward_message.rs @@ -1,8 +1,8 @@ use std::sync::Mutex; use crate::mock_bot::State; +use crate::server::routes::check_if_message_exists; use crate::server::ForwardedMessage; -use crate::server::{routes::check_if_message_exists, MESSAGES}; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; @@ -25,8 +25,10 @@ pub async fn forward_message( me: web::Data, state: web::Data>, ) -> impl Responder { - check_if_message_exists!(body.message_id); - let mut message = MESSAGES.get_message(body.message_id).unwrap(); + let mut lock = state.lock().unwrap(); + + check_if_message_exists!(lock, body.message_id); + let mut message = lock.messages.get_message(body.message_id).unwrap(); if message.has_protected_content() { return ErrorBadRequest("Message has protected content").into(); @@ -66,13 +68,12 @@ pub async fn forward_message( common.has_protected_content = body.protect_content.unwrap_or(false); } - let last_id = MESSAGES.max_message_id(); + let last_id = lock.messages.max_message_id(); message.id = MessageId(last_id + 1); message.chat = body.chat_id.chat(); message.from = Some(me.user.clone()); - let message = MESSAGES.add_message(message); + let message = lock.messages.add_message(message); - let mut lock = state.lock().unwrap(); lock.responses.sent_messages.push(message.clone()); lock.responses.forwarded_messages.push(ForwardedMessage { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/mod.rs b/teloxide_tests/src/server/routes/mod.rs index 965f490..bba42cf 100644 --- a/teloxide_tests/src/server/routes/mod.rs +++ b/teloxide_tests/src/server/routes/mod.rs @@ -167,8 +167,8 @@ pub trait SerializeRawFields { } macro_rules! check_if_message_exists { - ($msg_id:expr) => { - if MESSAGES.get_message($msg_id).is_none() { + ($lock:expr, $msg_id:expr) => { + if $lock.messages.get_message($msg_id).is_none() { return ErrorBadRequest("Message not found").into(); } }; diff --git a/teloxide_tests/src/server/routes/pin_chat_message.rs b/teloxide_tests/src/server/routes/pin_chat_message.rs index d4496a8..3728190 100644 --- a/teloxide_tests/src/server/routes/pin_chat_message.rs +++ b/teloxide_tests/src/server/routes/pin_chat_message.rs @@ -6,7 +6,6 @@ use serde::Deserialize; use crate::mock_bot::State; use crate::server::routes::make_telegram_result; -use crate::server::MESSAGES; use super::{check_if_message_exists, BodyChatId}; @@ -21,9 +20,8 @@ pub async fn pin_chat_message( state: web::Data>, body: web::Json, ) -> impl Responder { - check_if_message_exists!(body.message_id); let mut lock = state.lock().unwrap(); + check_if_message_exists!(lock, body.message_id); lock.responses.pinned_chat_messages.push(body.into_inner()); - make_telegram_result(true) } diff --git a/teloxide_tests/src/server/routes/send_animation.rs b/teloxide_tests/src/server/routes/send_animation.rs index 3271735..768ba7b 100644 --- a/teloxide_tests/src/server/routes/send_animation.rs +++ b/teloxide_tests/src/server/routes/send_animation.rs @@ -16,7 +16,7 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, MESSAGES}; +use crate::server::routes::check_if_message_exists; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -25,6 +25,7 @@ pub async fn send_animation( me: web::Data, state: web::Data>, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageAnimationBody::serialize_raw_fields(&fields, &attachments, FileType::Animation) @@ -40,8 +41,11 @@ pub async fn send_animation( message.has_media_spoiler = body.has_spoiler.unwrap_or_default(); if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); - let reply_to_message = MESSAGES.get_message(reply_parameters.message_id.0).unwrap(); + check_if_message_exists!(lock, reply_parameters.message_id.0); + let reply_to_message = lock + .messages + .get_message(reply_parameters.message_id.0) + .unwrap(); message.reply_to_message = Some(Box::new(reply_to_message.clone())); } if let Some(ReplyMarkup::InlineKeyboard(markup)) = body.reply_markup.clone() { @@ -64,14 +68,13 @@ pub async fn send_animation( .unwrap_or(Mime::from_str("image/gif").unwrap()), ); - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); - state.lock().unwrap().files.push(teloxide::types::File { + lock.files.push(teloxide::types::File { meta: message.animation().unwrap().file.clone(), path: body.file_name.to_owned(), }); - let mut lock = state.lock().unwrap(); lock.responses.sent_messages.push(message.clone()); lock.responses .sent_messages_animation diff --git a/teloxide_tests/src/server/routes/send_audio.rs b/teloxide_tests/src/server/routes/send_audio.rs index c1b2a7d..b171eac 100644 --- a/teloxide_tests/src/server/routes/send_audio.rs +++ b/teloxide_tests/src/server/routes/send_audio.rs @@ -19,7 +19,7 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, MESSAGES}; +use crate::server::routes::check_if_message_exists; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -28,6 +28,7 @@ pub async fn send_audio( me: web::Data, state: web::Data>, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageAudioBody::serialize_raw_fields(&fields, &attachments, FileType::Audio).unwrap(); @@ -40,8 +41,11 @@ pub async fn send_audio( message.caption_entities = body.caption_entities.clone().unwrap_or_default(); if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); - let reply_to_message = MESSAGES.get_message(reply_parameters.message_id.0).unwrap(); + check_if_message_exists!(lock, reply_parameters.message_id.0); + let reply_to_message = lock + .messages + .get_message(reply_parameters.message_id.0) + .unwrap(); message.reply_to_message = Some(Box::new(reply_to_message.clone())); } if let Some(ReplyMarkup::InlineKeyboard(markup)) = body.reply_markup.clone() { @@ -60,10 +64,9 @@ pub async fn send_audio( message.mime_type = Some(Mime::from_str("audio/mp3").unwrap()); message.file_name = Some(body.file_name.clone()); - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); - let mut lock = state.lock().unwrap(); lock.files.push(teloxide::types::File { meta: message.audio().unwrap().file.clone(), path: body.file_name.to_owned(), diff --git a/teloxide_tests/src/server/routes/send_contact.rs b/teloxide_tests/src/server/routes/send_contact.rs index 020878a..82d1803 100644 --- a/teloxide_tests/src/server/routes/send_contact.rs +++ b/teloxide_tests/src/server/routes/send_contact.rs @@ -1,7 +1,7 @@ use std::sync::Mutex; use crate::mock_bot::State; -use crate::server::{SentMessageContact, MESSAGES}; +use crate::server::SentMessageContact; use crate::MockMessageContact; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; @@ -33,6 +33,7 @@ pub async fn send_contact( me: web::Data, state: web::Data>, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let chat = body.chat_id.chat(); let mut message = // Creates the message, which will be mutated to fit the needed shape MockMessageContact::new().chat(chat); @@ -44,18 +45,20 @@ pub async fn send_contact( message.has_protected_content = body.protect_content.unwrap_or(false); if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); - let reply_to_message = MESSAGES.get_message(reply_parameters.message_id.0).unwrap(); + check_if_message_exists!(lock, reply_parameters.message_id.0); + let reply_to_message = lock + .messages + .get_message(reply_parameters.message_id.0) + .unwrap(); message.reply_to_message = Some(Box::new(reply_to_message.clone())); } if let Some(ReplyMarkup::InlineKeyboard(markup)) = body.reply_markup.clone() { message.reply_markup = Some(markup); } - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); - let mut lock = state.lock().unwrap(); lock.responses.sent_messages.push(message.clone()); lock.responses .sent_messages_contact diff --git a/teloxide_tests/src/server/routes/send_dice.rs b/teloxide_tests/src/server/routes/send_dice.rs index 4537012..e57dfe8 100644 --- a/teloxide_tests/src/server/routes/send_dice.rs +++ b/teloxide_tests/src/server/routes/send_dice.rs @@ -2,7 +2,7 @@ use std::sync::Mutex; use crate::mock_bot::State; use crate::server::routes::check_if_message_exists; -use crate::server::{SentMessageDice, MESSAGES}; +use crate::server::SentMessageDice; use crate::MockMessageDice; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; @@ -28,6 +28,7 @@ pub async fn send_dice( state: web::Data>, body: web::Json, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let chat = body.chat_id.chat(); let mut message = // Creates the message, which will be mutated to fit the needed shape MockMessageDice::new().chat(chat); @@ -35,13 +36,12 @@ pub async fn send_dice( // Random from 1 to 5 because it fits all the emoji message.value = (1 + rand::random::() % 5) as u8; if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); + check_if_message_exists!(lock, reply_parameters.message_id.0); } - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); - let mut lock = state.lock().unwrap(); lock.responses.sent_messages.push(message.clone()); lock.responses.sent_messages_dice.push(SentMessageDice { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/send_document.rs b/teloxide_tests/src/server/routes/send_document.rs index 6224eea..811d00e 100644 --- a/teloxide_tests/src/server/routes/send_document.rs +++ b/teloxide_tests/src/server/routes/send_document.rs @@ -15,7 +15,7 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters}; -use crate::server::{routes::check_if_message_exists, SentMessageDocument, MESSAGES}; +use crate::server::{routes::check_if_message_exists, SentMessageDocument}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -24,6 +24,7 @@ pub async fn send_document( me: web::Data, state: web::Data>, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageDocumentBody::serialize_raw_fields(&fields, &attachments, FileType::Document) @@ -37,8 +38,11 @@ pub async fn send_document( message.caption_entities = body.caption_entities.clone().unwrap_or_default(); if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); - let reply_to_message = MESSAGES.get_message(reply_parameters.message_id.0).unwrap(); + check_if_message_exists!(lock, reply_parameters.message_id.0); + let reply_to_message = lock + .messages + .get_message(reply_parameters.message_id.0) + .unwrap(); message.reply_to_message = Some(Box::new(reply_to_message.clone())); } if let Some(ReplyMarkup::InlineKeyboard(markup)) = body.reply_markup.clone() { @@ -59,10 +63,9 @@ pub async fn send_document( ); message.has_protected_content = body.protect_content.unwrap_or(false); - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); - let mut lock = state.lock().unwrap(); lock.files.push(teloxide::types::File { meta: message.document().unwrap().file.clone(), path: body.file_name.to_owned(), diff --git a/teloxide_tests/src/server/routes/send_location.rs b/teloxide_tests/src/server/routes/send_location.rs index 1c5390f..9d21287 100644 --- a/teloxide_tests/src/server/routes/send_location.rs +++ b/teloxide_tests/src/server/routes/send_location.rs @@ -1,7 +1,7 @@ use std::sync::Mutex; use crate::mock_bot::State; -use crate::server::{SentMessageLocation, MESSAGES}; +use crate::server::SentMessageLocation; use crate::MockMessageLocation; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; @@ -35,6 +35,8 @@ pub async fn send_location( me: web::Data, state: web::Data>, ) -> impl Responder { + let mut lock = state.lock().unwrap(); + let chat = body.chat_id.chat(); let mut message = // Creates the message, which will be mutated to fit the needed shape MockMessageLocation::new().chat(chat).latitude(body.latitude).longitude(body.longitude); @@ -46,18 +48,20 @@ pub async fn send_location( message.has_protected_content = body.protect_content.unwrap_or(false); if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); - let reply_to_message = MESSAGES.get_message(reply_parameters.message_id.0).unwrap(); + check_if_message_exists!(lock, reply_parameters.message_id.0); + let reply_to_message = lock + .messages + .get_message(reply_parameters.message_id.0) + .unwrap(); message.reply_to_message = Some(Box::new(reply_to_message.clone())); } if let Some(ReplyMarkup::InlineKeyboard(markup)) = body.reply_markup.clone() { message.reply_markup = Some(markup); } - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); - let mut lock = state.lock().unwrap(); lock.responses.sent_messages.push(message.clone()); lock.responses .sent_messages_location diff --git a/teloxide_tests/src/server/routes/send_media_group.rs b/teloxide_tests/src/server/routes/send_media_group.rs index 8e4005e..3cc521c 100644 --- a/teloxide_tests/src/server/routes/send_media_group.rs +++ b/teloxide_tests/src/server/routes/send_media_group.rs @@ -1,5 +1,5 @@ use crate::mock_bot::State; -use crate::server::{SentMediaGroup, MESSAGES}; +use crate::server::SentMediaGroup; use crate::{ MockMessageAudio, MockMessageDocument, MockMessagePhoto, MockMessageVideo, MockPhotoSize, MockVideo, @@ -29,6 +29,7 @@ pub async fn send_media_group( state: web::Data>, ) -> impl Responder { let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; + let mut lock = state.lock().unwrap(); let body = SendMediaGroupBody::serialize_raw_fields(&fields, &attachments).unwrap(); if body.media.len() > 10 { return ErrorBadRequest("Too many media items").into(); @@ -39,10 +40,12 @@ pub async fn send_media_group( let protect_content = body.protect_content; let mut reply_to_message = None; if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); + check_if_message_exists!(lock, reply_parameters.message_id.0); // All of messages in the media group are replying to the same message reply_to_message = Some(Box::new( - MESSAGES.get_message(reply_parameters.message_id.0).unwrap(), + lock.messages + .get_message(reply_parameters.message_id.0) + .unwrap(), )); } let media_group_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 16); @@ -52,7 +55,7 @@ pub async fn send_media_group( for media in &body.media { let file_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 16); let file_unique_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 8); - let last_id = MESSAGES.max_message_id(); + let last_id = lock.messages.max_message_id(); let message: Message; match media { MediaGroupInputMedia::InputMediaAudio(audio) => { @@ -78,7 +81,7 @@ pub async fn send_media_group( mock_message.id = MessageId(last_id + 1); message = mock_message.build(); - state.lock().unwrap().files.push(teloxide::types::File { + lock.files.push(teloxide::types::File { meta: message.audio().unwrap().file.clone(), path: audio.file_name.clone(), }); @@ -104,7 +107,7 @@ pub async fn send_media_group( mock_message.id = MessageId(last_id + 1); message = mock_message.build(); - state.lock().unwrap().files.push(teloxide::types::File { + lock.files.push(teloxide::types::File { meta: message.document().unwrap().file.clone(), path: document.file_name.clone(), }); @@ -131,7 +134,7 @@ pub async fn send_media_group( mock_message.id = MessageId(last_id + 1); message = mock_message.build(); - state.lock().unwrap().files.push(teloxide::types::File { + lock.files.push(teloxide::types::File { meta: message.photo().unwrap().first().unwrap().clone().file, path: photo.file_name.clone(), }); @@ -163,7 +166,7 @@ pub async fn send_media_group( mock_message.id = MessageId(last_id + 1); message = mock_message.build(); - state.lock().unwrap().files.push(teloxide::types::File { + lock.files.push(teloxide::types::File { meta: message.video().unwrap().file.clone(), path: video.file_name.clone(), }); @@ -171,10 +174,9 @@ pub async fn send_media_group( } messages.push(message.clone()); - MESSAGES.add_message(message); + lock.messages.add_message(message); } - let mut lock = state.lock().unwrap(); lock.responses.sent_messages.extend(messages.clone()); lock.responses.sent_media_group.push(SentMediaGroup { messages: messages.clone(), diff --git a/teloxide_tests/src/server/routes/send_message.rs b/teloxide_tests/src/server/routes/send_message.rs index 72d5dfa..dfd9c0b 100644 --- a/teloxide_tests/src/server/routes/send_message.rs +++ b/teloxide_tests/src/server/routes/send_message.rs @@ -9,7 +9,7 @@ use teloxide::types::{ LinkPreviewOptions, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, }; -use crate::server::{routes::check_if_message_exists, SentMessageText, MESSAGES}; +use crate::server::{routes::check_if_message_exists, SentMessageText}; use super::{make_telegram_result, BodyChatId}; @@ -34,6 +34,7 @@ pub async fn send_message( me: web::Data, state: web::Data>, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let chat = body.chat_id.chat(); let mut message = // Creates the message, which will be mutated to fit the needed shape MockMessageText::new().text(&body.text).chat(chat); @@ -42,18 +43,20 @@ pub async fn send_message( message.entities = body.entities.clone().unwrap_or_default(); if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); - let reply_to_message = MESSAGES.get_message(reply_parameters.message_id.0).unwrap(); + check_if_message_exists!(lock, reply_parameters.message_id.0); + let reply_to_message = lock + .messages + .get_message(reply_parameters.message_id.0) + .unwrap(); message.reply_to_message = Some(Box::new(reply_to_message.clone())); } if let Some(ReplyMarkup::InlineKeyboard(markup)) = body.reply_markup.clone() { message.reply_markup = Some(markup); } - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); - let mut lock = state.lock().unwrap(); lock.responses.sent_messages.push(message.clone()); lock.responses.sent_messages_text.push(SentMessageText { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/send_photo.rs b/teloxide_tests/src/server/routes/send_photo.rs index 85b6fa4..3643c8b 100644 --- a/teloxide_tests/src/server/routes/send_photo.rs +++ b/teloxide_tests/src/server/routes/send_photo.rs @@ -16,7 +16,7 @@ use teloxide::types::{ LinkPreviewOptions, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, }; -use crate::server::{routes::check_if_message_exists, SentMessagePhoto, MESSAGES}; +use crate::server::{routes::check_if_message_exists, SentMessagePhoto}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -25,6 +25,7 @@ pub async fn send_photo( me: web::Data, state: web::Data>, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessagePhotoBody::serialize_raw_fields(&fields, &attachments, FileType::Photo).unwrap(); @@ -38,8 +39,11 @@ pub async fn send_photo( message.caption_entities = body.caption_entities.clone().unwrap_or_default(); if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); - let reply_to_message = MESSAGES.get_message(reply_parameters.message_id.0).unwrap(); + check_if_message_exists!(lock, reply_parameters.message_id.0); + let reply_to_message = lock + .messages + .get_message(reply_parameters.message_id.0) + .unwrap(); message.reply_to_message = Some(Box::new(reply_to_message.clone())); } if let Some(ReplyMarkup::InlineKeyboard(markup)) = body.reply_markup.clone() { @@ -55,10 +59,9 @@ pub async fn send_photo( .file_size(body.file_data.bytes().len() as u32) .build()]; - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); - let mut lock = state.lock().unwrap(); lock.files.push(teloxide::types::File { meta: message.photo().unwrap()[0].file.clone(), path: body.file_name.to_owned(), diff --git a/teloxide_tests/src/server/routes/send_poll.rs b/teloxide_tests/src/server/routes/send_poll.rs index 49a4053..0c98528 100644 --- a/teloxide_tests/src/server/routes/send_poll.rs +++ b/teloxide_tests/src/server/routes/send_poll.rs @@ -1,7 +1,7 @@ use std::sync::Mutex; use crate::mock_bot::State; -use crate::server::{SentMessagePoll, MESSAGES}; +use crate::server::SentMessagePoll; use crate::MockMessagePoll; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; @@ -46,6 +46,7 @@ pub async fn send_poll( body: web::Json, me: web::Data, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let chat = body.chat_id.chat(); let mut message = // Creates the message, which will be mutated to fit the needed shape MockMessagePoll::new().chat(chat); @@ -71,18 +72,20 @@ pub async fn send_poll( message.close_date = DateTime::from_timestamp(body.close_date.unwrap_or(0) as i64, 0); if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); - let reply_to_message = MESSAGES.get_message(reply_parameters.message_id.0).unwrap(); + check_if_message_exists!(lock, reply_parameters.message_id.0); + let reply_to_message = lock + .messages + .get_message(reply_parameters.message_id.0) + .unwrap(); message.reply_to_message = Some(Box::new(reply_to_message.clone())); } if let Some(ReplyMarkup::InlineKeyboard(markup)) = body.reply_markup.clone() { message.reply_markup = Some(markup); } - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); - let mut lock = state.lock().unwrap(); lock.responses.sent_messages.push(message.clone()); lock.responses.sent_messages_poll.push(SentMessagePoll { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/send_sticker.rs b/teloxide_tests/src/server/routes/send_sticker.rs index 793285a..6959745 100644 --- a/teloxide_tests/src/server/routes/send_sticker.rs +++ b/teloxide_tests/src/server/routes/send_sticker.rs @@ -13,7 +13,7 @@ use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::{Me, ReplyMarkup, ReplyParameters}; -use crate::server::{routes::check_if_message_exists, MESSAGES}; +use crate::server::routes::check_if_message_exists; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -22,6 +22,7 @@ pub async fn send_sticker( me: web::Data, state: web::Data>, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageStickerBody::serialize_raw_fields(&fields, &attachments, FileType::Sticker) @@ -37,18 +38,19 @@ pub async fn send_sticker( // ain't nobody testing that if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); - let reply_to_message = MESSAGES.get_message(reply_parameters.message_id.0).unwrap(); + check_if_message_exists!(lock, reply_parameters.message_id.0); + let reply_to_message = lock + .messages + .get_message(reply_parameters.message_id.0) + .unwrap(); message.reply_to_message = Some(Box::new(reply_to_message.clone())); } if let Some(ReplyMarkup::InlineKeyboard(markup)) = body.reply_markup.clone() { message.reply_markup = Some(markup); } - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); - - let mut lock = state.lock().unwrap(); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); lock.files.push(teloxide::types::File { meta: message.sticker().unwrap().file.clone(), diff --git a/teloxide_tests/src/server/routes/send_venue.rs b/teloxide_tests/src/server/routes/send_venue.rs index c2eb3d7..efbf1a4 100644 --- a/teloxide_tests/src/server/routes/send_venue.rs +++ b/teloxide_tests/src/server/routes/send_venue.rs @@ -1,7 +1,7 @@ use std::sync::Mutex; use crate::mock_bot::State; -use crate::server::{SentMessageVenue, MESSAGES}; +use crate::server::SentMessageVenue; use crate::{MockLocation, MockMessageVenue}; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; @@ -37,6 +37,7 @@ pub async fn send_venue( me: web::Data, state: web::Data>, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let chat = body.chat_id.chat(); let mut message = // Creates the message, which will be mutated to fit the needed shape MockMessageVenue::new().chat(chat); @@ -54,18 +55,20 @@ pub async fn send_venue( message.google_place_type = body.google_place_type.clone(); if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); - let reply_to_message = MESSAGES.get_message(reply_parameters.message_id.0).unwrap(); + check_if_message_exists!(lock, reply_parameters.message_id.0); + let reply_to_message = lock + .messages + .get_message(reply_parameters.message_id.0) + .unwrap(); message.reply_to_message = Some(Box::new(reply_to_message.clone())); } if let Some(ReplyMarkup::InlineKeyboard(markup)) = body.reply_markup.clone() { message.reply_markup = Some(markup); } - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); - let mut lock = state.lock().unwrap(); lock.responses.sent_messages.push(message.clone()); lock.responses.sent_messages_venue.push(SentMessageVenue { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/send_video.rs b/teloxide_tests/src/server/routes/send_video.rs index a0f8325..2c3724d 100644 --- a/teloxide_tests/src/server/routes/send_video.rs +++ b/teloxide_tests/src/server/routes/send_video.rs @@ -15,7 +15,7 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, SentMessageVideo, MESSAGES}; +use crate::server::{routes::check_if_message_exists, SentMessageVideo}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -24,6 +24,7 @@ pub async fn send_video( me: web::Data, state: web::Data>, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageVideoBody::serialize_raw_fields(&fields, &attachments, FileType::Video).unwrap(); @@ -36,8 +37,11 @@ pub async fn send_video( message.caption_entities = body.caption_entities.clone().unwrap_or_default(); if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); - let reply_to_message = MESSAGES.get_message(reply_parameters.message_id.0).unwrap(); + check_if_message_exists!(lock, reply_parameters.message_id.0); + let reply_to_message = lock + .messages + .get_message(reply_parameters.message_id.0) + .unwrap(); message.reply_to_message = Some(Box::new(reply_to_message.clone())); } @@ -59,14 +63,13 @@ pub async fn send_video( .mime_type(Mime::from_str("video/mp4").unwrap()) .build(); - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); - state.lock().unwrap().files.push(teloxide::types::File { + lock.files.push(teloxide::types::File { meta: message.video().unwrap().file.clone(), path: body.file_name.to_owned(), }); - let mut lock = state.lock().unwrap(); lock.responses.sent_messages.push(message.clone()); lock.responses.sent_messages_video.push(SentMessageVideo { message: message.clone(), diff --git a/teloxide_tests/src/server/routes/send_video_note.rs b/teloxide_tests/src/server/routes/send_video_note.rs index 732b963..452e736 100644 --- a/teloxide_tests/src/server/routes/send_video_note.rs +++ b/teloxide_tests/src/server/routes/send_video_note.rs @@ -18,7 +18,7 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, MESSAGES}; +use crate::server::routes::check_if_message_exists; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -27,6 +27,8 @@ pub async fn send_video_note( me: web::Data, state: web::Data>, ) -> impl Responder { + let mut lock = state.lock().unwrap(); + let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageVideoNoteBody::serialize_raw_fields(&fields, &attachments, FileType::Voice) @@ -38,8 +40,11 @@ pub async fn send_video_note( message.has_protected_content = body.protect_content.unwrap_or(false); if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); - let reply_to_message = MESSAGES.get_message(reply_parameters.message_id.0).unwrap(); + check_if_message_exists!(lock, reply_parameters.message_id.0); + let reply_to_message = lock + .messages + .get_message(reply_parameters.message_id.0) + .unwrap(); message.reply_to_message = Some(Box::new(reply_to_message.clone())); } if let Some(ReplyMarkup::InlineKeyboard(markup)) = body.reply_markup.clone() { @@ -55,10 +60,9 @@ pub async fn send_video_note( message.length = body.length.unwrap_or(100); message.file_size = body.file_data.bytes().len() as u32; - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); - let mut lock = state.lock().unwrap(); lock.files.push(teloxide::types::File { meta: message.video_note().unwrap().file.clone(), path: body.file_name.to_owned(), diff --git a/teloxide_tests/src/server/routes/send_voice.rs b/teloxide_tests/src/server/routes/send_voice.rs index 02c5487..20c5194 100644 --- a/teloxide_tests/src/server/routes/send_voice.rs +++ b/teloxide_tests/src/server/routes/send_voice.rs @@ -19,7 +19,7 @@ use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, MESSAGES}; +use crate::server::routes::check_if_message_exists; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -28,6 +28,7 @@ pub async fn send_voice( me: web::Data, state: web::Data>, ) -> impl Responder { + let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; let body = SendMessageVoiceBody::serialize_raw_fields(&fields, &attachments, FileType::Voice).unwrap(); @@ -40,8 +41,11 @@ pub async fn send_voice( message.caption_entities = body.caption_entities.clone().unwrap_or_default(); if let Some(reply_parameters) = &body.reply_parameters { - check_if_message_exists!(reply_parameters.message_id.0); - let reply_to_message = MESSAGES.get_message(reply_parameters.message_id.0).unwrap(); + check_if_message_exists!(lock, reply_parameters.message_id.0); + let reply_to_message = lock + .messages + .get_message(reply_parameters.message_id.0) + .unwrap(); message.reply_to_message = Some(Box::new(reply_to_message.clone())); } if let Some(ReplyMarkup::InlineKeyboard(markup)) = body.reply_markup.clone() { @@ -57,10 +61,8 @@ pub async fn send_voice( message.file_size = body.file_data.bytes().len() as u32; message.mime_type = Some(Mime::from_str("audio/mp3").unwrap()); - let last_id = MESSAGES.max_message_id(); - let message = MESSAGES.add_message(message.id(last_id + 1).build()); - - let mut lock = state.lock().unwrap(); + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); lock.files.push(teloxide::types::File { meta: message.voice().unwrap().file.clone(), diff --git a/teloxide_tests/src/server/routes/set_message_reaction.rs b/teloxide_tests/src/server/routes/set_message_reaction.rs index 72a4127..991e907 100644 --- a/teloxide_tests/src/server/routes/set_message_reaction.rs +++ b/teloxide_tests/src/server/routes/set_message_reaction.rs @@ -7,7 +7,7 @@ use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::ReactionType; -use crate::server::{routes::check_if_message_exists, MESSAGES}; +use crate::server::routes::check_if_message_exists; use super::{make_telegram_result, BodyChatId}; @@ -23,9 +23,10 @@ pub async fn set_message_reaction( state: web::Data>, body: web::Json, ) -> impl Responder { - check_if_message_exists!(body.message_id); - let mut lock = state.lock().unwrap(); + + check_if_message_exists!(lock, body.message_id); + lock.responses .set_message_reaction .push(SetMessageReaction { diff --git a/teloxide_tests/src/server/routes/unpin_chat_message.rs b/teloxide_tests/src/server/routes/unpin_chat_message.rs index 79c3293..4c97c5f 100644 --- a/teloxide_tests/src/server/routes/unpin_chat_message.rs +++ b/teloxide_tests/src/server/routes/unpin_chat_message.rs @@ -6,7 +6,6 @@ use serde::Deserialize; use crate::mock_bot::State; use crate::server::routes::make_telegram_result; -use crate::server::MESSAGES; use super::{check_if_message_exists, BodyChatId}; @@ -20,10 +19,10 @@ pub async fn unpin_chat_message( state: web::Data>, body: web::Json, ) -> impl Responder { + let mut lock = state.lock().unwrap(); if let Some(message_id) = body.message_id { - check_if_message_exists!(message_id); + check_if_message_exists!(lock, message_id); } - let mut lock = state.lock().unwrap(); lock.responses .unpinned_chat_messages .push(body.into_inner()); From 7b4e2311f66fd3a6e49af51d9a1afa1b3de36382 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 14:09:00 +0000 Subject: [PATCH 092/138] remove storage lock Maybe it's fine? --- teloxide_tests/src/mock_bot.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index a8fe67d..c10831e 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -32,8 +32,6 @@ lazy_static! { static ref BOT_LOCK: Arc> = Arc::new(Mutex::new(())); } -static GET_POTENTIAL_STORAGE_LOCK: Mutex<()> = Mutex::new(()); - fn find_file(value: Value) -> Option { // Recursively searches for file meta let mut file_id = None; @@ -336,9 +334,6 @@ impl MockBot { where S: Send + 'static + Clone, { - let get_potential_storage_lock = GET_POTENTIAL_STORAGE_LOCK.lock(); - // If not this lock, some panic messages will make it to stderr, even with gag, because - // race condition. let default_panic = panic::take_hook(); let in_mem_storage: Option>>>; let erased_storage: Option>>>; @@ -368,7 +363,6 @@ impl MockBot { panic::set_hook(default_panic); // Restore the default panic hook drop(print_gag); - drop(get_potential_storage_lock); (in_mem_storage, erased_storage) } From 930d19bebd14c7c2ba75aefda6519097877fc17d Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 14:13:28 +0000 Subject: [PATCH 093/138] fix mutex guards being held over awaits --- teloxide_tests/src/server/routes/send_animation.rs | 2 +- teloxide_tests/src/server/routes/send_audio.rs | 2 +- teloxide_tests/src/server/routes/send_document.rs | 2 +- teloxide_tests/src/server/routes/send_photo.rs | 2 +- teloxide_tests/src/server/routes/send_sticker.rs | 2 +- teloxide_tests/src/server/routes/send_video.rs | 2 +- teloxide_tests/src/server/routes/send_video_note.rs | 3 +-- teloxide_tests/src/server/routes/send_voice.rs | 2 +- 8 files changed, 8 insertions(+), 9 deletions(-) diff --git a/teloxide_tests/src/server/routes/send_animation.rs b/teloxide_tests/src/server/routes/send_animation.rs index 768ba7b..3742194 100644 --- a/teloxide_tests/src/server/routes/send_animation.rs +++ b/teloxide_tests/src/server/routes/send_animation.rs @@ -25,8 +25,8 @@ pub async fn send_animation( me: web::Data, state: web::Data>, ) -> impl Responder { - let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; + let mut lock = state.lock().unwrap(); let body = SendMessageAnimationBody::serialize_raw_fields(&fields, &attachments, FileType::Animation) .unwrap(); diff --git a/teloxide_tests/src/server/routes/send_audio.rs b/teloxide_tests/src/server/routes/send_audio.rs index b171eac..ca198fd 100644 --- a/teloxide_tests/src/server/routes/send_audio.rs +++ b/teloxide_tests/src/server/routes/send_audio.rs @@ -28,8 +28,8 @@ pub async fn send_audio( me: web::Data, state: web::Data>, ) -> impl Responder { - let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; + let mut lock = state.lock().unwrap(); let body = SendMessageAudioBody::serialize_raw_fields(&fields, &attachments, FileType::Audio).unwrap(); let chat = body.chat_id.chat(); diff --git a/teloxide_tests/src/server/routes/send_document.rs b/teloxide_tests/src/server/routes/send_document.rs index 811d00e..9fdb993 100644 --- a/teloxide_tests/src/server/routes/send_document.rs +++ b/teloxide_tests/src/server/routes/send_document.rs @@ -24,8 +24,8 @@ pub async fn send_document( me: web::Data, state: web::Data>, ) -> impl Responder { - let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; + let mut lock = state.lock().unwrap(); let body = SendMessageDocumentBody::serialize_raw_fields(&fields, &attachments, FileType::Document) .unwrap(); diff --git a/teloxide_tests/src/server/routes/send_photo.rs b/teloxide_tests/src/server/routes/send_photo.rs index 3643c8b..02cd7a3 100644 --- a/teloxide_tests/src/server/routes/send_photo.rs +++ b/teloxide_tests/src/server/routes/send_photo.rs @@ -25,8 +25,8 @@ pub async fn send_photo( me: web::Data, state: web::Data>, ) -> impl Responder { - let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; + let mut lock = state.lock().unwrap(); let body = SendMessagePhotoBody::serialize_raw_fields(&fields, &attachments, FileType::Photo).unwrap(); let chat = body.chat_id.chat(); diff --git a/teloxide_tests/src/server/routes/send_sticker.rs b/teloxide_tests/src/server/routes/send_sticker.rs index 6959745..0e35e78 100644 --- a/teloxide_tests/src/server/routes/send_sticker.rs +++ b/teloxide_tests/src/server/routes/send_sticker.rs @@ -22,8 +22,8 @@ pub async fn send_sticker( me: web::Data, state: web::Data>, ) -> impl Responder { - let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; + let mut lock = state.lock().unwrap(); let body = SendMessageStickerBody::serialize_raw_fields(&fields, &attachments, FileType::Sticker) .unwrap(); diff --git a/teloxide_tests/src/server/routes/send_video.rs b/teloxide_tests/src/server/routes/send_video.rs index 2c3724d..56f637f 100644 --- a/teloxide_tests/src/server/routes/send_video.rs +++ b/teloxide_tests/src/server/routes/send_video.rs @@ -24,8 +24,8 @@ pub async fn send_video( me: web::Data, state: web::Data>, ) -> impl Responder { - let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; + let mut lock = state.lock().unwrap(); let body = SendMessageVideoBody::serialize_raw_fields(&fields, &attachments, FileType::Video).unwrap(); let chat = body.chat_id.chat(); diff --git a/teloxide_tests/src/server/routes/send_video_note.rs b/teloxide_tests/src/server/routes/send_video_note.rs index 452e736..6ccf6aa 100644 --- a/teloxide_tests/src/server/routes/send_video_note.rs +++ b/teloxide_tests/src/server/routes/send_video_note.rs @@ -27,9 +27,8 @@ pub async fn send_video_note( me: web::Data, state: web::Data>, ) -> impl Responder { - let mut lock = state.lock().unwrap(); - let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; + let mut lock = state.lock().unwrap(); let body = SendMessageVideoNoteBody::serialize_raw_fields(&fields, &attachments, FileType::Voice) .unwrap(); diff --git a/teloxide_tests/src/server/routes/send_voice.rs b/teloxide_tests/src/server/routes/send_voice.rs index 20c5194..ab68aca 100644 --- a/teloxide_tests/src/server/routes/send_voice.rs +++ b/teloxide_tests/src/server/routes/send_voice.rs @@ -28,8 +28,8 @@ pub async fn send_voice( me: web::Data, state: web::Data>, ) -> impl Responder { - let mut lock = state.lock().unwrap(); let (fields, attachments) = get_raw_multipart_fields(&mut payload).await; + let mut lock = state.lock().unwrap(); let body = SendMessageVoiceBody::serialize_raw_fields(&fields, &attachments, FileType::Voice).unwrap(); let chat = body.chat_id.chat(); From 2eb9a2b0c4f4675bd8586a1b252f4f1004e0222f Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 14:17:35 +0000 Subject: [PATCH 094/138] make bot lock an option --- teloxide_tests/src/mock_bot.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index c10831e..10eda53 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -123,7 +123,7 @@ pub struct MockBot { current_update_id: AtomicI32, stack_size: usize, state: Arc>, - _bot_lock: MutexGuard<'static, ()>, + _bot_lock: Option>, } impl MockBot { @@ -191,7 +191,7 @@ impl MockBot { let state = Arc::new(Mutex::new(State::default())); // If the lock is poisoned, we don't care, some other bot panicked and can't do anything - let lock = BOT_LOCK.lock().unwrap_or_else(PoisonError::into_inner); + let lock = Some(BOT_LOCK.lock().unwrap_or_else(PoisonError::into_inner)); Self { bot, From 518b287ba6259eb0eaf08281308d2dc7dceb2741 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 18:08:42 +0000 Subject: [PATCH 095/138] Add assert_state --- teloxide_tests/src/mock_bot.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 6b6569f..b36502b 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -3,6 +3,7 @@ use gag::Gag; use serde_json::Value; use std::{ env, + fmt::Debug, mem::discriminant, panic, sync::{atomic::AtomicI32, Arc, Mutex, MutexGuard, PoisonError}, @@ -538,6 +539,13 @@ impl MockBot { } } + pub async fn assert_state(&self, state: S) + where + S: Send + 'static + Clone + Debug + PartialEq, + { + assert_eq!(self.get_state::().await, state) + } + /// Gets the state of the dialogue, if the storage exists in dependencies /// Panics if no storage was found /// You need to use type annotation to get the state, please refer to the `set_state` From 147f2b32c85e8837c6d6fd50f7acf29a7302bc90 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 18:09:17 +0000 Subject: [PATCH 096/138] Add test for assert_state --- teloxide_tests/src/tests.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index c9bf0c1..c9cbe09 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -82,6 +82,21 @@ async fn test_echo_with_start_state() { assert_eq!(last_response.text(), Some("test")); } +#[tokio::test] +async fn test_assert_state() { + let bot = MockBot::new(MockMessageText::new().text("test"), get_dialogue_schema()); + let storage = InMemStorage::::new(); + bot.dependencies(deps![storage]); + bot.set_state(State::Start).await; + + bot.dispatch().await; + + bot.assert_state(State::NotStart).await; + + let last_response = bot.get_responses().sent_messages.pop().unwrap(); + assert_eq!(last_response.text(), Some("test")); +} + #[tokio::test] async fn test_echo_with_not_start_test() { let bot = MockBot::new(MockMessageText::new().text("test"), get_dialogue_schema()); From f25ae82c81b5b2ca9e4963cd819f56c835ef5847 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Fri, 8 Nov 2024 18:12:45 +0000 Subject: [PATCH 097/138] Add docstring to assert_state --- teloxide_tests/src/mock_bot.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index b36502b..e8df3e9 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -539,6 +539,7 @@ impl MockBot { } } + /// Helper function to fetch the state of the dialogue and assert its value pub async fn assert_state(&self, state: S) where S: Send + 'static + Clone + Debug + PartialEq, From a0f1790e3fa2132b1d31f2ff00a0bd2a353572d6 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Sat, 9 Nov 2024 21:03:29 +0200 Subject: [PATCH 098/138] Fixed tests hanging + changed to Dispatcher --- Cargo.lock | 32 +++--- Cargo.toml | 2 +- teloxide_tests/src/lib.rs | 1 + teloxide_tests/src/listener.rs | 62 ++++++++++ teloxide_tests/src/mock_bot.rs | 107 +++++++----------- teloxide_tests/src/server/mod.rs | 55 ++++----- teloxide_tests/src/server/routes/get_me.rs | 8 ++ .../src/server/routes/get_updates.rs | 8 ++ .../src/server/routes/get_webhook_info.rs | 10 ++ teloxide_tests/src/server/routes/mod.rs | 3 + teloxide_tests/src/tests.rs | 26 ++++- 11 files changed, 194 insertions(+), 120 deletions(-) create mode 100644 teloxide_tests/src/listener.rs create mode 100644 teloxide_tests/src/server/routes/get_me.rs create mode 100644 teloxide_tests/src/server/routes/get_updates.rs create mode 100644 teloxide_tests/src/server/routes/get_webhook_info.rs diff --git a/Cargo.lock b/Cargo.lock index 663e832..821a4d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -518,9 +518,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.35" +version = "1.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57c4b4da2a9d619dd035f27316d7a426305b75be93d09e92f2b9229c34feaf" +checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf" dependencies = [ "jobserver", "libc", @@ -879,9 +879,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "filedescriptor" @@ -1539,9 +1539,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "linux-raw-sys" @@ -2158,9 +2158,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -2272,9 +2272,9 @@ dependencies = [ [[package]] name = "serial_test" -version = "3.1.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b4b487fe2acf240a021cf57c6b2b4903b1e78ca0ecd862a71b71d2a51fed77d" +checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9" dependencies = [ "futures", "log", @@ -2286,9 +2286,9 @@ dependencies = [ [[package]] name = "serial_test_derive" -version = "3.1.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" +checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", @@ -2570,9 +2570,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", "fastrand", @@ -2653,9 +2653,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.41.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", diff --git a/Cargo.toml b/Cargo.toml index 4774750..9c680d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ resolver = "2" [workspace.package] # MSRV -rust-version = "1.72" +rust-version = "1.80" edition = "2021" license = "MIT" diff --git a/teloxide_tests/src/lib.rs b/teloxide_tests/src/lib.rs index c9a082f..3364421 100644 --- a/teloxide_tests/src/lib.rs +++ b/teloxide_tests/src/lib.rs @@ -161,6 +161,7 @@ pub mod mock_bot; mod server; #[cfg(test)] mod tests; +pub mod listener; pub use dataset::*; pub use mock_bot::MockBot; diff --git a/teloxide_tests/src/listener.rs b/teloxide_tests/src/listener.rs new file mode 100644 index 0000000..673272a --- /dev/null +++ b/teloxide_tests/src/listener.rs @@ -0,0 +1,62 @@ +use std::{ + pin::Pin, + sync::Mutex, + task::{Context, Poll}, +}; + +use futures_util::Stream; +use teloxide::{ + stop::StopToken, + types::Update, + update_listeners::{AsUpdateStream, UpdateListener}, + Bot, RequestError, +}; + +// It isn't really a listener, it just takes the updates and feeds them one by one to the +// dispather, until there is no more. +pub(crate) struct InsertingListener { + pub updates: Vec, +} + +pub(crate) struct InsertingListenerStream { + updates: Mutex>, +} + +impl Stream for InsertingListenerStream { + type Item = Result; + + fn poll_next(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + if self.updates.lock().unwrap().len() == 0 { + // Returning Poll::Ready(None) means that there is nothing more to poll, and the + // dispatcher closes. If we wanted it to continue, Poll::Pending is the way. + return Poll::Ready(None); + } + // Returns updates one by one + let update = self.updates.lock().unwrap().remove(0); + Poll::Ready(Some(Ok(update))) + } +} + +impl UpdateListener for InsertingListener { + type Err = RequestError; + + fn stop_token(&mut self) -> StopToken { + // This is a workaround, StopToken fields are private + let token = "1234567890:QWERTYUIOPASDFGHJKLZXCVBNMQWERTYUIO"; + let bot = Bot::new(token); + teloxide::update_listeners::Polling::builder(bot) + .build() + .stop_token() + } +} + +impl<'a> AsUpdateStream<'a> for InsertingListener { + type StreamErr = RequestError; + type Stream = InsertingListenerStream; + + fn as_stream(&'a mut self) -> Self::Stream { + InsertingListenerStream { + updates: self.updates.clone().into(), + } + } +} diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 10eda53..937cc50 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -1,24 +1,26 @@ //! Mock bot that sends requests to the fake server +use crate::{ + dataset::{IntoUpdate, MockMe}, + server::ServerManager, +}; +use crate::{ + listener::InsertingListener, + server::{self, messages::Messages, Responses}, +}; use gag::Gag; +use lazy_static::lazy_static; use serde_json::Value; use std::{ mem::discriminant, panic, sync::{atomic::AtomicI32, Arc, Mutex, MutexGuard, PoisonError}, }; +use teloxide::types::UpdateKind; use teloxide::{ dispatching::dialogue::ErasedStorage, dptree::di::DependencySupplier, types::{File, FileMeta, MaybeInaccessibleMessage, MessageId, MessageKind}, }; -use teloxide::{dptree::deps, types::UpdateKind}; - -use crate::server::{self, messages::Messages, Responses}; -use crate::{ - dataset::{IntoUpdate, MockMe}, - server::ServerManager, -}; -use lazy_static::lazy_static; use teloxide::{ dispatching::{ dialogue::{GetChatId, InMemStorage, Storage}, @@ -73,6 +75,7 @@ fn find_chat_id(value: Value) -> Option { } None } + #[derive(Default)] pub struct State { pub files: Vec, @@ -225,9 +228,9 @@ impl MockBot { self.updates = update.into_update(&self.current_update_id); } - fn collect_handles(&self, handles: &mut Vec>, bot: Bot) { - let self_deps = self.dependencies.clone(); - for mut update in self.updates.clone() { + /// Just inserts the updates into the state, returning them + fn insert_updates(&self, updates: &mut [Update]) { + for update in updates.iter_mut() { match update.kind.clone() { UpdateKind::Message(mut message) => { // Add the message to the list of messages, so the bot can interact with it @@ -244,46 +247,33 @@ impl MockBot { } _ => {} } + } + } - let mut deps = deps![ - bot.clone(), - self.me.clone(), - update.clone() // This actually makes an update go through the dptree - ]; - - deps.insert_container(self_deps.clone()); // These are nessessary for the dispatch - - // This, too, will need to be redone in the ideal world, but it just waits until the server is up - let handler_tree = self.handler_tree.clone(); - - let stack_size = self.stack_size; - - // To fix the stack overflow, a new thread with a new runtime is needed - let builder = std::thread::Builder::new().stack_size(self.stack_size); - handles.push( - builder - .spawn(move || { - let runtime = tokio::runtime::Builder::new_multi_thread() - .thread_stack_size(stack_size) // Not needed, but just in case - .enable_all() - .build() - .unwrap(); - - runtime.block_on(async move { - let result = handler_tree.dispatch(deps.clone()).await; - if let ControlFlow::Break(result) = result { - // If it returned `ControlFlow::Break`, everything is fine, but we need to check, if the - // handler didn't error out - assert!(result.is_ok(), "Error in handler: {:?}", result); - } else { - log::error!("Update didn't get handled!"); - panic!("Unhandled update!"); - } - }) - }) - .unwrap(), + async fn run_updates(&self, bot: Bot, updates: Vec) { + let handler_tree = self.handler_tree.clone(); + let deps = self.dependencies.clone(); + let stack_size = self.stack_size; + + tokio::task::spawn_blocking(move || { + let runtime = tokio::runtime::Builder::new_multi_thread() + .thread_stack_size(stack_size) // Not needed, but just in case + .enable_all() + .build() + .unwrap(); + runtime.block_on( + Dispatcher::builder(bot.clone(), handler_tree.clone()) + .dependencies(deps) + .stack_size(stack_size) + .build() + .dispatch_with_listener( + InsertingListener { updates }, + LoggingErrorHandler::new(), + ), ); - } + }) + .await + .expect("Thread panicked"); } /// Actually dispatches the bot, calling the update through the handler tree. @@ -296,25 +286,12 @@ impl MockBot { let server = ServerManager::start(self.me.clone(), self.state.clone()) .await .unwrap(); + let mut updates = self.updates.clone(); + self.insert_updates(&mut updates); let api_url = reqwest::Url::parse(&format!("http://127.0.0.1:{}", server.port)).unwrap(); let bot = self.bot.clone().set_api_url(api_url); - - // Gets all of the updates to send - let mut handles = vec![]; - self.collect_handles(&mut handles, bot.clone()); - - for handle in handles { - // Waits until every update has been sent - match handle.join() { - Ok(_) => {} - Err(_) => { - server.stop().await.unwrap(); - panic!("Something went wrong and the bot panicked!"); - } - }; - } - + self.run_updates(bot, updates).await; server.stop().await.unwrap(); } diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 5c598af..01b3b0c 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -8,12 +8,13 @@ pub use responses::*; use routes::{ answer_callback_query::*, ban_chat_member::*, copy_message::*, delete_message::*, download_file::download_file, edit_message_caption::*, edit_message_reply_markup::*, - edit_message_text::*, forward_message::*, get_file::*, pin_chat_message::*, - restrict_chat_member::*, send_animation::*, send_audio::*, send_chat_action::*, - send_contact::*, send_dice::*, send_document::*, send_location::*, send_media_group::*, - send_message::*, send_photo::*, send_poll::*, send_sticker::*, send_venue::*, send_video::*, - send_video_note::*, send_voice::*, set_message_reaction::*, set_my_commands::*, - unban_chat_member::*, unpin_all_chat_messages::*, unpin_chat_message::*, + edit_message_text::*, forward_message::*, get_file::*, get_me::*, get_updates::*, + get_webhook_info::*, pin_chat_message::*, restrict_chat_member::*, send_animation::*, + send_audio::*, send_chat_action::*, send_contact::*, send_dice::*, send_document::*, + send_location::*, send_media_group::*, send_message::*, send_photo::*, send_poll::*, + send_sticker::*, send_venue::*, send_video::*, send_video_note::*, send_voice::*, + set_message_reaction::*, set_my_commands::*, unban_chat_member::*, unpin_all_chat_messages::*, + unpin_chat_message::*, }; use std::{ error::Error, @@ -22,7 +23,11 @@ use std::{ sync::{Arc, Mutex}, }; use teloxide::types::Me; -use tokio::task::{JoinError, JoinHandle}; +use tokio::sync::mpsc::Sender; +use tokio::{ + sync::mpsc::channel, + task::{JoinError, JoinHandle}, +}; use tokio_util::sync::CancellationToken; use crate::mock_bot::State; @@ -30,10 +35,6 @@ use crate::mock_bot::State; pub mod messages; pub mod responses; -pub async fn ping() -> impl Responder { - "pong" -} - #[allow(dead_code)] pub async fn log_request(body: Json) -> impl Responder { dbg!(body); @@ -54,19 +55,17 @@ impl ServerManager { let port = listener.local_addr()?.port(); let cancel_token = CancellationToken::new(); + let (tx, mut rx) = channel::<()>(100); let server = tokio::spawn(run_server( listener, me, state.clone(), cancel_token.clone(), + tx, )); - - if let Err(err) = wait_for_server(port).await { - cancel_token.cancel(); - server.await?; - return Err(err.into()); - } + // Waits until the server is ready + rx.recv().await; Ok(Self { port, @@ -81,26 +80,15 @@ impl ServerManager { } } -async fn wait_for_server(port: u16) -> Result<(), String> { - let url = format!("http://127.0.0.1:{}/ping", port); - let max_tries = 200; - - for _ in 0..max_tries { - if reqwest::get(&url).await.is_ok() { - return Ok(()); - } - } - - Err(format!("Failed to get the server on the port {}!", port)) -} - async fn run_server( listener: TcpListener, me: Me, state: Arc>, cancel_token: CancellationToken, + tx: Sender<()>, ) { let server = create_server(listener, me, state).unwrap(); + tx.send(()).await.unwrap(); let server_handle = server.handle(); tokio::spawn(async move { @@ -123,19 +111,20 @@ fn create_server( .configure(set_routes) }) .listen(listener)? - .workers(1) .run()) } fn set_routes(cfg: &mut ServiceConfig) { - cfg.route("/ping", get().to(ping)) - .route("/file/bot{token}/{file_name}", get().to(download_file)) + cfg.route("/file/bot{token}/{file_name}", get().to(download_file)) .service(scope("/bot{token}").configure(set_bot_routes)); } fn set_bot_routes(cfg: &mut ServiceConfig) { cfg.route("/GetFile", post().to(get_file)) .route("/SendMessage", post().to(send_message)) + .route("/GetWebhookInfo", post().to(get_webhook_info)) + .route("/GetMe", post().to(get_me)) + .route("/GetUpdates", post().to(get_updates)) .route("/SendPhoto", post().to(send_photo)) .route("/SendVideo", post().to(send_video)) .route("/SendVoice", post().to(send_voice)) diff --git a/teloxide_tests/src/server/routes/get_me.rs b/teloxide_tests/src/server/routes/get_me.rs new file mode 100644 index 0000000..1999dde --- /dev/null +++ b/teloxide_tests/src/server/routes/get_me.rs @@ -0,0 +1,8 @@ +use actix_web::{web, Responder}; +use teloxide::types::Me; + +use super::make_telegram_result; + +pub async fn get_me(me: web::Data) -> impl Responder { + make_telegram_result(me) +} diff --git a/teloxide_tests/src/server/routes/get_updates.rs b/teloxide_tests/src/server/routes/get_updates.rs new file mode 100644 index 0000000..8ea31e9 --- /dev/null +++ b/teloxide_tests/src/server/routes/get_updates.rs @@ -0,0 +1,8 @@ +use actix_web::Responder; +use serde_json::json; + +use super::make_telegram_result; + +pub async fn get_updates() -> impl Responder { + make_telegram_result(json!([])) +} diff --git a/teloxide_tests/src/server/routes/get_webhook_info.rs b/teloxide_tests/src/server/routes/get_webhook_info.rs new file mode 100644 index 0000000..98006c6 --- /dev/null +++ b/teloxide_tests/src/server/routes/get_webhook_info.rs @@ -0,0 +1,10 @@ +use actix_web::Responder; +use serde_json::json; + +use super::make_telegram_result; + +pub async fn get_webhook_info() -> impl Responder { + make_telegram_result( + json!({"url": "", "has_custom_certificate":false,"pending_update_count":0}), + ) +} diff --git a/teloxide_tests/src/server/routes/mod.rs b/teloxide_tests/src/server/routes/mod.rs index bba42cf..cde27eb 100644 --- a/teloxide_tests/src/server/routes/mod.rs +++ b/teloxide_tests/src/server/routes/mod.rs @@ -23,6 +23,9 @@ pub mod edit_message_reply_markup; pub mod edit_message_text; pub mod forward_message; pub mod get_file; +pub mod get_me; +pub mod get_updates; +pub mod get_webhook_info; pub mod pin_chat_message; pub mod restrict_chat_member; pub mod send_animation; diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index e345a18..8df9e61 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -36,6 +36,8 @@ enum State { NotStart, } +type MyDialogue = Dialogue>; + async fn handler_with_state( bot: Bot, dialogue: MyDialogue, @@ -161,8 +163,6 @@ pub enum AllCommands { Panic, } -type MyDialogue = Dialogue>; - async fn handler( bot: Bot, msg: Message, @@ -433,14 +433,30 @@ async fn test_echo() { #[tokio::test] #[should_panic] async fn test_panic() { - // Nothing else should fail because it panics - let mut bot = MockBot::new(MockMessageText::new().text("/panic"), get_schema()); + // Nothing else should fail because this panics + let bot = MockBot::new(MockMessageText::new().text("/panic"), get_schema()); - bot.dispatch().await; + // To actually keep the bot in scope + if true { + panic!("Expected panic"); + } drop(bot); } +#[tokio::test] +async fn test_no_updates() { + let empty: Vec = vec![]; + let mut bot = MockBot::new(empty, get_schema()); + + // This shouldn't panic + bot.dispatch().await; + + // Just to test that everything is fine + bot.update(MockMessageText::new().text("/echo echo")); + bot.dispatch_and_check_last_text("/echo echo").await; +} + #[tokio::test] async fn test_send_photo() { let mut bot = MockBot::new(MockMessageText::new().text("/photo"), get_schema()); From 977ab87d5b3e583ad3e00f6fc43cd6f5293ba19a Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Sat, 9 Nov 2024 21:33:23 +0200 Subject: [PATCH 099/138] Removed obsolete crutch --- teloxide_tests/src/lib.rs | 2 +- .../src/server/routes/copy_message.rs | 1 - .../src/server/routes/edit_message_caption.rs | 1 - .../routes/edit_message_reply_markup.rs | 1 - .../src/server/routes/edit_message_text.rs | 1 - teloxide_tests/src/server/routes/mod.rs | 113 +----------------- .../src/server/routes/send_animation.rs | 1 - .../src/server/routes/send_audio.rs | 1 - .../src/server/routes/send_contact.rs | 1 - teloxide_tests/src/server/routes/send_dice.rs | 1 - .../src/server/routes/send_document.rs | 1 - .../src/server/routes/send_location.rs | 1 - .../src/server/routes/send_message.rs | 1 - .../src/server/routes/send_photo.rs | 1 - teloxide_tests/src/server/routes/send_poll.rs | 1 - .../src/server/routes/send_sticker.rs | 1 - .../src/server/routes/send_venue.rs | 1 - .../src/server/routes/send_video.rs | 1 - .../src/server/routes/send_video_note.rs | 1 - .../src/server/routes/send_voice.rs | 1 - teloxide_tests/src/tests.rs | 2 +- 21 files changed, 4 insertions(+), 131 deletions(-) diff --git a/teloxide_tests/src/lib.rs b/teloxide_tests/src/lib.rs index 3364421..54ede6c 100644 --- a/teloxide_tests/src/lib.rs +++ b/teloxide_tests/src/lib.rs @@ -157,11 +157,11 @@ #![allow(clippy::bool_assert_comparison)] mod dataset; +pub(crate) mod listener; pub mod mock_bot; mod server; #[cfg(test)] mod tests; -pub mod listener; pub use dataset::*; pub use mock_bot::MockBot; diff --git a/teloxide_tests/src/server/routes/copy_message.rs b/teloxide_tests/src/server/routes/copy_message.rs index 5351d6a..d1eb76c 100644 --- a/teloxide_tests/src/server/routes/copy_message.rs +++ b/teloxide_tests/src/server/routes/copy_message.rs @@ -27,7 +27,6 @@ pub struct CopyMessageBody { pub show_caption_above_media: Option, pub disable_notification: Option, pub protect_content: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, } diff --git a/teloxide_tests/src/server/routes/edit_message_caption.rs b/teloxide_tests/src/server/routes/edit_message_caption.rs index 300d86c..7a9a1bc 100644 --- a/teloxide_tests/src/server/routes/edit_message_caption.rs +++ b/teloxide_tests/src/server/routes/edit_message_caption.rs @@ -20,7 +20,6 @@ pub struct EditMessageCaptionBody { pub parse_mode: Option, pub caption_entities: Option>, pub show_caption_above_media: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, } diff --git a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs index 2301d00..d200c99 100644 --- a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs +++ b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs @@ -16,7 +16,6 @@ pub struct EditMessageReplyMarkupBody { pub chat_id: Option, pub message_id: Option, pub inline_message_id: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, } diff --git a/teloxide_tests/src/server/routes/edit_message_text.rs b/teloxide_tests/src/server/routes/edit_message_text.rs index d554967..6a95833 100644 --- a/teloxide_tests/src/server/routes/edit_message_text.rs +++ b/teloxide_tests/src/server/routes/edit_message_text.rs @@ -20,7 +20,6 @@ pub struct EditMessageTextBody { pub parse_mode: Option, pub entities: Option>, pub link_preview_options: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, } diff --git a/teloxide_tests/src/server/routes/mod.rs b/teloxide_tests/src/server/routes/mod.rs index cde27eb..b2cf069 100644 --- a/teloxide_tests/src/server/routes/mod.rs +++ b/teloxide_tests/src/server/routes/mod.rs @@ -7,11 +7,8 @@ use futures_util::stream::StreamExt as _; use futures_util::TryStreamExt; use rand::distributions::{Alphanumeric, DistString}; use serde::{Deserialize, Serialize}; -use serde_json::{json, Value}; -use teloxide::types::{ - Chat, ForceReply, KeyboardMarkup, KeyboardRemove, MessageEntity, ParseMode, ReplyMarkup, - Seconds, True, -}; +use serde_json::json; +use teloxide::types::{Chat, MessageEntity, ParseMode, Seconds}; pub mod answer_callback_query; pub mod ban_chat_member; @@ -260,109 +257,3 @@ where .to_string(), ) } - -pub fn deserialize_reply_markup(value: Value) -> Option { - let selective = value - .get("selective") - .map(|x| serde_json::from_value(x.clone()).ok()) - .flatten() - == Some(true); - let input_field_placeholder: Option = value - .get("input_field_placeholder") - .map(|x| serde_json::from_value(x.clone()).ok()) - .flatten(); - if value.get("keyboard").is_some() { - let is_persistent: bool = value - .get("is_persistent") - .map(|x| serde_json::from_value(x.clone()).ok()) - .flatten() - == Some(true); - let one_time_keyboard = value - .get("one_time_keyboard") - .map(|x| serde_json::from_value(x.clone()).ok()) - .flatten() - == Some(true); - let resize_keyboard = value - .get("resize_keyboard") - .map(|x| serde_json::from_value(x.clone()).ok()) - .flatten() - == Some(true); - - return Some(ReplyMarkup::Keyboard(KeyboardMarkup { - keyboard: serde_json::from_value(value["keyboard"].clone()).unwrap(), - is_persistent, - selective, - input_field_placeholder: input_field_placeholder.unwrap_or("".to_string()), - one_time_keyboard, - resize_keyboard, - })); - } else if value.get("inline_keyboard").is_some() { - return serde_json::from_value(value).ok(); - } else if value.get("remove_keyboard").is_some() { - return Some(ReplyMarkup::KeyboardRemove(KeyboardRemove { - remove_keyboard: True, - selective, - })); - } else if value.get("force_reply").is_some() { - return Some(ReplyMarkup::ForceReply(ForceReply { - force_reply: True, - input_field_placeholder, - selective, - })); - } - - return None; -} - -pub(crate) mod reply_markup_deserialize { - use super::deserialize_reply_markup; - use serde::{Deserialize, Deserializer}; - use serde_json::Value; - use teloxide::types::ReplyMarkup; - - pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - let value: Option = Option::deserialize(deserializer)?; - match value { - Some(value) => { - if !value.is_null() { - Ok(deserialize_reply_markup(value)) - } else { - Ok(None) - } - } - None => Ok(None), - } - } - - #[test] - fn test() { - use teloxide::types::KeyboardRemove; - #[derive(serde::Deserialize, Debug, PartialEq)] - struct Struct { - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] - reply_markup: Option, - } - - { - let s: Struct = - serde_json::from_str("{\"reply_markup\": {\"remove_keyboard\":\"True\"}}").unwrap(); - assert_eq!( - s, - Struct { - reply_markup: Some(ReplyMarkup::KeyboardRemove(KeyboardRemove { - remove_keyboard: teloxide::types::True, - selective: false - })) - } - ); - } - - { - let s: Struct = serde_json::from_str("{}").unwrap(); - assert_eq!(s, Struct { reply_markup: None }) - } - } -} diff --git a/teloxide_tests/src/server/routes/send_animation.rs b/teloxide_tests/src/server/routes/send_animation.rs index 3742194..9a4b03a 100644 --- a/teloxide_tests/src/server/routes/send_animation.rs +++ b/teloxide_tests/src/server/routes/send_animation.rs @@ -103,7 +103,6 @@ pub struct SendMessageAnimationBody { pub disable_notification: Option, pub protect_content: Option, pub message_effect_id: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, pub reply_parameters: Option, } diff --git a/teloxide_tests/src/server/routes/send_audio.rs b/teloxide_tests/src/server/routes/send_audio.rs index ca198fd..a233bc3 100644 --- a/teloxide_tests/src/server/routes/send_audio.rs +++ b/teloxide_tests/src/server/routes/send_audio.rs @@ -96,6 +96,5 @@ pub struct SendMessageAudioBody { pub protect_content: Option, pub message_effect_id: Option, pub reply_parameters: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, } diff --git a/teloxide_tests/src/server/routes/send_contact.rs b/teloxide_tests/src/server/routes/send_contact.rs index 82d1803..0f17666 100644 --- a/teloxide_tests/src/server/routes/send_contact.rs +++ b/teloxide_tests/src/server/routes/send_contact.rs @@ -23,7 +23,6 @@ pub struct SendMessageContactBody { pub disable_notification: Option, pub protect_content: Option, pub message_effect_id: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, pub reply_parameters: Option, } diff --git a/teloxide_tests/src/server/routes/send_dice.rs b/teloxide_tests/src/server/routes/send_dice.rs index e57dfe8..e5294f7 100644 --- a/teloxide_tests/src/server/routes/send_dice.rs +++ b/teloxide_tests/src/server/routes/send_dice.rs @@ -19,7 +19,6 @@ pub struct SendMessageDiceBody { pub disable_notification: Option, pub protect_content: Option, pub message_effect_id: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, pub reply_parameters: Option, } diff --git a/teloxide_tests/src/server/routes/send_document.rs b/teloxide_tests/src/server/routes/send_document.rs index 9fdb993..a82e2fe 100644 --- a/teloxide_tests/src/server/routes/send_document.rs +++ b/teloxide_tests/src/server/routes/send_document.rs @@ -94,7 +94,6 @@ pub struct SendMessageDocumentBody { pub disable_notification: Option, pub protect_content: Option, pub message_effect_id: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, pub reply_parameters: Option, } diff --git a/teloxide_tests/src/server/routes/send_location.rs b/teloxide_tests/src/server/routes/send_location.rs index 9d21287..ace21aa 100644 --- a/teloxide_tests/src/server/routes/send_location.rs +++ b/teloxide_tests/src/server/routes/send_location.rs @@ -25,7 +25,6 @@ pub struct SendMessageLocationBody { pub disable_notification: Option, pub protect_content: Option, pub message_effect_id: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, pub reply_parameters: Option, } diff --git a/teloxide_tests/src/server/routes/send_message.rs b/teloxide_tests/src/server/routes/send_message.rs index dfd9c0b..a6d1440 100644 --- a/teloxide_tests/src/server/routes/send_message.rs +++ b/teloxide_tests/src/server/routes/send_message.rs @@ -24,7 +24,6 @@ pub struct SendMessageTextBody { pub disable_notification: Option, pub protect_content: Option, pub message_effect_id: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, pub reply_parameters: Option, } diff --git a/teloxide_tests/src/server/routes/send_photo.rs b/teloxide_tests/src/server/routes/send_photo.rs index 02cd7a3..ef4bdfa 100644 --- a/teloxide_tests/src/server/routes/send_photo.rs +++ b/teloxide_tests/src/server/routes/send_photo.rs @@ -88,7 +88,6 @@ pub struct SendMessagePhotoBody { pub disable_notification: Option, pub protect_content: Option, pub message_effect_id: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, pub reply_parameters: Option, } diff --git a/teloxide_tests/src/server/routes/send_poll.rs b/teloxide_tests/src/server/routes/send_poll.rs index 0c98528..fda4b21 100644 --- a/teloxide_tests/src/server/routes/send_poll.rs +++ b/teloxide_tests/src/server/routes/send_poll.rs @@ -36,7 +36,6 @@ pub struct SendMessagePollBody { pub disable_notification: Option, pub protect_content: Option, pub message_effect_id: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, pub reply_parameters: Option, } diff --git a/teloxide_tests/src/server/routes/send_sticker.rs b/teloxide_tests/src/server/routes/send_sticker.rs index 0e35e78..8fb7da0 100644 --- a/teloxide_tests/src/server/routes/send_sticker.rs +++ b/teloxide_tests/src/server/routes/send_sticker.rs @@ -77,7 +77,6 @@ pub struct SendMessageStickerBody { pub disable_notification: Option, pub protect_content: Option, pub message_effect_id: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, pub reply_parameters: Option, } diff --git a/teloxide_tests/src/server/routes/send_venue.rs b/teloxide_tests/src/server/routes/send_venue.rs index efbf1a4..d7a1461 100644 --- a/teloxide_tests/src/server/routes/send_venue.rs +++ b/teloxide_tests/src/server/routes/send_venue.rs @@ -27,7 +27,6 @@ pub struct SendMessageVenueBody { pub disable_notification: Option, pub protect_content: Option, pub message_effect_id: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, pub reply_parameters: Option, } diff --git a/teloxide_tests/src/server/routes/send_video.rs b/teloxide_tests/src/server/routes/send_video.rs index 56f637f..4e0b218 100644 --- a/teloxide_tests/src/server/routes/send_video.rs +++ b/teloxide_tests/src/server/routes/send_video.rs @@ -97,7 +97,6 @@ pub struct SendMessageVideoBody { pub disable_notification: Option, pub protect_content: Option, pub message_effect_id: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, pub reply_parameters: Option, } diff --git a/teloxide_tests/src/server/routes/send_video_note.rs b/teloxide_tests/src/server/routes/send_video_note.rs index 6ccf6aa..6d7d0db 100644 --- a/teloxide_tests/src/server/routes/send_video_note.rs +++ b/teloxide_tests/src/server/routes/send_video_note.rs @@ -89,6 +89,5 @@ pub struct SendMessageVideoNoteBody { pub protect_content: Option, pub message_effect_id: Option, pub reply_parameters: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, } diff --git a/teloxide_tests/src/server/routes/send_voice.rs b/teloxide_tests/src/server/routes/send_voice.rs index ab68aca..cd25b64 100644 --- a/teloxide_tests/src/server/routes/send_voice.rs +++ b/teloxide_tests/src/server/routes/send_voice.rs @@ -91,6 +91,5 @@ pub struct SendMessageVoiceBody { pub protect_content: Option, pub message_effect_id: Option, pub reply_parameters: Option, - #[serde(default, with = "crate::server::routes::reply_markup_deserialize")] pub reply_markup: Option, } diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index 8df9e61..d17a427 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -451,7 +451,7 @@ async fn test_no_updates() { // This shouldn't panic bot.dispatch().await; - + // Just to test that everything is fine bot.update(MockMessageText::new().text("/echo echo")); bot.dispatch_and_check_last_text("/echo echo").await; From 9485d9dd90654aa9dd23f99ad6149149346f8e96 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Sat, 9 Nov 2024 21:35:51 +0200 Subject: [PATCH 100/138] Updated all examples except album_bot --- examples/Cargo.lock | 359 ++++++++++++++++++-- examples/calculator_bot/Cargo.toml | 4 +- examples/calculator_bot/src/tests.rs | 12 +- examples/deep_linking_bot/Cargo.toml | 4 +- examples/deep_linking_bot/src/tests.rs | 14 +- examples/file_download_bot/Cargo.toml | 4 +- examples/file_download_bot/src/main.rs | 4 +- examples/hello_world_bot/Cargo.toml | 4 +- examples/hello_world_bot/src/main.rs | 2 +- examples/phrase_bot/Cargo.toml | 4 +- examples/phrase_bot/src/handlers/private.rs | 22 +- examples/phrase_bot/src/handlers/public.rs | 4 +- 12 files changed, 362 insertions(+), 75 deletions(-) diff --git a/examples/Cargo.lock b/examples/Cargo.lock index 3551646..e6b39ef 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -35,7 +35,7 @@ dependencies = [ "brotli", "bytes", "bytestring", - "derive_more", + "derive_more 0.99.18", "encoding_rs", "flate2", "futures-core", @@ -77,7 +77,7 @@ dependencies = [ "actix-multipart-derive", "actix-utils", "actix-web", - "derive_more", + "derive_more 0.99.18", "futures-core", "futures-util", "httparse", @@ -189,7 +189,7 @@ dependencies = [ "bytestring", "cfg-if", "cookie", - "derive_more", + "derive_more 0.99.18", "encoding_rs", "futures-core", "futures-util", @@ -234,14 +234,14 @@ dependencies = [ "actix-service", "actix-utils", "actix-web", - "actix-web-lab-derive", + "actix-web-lab-derive 0.20.0", "ahash", "arc-swap", "async-trait", "bytes", "bytestring", "csv", - "derive_more", + "derive_more 0.99.18", "futures-core", "futures-util", "http 0.2.12", @@ -261,6 +261,44 @@ dependencies = [ "tracing", ] +[[package]] +name = "actix-web-lab" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee75923689132fc5fb57ccc5bb98d25bb214796a29cd505844eb3b42daf11df0" +dependencies = [ + "actix-http", + "actix-router", + "actix-service", + "actix-utils", + "actix-web", + "actix-web-lab-derive 0.23.0", + "ahash", + "arc-swap", + "bytes", + "bytestring", + "csv", + "derive_more 1.0.0", + "form_urlencoded", + "futures-core", + "futures-util", + "http 0.2.12", + "impl-more", + "itertools 0.13.0", + "local-channel", + "mediatype", + "mime", + "pin-project-lite", + "regex", + "serde", + "serde_html_form", + "serde_json", + "serde_path_to_error", + "tokio", + "tokio-stream", + "tracing", +] + [[package]] name = "actix-web-lab-derive" version = "0.20.0" @@ -272,6 +310,17 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "actix-web-lab-derive" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c221da13534b9352f3f79fcbbd6095f6d8aee63bdf1da8a73d36f9eeea17d5a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "addr2line" version = "0.24.2" @@ -316,8 +365,8 @@ dependencies = [ "dotenv", "log", "pretty_env_logger", - "teloxide", - "teloxide_tests", + "teloxide 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "teloxide_tests 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio", ] @@ -351,6 +400,55 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +dependencies = [ + "anstyle", + "windows-sys 0.59.0", +] + [[package]] name = "aquamarine" version = "0.5.0" @@ -469,6 +567,12 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "bytemuck" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" + [[package]] name = "byteorder" version = "1.5.0" @@ -499,16 +603,16 @@ dependencies = [ "pretty_env_logger", "serde", "serde_json", - "teloxide", - "teloxide_tests", + "teloxide 0.13.0 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", + "teloxide_tests 0.2.0", "tokio", ] [[package]] name = "cc" -version = "1.1.35" +version = "1.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57c4b4da2a9d619dd035f27316d7a426305b75be93d09e92f2b9229c34feaf" +checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf" dependencies = [ "jobserver", "libc", @@ -541,6 +645,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + [[package]] name = "combine" version = "4.6.7" @@ -755,8 +865,8 @@ dependencies = [ "dotenv", "serde", "serde_json", - "teloxide", - "teloxide_tests", + "teloxide 0.13.0 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", + "teloxide_tests 0.2.0", "tokio", ] @@ -782,6 +892,27 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "unicode-xid", +] + [[package]] name = "diesel" version = "2.2.4" @@ -882,6 +1013,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "env_filter" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +dependencies = [ + "log", + "regex", +] + [[package]] name = "env_logger" version = "0.10.2" @@ -895,6 +1036,19 @@ dependencies = [ "termcolor", ] +[[package]] +name = "env_logger" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -923,17 +1077,17 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "file_download_bot" version = "0.1.0" dependencies = [ "dotenv", - "teloxide", - "teloxide_tests", + "teloxide 0.13.0 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", + "teloxide_tests 0.2.0", "tokio", ] @@ -1181,8 +1335,8 @@ name = "hello_world_bot" version = "0.1.0" dependencies = [ "dotenv", - "teloxide", - "teloxide_tests", + "teloxide 0.13.0 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", + "teloxide_tests 0.2.0", "tokio", ] @@ -1601,6 +1755,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itertools" version = "0.10.5" @@ -1619,6 +1779,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -1657,9 +1826,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" [[package]] name = "linux-raw-sys" @@ -1920,8 +2089,8 @@ dependencies = [ "pretty_env_logger", "serde", "serde_json", - "teloxide", - "teloxide_tests", + "teloxide 0.13.0 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", + "teloxide_tests 0.2.0", "tokio", ] @@ -1993,7 +2162,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" dependencies = [ - "env_logger", + "env_logger 0.10.2", "log", ] @@ -2207,6 +2376,7 @@ dependencies = [ "js-sys", "log", "mime", + "mime_guess", "native-tls", "once_cell", "percent-encoding", @@ -2219,14 +2389,25 @@ dependencies = [ "system-configuration 0.6.1", "tokio", "tokio-native-tls", + "tokio-util", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", + "wasm-streams", "web-sys", "windows-registry", ] +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +dependencies = [ + "bytemuck", +] + [[package]] name = "ring" version = "0.17.8" @@ -2354,9 +2535,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -2423,6 +2604,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +dependencies = [ + "itoa", + "serde", +] + [[package]] name = "serde_plain" version = "1.0.2" @@ -2654,11 +2845,36 @@ name = "teloxide" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f79dd283eb21b90451c03fa7c7f83b9985130efb876b33bad89a2c208ccbc16" +dependencies = [ + "aquamarine", + "bytes", + "derive_more 0.99.18", + "dptree", + "either", + "futures", + "log", + "mime", + "pin-project", + "serde", + "serde_json", + "teloxide-core 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "teloxide-macros", + "thiserror", + "tokio", + "tokio-stream", + "tokio-util", + "url", +] + +[[package]] +name = "teloxide" +version = "0.13.0" +source = "git+https://github.com/teloxide/teloxide.git?rev=24a8d5f#24a8d5f9d5f5467eabdbfe165839bf5a44cbddf9" dependencies = [ "aquamarine", "bytes", "deadpool-redis", - "derive_more", + "derive_more 0.99.18", "dptree", "either", "futures", @@ -2668,7 +2884,7 @@ dependencies = [ "serde", "serde_cbor", "serde_json", - "teloxide-core", + "teloxide-core 0.10.1 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", "teloxide-macros", "thiserror", "tokio", @@ -2686,7 +2902,7 @@ dependencies = [ "bitflags 1.3.2", "bytes", "chrono", - "derive_more", + "derive_more 0.99.18", "either", "futures", "log", @@ -2707,6 +2923,36 @@ dependencies = [ "uuid", ] +[[package]] +name = "teloxide-core" +version = "0.10.1" +source = "git+https://github.com/teloxide/teloxide.git?rev=24a8d5f#24a8d5f9d5f5467eabdbfe165839bf5a44cbddf9" +dependencies = [ + "bitflags 1.3.2", + "bytes", + "chrono", + "derive_more 0.99.18", + "either", + "futures", + "log", + "mime", + "once_cell", + "pin-project", + "rc-box", + "reqwest 0.12.9", + "rgb", + "serde", + "serde_json", + "serde_with", + "take_mut", + "takecell", + "thiserror", + "tokio", + "tokio-util", + "url", + "uuid", +] + [[package]] name = "teloxide-macros" version = "0.8.0" @@ -2719,6 +2965,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "teloxide_tests" +version = "0.2.0" +dependencies = [ + "actix-multipart", + "actix-web", + "actix-web-lab 0.23.0", + "chrono", + "ctrlc", + "dotenv", + "env_logger 0.11.5", + "futures-util", + "gag", + "lazy_static", + "log", + "mime", + "mime_guess", + "pretty_env_logger", + "rand", + "reqwest 0.12.9", + "serde", + "serde_json", + "teloxide 0.13.0 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", + "teloxide_tests_macros", + "tokio", + "tokio-util", + "url", +] + [[package]] name = "teloxide_tests" version = "0.2.0" @@ -2727,11 +3002,11 @@ checksum = "063e7d8270f4b1c1be07a16320b424b29cfefd48e6250eeb69020ec847bc0faa" dependencies = [ "actix-multipart", "actix-web", - "actix-web-lab", + "actix-web-lab 0.20.2", "chrono", "ctrlc", "dotenv", - "env_logger", + "env_logger 0.10.2", "futures-util", "gag", "lazy_static", @@ -2744,7 +3019,7 @@ dependencies = [ "reqwest 0.12.9", "serde", "serde_json", - "teloxide", + "teloxide 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", "teloxide_tests_macros", "tokio", "url", @@ -2763,9 +3038,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", "fastrand", @@ -2846,9 +3121,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.41.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -2980,6 +3255,12 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "untrusted" version = "0.9.0" @@ -3010,6 +3291,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" version = "1.11.0" diff --git a/examples/calculator_bot/Cargo.toml b/examples/calculator_bot/Cargo.toml index 8902617..38f9d07 100644 --- a/examples/calculator_bot/Cargo.toml +++ b/examples/calculator_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { version = "0.13.0", features = ["macros", "redis-storage", "cbor-serializer"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros", "redis-storage", "cbor-serializer"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" serde = { version = "1.0", features = ["derive"] } @@ -13,4 +13,4 @@ log = "0.4" pretty_env_logger = "0.5" [dev-dependencies] -teloxide_tests = "0.2.0" +teloxide_tests = { path = "../../teloxide_tests" } diff --git a/examples/calculator_bot/src/tests.rs b/examples/calculator_bot/src/tests.rs index e488d81..89b595d 100644 --- a/examples/calculator_bot/src/tests.rs +++ b/examples/calculator_bot/src/tests.rs @@ -5,7 +5,7 @@ use teloxide_tests::{MockBot, MockCallbackQuery, MockMessagePhoto, MockMessageTe #[tokio::test] async fn test_start() { - let bot = MockBot::new(MockMessageText::new().text("/start"), handler_tree()); + let mut bot = MockBot::new(MockMessageText::new().text("/start"), handler_tree()); bot.dependencies(deps![get_bot_storage().await]); bot.set_state(State::Start).await; @@ -27,7 +27,7 @@ async fn test_start() { #[tokio::test] async fn test_what_is_the_first_number() { - let bot = MockBot::new(MockCallbackQuery::new().data("add"), handler_tree()); + let mut bot = MockBot::new(MockCallbackQuery::new().data("add"), handler_tree()); bot.dependencies(deps![get_bot_storage().await]); bot.set_state(State::WhatDoYouWant).await; @@ -43,7 +43,7 @@ async fn test_what_is_the_first_number() { #[tokio::test] async fn test_message_errors() { - let bot = MockBot::new(MockMessageText::new().text("not a number"), handler_tree()); + let mut bot = MockBot::new(MockMessageText::new().text("not a number"), handler_tree()); bot.dependencies(deps![get_bot_storage().await]); bot.set_state(State::GetFirstNumber { @@ -63,7 +63,7 @@ async fn test_message_errors() { #[tokio::test] async fn test_what_is_the_second_number() { - let bot = MockBot::new(MockMessageText::new().text("5"), handler_tree()); + let mut bot = MockBot::new(MockMessageText::new().text("5"), handler_tree()); bot.dependencies(deps![get_bot_storage().await]); bot.set_state(State::GetFirstNumber { @@ -83,7 +83,7 @@ async fn test_what_is_the_second_number() { #[tokio::test] async fn test_add_result() { - let bot = MockBot::new(MockMessageText::new().text("4"), handler_tree()); + let mut bot = MockBot::new(MockMessageText::new().text("4"), handler_tree()); bot.dependencies(deps![get_bot_storage().await]); bot.set_state(State::GetSecondNumber { @@ -101,7 +101,7 @@ async fn test_add_result() { #[tokio::test] async fn test_subtract_result() { - let bot = MockBot::new(MockMessageText::new().text("4"), handler_tree()); + let mut bot = MockBot::new(MockMessageText::new().text("4"), handler_tree()); bot.dependencies(deps![get_bot_storage().await]); bot.set_state(State::GetSecondNumber { diff --git a/examples/deep_linking_bot/Cargo.toml b/examples/deep_linking_bot/Cargo.toml index c3f4a65..5a03eed 100644 --- a/examples/deep_linking_bot/Cargo.toml +++ b/examples/deep_linking_bot/Cargo.toml @@ -4,11 +4,11 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { version = "0.13.0", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" [dev-dependencies] -teloxide_tests = "0.2.0" +teloxide_tests = { path = "../../teloxide_tests" } diff --git a/examples/deep_linking_bot/src/tests.rs b/examples/deep_linking_bot/src/tests.rs index c16e132..d7fa738 100644 --- a/examples/deep_linking_bot/src/tests.rs +++ b/examples/deep_linking_bot/src/tests.rs @@ -6,10 +6,10 @@ use teloxide_tests::{MockBot, MockMessagePhoto, MockMessageText}; async fn test_start() { // Just a regular start let mock_message = MockMessageText::new().text("/start"); - let bot = MockBot::new(mock_message.clone(), handler_tree()); + let mut bot = MockBot::new(mock_message.clone(), handler_tree()); bot.dependencies(deps![InMemStorage::::new()]); - let me = bot.me.lock().unwrap().clone(); // Yeah, we can access the default 'me' like that + let me = bot.me.clone(); // Yeah, we can access the default 'me' like that bot.dispatch_and_check_last_text_and_state( &add_deep_link(text::START, me, mock_message.chat.id), @@ -23,7 +23,7 @@ async fn test_with_deep_link() { // Because https://t.me/some_bot?start=987654321 is the same as sending "/start 987654321", // we can simulate it with this let mock_message = MockMessageText::new().text("/start 987654321"); - let bot = MockBot::new(mock_message, handler_tree()); + let mut bot = MockBot::new(mock_message, handler_tree()); bot.dependencies(deps![InMemStorage::::new()]); @@ -38,9 +38,9 @@ async fn test_with_deep_link() { async fn test_send_message() { // The text we want to send to a 987654321 user let mock_message = MockMessageText::new().text("I love you!"); - let bot = MockBot::new(mock_message.clone(), handler_tree()); + let mut bot = MockBot::new(mock_message.clone(), handler_tree()); - let me = bot.me.lock().unwrap().clone(); + let me = bot.me.clone(); bot.dependencies(deps![InMemStorage::::new()]); bot.set_state(State::WriteToSomeone { id: 987654321 }).await; @@ -70,7 +70,7 @@ async fn test_send_message() { #[tokio::test] async fn test_wrong_link() { let mock_message = MockMessageText::new().text("/start not_id"); - let bot = MockBot::new(mock_message, handler_tree()); + let mut bot = MockBot::new(mock_message, handler_tree()); bot.dependencies(deps![InMemStorage::::new()]); bot.dispatch_and_check_last_text(text::WRONG_LINK).await; @@ -79,7 +79,7 @@ async fn test_wrong_link() { #[tokio::test] async fn test_not_a_text() { let mock_message = MockMessagePhoto::new(); - let bot = MockBot::new(mock_message, handler_tree()); + let mut bot = MockBot::new(mock_message, handler_tree()); bot.dependencies(deps![InMemStorage::::new()]); bot.set_state(State::WriteToSomeone { id: 987654321 }).await; diff --git a/examples/file_download_bot/Cargo.toml b/examples/file_download_bot/Cargo.toml index ca8fd83..3b49878 100644 --- a/examples/file_download_bot/Cargo.toml +++ b/examples/file_download_bot/Cargo.toml @@ -4,9 +4,9 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { version = "0.13.0", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" [dev-dependencies] -teloxide_tests = "0.2.0" +teloxide_tests = { path = "../../teloxide_tests" } diff --git a/examples/file_download_bot/src/main.rs b/examples/file_download_bot/src/main.rs index 71b9e52..bf75ec6 100644 --- a/examples/file_download_bot/src/main.rs +++ b/examples/file_download_bot/src/main.rs @@ -53,13 +53,13 @@ mod tests { #[tokio::test] async fn test_not_a_document() { - let bot = MockBot::new(MockMessageText::new().text("Hi!"), handler_tree()); + let mut bot = MockBot::new(MockMessageText::new().text("Hi!"), handler_tree()); bot.dispatch_and_check_last_text("Not a document").await; } #[tokio::test] async fn test_download_document_and_check() { - let bot = MockBot::new(MockMessageDocument::new(), handler_tree()); + let mut bot = MockBot::new(MockMessageDocument::new(), handler_tree()); bot.dispatch_and_check_last_text("Downloaded!").await; } } diff --git a/examples/hello_world_bot/Cargo.toml b/examples/hello_world_bot/Cargo.toml index b324108..561c864 100644 --- a/examples/hello_world_bot/Cargo.toml +++ b/examples/hello_world_bot/Cargo.toml @@ -4,9 +4,9 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { version = "0.13.0", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" [dev-dependencies] -teloxide_tests = "0.2.0" +teloxide_tests = { path = "../../teloxide_tests" } diff --git a/examples/hello_world_bot/src/main.rs b/examples/hello_world_bot/src/main.rs index 2a02367..28aa937 100644 --- a/examples/hello_world_bot/src/main.rs +++ b/examples/hello_world_bot/src/main.rs @@ -40,7 +40,7 @@ mod tests { // This creates a fake bot that will send the mock_message after we dispatch it as if it was sent by the user // If you wanted, you could've made vec![MockMessageText::new().text("Hi!"), MockMessageText::new().text("Hello!")], // and both updates would've been sent one after the other. You also can make a MockMessagePhoto, MockMessageDocument, etc - let bot = MockBot::new(mock_message, handler_tree()); + let mut bot = MockBot::new(mock_message, handler_tree()); // This will dispatch the update bot.dispatch().await; diff --git a/examples/phrase_bot/Cargo.toml b/examples/phrase_bot/Cargo.toml index b3510cd..e26821e 100644 --- a/examples/phrase_bot/Cargo.toml +++ b/examples/phrase_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { version = "0.13.0", features = ["macros", "redis-storage", "cbor-serializer"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros", "redis-storage", "cbor-serializer"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" serde = { version = "1.0", features = ["derive"] } @@ -14,4 +14,4 @@ pretty_env_logger = "0.5" diesel = { version = "2.1.6", features = ["postgres"] } [dev-dependencies] -teloxide_tests = "0.2.0" +teloxide_tests = { path = "../../teloxide_tests" } diff --git a/examples/phrase_bot/src/handlers/private.rs b/examples/phrase_bot/src/handlers/private.rs index e926948..4071705 100644 --- a/examples/phrase_bot/src/handlers/private.rs +++ b/examples/phrase_bot/src/handlers/private.rs @@ -237,7 +237,7 @@ mod tests { #[tokio::test] async fn test_start() { - let bot = MockBot::new(MockMessageText::new().text("/start"), handler_tree()); + let mut bot = MockBot::new(MockMessageText::new().text("/start"), handler_tree()); // This fully deletes the user to test its creation let _ = db::delete_user(MockUser::ID as i64); @@ -262,7 +262,7 @@ mod tests { #[tokio::test] async fn test_cancel() { // Cancel is universal, so only one test is needed - let bot = MockBot::new(MockMessageText::new().text("/cancel"), handler_tree()); + let mut bot = MockBot::new(MockMessageText::new().text("/cancel"), handler_tree()); bot.dependencies(deps![get_bot_storage().await]); bot.set_state(State::ChangeNickname).await; @@ -288,7 +288,7 @@ mod tests { #[tokio::test] async fn test_profile() { - let bot = MockBot::new( + let mut bot = MockBot::new( MockMessageText::new().text(keyboards::PROFILE_BUTTON), handler_tree(), ); @@ -313,7 +313,7 @@ mod tests { #[tokio::test] async fn test_change_nickname() { - let bot = MockBot::new( + let mut bot = MockBot::new( MockMessageText::new().text(keyboards::CHANGE_NICKNAME_BUTTON), handler_tree(), ); @@ -327,7 +327,7 @@ mod tests { #[tokio::test] async fn test_changed_nickname() { - let bot = MockBot::new(MockMessageText::new().text("nickname"), handler_tree()); + let mut bot = MockBot::new(MockMessageText::new().text("nickname"), handler_tree()); db::full_user_redeletion(MockUser::ID as i64, None); @@ -361,7 +361,7 @@ mod tests { // might race condition themselves. Because of that, write all db queries __after__ // creating the bot. Bot creation makes a lock that prevents other tests from starting, // before this one finishes - let bot = MockBot::new( + let mut bot = MockBot::new( MockMessageText::new().text(keyboards::REMOVE_PHRASE_BUTTON), handler_tree(), ); @@ -392,7 +392,7 @@ mod tests { #[tokio::test] async fn test_deleted_phrase() { - let bot = MockBot::new(MockMessageText::new().text("not a number"), handler_tree()); + let mut bot = MockBot::new(MockMessageText::new().text("not a number"), handler_tree()); db::full_user_redeletion(MockUser::ID as i64, None); db::create_phrase( @@ -440,7 +440,7 @@ mod tests { #[tokio::test] async fn test_add_phrase() { - let bot = MockBot::new( + let mut bot = MockBot::new( MockMessageText::new().text(keyboards::ADD_PHRASE_BUTTON), handler_tree(), ); @@ -457,7 +457,7 @@ mod tests { #[tokio::test] async fn test_what_is_new_phrase_text() { - let bot = MockBot::new(MockMessageText::new().text("🤗🤗🤗🤗"), handler_tree()); + let mut bot = MockBot::new(MockMessageText::new().text("🤗🤗🤗🤗"), handler_tree()); bot.dependencies(deps![get_bot_storage().await]); bot.set_state(State::WhatIsNewPhraseEmoji).await; @@ -477,7 +477,7 @@ mod tests { #[tokio::test] async fn test_what_is_new_phrase_bot_text() { - let bot = MockBot::new(MockMessageText::new().text("hug"), handler_tree()); + let mut bot = MockBot::new(MockMessageText::new().text("hug"), handler_tree()); bot.dependencies(deps![get_bot_storage().await]); bot.set_state(State::WhatIsNewPhraseText { @@ -497,7 +497,7 @@ mod tests { #[tokio::test] async fn test_added_phrase() { - let bot = MockBot::new( + let mut bot = MockBot::new( MockMessageText::new().text("(me) hugged (reply)"), handler_tree(), ); diff --git a/examples/phrase_bot/src/handlers/public.rs b/examples/phrase_bot/src/handlers/public.rs index 5736938..ab288e3 100644 --- a/examples/phrase_bot/src/handlers/public.rs +++ b/examples/phrase_bot/src/handlers/public.rs @@ -67,7 +67,7 @@ mod tests { .from(MockUser::new().first_name("me").id(1234).build()) .reply_to_message(reply_message.build()); - let bot = MockBot::new(me_message, handler_tree()); + let mut bot = MockBot::new(me_message, handler_tree()); // !!! IMPORTANT !!! same as in test_delete_phrase in private handlers, do all db stuff // after creating the bot db::full_user_redeletion(1234, Some("nick1".to_string())); @@ -101,7 +101,7 @@ mod tests { .chat(chat.clone()) .from(MockUser::new().first_name("me").id(1234).build()); - let bot = MockBot::new(me_message.clone(), handler_tree()); + let mut bot = MockBot::new(me_message.clone(), handler_tree()); db::full_user_redeletion(1234, None); db::create_phrase( 1234, From 228c3ed328badc428146df556ea1a6ab3809315b Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Sat, 9 Nov 2024 21:40:29 +0200 Subject: [PATCH 101/138] Resolve merge conflicts --- teloxide_tests/src/mock_bot.rs | 1 - teloxide_tests/src/tests.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index acd1a28..e6c113f 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -11,7 +11,6 @@ use gag::Gag; use lazy_static::lazy_static; use serde_json::Value; use std::{ - env, fmt::Debug, mem::discriminant, panic, diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index 8945e28..35d76e1 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -86,7 +86,7 @@ async fn test_echo_with_start_state() { #[tokio::test] async fn test_assert_state() { - let bot = MockBot::new(MockMessageText::new().text("test"), get_dialogue_schema()); + let mut bot = MockBot::new(MockMessageText::new().text("test"), get_dialogue_schema()); let storage = InMemStorage::::new(); bot.dependencies(deps![storage]); bot.set_state(State::Start).await; From a93df7afab3ced43c6895e8a019848d277fbf74f Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Sat, 9 Nov 2024 20:11:26 +0000 Subject: [PATCH 102/138] make stack_size public --- teloxide_tests/src/mock_bot.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index e6c113f..6c6db30 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -123,9 +123,10 @@ pub struct MockBot { pub me: Me, /// If you have something like a state, you should add the storage here using .dependencies() pub dependencies: DependencyMap, + /// The stack size of the runtime for running updates + pub stack_size: usize, current_update_id: AtomicI32, - stack_size: usize, state: Arc>, _bot_lock: Option>, } From 6fba361392ce8ab39cf8c04af0d40aafbfd28aa1 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Sat, 9 Nov 2024 20:12:50 +0000 Subject: [PATCH 103/138] Remove useless Arc on BOT_LOCK --- teloxide_tests/src/mock_bot.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 6c6db30..164ce5f 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -32,7 +32,7 @@ use teloxide::{ }; lazy_static! { - static ref BOT_LOCK: Arc> = Arc::new(Mutex::new(())); + static ref BOT_LOCK: Mutex<()> = Mutex::new(()); } fn find_file(value: Value) -> Option { From a89912e27ea9feb15e44756261bb846682de5abd Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Sat, 9 Nov 2024 23:14:45 +0200 Subject: [PATCH 104/138] Added try_get --- teloxide_tests/src/mock_bot.rs | 28 +++++++++++++++++++--------- teloxide_tests/src/tests.rs | 20 ++++++++++++++++++++ 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 164ce5f..ef131dd 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -447,7 +447,7 @@ impl MockBot { /// Helper function to fetch the state of the dialogue and assert its value pub async fn assert_state(&self, state: S) where - S: Send + 'static + Clone + Debug + PartialEq, + S: Send + Default + 'static + Clone + Debug + PartialEq, { assert_eq!(self.get_state::().await, state) } @@ -457,6 +457,16 @@ impl MockBot { /// You need to use type annotation to get the state, please refer to the `set_state` /// documentation example pub async fn get_state(&self) -> S + where + S: Send + Default + 'static + Clone, + { + self.try_get_state().await.unwrap_or(S::default()) + } + + /// Same as [`get_state`], but returns None if the state is None, instead of the default + /// + /// [`get_state`]: crate::MockBot::get_state + pub async fn try_get_state(&self) -> Option where S: Send + 'static + Clone, { @@ -477,16 +487,16 @@ impl MockBot { .clone() .get_dialogue(chat_id) .await - .expect("Error getting dialogue") - .expect("State is None") + .ok() + .flatten() } else if let Some(storage) = erased_storage { // If erased storage exists (*storage) .clone() .get_dialogue(chat_id) .await - .expect("Error getting dialogue") - .expect("State is None") + .ok() + .flatten() } else { log::error!("No storage was detected! Did you add it to bot.dependencies(deps![get_bot_storage().await]); ?"); panic!("No storage was detected!"); @@ -524,7 +534,7 @@ impl MockBot { text_or_caption: &str, state: S, ) where - S: Send + 'static + Clone + std::fmt::Debug + PartialEq, + S: Send + Default + 'static + Clone + std::fmt::Debug + PartialEq, { self.dispatch().await; @@ -554,7 +564,7 @@ impl MockBot { text_or_caption: &str, state: S, ) where - S: Send + 'static + Clone, + S: Send + Default + 'static + Clone, { self.dispatch().await; @@ -583,7 +593,7 @@ impl MockBot { /// Just checks the state after dispathing the update, like `dispatch_and_check_last_text_and_state` pub async fn dispatch_and_check_state(&mut self, state: S) where - S: Send + 'static + Clone + std::fmt::Debug + PartialEq, + S: Send + Default + 'static + Clone + std::fmt::Debug + PartialEq, { self.dispatch().await; let got_state: S = self.get_state().await; @@ -593,7 +603,7 @@ impl MockBot { /// Just checks the state discriminant after dispathing the update, like `dispatch_and_check_last_text_and_state_discriminant` pub async fn dispatch_and_check_state_discriminant(&mut self, state: S) where - S: Send + 'static + Clone, + S: Send + Default + 'static + Clone, { self.dispatch().await; let got_state: S = self.get_state().await; diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index 35d76e1..b5d2b9a 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -44,6 +44,10 @@ async fn handler_with_state( msg: Message, ) -> Result<(), Box> { bot.send_message(msg.chat.id, msg.text().unwrap()).await?; + if msg.text().unwrap() == "exit" { + dialogue.exit().await?; + return Ok(()); + } dialogue.update(State::NotStart).await?; Ok(()) @@ -99,6 +103,22 @@ async fn test_assert_state() { assert_eq!(last_response.text(), Some("test")); } +#[tokio::test] +async fn test_try_get() { + let mut bot = MockBot::new(MockMessageText::new().text("exit"), get_dialogue_schema()); + let storage = InMemStorage::::new(); + bot.dependencies(deps![storage]); + bot.set_state(State::Start).await; + + bot.dispatch().await; + + let last_response = bot.get_responses().sent_messages.pop().unwrap(); + let state: Option = bot.try_get_state().await; + assert_eq!(state, None); + + assert_eq!(last_response.text(), Some("exit")); +} + #[tokio::test] async fn test_echo_with_not_start_test() { let mut bot = MockBot::new(MockMessageText::new().text("test"), get_dialogue_schema()); From 9b41a0570a0caafd3f388fb97ed61029f6563062 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Sun, 10 Nov 2024 15:18:07 +0200 Subject: [PATCH 105/138] Fix sqlite storage race condition?.. --- Cargo.lock | 559 +++++++++++++++++++++++++++++++-- teloxide_tests/Cargo.toml | 2 +- teloxide_tests/src/listener.rs | 7 +- teloxide_tests/src/mock_bot.rs | 7 +- teloxide_tests/src/tests.rs | 34 ++ 5 files changed, 586 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 821a4d2..8857a60 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -324,6 +324,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "611cc2ae7d2e242c457e4be7f97036b8ad9ca152b499f53faf99b1ed8fc2553f" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -408,6 +414,15 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -432,7 +447,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -550,7 +565,7 @@ dependencies = [ "js-sys", "num-traits", "wasm-bindgen", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -559,6 +574,15 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -601,6 +625,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.4.2" @@ -610,6 +649,21 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + [[package]] name = "crypto-common" version = "0.1.6" @@ -772,6 +826,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] @@ -791,6 +846,12 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "dptree" version = "0.3.0" @@ -805,6 +866,9 @@ name = "either" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +dependencies = [ + "serde", +] [[package]] name = "encoding_rs" @@ -877,6 +941,28 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + [[package]] name = "fastrand" version = "2.2.0" @@ -904,6 +990,17 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -976,6 +1073,17 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + [[package]] name = "futures-io" version = "0.3.31" @@ -1098,18 +1206,43 @@ dependencies = [ "tracing", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + [[package]] name = "hashbrown" version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + [[package]] name = "hermit-abi" version = "0.3.9" @@ -1122,6 +1255,39 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "http" version = "0.2.12" @@ -1457,7 +1623,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.1", ] [[package]] @@ -1543,6 +1709,17 @@ version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -1588,6 +1765,16 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "mediatype" version = "0.19.18" @@ -1616,6 +1803,12 @@ dependencies = [ "unicase", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.0" @@ -1667,6 +1860,16 @@ dependencies = [ "libc", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -1741,6 +1944,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.3" @@ -1761,7 +1970,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -2306,6 +2515,17 @@ dependencies = [ "digest", ] +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shlex" version = "1.3.0" @@ -2335,6 +2555,9 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -2351,6 +2574,170 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "sqlformat" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" +dependencies = [ + "nom", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" +dependencies = [ + "atoi", + "byteorder", + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.14.5", + "hashlink", + "hex", + "indexmap", + "log", + "memchr", + "native-tls", + "once_cell", + "paste", + "percent-encoding", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlformat", + "thiserror", + "tokio", + "tokio-stream", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.87", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" +dependencies = [ + "dotenvy", + "either", + "heck 0.5.0", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.87", + "tempfile", + "tokio", + "url", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" +dependencies = [ + "atoi", + "base64", + "bitflags 2.6.0", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "tracing", + "url", +] [[package]] name = "stable_deref_trait" @@ -2358,6 +2745,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + [[package]] name = "strsim" version = "0.10.0" @@ -2467,6 +2865,7 @@ dependencies = [ "pin-project", "serde", "serde_json", + "sqlx", "teloxide-core", "teloxide-macros", "thiserror", @@ -2512,7 +2911,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e2d33d809c3e7161a9ab18bedddf98821245014f0a78fa4d2c9430b2ec018c1" dependencies = [ - "heck", + "heck 0.4.1", "proc-macro2", "quote", "syn 1.0.109", @@ -2651,6 +3050,21 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.41.1" @@ -2781,18 +3195,45 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +[[package]] +name = "unicode-bidi" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + [[package]] name = "untrusted" version = "0.9.0" @@ -2865,6 +3306,12 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.95" @@ -2955,6 +3402,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "whoami" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall", + "wasite", +] + [[package]] name = "winapi" version = "0.3.9" @@ -2992,7 +3449,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3003,7 +3460,7 @@ checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ "windows-result", "windows-strings", - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3012,7 +3469,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3022,7 +3479,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ "windows-result", - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", ] [[package]] @@ -3031,7 +3497,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", ] [[package]] @@ -3040,7 +3506,22 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -3049,28 +3530,46 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "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_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -3083,24 +3582,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" diff --git a/teloxide_tests/Cargo.toml b/teloxide_tests/Cargo.toml index 5834782..48a6d19 100644 --- a/teloxide_tests/Cargo.toml +++ b/teloxide_tests/Cargo.toml @@ -20,7 +20,7 @@ log = "0.4" pretty_env_logger = "0.5" url = "2.5.1" reqwest = "0.12.5" -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros", "sqlite-storage-nativetls"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/teloxide_tests/src/listener.rs b/teloxide_tests/src/listener.rs index 673272a..95d9f1b 100644 --- a/teloxide_tests/src/listener.rs +++ b/teloxide_tests/src/listener.rs @@ -2,6 +2,8 @@ use std::{ pin::Pin, sync::Mutex, task::{Context, Poll}, + thread::sleep, + time::Duration, }; use futures_util::Stream; @@ -27,8 +29,11 @@ impl Stream for InsertingListenerStream { fn poll_next(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { if self.updates.lock().unwrap().len() == 0 { + // A small wait to make sure the state is setteled in?.. + // No idea, but it fixes a bug with test_erased_state... + sleep(Duration::from_millis(10)); // Returning Poll::Ready(None) means that there is nothing more to poll, and the - // dispatcher closes. If we wanted it to continue, Poll::Pending is the way. + // dispatcher closes. return Poll::Ready(None); } // Returns updates one by one diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index ef131dd..d219f2e 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -263,7 +263,7 @@ impl MockBot { .enable_all() .build() .unwrap(); - runtime.block_on( + runtime.block_on(async { Dispatcher::builder(bot.clone(), handler_tree.clone()) .dependencies(deps) .stack_size(stack_size) @@ -271,8 +271,9 @@ impl MockBot { .dispatch_with_listener( InsertingListener { updates }, LoggingErrorHandler::new(), - ), - ); + ) + .await; + }); }) .await .expect("Thread panicked"); diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index b5d2b9a..aec6372 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -1,6 +1,10 @@ +use std::sync::Arc; + use super::*; use crate::dataset::*; use serde::{Deserialize, Serialize}; +use teloxide::dispatching::dialogue::serializer::Json; +use teloxide::dispatching::dialogue::{ErasedStorage, SqliteStorage, Storage}; use teloxide::dispatching::{HandlerExt, UpdateHandler}; use teloxide::dptree::case; use teloxide::net::Download; @@ -37,6 +41,8 @@ enum State { } type MyDialogue = Dialogue>; +type ErasedDialogue = Dialogue>; +type MyStorage = Arc>; async fn handler_with_state( bot: Bot, @@ -135,6 +141,34 @@ async fn test_echo_with_not_start_test() { assert_eq!(last_response.text(), Some("Not start!")); } +fn get_erased_dialogue_schema() -> UpdateHandler> +{ + dialogue::enter::, State, _>() + .branch(Update::filter_message().endpoint(handler_with_erased_state)) +} + +async fn handler_with_erased_state( + bot: Bot, + dialogue: ErasedDialogue, + msg: Message, +) -> Result<(), Box> { + bot.send_message(msg.chat.id, msg.text().unwrap()).await?; + dialogue.update(State::NotStart).await?; + Ok(()) +} + +#[tokio::test] +async fn test_erased_state() { + let mut bot = MockBot::new( + MockMessageText::new().text("test"), + get_erased_dialogue_schema(), + ); + let storage: MyStorage = SqliteStorage::open(":memory:", Json).await.unwrap().erase(); + bot.dependencies(deps![storage]); + bot.dispatch().await; + bot.dispatch_and_check_state(State::NotStart).await; +} + // // // From afbb272707b3ea7797641388fbbb8a6679039d63 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Sun, 10 Nov 2024 15:57:15 +0200 Subject: [PATCH 106/138] Better panic messages --- examples/Cargo.lock | 453 ++++++++++++++++++++++++++++++++- teloxide_tests/src/mock_bot.rs | 73 ++++-- teloxide_tests/src/tests.rs | 2 + 3 files changed, 502 insertions(+), 26 deletions(-) diff --git a/examples/Cargo.lock b/examples/Cargo.lock index e6b39ef..63156f2 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -385,6 +385,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "611cc2ae7d2e242c457e4be7f97036b8ad9ca152b499f53faf99b1ed8fc2553f" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -480,6 +486,15 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -665,6 +680,15 @@ dependencies = [ "tokio-util", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -707,6 +731,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" + [[package]] name = "crc32fast" version = "1.4.2" @@ -716,6 +755,21 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + [[package]] name = "crypto-common" version = "0.1.6" @@ -956,6 +1010,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] @@ -975,6 +1030,12 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "dptree" version = "0.3.0" @@ -1003,6 +1064,9 @@ name = "either" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +dependencies = [ + "serde", +] [[package]] name = "encoding_rs" @@ -1075,6 +1139,28 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + [[package]] name = "fastrand" version = "2.2.0" @@ -1112,6 +1198,17 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1184,6 +1281,17 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", +] + [[package]] name = "futures-io" version = "0.3.31" @@ -1312,12 +1420,31 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + [[package]] name = "hashbrown" version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] + [[package]] name = "heck" version = "0.4.1" @@ -1352,6 +1479,39 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "http" version = "0.2.12" @@ -1735,7 +1895,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.15.1", ] [[package]] @@ -1830,6 +1990,17 @@ version = "0.2.162" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" +[[package]] +name = "libsqlite3-sys" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +dependencies = [ + "cc", + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -1875,6 +2046,16 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + [[package]] name = "mediatype" version = "0.19.18" @@ -1903,6 +2084,12 @@ dependencies = [ "unicase", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.0" @@ -1954,6 +2141,16 @@ dependencies = [ "libc", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-conv" version = "0.1.0" @@ -2038,6 +2235,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.3" @@ -2668,6 +2871,17 @@ dependencies = [ "digest", ] +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shlex" version = "1.3.0" @@ -2697,6 +2911,9 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -2713,6 +2930,170 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "sqlformat" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" +dependencies = [ + "nom", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" +dependencies = [ + "atoi", + "byteorder", + "bytes", + "crc", + "crossbeam-queue", + "either", + "event-listener", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashbrown 0.14.5", + "hashlink", + "hex", + "indexmap", + "log", + "memchr", + "native-tls", + "once_cell", + "paste", + "percent-encoding", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlformat", + "thiserror", + "tokio", + "tokio-stream", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 2.0.87", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" +dependencies = [ + "dotenvy", + "either", + "heck 0.5.0", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", + "sqlx-core", + "sqlx-postgres", + "sqlx-sqlite", + "syn 2.0.87", + "tempfile", + "tokio", + "url", +] + +[[package]] +name = "sqlx-postgres" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" +dependencies = [ + "atoi", + "base64 0.22.1", + "bitflags 2.6.0", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "serde_urlencoded", + "sqlx-core", + "tracing", + "url", +] [[package]] name = "stable_deref_trait" @@ -2720,6 +3101,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "stringprep" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" +dependencies = [ + "unicode-bidi", + "unicode-normalization", + "unicode-properties", +] + [[package]] name = "strsim" version = "0.10.0" @@ -2884,6 +3276,7 @@ dependencies = [ "serde", "serde_cbor", "serde_json", + "sqlx", "teloxide-core 0.10.1 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", "teloxide-macros", "thiserror", @@ -3119,6 +3512,21 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.41.1" @@ -3249,18 +3657,45 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +[[package]] +name = "unicode-bidi" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + [[package]] name = "unicode-ident" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + [[package]] name = "untrusted" version = "0.9.0" @@ -3333,6 +3768,12 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" + [[package]] name = "wasm-bindgen" version = "0.2.95" @@ -3423,6 +3864,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "whoami" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +dependencies = [ + "redox_syscall", + "wasite", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index d219f2e..fabdc4d 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -35,6 +35,33 @@ lazy_static! { static ref BOT_LOCK: Mutex<()> = Mutex::new(()); } +macro_rules! assert_eqn { + ($actual:expr, $expected:expr $(,)?) => { + match (&$actual, &$expected) { + (actual, expected) => { + if !(*actual == *expected) { + panic!("assertion `actual == expected` failed: + actual: {actual:?} + expected: {expected:?}", actual=&*actual, expected=&*expected) + + } + } + } + }; + ($actual:expr, $expected:expr, $($arg:tt)+) => { + match (&$actual, &$expected) { + (actual, expected) => { + if !(*actual == *expected) { + panic!("assertion `actual == expected` failed: {message} + actual: {actual:?} + expected: {expected:?}", message=$($arg)+, actual=&*actual, expected=&*expected) + + } + } + } + }; +} + fn find_file(value: Value) -> Option { // Recursively searches for file meta let mut file_id = None; @@ -276,7 +303,7 @@ impl MockBot { }); }) .await - .expect("Thread panicked"); + .expect("Dispatcher panicked!"); } /// Actually dispatches the bot, calling the update through the handler tree. @@ -450,13 +477,15 @@ impl MockBot { where S: Send + Default + 'static + Clone + Debug + PartialEq, { - assert_eq!(self.get_state::().await, state) + assert_eqn!(self.get_state::().await, state, "States are not equal!") } /// Gets the state of the dialogue, if the storage exists in dependencies /// Panics if no storage was found - /// You need to use type annotation to get the state, please refer to the `set_state` + /// You need to use type annotation to get the state, please refer to the [`set_state`] /// documentation example + /// + /// [`set_state`]: crate::MockBot::set_state pub async fn get_state(&self) -> S where S: Send + Default + 'static + Clone, @@ -520,9 +549,9 @@ impl MockBot { .expect("No sent messages were detected!"); if let Some(text) = message.text() { - assert_eq!(text, text_or_caption, "Texts are not equal!"); + assert_eqn!(text, text_or_caption, "Texts are not equal!"); } else if let Some(caption) = message.caption() { - assert_eq!(caption, text_or_caption, "Captions are not equal!"); + assert_eqn!(caption, text_or_caption, "Captions are not equal!"); } else if !text_or_caption.is_empty() { panic!("Message has no text or caption!"); } @@ -546,15 +575,14 @@ impl MockBot { .expect("No sent messages were detected!"); if let Some(text) = message.text() { - assert_eq!(text, text_or_caption, "Texts are not equal!"); + assert_eqn!(text, text_or_caption, "Texts are not equal!"); } else if let Some(caption) = message.caption() { - assert_eq!(caption, text_or_caption, "Captions are not equal!"); + assert_eqn!(caption, text_or_caption, "Captions are not equal!"); } else if !text_or_caption.is_empty() { panic!("Message has no text or caption!"); } - let got_state: S = self.get_state().await; - assert_eq!(got_state, state, "States are not equal!"); + self.assert_state(state).await; } /// Same as `dispatch_and_check_last_text`, but also checks, if the variants of the state are the same @@ -565,7 +593,7 @@ impl MockBot { text_or_caption: &str, state: S, ) where - S: Send + Default + 'static + Clone, + S: Send + PartialEq + Debug + Default + 'static + Clone, { self.dispatch().await; @@ -576,19 +604,17 @@ impl MockBot { .expect("No sent messages were detected!"); if let Some(text) = message.text() { - assert_eq!(text, text_or_caption, "Texts are not equal!"); + assert_eqn!(text, text_or_caption, "Texts are not equal!"); } else if let Some(caption) = message.caption() { - assert_eq!(caption, text_or_caption, "Captions are not equal!"); + assert_eqn!(caption, text_or_caption, "Captions are not equal!"); } else if !text_or_caption.is_empty() { panic!("Message has no text or caption!"); } let got_state: S = self.get_state().await; - assert_eq!( - discriminant(&got_state), - discriminant(&state), - "State variants are not equal!" - ); + if discriminant(&got_state) != discriminant(&state) { + assert_eqn!(got_state, state, "State variants are not equal!") + } } /// Just checks the state after dispathing the update, like `dispatch_and_check_last_text_and_state` @@ -597,21 +623,18 @@ impl MockBot { S: Send + Default + 'static + Clone + std::fmt::Debug + PartialEq, { self.dispatch().await; - let got_state: S = self.get_state().await; - assert_eq!(got_state, state, "States are not equal!"); + self.assert_state(state).await; } /// Just checks the state discriminant after dispathing the update, like `dispatch_and_check_last_text_and_state_discriminant` pub async fn dispatch_and_check_state_discriminant(&mut self, state: S) where - S: Send + Default + 'static + Clone, + S: Send + Debug + PartialEq + Default + 'static + Clone, { self.dispatch().await; let got_state: S = self.get_state().await; - assert_eq!( - discriminant(&got_state), - discriminant(&state), - "State variants are not equal!" - ); + if discriminant(&got_state) != discriminant(&state) { + assert_eqn!(got_state, state, "State variants are not equal!") + } } } diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index aec6372..a4adda0 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -165,6 +165,8 @@ async fn test_erased_state() { ); let storage: MyStorage = SqliteStorage::open(":memory:", Json).await.unwrap().erase(); bot.dependencies(deps![storage]); + + // This .dispatch is important?.. bot.dispatch().await; bot.dispatch_and_check_state(State::NotStart).await; } From ce36302589c01b68772b301e9b14f2c01e4b6dd9 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Sun, 10 Nov 2024 17:04:27 +0200 Subject: [PATCH 107/138] If message exists, it isn't inserted --- teloxide_tests/src/mock_bot.rs | 64 +++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index fabdc4d..3ffdbb5 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -7,16 +7,17 @@ use crate::{ listener::InsertingListener, server::{self, messages::Messages, Responses}, }; +use futures_util::future::BoxFuture; use gag::Gag; use lazy_static::lazy_static; use serde_json::Value; use std::{ fmt::Debug, + hash::Hash, mem::discriminant, panic, sync::{atomic::AtomicI32, Arc, Mutex, MutexGuard, PoisonError}, }; -use teloxide::types::UpdateKind; use teloxide::{ dispatching::dialogue::ErasedStorage, dptree::di::DependencySupplier, @@ -30,6 +31,7 @@ use teloxide::{ prelude::*, types::Me, }; +use teloxide::{error_handlers::ErrorHandler, types::UpdateKind}; lazy_static! { static ref BOT_LOCK: Mutex<()> = Mutex::new(()); @@ -118,7 +120,11 @@ impl State { fn add_message(&mut self, message: &mut Message) { let max_id = self.messages.max_message_id(); - if message.id.0 <= max_id || self.messages.get_message(message.id.0).is_some() { + let maybe_message = self.messages.get_message(message.id.0); + if maybe_message == Some(message.clone()) { + return; + } + if message.id.0 <= max_id || maybe_message.is_some() { message.id = MessageId(max_id + 1); } if let Some(file_meta) = find_file(serde_json::to_value(&message).unwrap()) { @@ -137,13 +143,26 @@ impl State { } } +// Copied from source code +type DefaultHandler = Arc) -> BoxFuture<'static, ()> + Send + Sync>; + +#[derive(Debug, Hash, PartialEq, Eq, Clone)] +pub struct DefaultKey(ChatId); + +pub(crate) fn default_distribution_function(update: &Update) -> Option { + update.chat().map(|c| c.id).map(DefaultKey) +} + /// A mocked bot that sends requests to the fake server -/// Please check the `new` function docs and [github examples](https://github.com/LasterAlex/teloxide_tests/tree/master/examples) for more information. -pub struct MockBot { +/// Please check the [`new`] function docs and [github examples](https://github.com/LasterAlex/teloxide_tests/tree/master/examples) for more information. +/// +/// [`new`]: crate::MockBot::new +#[allow(dead_code)] +pub struct MockBot { /// The bot with a fake server url pub bot: Bot, /// The thing that dptree::entry() returns - pub handler_tree: UpdateHandler>, + pub handler_tree: UpdateHandler, /// Updates to send as user pub updates: Vec, /// Bot parameters are here @@ -153,12 +172,30 @@ pub struct MockBot { /// The stack size of the runtime for running updates pub stack_size: usize, + default_handler: DefaultHandler, + distribution_f: fn(&Update) -> Option, + error_handler: Arc + Send + Sync>, + current_update_id: AtomicI32, state: Arc>, _bot_lock: Option>, } -impl MockBot { +impl MockBot +where + Err: Debug + Send + Sync + 'static, + Key: Hash + Eq, +{ + /// Sets the dispatchers distribution function + pub fn distribution_function(&mut self, f: fn(&Update) -> Option) { + self.distribution_f = f; + } +} + +impl MockBot +where + Err: Debug + Send + Sync + 'static, +{ const DEFAULT_STACK_SIZE: usize = 8 * 1024 * 1024; /// Creates a new MockBot, using something that can be turned into Updates, and a handler tree. @@ -210,10 +247,11 @@ impl MockBot { pub fn new( update: T, // This 'T' is just anything that can be turned into an Update, like a // MockMessageText or MockCallbackQuery, or a vec[MockMessagePhoto] if you want! - handler_tree: UpdateHandler>, + handler_tree: UpdateHandler, ) -> Self where T: IntoUpdate, // And that code just "proves" that it can be turned into an update + Err: Debug, { let _ = pretty_env_logger::try_init(); @@ -231,9 +269,15 @@ impl MockBot { updates: update.into_update(¤t_update_id), handler_tree, dependencies: DependencyMap::new(), + stack_size: Self::DEFAULT_STACK_SIZE, + default_handler: Arc::new(|upd| { + log::warn!("Unhandled update: {:?}", upd); + Box::pin(async {}) + }), + error_handler: LoggingErrorHandler::new(), + distribution_f: default_distribution_function, _bot_lock: lock, current_update_id, - stack_size: Self::DEFAULT_STACK_SIZE, state, } } @@ -283,6 +327,8 @@ impl MockBot { let handler_tree = self.handler_tree.clone(); let deps = self.dependencies.clone(); let stack_size = self.stack_size; + let distribution_f = self.distribution_f.clone(); + let error_handler = self.error_handler.clone(); tokio::task::spawn_blocking(move || { let runtime = tokio::runtime::Builder::new_multi_thread() @@ -293,6 +339,8 @@ impl MockBot { runtime.block_on(async { Dispatcher::builder(bot.clone(), handler_tree.clone()) .dependencies(deps) + .distribution_function(distribution_f) + .error_handler(error_handler) .stack_size(stack_size) .build() .dispatch_with_listener( From 0b8a6ff3457ab79fa7e561f18af6f74fa5df2a68 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Sun, 10 Nov 2024 19:00:48 +0200 Subject: [PATCH 108/138] Split up files + added distribution function and error handler --- examples/Cargo.lock | 356 ++---------------- examples/album_bot/Cargo.toml | 4 +- examples/album_bot/src/main.rs | 28 +- examples/calculator_bot/src/handlers.rs | 1 - examples/calculator_bot/src/main.rs | 6 +- examples/calculator_bot/src/text.rs | 1 - examples/deep_linking_bot/src/tests.rs | 4 +- examples/deep_linking_bot/src/text.rs | 3 +- examples/hello_world_bot/src/main.rs | 11 +- examples/phrase_bot/src/db/schema.rs | 5 +- examples/phrase_bot/src/handlers/public.rs | 4 +- teloxide_tests/src/lib.rs | 2 + teloxide_tests/src/mock_bot.rs | 204 +++------- teloxide_tests/src/server/mod.rs | 2 +- .../server/routes/answer_callback_query.rs | 2 +- .../src/server/routes/ban_chat_member.rs | 2 +- .../src/server/routes/copy_message.rs | 2 +- .../src/server/routes/delete_message.rs | 2 +- .../src/server/routes/download_file.rs | 2 +- .../src/server/routes/edit_message_caption.rs | 2 +- .../routes/edit_message_reply_markup.rs | 5 +- .../src/server/routes/edit_message_text.rs | 2 +- .../src/server/routes/forward_message.rs | 2 +- teloxide_tests/src/server/routes/get_file.rs | 2 +- .../src/server/routes/pin_chat_message.rs | 2 +- .../src/server/routes/restrict_chat_member.rs | 2 +- .../src/server/routes/send_animation.rs | 2 +- .../src/server/routes/send_audio.rs | 2 +- .../src/server/routes/send_chat_action.rs | 2 +- .../src/server/routes/send_contact.rs | 2 +- teloxide_tests/src/server/routes/send_dice.rs | 2 +- .../src/server/routes/send_document.rs | 2 +- .../src/server/routes/send_location.rs | 2 +- .../src/server/routes/send_media_group.rs | 2 +- .../src/server/routes/send_message.rs | 2 +- .../src/server/routes/send_photo.rs | 2 +- teloxide_tests/src/server/routes/send_poll.rs | 2 +- .../src/server/routes/send_sticker.rs | 2 +- .../src/server/routes/send_venue.rs | 2 +- .../src/server/routes/send_video.rs | 2 +- .../src/server/routes/send_video_note.rs | 2 +- .../src/server/routes/send_voice.rs | 2 +- .../src/server/routes/set_message_reaction.rs | 2 +- .../src/server/routes/unban_chat_member.rs | 2 +- .../server/routes/unpin_all_chat_messages.rs | 2 +- .../src/server/routes/unpin_chat_message.rs | 2 +- teloxide_tests/src/state.rs | 50 +++ teloxide_tests/src/utils.rs | 82 ++++ 48 files changed, 297 insertions(+), 533 deletions(-) create mode 100644 teloxide_tests/src/state.rs create mode 100644 teloxide_tests/src/utils.rs diff --git a/examples/Cargo.lock b/examples/Cargo.lock index 63156f2..6760d8e 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -30,7 +30,7 @@ dependencies = [ "actix-service", "actix-utils", "ahash", - "base64 0.22.1", + "base64", "bitflags 2.6.0", "brotli", "bytes", @@ -223,44 +223,6 @@ dependencies = [ "syn 2.0.87", ] -[[package]] -name = "actix-web-lab" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7675c1a84eec1b179c844cdea8488e3e409d8e4984026e92fa96c87dd86f33c6" -dependencies = [ - "actix-http", - "actix-router", - "actix-service", - "actix-utils", - "actix-web", - "actix-web-lab-derive 0.20.0", - "ahash", - "arc-swap", - "async-trait", - "bytes", - "bytestring", - "csv", - "derive_more 0.99.18", - "futures-core", - "futures-util", - "http 0.2.12", - "impl-more", - "itertools 0.12.1", - "local-channel", - "mediatype", - "mime", - "once_cell", - "pin-project-lite", - "regex", - "serde", - "serde_html_form", - "serde_json", - "tokio", - "tokio-stream", - "tracing", -] - [[package]] name = "actix-web-lab" version = "0.23.0" @@ -272,7 +234,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web", - "actix-web-lab-derive 0.23.0", + "actix-web-lab-derive", "ahash", "arc-swap", "bytes", @@ -299,17 +261,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "actix-web-lab-derive" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa0b287c8de4a76b691f29dbb5451e8dd5b79d777eaf87350c9b0cbfdb5e968" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - [[package]] name = "actix-web-lab-derive" version = "0.23.0" @@ -365,8 +316,8 @@ dependencies = [ "dotenv", "log", "pretty_env_logger", - "teloxide 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "teloxide_tests 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "teloxide", + "teloxide_tests", "tokio", ] @@ -522,12 +473,6 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -618,8 +563,8 @@ dependencies = [ "pretty_env_logger", "serde", "serde_json", - "teloxide 0.13.0 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", - "teloxide_tests 0.2.0", + "teloxide", + "teloxide_tests", "tokio", ] @@ -919,8 +864,8 @@ dependencies = [ "dotenv", "serde", "serde_json", - "teloxide 0.13.0 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", - "teloxide_tests 0.2.0", + "teloxide", + "teloxide_tests", "tokio", ] @@ -1172,8 +1117,8 @@ name = "file_download_bot" version = "0.1.0" dependencies = [ "dotenv", - "teloxide 0.13.0 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", - "teloxide_tests 0.2.0", + "teloxide", + "teloxide_tests", "tokio", ] @@ -1462,8 +1407,8 @@ name = "hello_world_bot" version = "0.1.0" dependencies = [ "dotenv", - "teloxide 0.13.0 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", - "teloxide_tests 0.2.0", + "teloxide", + "teloxide_tests", "tokio", ] @@ -1534,17 +1479,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.1" @@ -1564,7 +1498,7 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.1", + "http-body", "pin-project-lite", ] @@ -1586,30 +1520,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[package]] -name = "hyper" -version = "0.14.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.5.0" @@ -1621,7 +1531,7 @@ dependencies = [ "futures-util", "h2 0.4.6", "http 1.1.0", - "http-body 1.0.1", + "http-body", "httparse", "itoa", "pin-project-lite", @@ -1638,7 +1548,7 @@ checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.5.0", + "hyper", "hyper-util", "rustls", "rustls-pki-types", @@ -1647,19 +1557,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper 0.14.31", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "hyper-tls" version = "0.6.0" @@ -1668,7 +1565,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.5.0", + "hyper", "hyper-util", "native-tls", "tokio", @@ -1686,8 +1583,8 @@ dependencies = [ "futures-channel", "futures-util", "http 1.1.0", - "http-body 1.0.1", - "hyper 1.5.0", + "http-body", + "hyper", "pin-project-lite", "socket2", "tokio", @@ -1930,15 +1827,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -2292,8 +2180,8 @@ dependencies = [ "pretty_env_logger", "serde", "serde_json", - "teloxide 0.13.0 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", - "teloxide_tests 0.2.0", + "teloxide", + "teloxide_tests", "tokio", ] @@ -2513,67 +2401,24 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.31", - "hyper-tls 0.5.0", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration 0.5.1", - "tokio", - "tokio-native-tls", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "winreg", -] - [[package]] name = "reqwest" version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ - "base64 0.22.1", + "base64", "bytes", "encoding_rs", "futures-core", "futures-util", "h2 0.4.6", "http 1.1.0", - "http-body 1.0.1", + "http-body", "http-body-util", - "hyper 1.5.0", + "hyper", "hyper-rustls", - "hyper-tls 0.6.0", + "hyper-tls", "hyper-util", "ipnet", "js-sys", @@ -2584,12 +2429,12 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile 2.2.0", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", - "system-configuration 0.6.1", + "sync_wrapper", + "system-configuration", "tokio", "tokio-native-tls", "tokio-util", @@ -2667,15 +2512,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.2.0" @@ -3041,7 +2877,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" dependencies = [ "atoi", - "base64 0.22.1", + "base64", "bitflags 2.6.0", "byteorder", "crc", @@ -3152,12 +2988,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" @@ -3178,17 +3008,6 @@ dependencies = [ "syn 2.0.87", ] -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys 0.5.0", -] - [[package]] name = "system-configuration" version = "0.6.1" @@ -3197,17 +3016,7 @@ checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags 2.6.0", "core-foundation", - "system-configuration-sys 0.6.0", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", + "system-configuration-sys", ] [[package]] @@ -3232,32 +3041,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20f34339676cdcab560c9a82300c4c2581f68b9369aedf0fae86f2ff9565ff3e" -[[package]] -name = "teloxide" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f79dd283eb21b90451c03fa7c7f83b9985130efb876b33bad89a2c208ccbc16" -dependencies = [ - "aquamarine", - "bytes", - "derive_more 0.99.18", - "dptree", - "either", - "futures", - "log", - "mime", - "pin-project", - "serde", - "serde_json", - "teloxide-core 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", - "teloxide-macros", - "thiserror", - "tokio", - "tokio-stream", - "tokio-util", - "url", -] - [[package]] name = "teloxide" version = "0.13.0" @@ -3277,7 +3060,7 @@ dependencies = [ "serde_cbor", "serde_json", "sqlx", - "teloxide-core 0.10.1 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", + "teloxide-core", "teloxide-macros", "thiserror", "tokio", @@ -3286,36 +3069,6 @@ dependencies = [ "url", ] -[[package]] -name = "teloxide-core" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1642a7ef10e7af63b8298c8d13c0f986d4fc646d42649ff060359607f62f69" -dependencies = [ - "bitflags 1.3.2", - "bytes", - "chrono", - "derive_more 0.99.18", - "either", - "futures", - "log", - "mime", - "once_cell", - "pin-project", - "rc-box", - "reqwest 0.11.27", - "serde", - "serde_json", - "serde_with", - "take_mut", - "takecell", - "thiserror", - "tokio", - "tokio-util", - "url", - "uuid", -] - [[package]] name = "teloxide-core" version = "0.10.1" @@ -3332,7 +3085,7 @@ dependencies = [ "once_cell", "pin-project", "rc-box", - "reqwest 0.12.9", + "reqwest", "rgb", "serde", "serde_json", @@ -3364,7 +3117,7 @@ version = "0.2.0" dependencies = [ "actix-multipart", "actix-web", - "actix-web-lab 0.23.0", + "actix-web-lab", "chrono", "ctrlc", "dotenv", @@ -3377,47 +3130,16 @@ dependencies = [ "mime_guess", "pretty_env_logger", "rand", - "reqwest 0.12.9", + "reqwest", "serde", "serde_json", - "teloxide 0.13.0 (git+https://github.com/teloxide/teloxide.git?rev=24a8d5f)", + "teloxide", "teloxide_tests_macros", "tokio", "tokio-util", "url", ] -[[package]] -name = "teloxide_tests" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e7d8270f4b1c1be07a16320b424b29cfefd48e6250eeb69020ec847bc0faa" -dependencies = [ - "actix-multipart", - "actix-web", - "actix-web-lab 0.20.2", - "chrono", - "ctrlc", - "dotenv", - "env_logger 0.10.2", - "futures-util", - "gag", - "lazy_static", - "log", - "mime", - "mime_guess", - "parking_lot", - "pretty_env_logger", - "rand", - "reqwest 0.12.9", - "serde", - "serde_json", - "teloxide 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", - "teloxide_tests_macros", - "tokio", - "url", -] - [[package]] name = "teloxide_tests_macros" version = "0.2.0" @@ -4092,16 +3814,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "write16" version = "1.0.0" diff --git a/examples/album_bot/Cargo.toml b/examples/album_bot/Cargo.toml index f035bca..3ad60d2 100644 --- a/examples/album_bot/Cargo.toml +++ b/examples/album_bot/Cargo.toml @@ -4,11 +4,11 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { version = "0.13.0", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" log = "0.4" pretty_env_logger = "0.5" [dev-dependencies] -teloxide_tests = "0.2.0" +teloxide_tests = { path = "../../teloxide_tests" } diff --git a/examples/album_bot/src/main.rs b/examples/album_bot/src/main.rs index 305a0ee..6adf4b9 100644 --- a/examples/album_bot/src/main.rs +++ b/examples/album_bot/src/main.rs @@ -165,7 +165,11 @@ mod tests { #[tokio::test] async fn test_get_one_message() { - let bot = MockBot::new(MockMessagePhoto::new(), handler_tree()); + let mut bot = MockBot::new_with_distribution_function( + MockMessagePhoto::new(), + handler_tree(), + default_distribution_function, + ); let album_storage: AlbumStorage = Arc::new(Mutex::new(HashMap::new())); bot.dependencies(deps![album_storage]); @@ -175,28 +179,28 @@ mod tests { #[tokio::test] async fn test_multiple_text_messages() { - let bot = MockBot::new(vec![MockMessageText::new(); 3], handler_tree()); + let mut bot = MockBot::new_with_distribution_function( + vec![MockMessageText::new(); 3], + handler_tree(), + default_distribution_function, + ); let album_storage: AlbumStorage = Arc::new(Mutex::new(HashMap::new())); bot.dependencies(deps![album_storage]); - // ATTENTION!!! This is NOT how it would work in real life. Because we are simulating - // an update, there is no distribution function, so in reality you would see that behaviour - // only if you set the distribution function to always return None. - // I don't consider it a big deal, the default distribution function is more for real - // users, who may send multiple messages in a row, for testing no distribution function is - // fine - bot.dispatch_and_check_last_text("Detected 3 messages without media group!") + // This is 3 messages with the text "Detected 1 messages without media group!" + bot.dispatch_and_check_last_text("Detected 1 messages without media group!") .await; - // In reality it would be 3 messages with the text "Detected 1 messages without media group!" + assert_eq!(bot.get_responses().sent_messages.len(), 3); } #[tokio::test] async fn test_get_album() { // This sends all three messages consecutively, making an album simulation, because // telegram would've sent them exactly the same way - let bot = MockBot::new( + let mut bot = MockBot::new_with_distribution_function( vec![MockMessagePhoto::new().media_group_id("123"); 3], handler_tree(), + default_distribution_function, ); let album_storage: AlbumStorage = Arc::new(Mutex::new(HashMap::new())); @@ -214,6 +218,6 @@ mod tests { Some("Detected 3 messages!") ); assert_eq!(sent_media_group.messages.len(), 3); - assert_eq!(sent_messages.len(), 3); // Just a sanity check + assert_eq!(sent_messages.len(), 3); // Just a sanity check } } diff --git a/examples/calculator_bot/src/handlers.rs b/examples/calculator_bot/src/handlers.rs index 304d27b..1525bd7 100644 --- a/examples/calculator_bot/src/handlers.rs +++ b/examples/calculator_bot/src/handlers.rs @@ -121,4 +121,3 @@ pub async fn get_result( dialogue.update(State::default()).await?; Ok(()) } - diff --git a/examples/calculator_bot/src/main.rs b/examples/calculator_bot/src/main.rs index 09e9f41..de1d9d0 100644 --- a/examples/calculator_bot/src/main.rs +++ b/examples/calculator_bot/src/main.rs @@ -1,16 +1,16 @@ mod handler_tree; mod handlers; -pub mod text; #[cfg(test)] mod tests; +pub mod text; use std::error::Error; use dotenv::dotenv; +use handler_tree::handler_tree; use teloxide::dispatching::dialogue::serializer::Cbor; use teloxide::dispatching::dialogue::{Dialogue, ErasedStorage, RedisStorage, Storage}; use teloxide::prelude::*; -use handler_tree::handler_tree; pub type MyDialogue = Dialogue>; pub type HandlerResult = Result<(), Box>; @@ -36,7 +36,7 @@ pub async fn get_bot_storage() -> MyStorage { let storage: MyStorage = RedisStorage::open(&dotenv::var("REDIS_URL").unwrap(), Cbor) // For reasons unknown to me, Binary serializer doesn't accept json-like objects, // so im using it. If you want to use InMemStorage, just change - // ErasedStorage to InMemStorage (dont forget to do it in the handler_tree.rs), + // ErasedStorage to InMemStorage (dont forget to do it in the handler_tree.rs), // and make this function return InMemStorage::::new() .await .unwrap() diff --git a/examples/calculator_bot/src/text.rs b/examples/calculator_bot/src/text.rs index 1bde8b6..3c6e993 100644 --- a/examples/calculator_bot/src/text.rs +++ b/examples/calculator_bot/src/text.rs @@ -7,4 +7,3 @@ pub const PLEASE_SEND_TEXT: &str = "Please send text, not anything else"; pub const YOUR_RESULT: &str = "Your result: "; pub const SORRY_BOT_UPDATED: &str = "Sorry, bot updated and we lost where you were. Please try again."; - diff --git a/examples/deep_linking_bot/src/tests.rs b/examples/deep_linking_bot/src/tests.rs index d7fa738..5a8b352 100644 --- a/examples/deep_linking_bot/src/tests.rs +++ b/examples/deep_linking_bot/src/tests.rs @@ -20,7 +20,7 @@ async fn test_start() { #[tokio::test] async fn test_with_deep_link() { - // Because https://t.me/some_bot?start=987654321 is the same as sending "/start 987654321", + // Because https://t.me/some_bot?start=987654321 is the same as sending "/start 987654321", // we can simulate it with this let mock_message = MockMessageText::new().text("/start 987654321"); let mut bot = MockBot::new(mock_message, handler_tree()); @@ -57,7 +57,7 @@ async fn test_send_message() { assert_eq!( sent_message.text().unwrap(), text::YOU_HAVE_A_NEW_MESSAGE.replace("{message}", "I love you!") - ); // Just checking that the text and sender are correct + ); // Just checking that the text and sender are correct assert_eq!(sent_message.chat.id.0, 987654321); assert_eq!( diff --git a/examples/deep_linking_bot/src/text.rs b/examples/deep_linking_bot/src/text.rs index 513da7a..b2c2ff4 100644 --- a/examples/deep_linking_bot/src/text.rs +++ b/examples/deep_linking_bot/src/text.rs @@ -1,4 +1,5 @@ -pub const START: &str = "Hello! This bot is made to ask or say something to someone completely anonymously! +pub const START: &str = + "Hello! This bot is made to ask or say something to someone completely anonymously! This link allows anyone to message you secretly: {deep_link}"; diff --git a/examples/hello_world_bot/src/main.rs b/examples/hello_world_bot/src/main.rs index 28aa937..934fb9b 100644 --- a/examples/hello_world_bot/src/main.rs +++ b/examples/hello_world_bot/src/main.rs @@ -45,19 +45,18 @@ mod tests { bot.dispatch().await; // We can now check the sent messages - let responses = bot.get_responses(); // This returns a struct that has all of the recieved - // updates and requests. You can treat that function like a variable, because it basically is. + let responses = bot.get_responses(); // This returns a struct that has all of the recieved + // updates and requests. You can treat that function like a variable, because it basically is. let message = responses - .sent_messages // This is a list of all sent messages. Be warned, editing or deleting + .sent_messages // This is a list of all sent messages. Be warned, editing or deleting // messages do not affect this list! .last() .expect("No sent messages were detected!"); assert_eq!(message.text(), Some("Hello World!")); - // There is also a more specialized field, sent_messages_text: let message_text = responses - .sent_messages_text // This has a list request bodies and sent messages of only text messages, no photo, audio, etc. + .sent_messages_text // This has a list request bodies and sent messages of only text messages, no photo, audio, etc. // messages .last() .expect("No sent messages were detected!"); @@ -66,7 +65,7 @@ mod tests { // can't be accessed by looking only at the resulted message. For example, drop-down style keyboards can't // be seen in the regular message, like the parse_mode. assert_eq!(message_text.bot_request.parse_mode, None); - // Also, it is highly discouraged to use the raw bot fields like bot.updates and bot.bot, + // Also, it is highly discouraged to use the raw bot fields like bot.updates and bot.bot, // abstractions exist for a reason!!! Do not use them unless you know what you are doing! } } diff --git a/examples/phrase_bot/src/db/schema.rs b/examples/phrase_bot/src/db/schema.rs index 299de5e..735f4ec 100644 --- a/examples/phrase_bot/src/db/schema.rs +++ b/examples/phrase_bot/src/db/schema.rs @@ -19,7 +19,4 @@ diesel::table! { diesel::joinable!(phrases -> users (user_id)); -diesel::allow_tables_to_appear_in_same_query!( - phrases, - users, -); +diesel::allow_tables_to_appear_in_same_query!(phrases, users,); diff --git a/examples/phrase_bot/src/handlers/public.rs b/examples/phrase_bot/src/handlers/public.rs index ab288e3..e540a38 100644 --- a/examples/phrase_bot/src/handlers/public.rs +++ b/examples/phrase_bot/src/handlers/public.rs @@ -11,7 +11,9 @@ pub async fn bot_phrase(bot: Bot, msg: Message) -> HandlerResult { let reply_from_id = reply_from.clone().id.0 as i64; let user_phrases = db::get_user_phrases(user_from_id).unwrap(); // Gets all the phrases and tries to find a matching one in the db - let phrase = user_phrases.iter().find(|phrase| phrase.text.to_lowercase() == text.to_lowercase()); + let phrase = user_phrases + .iter() + .find(|phrase| phrase.text.to_lowercase() == text.to_lowercase()); if let Some(phrase) = phrase { // If successfull, start making the test string diff --git a/teloxide_tests/src/lib.rs b/teloxide_tests/src/lib.rs index 54ede6c..1c3e70f 100644 --- a/teloxide_tests/src/lib.rs +++ b/teloxide_tests/src/lib.rs @@ -160,8 +160,10 @@ mod dataset; pub(crate) mod listener; pub mod mock_bot; mod server; +pub(crate) mod state; #[cfg(test)] mod tests; +pub(crate) mod utils; pub use dataset::*; pub use mock_bot::MockBot; diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 3ffdbb5..7d69de5 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -2,15 +2,12 @@ use crate::{ dataset::{IntoUpdate, MockMe}, server::ServerManager, + state::State, + utils::{assert_eqn, default_distribution_function, find_chat_id, DefaultKey}, }; -use crate::{ - listener::InsertingListener, - server::{self, messages::Messages, Responses}, -}; -use futures_util::future::BoxFuture; +use crate::{listener::InsertingListener, server}; use gag::Gag; use lazy_static::lazy_static; -use serde_json::Value; use std::{ fmt::Debug, hash::Hash, @@ -19,9 +16,8 @@ use std::{ sync::{atomic::AtomicI32, Arc, Mutex, MutexGuard, PoisonError}, }; use teloxide::{ - dispatching::dialogue::ErasedStorage, - dptree::di::DependencySupplier, - types::{File, FileMeta, MaybeInaccessibleMessage, MessageId, MessageKind}, + dispatching::dialogue::ErasedStorage, dptree::di::DependencySupplier, + types::MaybeInaccessibleMessage, }; use teloxide::{ dispatching::{ @@ -37,121 +33,7 @@ lazy_static! { static ref BOT_LOCK: Mutex<()> = Mutex::new(()); } -macro_rules! assert_eqn { - ($actual:expr, $expected:expr $(,)?) => { - match (&$actual, &$expected) { - (actual, expected) => { - if !(*actual == *expected) { - panic!("assertion `actual == expected` failed: - actual: {actual:?} - expected: {expected:?}", actual=&*actual, expected=&*expected) - - } - } - } - }; - ($actual:expr, $expected:expr, $($arg:tt)+) => { - match (&$actual, &$expected) { - (actual, expected) => { - if !(*actual == *expected) { - panic!("assertion `actual == expected` failed: {message} - actual: {actual:?} - expected: {expected:?}", message=$($arg)+, actual=&*actual, expected=&*expected) - - } - } - } - }; -} - -fn find_file(value: Value) -> Option { - // Recursively searches for file meta - let mut file_id = None; - let mut file_unique_id = None; - let mut file_size = None; - if let Value::Object(map) = value { - for (k, v) in map { - if k == "file_id" { - file_id = Some(v.as_str().unwrap().to_string()); - } else if k == "file_unique_id" { - file_unique_id = Some(v.as_str().unwrap().to_string()); - } else if k == "file_size" { - file_size = Some(v.as_u64().unwrap() as u32); - } else if let Some(found) = find_file(v) { - return Some(found); - } - } - } - if let (Some(id), Some(unique_id)) = (file_id, file_unique_id) { - return Some(FileMeta { - id, - unique_id, - size: file_size.unwrap_or(0), - }); - } - None -} - -fn find_chat_id(value: Value) -> Option { - // Recursively searches for chat id - if let Value::Object(map) = value { - for (k, v) in map { - if k == "chat" { - return v["id"].as_i64(); - } else if let Some(found) = find_chat_id(v) { - return Some(found); - } - } - } - None -} - -#[derive(Default)] -pub struct State { - pub files: Vec, - pub responses: Responses, - pub messages: Messages, -} - -impl State { - pub fn reset(&mut self) { - self.responses = Responses::default(); - } - - fn add_message(&mut self, message: &mut Message) { - let max_id = self.messages.max_message_id(); - let maybe_message = self.messages.get_message(message.id.0); - if maybe_message == Some(message.clone()) { - return; - } - if message.id.0 <= max_id || maybe_message.is_some() { - message.id = MessageId(max_id + 1); - } - if let Some(file_meta) = find_file(serde_json::to_value(&message).unwrap()) { - let file = File { - meta: file_meta, - path: "some_path.txt".to_string(), // This doesn't really matter - }; - self.files.push(file); - } - if let MessageKind::Common(ref mut message_kind) = message.kind { - if let Some(ref mut reply_message) = message_kind.reply_to_message { - self.add_message(reply_message); - } - } - self.messages.add_message(message.clone()); - } -} - -// Copied from source code -type DefaultHandler = Arc) -> BoxFuture<'static, ()> + Send + Sync>; - -#[derive(Debug, Hash, PartialEq, Eq, Clone)] -pub struct DefaultKey(ChatId); - -pub(crate) fn default_distribution_function(update: &Update) -> Option { - update.chat().map(|c| c.id).map(DefaultKey) -} +const DEFAULT_STACK_SIZE: usize = 8 * 1024 * 1024; /// A mocked bot that sends requests to the fake server /// Please check the [`new`] function docs and [github examples](https://github.com/LasterAlex/teloxide_tests/tree/master/examples) for more information. @@ -172,7 +54,6 @@ pub struct MockBot { /// The stack size of the runtime for running updates pub stack_size: usize, - default_handler: DefaultHandler, distribution_f: fn(&Update) -> Option, error_handler: Arc + Send + Sync>, @@ -181,23 +62,10 @@ pub struct MockBot { _bot_lock: Option>, } -impl MockBot -where - Err: Debug + Send + Sync + 'static, - Key: Hash + Eq, -{ - /// Sets the dispatchers distribution function - pub fn distribution_function(&mut self, f: fn(&Update) -> Option) { - self.distribution_f = f; - } -} - impl MockBot where Err: Debug + Send + Sync + 'static, { - const DEFAULT_STACK_SIZE: usize = 8 * 1024 * 1024; - /// Creates a new MockBot, using something that can be turned into Updates, and a handler tree. /// You can't create a new bot while you have another bot in scope. Otherwise you will have a /// lot of race conditions. If you still somehow manage to create two bots at the same time @@ -269,11 +137,7 @@ where updates: update.into_update(¤t_update_id), handler_tree, dependencies: DependencyMap::new(), - stack_size: Self::DEFAULT_STACK_SIZE, - default_handler: Arc::new(|upd| { - log::warn!("Unhandled update: {:?}", upd); - Box::pin(async {}) - }), + stack_size: DEFAULT_STACK_SIZE, error_handler: LoggingErrorHandler::new(), distribution_f: default_distribution_function, _bot_lock: lock, @@ -281,6 +145,55 @@ where state, } } +} + +// Trait bound things +impl MockBot +where + Err: Debug + Send + Sync + 'static, + Key: Hash + Eq + Clone + Send + 'static, +{ + /// Same as [`new`], but it inserts a distribution_function into the dispatcher + /// + /// [`new`]: crate::MockBot::new + pub fn new_with_distribution_function( + update: T, + handler_tree: UpdateHandler, + f: fn(&Update) -> Option, + ) -> Self + where + T: IntoUpdate, + Err: Debug, + { + // Again, trait bounds stuff, the generic Key is hard to work around + let MockBot { + bot, + me, + updates, + handler_tree, + dependencies, + stack_size, + error_handler, + distribution_f: _, + _bot_lock, + current_update_id, + state, + } = MockBot::new(update, handler_tree); + + Self { + bot, + me, + updates, + handler_tree, + dependencies, + stack_size, + error_handler, + distribution_f: f, + _bot_lock, + current_update_id, + state, + } + } /// Sets the dependencies of the dptree. The same as deps![] in bot dispatching. /// Just like in this teloxide example: @@ -301,6 +214,11 @@ where self.updates = update.into_update(&self.current_update_id); } + /// Sets the error_handler for Dispather + pub fn error_handler(&mut self, handler: Arc + Send + Sync>) { + self.error_handler = handler; + } + /// Just inserts the updates into the state, returning them fn insert_updates(&self, updates: &mut [Update]) { for update in updates.iter_mut() { diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 01b3b0c..14d150e 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -30,7 +30,7 @@ use tokio::{ }; use tokio_util::sync::CancellationToken; -use crate::mock_bot::State; +use crate::state::State; pub mod messages; pub mod responses; diff --git a/teloxide_tests/src/server/routes/answer_callback_query.rs b/teloxide_tests/src/server/routes/answer_callback_query.rs index 7927316..58573ab 100644 --- a/teloxide_tests/src/server/routes/answer_callback_query.rs +++ b/teloxide_tests/src/server/routes/answer_callback_query.rs @@ -3,7 +3,7 @@ use std::sync::Mutex; use actix_web::{web, Responder}; use serde::Deserialize; -use crate::mock_bot::State; +use crate::state::State; use super::make_telegram_result; diff --git a/teloxide_tests/src/server/routes/ban_chat_member.rs b/teloxide_tests/src/server/routes/ban_chat_member.rs index 3c1489b..d339303 100644 --- a/teloxide_tests/src/server/routes/ban_chat_member.rs +++ b/teloxide_tests/src/server/routes/ban_chat_member.rs @@ -3,8 +3,8 @@ use std::sync::Mutex; use actix_web::{web, Responder}; use serde::Deserialize; -use crate::mock_bot::State; use crate::server::routes::make_telegram_result; +use crate::state::State; use super::BodyChatId; diff --git a/teloxide_tests/src/server/routes/copy_message.rs b/teloxide_tests/src/server/routes/copy_message.rs index d1eb76c..983c50f 100644 --- a/teloxide_tests/src/server/routes/copy_message.rs +++ b/teloxide_tests/src/server/routes/copy_message.rs @@ -9,9 +9,9 @@ use teloxide::types::{ MessageEntity, MessageId, MessageKind, ParseMode, ReplyMarkup, }; -use crate::mock_bot::State; use crate::server::routes::check_if_message_exists; use crate::server::CopiedMessage; +use crate::state::State; use super::{make_telegram_result, BodyChatId}; diff --git a/teloxide_tests/src/server/routes/delete_message.rs b/teloxide_tests/src/server/routes/delete_message.rs index 10584b3..3ce6606 100644 --- a/teloxide_tests/src/server/routes/delete_message.rs +++ b/teloxide_tests/src/server/routes/delete_message.rs @@ -4,9 +4,9 @@ use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; -use crate::mock_bot::State; use crate::server::routes::make_telegram_result; use crate::server::DeletedMessage; +use crate::state::State; use super::{check_if_message_exists, BodyChatId}; diff --git a/teloxide_tests/src/server/routes/download_file.rs b/teloxide_tests/src/server/routes/download_file.rs index 67d07f6..004a9fe 100644 --- a/teloxide_tests/src/server/routes/download_file.rs +++ b/teloxide_tests/src/server/routes/download_file.rs @@ -7,7 +7,7 @@ use actix_web::{ }; use futures_util::{future::ok, stream::once}; -use crate::mock_bot::State; +use crate::state::State; pub async fn download_file( path: web::Path<(String, String)>, diff --git a/teloxide_tests/src/server/routes/edit_message_caption.rs b/teloxide_tests/src/server/routes/edit_message_caption.rs index 7a9a1bc..6a30bf8 100644 --- a/teloxide_tests/src/server/routes/edit_message_caption.rs +++ b/teloxide_tests/src/server/routes/edit_message_caption.rs @@ -5,9 +5,9 @@ use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::{MessageEntity, ParseMode, ReplyMarkup}; -use crate::mock_bot::State; use crate::server::routes::make_telegram_result; use crate::server::EditedMessageCaption; +use crate::state::State; use super::{check_if_message_exists, BodyChatId}; diff --git a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs index d200c99..c7e515f 100644 --- a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs +++ b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs @@ -1,10 +1,9 @@ -use std::sync::Mutex; - -use crate::mock_bot::State; use crate::server::routes::{check_if_message_exists, make_telegram_result}; +use crate::state::State; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; +use std::sync::Mutex; use teloxide::types::ReplyMarkup; use crate::server::EditedMessageReplyMarkup; diff --git a/teloxide_tests/src/server/routes/edit_message_text.rs b/teloxide_tests/src/server/routes/edit_message_text.rs index 6a95833..fb6a7a3 100644 --- a/teloxide_tests/src/server/routes/edit_message_text.rs +++ b/teloxide_tests/src/server/routes/edit_message_text.rs @@ -5,8 +5,8 @@ use serde::Deserialize; use teloxide::types::{LinkPreviewOptions, MessageEntity, ParseMode, ReplyMarkup}; use crate::{ - mock_bot::State, server::{routes::make_telegram_result, EditedMessageText}, + state::State, }; use super::{check_if_message_exists, BodyChatId}; diff --git a/teloxide_tests/src/server/routes/forward_message.rs b/teloxide_tests/src/server/routes/forward_message.rs index 5b90930..1f7a743 100644 --- a/teloxide_tests/src/server/routes/forward_message.rs +++ b/teloxide_tests/src/server/routes/forward_message.rs @@ -1,8 +1,8 @@ use std::sync::Mutex; -use crate::mock_bot::State; use crate::server::routes::check_if_message_exists; use crate::server::ForwardedMessage; +use crate::state::State; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; diff --git a/teloxide_tests/src/server/routes/get_file.rs b/teloxide_tests/src/server/routes/get_file.rs index 7821b13..b6b31e8 100644 --- a/teloxide_tests/src/server/routes/get_file.rs +++ b/teloxide_tests/src/server/routes/get_file.rs @@ -3,7 +3,7 @@ use std::sync::Mutex; use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use crate::mock_bot::State; +use crate::state::State; use super::make_telegram_result; diff --git a/teloxide_tests/src/server/routes/pin_chat_message.rs b/teloxide_tests/src/server/routes/pin_chat_message.rs index 3728190..50088a6 100644 --- a/teloxide_tests/src/server/routes/pin_chat_message.rs +++ b/teloxide_tests/src/server/routes/pin_chat_message.rs @@ -4,8 +4,8 @@ use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; -use crate::mock_bot::State; use crate::server::routes::make_telegram_result; +use crate::state::State; use super::{check_if_message_exists, BodyChatId}; diff --git a/teloxide_tests/src/server/routes/restrict_chat_member.rs b/teloxide_tests/src/server/routes/restrict_chat_member.rs index 3e00816..823be13 100644 --- a/teloxide_tests/src/server/routes/restrict_chat_member.rs +++ b/teloxide_tests/src/server/routes/restrict_chat_member.rs @@ -4,7 +4,7 @@ use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::ChatPermissions; -use crate::{mock_bot::State, server::routes::make_telegram_result}; +use crate::{server::routes::make_telegram_result, state::State}; use super::BodyChatId; diff --git a/teloxide_tests/src/server/routes/send_animation.rs b/teloxide_tests/src/server/routes/send_animation.rs index 9a4b03a..dd0ae3c 100644 --- a/teloxide_tests/src/server/routes/send_animation.rs +++ b/teloxide_tests/src/server/routes/send_animation.rs @@ -1,7 +1,7 @@ -use crate::mock_bot::State; use crate::server::routes::Attachment; use crate::server::routes::{FileType, SerializeRawFields}; use crate::server::SentMessageAnimation; +use crate::state::State; use crate::MockMessageAnimation; use std::collections::HashMap; use std::str::FromStr; diff --git a/teloxide_tests/src/server/routes/send_audio.rs b/teloxide_tests/src/server/routes/send_audio.rs index a233bc3..bbf3ea2 100644 --- a/teloxide_tests/src/server/routes/send_audio.rs +++ b/teloxide_tests/src/server/routes/send_audio.rs @@ -1,5 +1,5 @@ -use crate::mock_bot::State; use crate::server::routes::Attachment; +use crate::state::State; use crate::{ server::{ routes::{FileType, SerializeRawFields}, diff --git a/teloxide_tests/src/server/routes/send_chat_action.rs b/teloxide_tests/src/server/routes/send_chat_action.rs index 8a6069b..b03536c 100644 --- a/teloxide_tests/src/server/routes/send_chat_action.rs +++ b/teloxide_tests/src/server/routes/send_chat_action.rs @@ -3,7 +3,7 @@ use std::sync::Mutex; use actix_web::{web, Responder}; use serde::Deserialize; -use crate::{mock_bot::State, server::routes::make_telegram_result}; +use crate::{server::routes::make_telegram_result, state::State}; use super::BodyChatId; diff --git a/teloxide_tests/src/server/routes/send_contact.rs b/teloxide_tests/src/server/routes/send_contact.rs index 0f17666..7e94907 100644 --- a/teloxide_tests/src/server/routes/send_contact.rs +++ b/teloxide_tests/src/server/routes/send_contact.rs @@ -1,7 +1,7 @@ use std::sync::Mutex; -use crate::mock_bot::State; use crate::server::SentMessageContact; +use crate::state::State; use crate::MockMessageContact; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; diff --git a/teloxide_tests/src/server/routes/send_dice.rs b/teloxide_tests/src/server/routes/send_dice.rs index e5294f7..8ead70e 100644 --- a/teloxide_tests/src/server/routes/send_dice.rs +++ b/teloxide_tests/src/server/routes/send_dice.rs @@ -1,8 +1,8 @@ use std::sync::Mutex; -use crate::mock_bot::State; use crate::server::routes::check_if_message_exists; use crate::server::SentMessageDice; +use crate::state::State; use crate::MockMessageDice; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; diff --git a/teloxide_tests/src/server/routes/send_document.rs b/teloxide_tests/src/server/routes/send_document.rs index a82e2fe..49f51ea 100644 --- a/teloxide_tests/src/server/routes/send_document.rs +++ b/teloxide_tests/src/server/routes/send_document.rs @@ -1,6 +1,6 @@ -use crate::mock_bot::State; use crate::server::routes::Attachment; use crate::server::routes::{FileType, SerializeRawFields}; +use crate::state::State; use std::collections::HashMap; use std::str::FromStr; use std::sync::Mutex; diff --git a/teloxide_tests/src/server/routes/send_location.rs b/teloxide_tests/src/server/routes/send_location.rs index ace21aa..b950bec 100644 --- a/teloxide_tests/src/server/routes/send_location.rs +++ b/teloxide_tests/src/server/routes/send_location.rs @@ -1,7 +1,7 @@ use std::sync::Mutex; -use crate::mock_bot::State; use crate::server::SentMessageLocation; +use crate::state::State; use crate::MockMessageLocation; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; diff --git a/teloxide_tests/src/server/routes/send_media_group.rs b/teloxide_tests/src/server/routes/send_media_group.rs index 3cc521c..7c696bc 100644 --- a/teloxide_tests/src/server/routes/send_media_group.rs +++ b/teloxide_tests/src/server/routes/send_media_group.rs @@ -1,5 +1,5 @@ -use crate::mock_bot::State; use crate::server::SentMediaGroup; +use crate::state::State; use crate::{ MockMessageAudio, MockMessageDocument, MockMessagePhoto, MockMessageVideo, MockPhotoSize, MockVideo, diff --git a/teloxide_tests/src/server/routes/send_message.rs b/teloxide_tests/src/server/routes/send_message.rs index a6d1440..249fd2e 100644 --- a/teloxide_tests/src/server/routes/send_message.rs +++ b/teloxide_tests/src/server/routes/send_message.rs @@ -1,7 +1,7 @@ use std::sync::Mutex; use crate::dataset::message_common::MockMessageText; -use crate::mock_bot::State; +use crate::state::State; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; diff --git a/teloxide_tests/src/server/routes/send_photo.rs b/teloxide_tests/src/server/routes/send_photo.rs index ef4bdfa..dae47fb 100644 --- a/teloxide_tests/src/server/routes/send_photo.rs +++ b/teloxide_tests/src/server/routes/send_photo.rs @@ -1,6 +1,6 @@ -use crate::mock_bot::State; use crate::server::routes::Attachment; use crate::server::routes::{FileType, SerializeRawFields}; +use crate::state::State; use std::collections::HashMap; use std::sync::Mutex; diff --git a/teloxide_tests/src/server/routes/send_poll.rs b/teloxide_tests/src/server/routes/send_poll.rs index fda4b21..d9f94f4 100644 --- a/teloxide_tests/src/server/routes/send_poll.rs +++ b/teloxide_tests/src/server/routes/send_poll.rs @@ -1,7 +1,7 @@ use std::sync::Mutex; -use crate::mock_bot::State; use crate::server::SentMessagePoll; +use crate::state::State; use crate::MockMessagePoll; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; diff --git a/teloxide_tests/src/server/routes/send_sticker.rs b/teloxide_tests/src/server/routes/send_sticker.rs index 8fb7da0..e6424b2 100644 --- a/teloxide_tests/src/server/routes/send_sticker.rs +++ b/teloxide_tests/src/server/routes/send_sticker.rs @@ -1,7 +1,7 @@ -use crate::mock_bot::State; use crate::server::routes::Attachment; use crate::server::routes::{FileType, SerializeRawFields}; use crate::server::SentMessageSticker; +use crate::state::State; use crate::MockMessageSticker; use std::collections::HashMap; use std::sync::Mutex; diff --git a/teloxide_tests/src/server/routes/send_venue.rs b/teloxide_tests/src/server/routes/send_venue.rs index d7a1461..c9cfd74 100644 --- a/teloxide_tests/src/server/routes/send_venue.rs +++ b/teloxide_tests/src/server/routes/send_venue.rs @@ -1,7 +1,7 @@ use std::sync::Mutex; -use crate::mock_bot::State; use crate::server::SentMessageVenue; +use crate::state::State; use crate::{MockLocation, MockMessageVenue}; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; diff --git a/teloxide_tests/src/server/routes/send_video.rs b/teloxide_tests/src/server/routes/send_video.rs index 4e0b218..ccc7274 100644 --- a/teloxide_tests/src/server/routes/send_video.rs +++ b/teloxide_tests/src/server/routes/send_video.rs @@ -1,6 +1,6 @@ -use crate::mock_bot::State; use crate::server::routes::Attachment; use crate::server::routes::{FileType, SerializeRawFields}; +use crate::state::State; use std::collections::HashMap; use std::str::FromStr; use std::sync::Mutex; diff --git a/teloxide_tests/src/server/routes/send_video_note.rs b/teloxide_tests/src/server/routes/send_video_note.rs index 6d7d0db..b9ccd81 100644 --- a/teloxide_tests/src/server/routes/send_video_note.rs +++ b/teloxide_tests/src/server/routes/send_video_note.rs @@ -1,5 +1,5 @@ -use crate::mock_bot::State; use crate::server::routes::Attachment; +use crate::state::State; use crate::{ server::{ routes::{FileType, SerializeRawFields}, diff --git a/teloxide_tests/src/server/routes/send_voice.rs b/teloxide_tests/src/server/routes/send_voice.rs index cd25b64..06405ea 100644 --- a/teloxide_tests/src/server/routes/send_voice.rs +++ b/teloxide_tests/src/server/routes/send_voice.rs @@ -1,5 +1,5 @@ -use crate::mock_bot::State; use crate::server::routes::Attachment; +use crate::state::State; use crate::{ server::{ routes::{FileType, SerializeRawFields}, diff --git a/teloxide_tests/src/server/routes/set_message_reaction.rs b/teloxide_tests/src/server/routes/set_message_reaction.rs index 991e907..da64ce5 100644 --- a/teloxide_tests/src/server/routes/set_message_reaction.rs +++ b/teloxide_tests/src/server/routes/set_message_reaction.rs @@ -1,7 +1,7 @@ use std::sync::Mutex; -use crate::mock_bot::State; use crate::server::SetMessageReaction; +use crate::state::State; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; diff --git a/teloxide_tests/src/server/routes/unban_chat_member.rs b/teloxide_tests/src/server/routes/unban_chat_member.rs index fb4e08f..b7906de 100644 --- a/teloxide_tests/src/server/routes/unban_chat_member.rs +++ b/teloxide_tests/src/server/routes/unban_chat_member.rs @@ -3,7 +3,7 @@ use std::sync::Mutex; use actix_web::{web, Responder}; use serde::Deserialize; -use crate::{mock_bot::State, server::routes::make_telegram_result}; +use crate::{server::routes::make_telegram_result, state::State}; use super::BodyChatId; diff --git a/teloxide_tests/src/server/routes/unpin_all_chat_messages.rs b/teloxide_tests/src/server/routes/unpin_all_chat_messages.rs index 236fa8c..5d4d1b8 100644 --- a/teloxide_tests/src/server/routes/unpin_all_chat_messages.rs +++ b/teloxide_tests/src/server/routes/unpin_all_chat_messages.rs @@ -3,7 +3,7 @@ use std::sync::Mutex; use actix_web::{web, Responder}; use serde::Deserialize; -use crate::{mock_bot::State, server::routes::make_telegram_result}; +use crate::{server::routes::make_telegram_result, state::State}; use super::BodyChatId; diff --git a/teloxide_tests/src/server/routes/unpin_chat_message.rs b/teloxide_tests/src/server/routes/unpin_chat_message.rs index 4c97c5f..4d7e312 100644 --- a/teloxide_tests/src/server/routes/unpin_chat_message.rs +++ b/teloxide_tests/src/server/routes/unpin_chat_message.rs @@ -4,8 +4,8 @@ use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; use serde::Deserialize; -use crate::mock_bot::State; use crate::server::routes::make_telegram_result; +use crate::state::State; use super::{check_if_message_exists, BodyChatId}; diff --git a/teloxide_tests/src/state.rs b/teloxide_tests/src/state.rs new file mode 100644 index 0000000..e8416df --- /dev/null +++ b/teloxide_tests/src/state.rs @@ -0,0 +1,50 @@ +use teloxide::prelude::*; +use teloxide::types::{File, MessageId, MessageKind}; + +use crate::{server::messages::Messages, utils::find_file, Responses}; + +#[derive(Default)] +pub(crate) struct State { + pub files: Vec, + pub responses: Responses, + pub messages: Messages, +} + +impl State { + pub fn reset(&mut self) { + self.responses = Responses::default(); + } + + pub(crate) fn add_message(&mut self, message: &mut Message) { + let max_id = self.messages.max_message_id(); + let maybe_message = self.messages.get_message(message.id.0); + + // If message exists in the database, and it isn't a default, + // let it be, the user knows best + if Some(message.clone()) == maybe_message.clone() { + log::debug!( + "Not inserting message with id {}, it exists in the database.", + message.id + ); + return; + } + + if message.id.0 <= max_id || maybe_message.is_some() { + message.id = MessageId(max_id + 1); + } + if let Some(file_meta) = find_file(serde_json::to_value(&message).unwrap()) { + let file = File { + meta: file_meta, + path: "some_path.txt".to_string(), // This doesn't really matter + }; + self.files.push(file); + } + if let MessageKind::Common(ref mut message_kind) = message.kind { + if let Some(ref mut reply_message) = message_kind.reply_to_message { + self.add_message(reply_message); + } + } + log::debug!("Inserted message with {}.", message.id); + self.messages.add_message(message.clone()); + } +} diff --git a/teloxide_tests/src/utils.rs b/teloxide_tests/src/utils.rs new file mode 100644 index 0000000..bd1526c --- /dev/null +++ b/teloxide_tests/src/utils.rs @@ -0,0 +1,82 @@ +use serde_json::Value; +use teloxide::prelude::*; +use teloxide::types::FileMeta; + +macro_rules! assert_eqn { + ($actual:expr, $expected:expr $(,)?) => { + match (&$actual, &$expected) { + (actual, expected) => { + if !(*actual == *expected) { + panic!("assertion `actual == expected` failed: + actual: {actual:?} + expected: {expected:?}", actual=&*actual, expected=&*expected) + + } + } + } + }; + ($actual:expr, $expected:expr, $($arg:tt)+) => { + match (&$actual, &$expected) { + (actual, expected) => { + if !(*actual == *expected) { + panic!("assertion `actual == expected` failed: {message} + actual: {actual:?} + expected: {expected:?}", message=$($arg)+, actual=&*actual, expected=&*expected) + + } + } + } + }; +} + +pub(crate) use assert_eqn; + +pub fn find_file(value: Value) -> Option { + // Recursively searches for file meta + let mut file_id = None; + let mut file_unique_id = None; + let mut file_size = None; + if let Value::Object(map) = value { + for (k, v) in map { + if k == "file_id" { + file_id = Some(v.as_str().unwrap().to_string()); + } else if k == "file_unique_id" { + file_unique_id = Some(v.as_str().unwrap().to_string()); + } else if k == "file_size" { + file_size = Some(v.as_u64().unwrap() as u32); + } else if let Some(found) = find_file(v) { + return Some(found); + } + } + } + if let (Some(id), Some(unique_id)) = (file_id, file_unique_id) { + return Some(FileMeta { + id, + unique_id, + size: file_size.unwrap_or(0), + }); + } + None +} + +pub fn find_chat_id(value: Value) -> Option { + // Recursively searches for chat id + if let Value::Object(map) = value { + for (k, v) in map { + if k == "chat" { + return v["id"].as_i64(); + } else if let Some(found) = find_chat_id(v) { + return Some(found); + } + } + } + None +} + +// Copied from source code +#[derive(Debug, Hash, PartialEq, Eq, Clone)] +pub struct DefaultKey(ChatId); + +pub(crate) fn default_distribution_function(update: &Update) -> Option { + update.chat().map(|c| c.id).map(DefaultKey) +} From 18e3db6448bfa18709d88d10f5d38a243c2b3cb0 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Mon, 11 Nov 2024 02:01:25 +0200 Subject: [PATCH 109/138] Fixed set_my_commands and fixed set_message_reaction --- teloxide_tests/src/server/responses.rs | 14 ++++---- .../src/server/routes/set_message_reaction.rs | 5 +-- .../src/server/routes/set_my_commands.rs | 24 ++++++++++++-- teloxide_tests/src/tests.rs | 33 +++++++++++++++++-- 4 files changed, 59 insertions(+), 17 deletions(-) diff --git a/teloxide_tests/src/server/responses.rs b/teloxide_tests/src/server/responses.rs index 9ac7ff9..bd24342 100644 --- a/teloxide_tests/src/server/responses.rs +++ b/teloxide_tests/src/server/responses.rs @@ -6,7 +6,7 @@ use super::routes::{ send_location::*, send_media_group::*, send_message::*, send_photo::*, send_poll::*, send_sticker::*, send_venue::*, send_video::*, send_video_note::*, send_voice::*, set_message_reaction::*, unban_chat_member::*, unpin_all_chat_messages::*, - unpin_chat_message::*, + unpin_chat_message::*, set_my_commands::*, }; use teloxide::types::{Message, MessageId}; @@ -137,11 +137,6 @@ pub struct CopiedMessage { pub bot_request: CopyMessageBody, } -#[derive(Clone, Debug)] -pub struct SetMessageReaction { - pub bot_request: SetMessageReactionBody, -} - #[derive(Clone, Debug, Default)] pub struct Responses { /// All of the sent messages, including text, photo, audio, etc. @@ -296,5 +291,10 @@ pub struct Responses { /// This has only the requests that were sent to the fake server to set message reactions. /// Telegram doesn't return anything, because there isn't anything to return, so there is no /// `.message` field. - pub set_message_reaction: Vec, + pub set_message_reaction: Vec, + + /// This has only the requests that were sent to the fake server to set message reactions. + /// Telegram doesn't return anything, because there isn't anything to return, so there is no + /// `.message` field. + pub set_my_commands: Vec, } diff --git a/teloxide_tests/src/server/routes/set_message_reaction.rs b/teloxide_tests/src/server/routes/set_message_reaction.rs index da64ce5..b50bb17 100644 --- a/teloxide_tests/src/server/routes/set_message_reaction.rs +++ b/teloxide_tests/src/server/routes/set_message_reaction.rs @@ -1,6 +1,5 @@ use std::sync::Mutex; -use crate::server::SetMessageReaction; use crate::state::State; use actix_web::error::ErrorBadRequest; use actix_web::{web, Responder}; @@ -29,9 +28,7 @@ pub async fn set_message_reaction( lock.responses .set_message_reaction - .push(SetMessageReaction { - bot_request: body.into_inner(), - }); + .push(body.into_inner()); make_telegram_result(true) } diff --git a/teloxide_tests/src/server/routes/set_my_commands.rs b/teloxide_tests/src/server/routes/set_my_commands.rs index 6d98e35..4931133 100644 --- a/teloxide_tests/src/server/routes/set_my_commands.rs +++ b/teloxide_tests/src/server/routes/set_my_commands.rs @@ -1,8 +1,26 @@ -use actix_web::Responder; +use std::sync::Mutex; + +use actix_web::{web, Responder}; +use serde::Deserialize; +use teloxide::types::{BotCommand, BotCommandScope}; + +use crate::state::State; use super::make_telegram_result; -pub async fn set_my_commands() -> impl Responder { - // Dummy response +#[derive(Debug, Deserialize, Clone)] +pub struct SetMyCommandsBody { + pub commands: Vec, + pub scope: Option, + pub language_code: Option, +} + +pub async fn set_my_commands( + state: web::Data>, + body: web::Json, +) -> impl Responder { + let mut lock = state.lock().unwrap(); + lock.responses.set_my_commands.push(body.into_inner()); + make_telegram_result(true) } diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index a4adda0..e2d3708 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -14,8 +14,8 @@ use teloxide::payloads::{ use teloxide::requests::Requester; use teloxide::sugar::request::RequestReplyExt; use teloxide::types::{ - ChatAction, ChatPermissions, DiceEmoji, InlineKeyboardButton, InlineKeyboardMarkup, InputFile, - InputMedia, InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo, + BotCommand, ChatAction, ChatPermissions, DiceEmoji, InlineKeyboardButton, InlineKeyboardMarkup, + InputFile, InputMedia, InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo, LinkPreviewOptions, Message, MessageEntity, MessageId, PollOption, PollType, ReactionType, ReplyParameters, Seconds, Update, }; @@ -231,6 +231,8 @@ pub enum AllCommands { #[command()] SetMessageReaction, #[command()] + SetMyCommands, + #[command()] Panic, } @@ -459,6 +461,13 @@ async fn handler( }]) .await?; } + AllCommands::SetMyCommands => { + bot.set_my_commands(vec![BotCommand { + command: String::from("test"), + description: String::from("test"), + }]) + .await?; + } AllCommands::Panic => { // This message id does not exist bot.send_message(msg.chat.id, "test") @@ -1069,9 +1078,27 @@ async fn test_set_message_reaction() { let last_reaction = responses.set_message_reaction.last().unwrap(); assert_eq!( - last_reaction.bot_request.reaction.clone().unwrap()[0], + last_reaction.reaction.clone().unwrap()[0], ReactionType::Emoji { emoji: "👍".to_owned() } ); } + +#[tokio::test] +async fn test_set_my_commands() { + let mut bot = MockBot::new(MockMessageText::new().text("/setmycommands"), get_schema()); + + bot.dispatch().await; + + let responses = bot.get_responses(); + let set_commands = responses.set_my_commands.last().unwrap(); + + assert_eq!( + set_commands.commands.first(), + Some(&BotCommand { + command: String::from("test"), + description: String::from("test") + }) + ); +} From dd7a587683c534c5072e943e984ae2b00fd8d61c Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Mon, 11 Nov 2024 03:09:21 +0200 Subject: [PATCH 110/138] Cargo fmt + error handling test --- teloxide_tests/src/server/responses.rs | 4 +-- .../src/server/routes/set_message_reaction.rs | 4 +-- teloxide_tests/src/tests.rs | 32 +++++++++++++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/teloxide_tests/src/server/responses.rs b/teloxide_tests/src/server/responses.rs index bd24342..7f69992 100644 --- a/teloxide_tests/src/server/responses.rs +++ b/teloxide_tests/src/server/responses.rs @@ -5,8 +5,8 @@ use super::routes::{ send_audio::*, send_chat_action::*, send_contact::*, send_dice::*, send_document::*, send_location::*, send_media_group::*, send_message::*, send_photo::*, send_poll::*, send_sticker::*, send_venue::*, send_video::*, send_video_note::*, send_voice::*, - set_message_reaction::*, unban_chat_member::*, unpin_all_chat_messages::*, - unpin_chat_message::*, set_my_commands::*, + set_message_reaction::*, set_my_commands::*, unban_chat_member::*, unpin_all_chat_messages::*, + unpin_chat_message::*, }; use teloxide::types::{Message, MessageId}; diff --git a/teloxide_tests/src/server/routes/set_message_reaction.rs b/teloxide_tests/src/server/routes/set_message_reaction.rs index b50bb17..91304d7 100644 --- a/teloxide_tests/src/server/routes/set_message_reaction.rs +++ b/teloxide_tests/src/server/routes/set_message_reaction.rs @@ -26,9 +26,7 @@ pub async fn set_message_reaction( check_if_message_exists!(lock, body.message_id); - lock.responses - .set_message_reaction - .push(body.into_inner()); + lock.responses.set_message_reaction.push(body.into_inner()); make_telegram_result(true) } diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index e2d3708..6892bab 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -1,12 +1,16 @@ +use std::fmt::Display; +use std::sync::atomic::AtomicBool; use std::sync::Arc; use super::*; use crate::dataset::*; +use futures_util::future::BoxFuture; use serde::{Deserialize, Serialize}; use teloxide::dispatching::dialogue::serializer::Json; use teloxide::dispatching::dialogue::{ErasedStorage, SqliteStorage, Storage}; use teloxide::dispatching::{HandlerExt, UpdateHandler}; use teloxide::dptree::case; +use teloxide::error_handlers::ErrorHandler; use teloxide::net::Download; use teloxide::payloads::{ BanChatMemberSetters, CopyMessageSetters, SendPhotoSetters, SendPollSetters, @@ -524,6 +528,34 @@ async fn test_panic() { drop(bot); } +pub struct MyErrorHandler { + some_bool: Arc, +} + +impl ErrorHandler for MyErrorHandler +where + E: std::fmt::Debug + Display + 'static + Sync + Send, +{ + fn handle_error(self: Arc, _error: E) -> BoxFuture<'static, ()> { + self.some_bool + .swap(true, std::sync::atomic::Ordering::SeqCst); + Box::pin(async {}) + } +} + +#[tokio::test] +async fn test_error_handler() { + let mut bot = MockBot::new(MockMessageText::new().text("/panic"), get_schema()); + let some_bool = Arc::new(AtomicBool::new(false)); + + bot.error_handler(Arc::new(MyErrorHandler { + some_bool: some_bool.clone(), + })); + bot.dispatch().await; + + assert!(some_bool.load(std::sync::atomic::Ordering::SeqCst)); +} + #[tokio::test] async fn test_no_updates() { let empty: Vec = vec![]; From 38a8ecab12545545ae3203fe8b1e9a25eeb4c1db Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Mon, 11 Nov 2024 03:31:23 +0200 Subject: [PATCH 111/138] Updated documentation --- README.md | 2 +- examples/album_bot/src/main.rs | 2 ++ teloxide_tests/src/lib.rs | 4 +++- teloxide_tests/src/mock_bot.rs | 4 +--- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d08ba54..85a141f 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ ## What this crate has - Easy testing of handlers with access to raw bot requests (see [hello_world_bot](https://github.com/LasterAlex/teloxide_tests/blob/master/examples/hello_world_bot/src/main.rs)) -- Support of dependencies, changes of `me` and multiple updates (see [album_bot](https://github.com/LasterAlex/teloxide_tests/blob/master/examples/album_bot/src/main.rs)) +- Support of dependencies, changes of `me`, distribution_function and multiple updates (see [album_bot](https://github.com/LasterAlex/teloxide_tests/blob/master/examples/album_bot/src/main.rs)) - Syntactic sugar and native support for storage, dialogue and states (see [calculator_bot](https://github.com/LasterAlex/teloxide_tests/blob/master/examples/calculator_bot/src/tests.rs)) - Fake file getting and downloading (see [file_download_bot](https://github.com/LasterAlex/teloxide_tests/blob/master/examples/file_download_bot/src/main.rs)) - Ability to be used with databases (see [phrase_bot](https://github.com/LasterAlex/teloxide_tests/blob/master/examples/phrase_bot/src/main.rs)) diff --git a/examples/album_bot/src/main.rs b/examples/album_bot/src/main.rs index 6adf4b9..50589f3 100644 --- a/examples/album_bot/src/main.rs +++ b/examples/album_bot/src/main.rs @@ -188,6 +188,8 @@ mod tests { bot.dependencies(deps![album_storage]); // This is 3 messages with the text "Detected 1 messages without media group!" + // They aren't bundled exactly because distribution_function only processes in parallel + // updates with a media group bot.dispatch_and_check_last_text("Detected 1 messages without media group!") .await; assert_eq!(bot.get_responses().sent_messages.len(), 3); diff --git a/teloxide_tests/src/lib.rs b/teloxide_tests/src/lib.rs index 1c3e70f..e7318fb 100644 --- a/teloxide_tests/src/lib.rs +++ b/teloxide_tests/src/lib.rs @@ -87,10 +87,12 @@ //! - /UnbanChatMember //! - /RestrictChatMember //! - /SetMessageReaction +//! - /SetMyCommands +//! - /GetMe //! //! More endpoints will be added as time goes on! //! -//! (do not worry about /GetMe and /GetUpdates, they are not needed for this bot!) +//! (/GetUpdates and /GetWebhookInfo exist, but they are dummies) //! //! And also fake file downloading! //! diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 7d69de5..67ec9f5 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -39,7 +39,6 @@ const DEFAULT_STACK_SIZE: usize = 8 * 1024 * 1024; /// Please check the [`new`] function docs and [github examples](https://github.com/LasterAlex/teloxide_tests/tree/master/examples) for more information. /// /// [`new`]: crate::MockBot::new -#[allow(dead_code)] pub struct MockBot { /// The bot with a fake server url pub bot: Bot, @@ -209,7 +208,7 @@ where } /// Sets the updates. Useful for reusing the same mocked bot instance in different tests - /// Reminder: You can pass in vec![MockMessagePhoto] or something else! + /// Reminder: You can pass in `vec![MockMessagePhoto]` or something else! pub fn update(&mut self, update: T) { self.updates = update.into_update(&self.current_update_id); } @@ -292,7 +291,6 @@ where } /// Returns the responses stored in `responses` - /// Panics if no dispatching was done. /// Should be treated as a variable, because it kinda is pub fn get_responses(&self) -> server::Responses { self.state.lock().unwrap().responses.clone() From 344351225a8956c4b2d52318c59fd1a14b28b8ca Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Mon, 11 Nov 2024 05:52:31 +0200 Subject: [PATCH 112/138] Less strict check on message addition --- teloxide_tests/src/mock_bot.rs | 8 +++++++- teloxide_tests/src/state.rs | 6 ++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 67ec9f5..b58b830 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -146,7 +146,7 @@ where } } -// Trait bound things +// Trait bound things. impl MockBot where Err: Debug + Send + Sync + 'static, @@ -155,6 +155,9 @@ where /// Same as [`new`], but it inserts a distribution_function into the dispatcher /// /// [`new`]: crate::MockBot::new + // It is its own function instead of `.distribution_function` setter because of the Key + // generic. If `new` sets the Key to DefaultKey, it's impossible to swich back to a different + // one, even if it fits all the trait bounds. pub fn new_with_distribution_function( update: T, handler_tree: UpdateHandler, @@ -281,12 +284,15 @@ where let server = ServerManager::start(self.me.clone(), self.state.clone()) .await .unwrap(); + let mut updates = self.updates.clone(); self.insert_updates(&mut updates); let api_url = reqwest::Url::parse(&format!("http://127.0.0.1:{}", server.port)).unwrap(); let bot = self.bot.clone().set_api_url(api_url); + self.run_updates(bot, updates).await; + server.stop().await.unwrap(); } diff --git a/teloxide_tests/src/state.rs b/teloxide_tests/src/state.rs index e8416df..a01122f 100644 --- a/teloxide_tests/src/state.rs +++ b/teloxide_tests/src/state.rs @@ -1,6 +1,7 @@ use teloxide::prelude::*; use teloxide::types::{File, MessageId, MessageKind}; +use crate::MockMessageText; use crate::{server::messages::Messages, utils::find_file, Responses}; #[derive(Default)] @@ -21,9 +22,9 @@ impl State { // If message exists in the database, and it isn't a default, // let it be, the user knows best - if Some(message.clone()) == maybe_message.clone() { + if maybe_message.is_some() && message.id != MessageId(MockMessageText::ID) { log::debug!( - "Not inserting message with id {}, it exists in the database.", + "Not inserting message with id {}, this id exists in the database.", message.id ); return; @@ -32,6 +33,7 @@ impl State { if message.id.0 <= max_id || maybe_message.is_some() { message.id = MessageId(max_id + 1); } + if let Some(file_meta) = find_file(serde_json::to_value(&message).unwrap()) { let file = File { meta: file_meta, From 9da2c90a5f5f470679fb09b853f7722b17961088 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Mon, 11 Nov 2024 06:07:34 +0200 Subject: [PATCH 113/138] Publicly reexported DistributionKey --- teloxide_tests/src/mock_bot.rs | 5 +++-- teloxide_tests/src/utils.rs | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index b58b830..eb8ec5d 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -3,7 +3,7 @@ use crate::{ dataset::{IntoUpdate, MockMe}, server::ServerManager, state::State, - utils::{assert_eqn, default_distribution_function, find_chat_id, DefaultKey}, + utils::{assert_eqn, default_distribution_function, find_chat_id}, }; use crate::{listener::InsertingListener, server}; use gag::Gag; @@ -28,6 +28,7 @@ use teloxide::{ types::Me, }; use teloxide::{error_handlers::ErrorHandler, types::UpdateKind}; +pub use crate::utils::DistributionKey; lazy_static! { static ref BOT_LOCK: Mutex<()> = Mutex::new(()); @@ -61,7 +62,7 @@ pub struct MockBot { _bot_lock: Option>, } -impl MockBot +impl MockBot where Err: Debug + Send + Sync + 'static, { diff --git a/teloxide_tests/src/utils.rs b/teloxide_tests/src/utils.rs index bd1526c..9809b1d 100644 --- a/teloxide_tests/src/utils.rs +++ b/teloxide_tests/src/utils.rs @@ -73,10 +73,10 @@ pub fn find_chat_id(value: Value) -> Option { None } -// Copied from source code +/// A key that defines the parallelism of updates #[derive(Debug, Hash, PartialEq, Eq, Clone)] -pub struct DefaultKey(ChatId); +pub struct DistributionKey(pub ChatId); -pub(crate) fn default_distribution_function(update: &Update) -> Option { - update.chat().map(|c| c.id).map(DefaultKey) +pub(crate) fn default_distribution_function(update: &Update) -> Option { + update.chat().map(|c| c.id).map(DistributionKey) } From cc32689a76a4a2351269bccb74a30623eb33416b Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Mon, 11 Nov 2024 06:15:33 +0200 Subject: [PATCH 114/138] Documentation update on generics --- teloxide_tests/src/mock_bot.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index eb8ec5d..b20b580 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -28,6 +28,7 @@ use teloxide::{ types::Me, }; use teloxide::{error_handlers::ErrorHandler, types::UpdateKind}; +// Needed for trait bound stuff pub use crate::utils::DistributionKey; lazy_static! { @@ -39,6 +40,10 @@ const DEFAULT_STACK_SIZE: usize = 8 * 1024 * 1024; /// A mocked bot that sends requests to the fake server /// Please check the [`new`] function docs and [github examples](https://github.com/LasterAlex/teloxide_tests/tree/master/examples) for more information. /// +/// If you are having troubles with generics while trying to store `MockBot`, just do this: +/// +/// `MockBot, teloxide_tests::mock_bot::DistributionKey>` +/// /// [`new`]: crate::MockBot::new pub struct MockBot { /// The bot with a fake server url From 342f9809065aba249f86e2b0ab462a8d9eef69e0 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Mon, 11 Nov 2024 15:23:49 +0200 Subject: [PATCH 115/138] Bot::from_env() now works --- Cargo.lock | 4 ++-- examples/Cargo.lock | 4 ++-- examples/album_bot/Cargo.toml | 2 +- examples/calculator_bot/Cargo.toml | 2 +- examples/deep_linking_bot/Cargo.toml | 2 +- examples/file_download_bot/Cargo.toml | 2 +- examples/hello_world_bot/Cargo.toml | 2 +- examples/phrase_bot/Cargo.toml | 2 +- teloxide_tests/Cargo.toml | 2 +- teloxide_tests/src/mock_bot.rs | 9 ++++++++- teloxide_tests/src/tests.rs | 17 ++++++++++++++++- 11 files changed, 35 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8857a60..c9c2bb3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2852,7 +2852,7 @@ checksum = "20f34339676cdcab560c9a82300c4c2581f68b9369aedf0fae86f2ff9565ff3e" [[package]] name = "teloxide" version = "0.13.0" -source = "git+https://github.com/teloxide/teloxide.git?rev=24a8d5f#24a8d5f9d5f5467eabdbfe165839bf5a44cbddf9" +source = "git+https://github.com/teloxide/teloxide.git?rev=94db1757dc96116f4756a586fcbce3ac5ebd0c59#94db1757dc96116f4756a586fcbce3ac5ebd0c59" dependencies = [ "aquamarine", "bytes", @@ -2878,7 +2878,7 @@ dependencies = [ [[package]] name = "teloxide-core" version = "0.10.1" -source = "git+https://github.com/teloxide/teloxide.git?rev=24a8d5f#24a8d5f9d5f5467eabdbfe165839bf5a44cbddf9" +source = "git+https://github.com/teloxide/teloxide.git?rev=94db1757dc96116f4756a586fcbce3ac5ebd0c59#94db1757dc96116f4756a586fcbce3ac5ebd0c59" dependencies = [ "bitflags 1.3.2", "bytes", diff --git a/examples/Cargo.lock b/examples/Cargo.lock index 6760d8e..74fb564 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -3044,7 +3044,7 @@ checksum = "20f34339676cdcab560c9a82300c4c2581f68b9369aedf0fae86f2ff9565ff3e" [[package]] name = "teloxide" version = "0.13.0" -source = "git+https://github.com/teloxide/teloxide.git?rev=24a8d5f#24a8d5f9d5f5467eabdbfe165839bf5a44cbddf9" +source = "git+https://github.com/teloxide/teloxide.git?rev=94db1757dc96116f4756a586fcbce3ac5ebd0c59#94db1757dc96116f4756a586fcbce3ac5ebd0c59" dependencies = [ "aquamarine", "bytes", @@ -3072,7 +3072,7 @@ dependencies = [ [[package]] name = "teloxide-core" version = "0.10.1" -source = "git+https://github.com/teloxide/teloxide.git?rev=24a8d5f#24a8d5f9d5f5467eabdbfe165839bf5a44cbddf9" +source = "git+https://github.com/teloxide/teloxide.git?rev=94db1757dc96116f4756a586fcbce3ac5ebd0c59#94db1757dc96116f4756a586fcbce3ac5ebd0c59" dependencies = [ "bitflags 1.3.2", "bytes", diff --git a/examples/album_bot/Cargo.toml b/examples/album_bot/Cargo.toml index 3ad60d2..baa1eb4 100644 --- a/examples/album_bot/Cargo.toml +++ b/examples/album_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" log = "0.4" diff --git a/examples/calculator_bot/Cargo.toml b/examples/calculator_bot/Cargo.toml index 38f9d07..3f1b183 100644 --- a/examples/calculator_bot/Cargo.toml +++ b/examples/calculator_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros", "redis-storage", "cbor-serializer"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros", "redis-storage", "cbor-serializer"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" serde = { version = "1.0", features = ["derive"] } diff --git a/examples/deep_linking_bot/Cargo.toml b/examples/deep_linking_bot/Cargo.toml index 5a03eed..3fd2ded 100644 --- a/examples/deep_linking_bot/Cargo.toml +++ b/examples/deep_linking_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" serde = { version = "1.0", features = ["derive"] } diff --git a/examples/file_download_bot/Cargo.toml b/examples/file_download_bot/Cargo.toml index 3b49878..9aef32b 100644 --- a/examples/file_download_bot/Cargo.toml +++ b/examples/file_download_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" diff --git a/examples/hello_world_bot/Cargo.toml b/examples/hello_world_bot/Cargo.toml index 561c864..3b0668f 100644 --- a/examples/hello_world_bot/Cargo.toml +++ b/examples/hello_world_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" diff --git a/examples/phrase_bot/Cargo.toml b/examples/phrase_bot/Cargo.toml index e26821e..91f4bea 100644 --- a/examples/phrase_bot/Cargo.toml +++ b/examples/phrase_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros", "redis-storage", "cbor-serializer"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros", "redis-storage", "cbor-serializer"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" serde = { version = "1.0", features = ["derive"] } diff --git a/teloxide_tests/Cargo.toml b/teloxide_tests/Cargo.toml index 48a6d19..f617448 100644 --- a/teloxide_tests/Cargo.toml +++ b/teloxide_tests/Cargo.toml @@ -20,7 +20,7 @@ log = "0.4" pretty_env_logger = "0.5" url = "2.5.1" reqwest = "0.12.5" -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "24a8d5f", features = ["macros", "sqlite-storage-nativetls"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros", "sqlite-storage-nativetls"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index b20b580..5884038 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -9,6 +9,7 @@ use crate::{listener::InsertingListener, server}; use gag::Gag; use lazy_static::lazy_static; use std::{ + env, fmt::Debug, hash::Hash, mem::discriminant, @@ -284,6 +285,9 @@ where /// All the requests made through the bot will be stored in `responses`, and can be retrieved /// with `get_responses`. All the responses are unique to that dispatch, and will be erased for /// every new dispatch. + /// + /// This method overrides env variables `TELOXIDE_TOKEN` and `TELOXIDE_API_URL`, so anyone can + /// call `Bot::from_env()` and get an actual bot that is connected to the fake server pub async fn dispatch(&mut self) { self.state.lock().unwrap().reset(); @@ -295,7 +299,10 @@ where self.insert_updates(&mut updates); let api_url = reqwest::Url::parse(&format!("http://127.0.0.1:{}", server.port)).unwrap(); - let bot = self.bot.clone().set_api_url(api_url); + let bot = self.bot.clone().set_api_url(api_url.clone()); + + env::set_var("TELOXIDE_TOKEN", bot.token()); + env::set_var("TELOXIDE_API_URL", api_url.to_string()); self.run_updates(bot, updates).await; diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index 6892bab..0a7b2bf 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -1,6 +1,7 @@ use std::fmt::Display; use std::sync::atomic::AtomicBool; use std::sync::Arc; +use std::thread; use super::*; use crate::dataset::*; @@ -537,12 +538,26 @@ where E: std::fmt::Debug + Display + 'static + Sync + Send, { fn handle_error(self: Arc, _error: E) -> BoxFuture<'static, ()> { + thread::spawn(|| { + respond_to_error(); + }) + .join() + .unwrap(); + self.some_bool .swap(true, std::sync::atomic::Ordering::SeqCst); Box::pin(async {}) } } +#[tokio::main] +async fn respond_to_error() { + let bot = Bot::from_env(); + bot.send_message(ChatId(MockUser::ID as i64), "Error detected!") + .await + .unwrap(); +} + #[tokio::test] async fn test_error_handler() { let mut bot = MockBot::new(MockMessageText::new().text("/panic"), get_schema()); @@ -551,7 +566,7 @@ async fn test_error_handler() { bot.error_handler(Arc::new(MyErrorHandler { some_bool: some_bool.clone(), })); - bot.dispatch().await; + bot.dispatch_and_check_last_text("Error detected!").await; assert!(some_bool.load(std::sync::atomic::Ordering::SeqCst)); } From 4fb20f97001c81267a8c2f3d1b75308509fac7f9 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Tue, 12 Nov 2024 05:51:52 +0200 Subject: [PATCH 116/138] Updated README --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 85a141f..d779802 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Simplified [[`hello_world_bot`]](https://github.com/LasterAlex/teloxide_tests/bl #[tokio::test] async fn test_hello_world() { let message = MockMessageText::new().text("Hi!"); - let bot = MockBot::new(message, handler_tree()); + let mut bot = MockBot::new(message, handler_tree()); // Sends the message as if it was from a user bot.dispatch().await; @@ -52,14 +52,14 @@ async fn test_hello_world() { ```rust,ignore #[tokio::test] async fn test_not_a_document() { - let bot = MockBot::new(MockMessageText::new().text("Hi!"), handler_tree()); + let mut bot = MockBot::new(MockMessageText::new().text("Hi!"), handler_tree()); // Syntactic sugar bot.dispatch_and_check_last_text("Not a document").await; } #[tokio::test] async fn test_download_document_and_check() { - let bot = MockBot::new(MockMessageDocument::new(), handler_tree()); + let mut bot = MockBot::new(MockMessageDocument::new(), handler_tree()); bot.dispatch_and_check_last_text("Downloaded!").await; } ``` @@ -68,7 +68,7 @@ async fn test_download_document_and_check() { ```rust,ignore #[tokio::test] async fn test_what_is_the_first_number() { - let bot = MockBot::new(MockCallbackQuery::new().data("add"), handler_tree()); + let mut bot = MockBot::new(MockCallbackQuery::new().data("add"), handler_tree()); bot.dependencies(deps![get_bot_storage().await]); bot.set_state(State::WhatDoYouWant).await; From b78a795ceee0f41d9201f569adce4286e672e560 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Tue, 12 Nov 2024 08:14:54 +0000 Subject: [PATCH 117/138] specify nightly toolchain --- rust-toolchain.toml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 rust-toolchain.toml diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..3f5d680 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "nightly-2024-10-10" +components = [ "rustfmt", "clippy" ] From 7b46aab4d15fb9b39cfeeacc5e735b43065cc68e Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Tue, 12 Nov 2024 08:17:14 +0000 Subject: [PATCH 118/138] add rustfmt.toml --- rustfmt.toml | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 rustfmt.toml diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..455c820 --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1,2 @@ +imports_granularity = "Crate" +group_imports = "StdExternalCrate" From 9880d2b9f5ccdc419aaafcf9f4928ac5e6721b1d Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Tue, 12 Nov 2024 08:18:28 +0000 Subject: [PATCH 119/138] run cargo fmt --- teloxide_tests/src/dataset/chat.rs | 5 +- teloxide_tests/src/dataset/message.rs | 9 ++-- teloxide_tests/src/dataset/message_common.rs | 12 +++-- teloxide_tests/src/dataset/queries.rs | 6 +-- teloxide_tests/src/dataset/tests.rs | 4 +- teloxide_tests/src/mock_bot.rs | 32 ++++++------- teloxide_tests/src/server/messages.rs | 5 +- teloxide_tests/src/server/mod.rs | 16 +++---- teloxide_tests/src/server/responses.rs | 3 +- .../server/routes/answer_callback_query.rs | 3 +- .../src/server/routes/ban_chat_member.rs | 4 +- .../src/server/routes/copy_message.rs | 11 ++--- .../src/server/routes/delete_message.rs | 11 ++--- .../src/server/routes/edit_message_caption.rs | 11 ++--- .../routes/edit_message_reply_markup.rs | 17 ++++--- .../src/server/routes/edit_message_text.rs | 3 +- .../src/server/routes/forward_message.rs | 10 ++-- teloxide_tests/src/server/routes/get_file.rs | 3 +- teloxide_tests/src/server/routes/mod.rs | 9 ++-- .../src/server/routes/pin_chat_message.rs | 7 +-- .../src/server/routes/restrict_chat_member.rs | 3 +- .../src/server/routes/send_animation.rs | 24 +++++----- .../src/server/routes/send_audio.rs | 27 +++++------ .../src/server/routes/send_chat_action.rs | 3 +- .../src/server/routes/send_contact.rs | 13 +++-- teloxide_tests/src/server/routes/send_dice.rs | 12 ++--- .../src/server/routes/send_document.rs | 23 +++++---- .../src/server/routes/send_location.rs | 13 +++-- .../src/server/routes/send_media_group.rs | 20 ++++---- .../src/server/routes/send_message.rs | 12 ++--- .../src/server/routes/send_photo.rs | 23 +++++---- teloxide_tests/src/server/routes/send_poll.rs | 13 +++-- .../src/server/routes/send_sticker.rs | 23 +++++---- .../src/server/routes/send_venue.rs | 13 +++-- .../src/server/routes/send_video.rs | 23 +++++---- .../src/server/routes/send_video_note.rs | 27 +++++------ .../src/server/routes/send_voice.rs | 27 +++++------ .../src/server/routes/set_message_reaction.rs | 7 +-- .../src/server/routes/set_my_commands.rs | 3 +- .../src/server/routes/unban_chat_member.rs | 3 +- .../server/routes/unpin_all_chat_messages.rs | 3 +- .../src/server/routes/unpin_chat_message.rs | 7 +-- teloxide_tests/src/state.rs | 9 ++-- teloxide_tests/src/tests.rs | 48 +++++++++---------- teloxide_tests/src/utils.rs | 3 +- 45 files changed, 256 insertions(+), 307 deletions(-) diff --git a/teloxide_tests/src/dataset/chat.rs b/teloxide_tests/src/dataset/chat.rs index c8dcafb..3aa0911 100644 --- a/teloxide_tests/src/dataset/chat.rs +++ b/teloxide_tests/src/dataset/chat.rs @@ -1,11 +1,10 @@ -use crate::proc_macros::Changeable; -use teloxide::types::*; use teloxide::types::{ Chat, ChatId, ChatKind, ChatLocation, ChatPermissions, ChatPhoto, ChatPrivate, ChatPublic, - Message, PublicChatChannel, PublicChatGroup, PublicChatKind, PublicChatSupergroup, True, + Message, PublicChatChannel, PublicChatGroup, PublicChatKind, PublicChatSupergroup, True, *, }; use super::{MockChatFullInfo, MockUser}; +use crate::proc_macros::Changeable; macro_rules! Chat { ( diff --git a/teloxide_tests/src/dataset/message.rs b/teloxide_tests/src/dataset/message.rs index a83d214..fc62236 100644 --- a/teloxide_tests/src/dataset/message.rs +++ b/teloxide_tests/src/dataset/message.rs @@ -1,10 +1,11 @@ -use super::chat::MockPrivateChat; -use crate::proc_macros::Changeable; -use crate::MockUser; -use chrono::{DateTime, Utc}; use core::sync::atomic::{AtomicI32, Ordering}; + +use chrono::{DateTime, Utc}; use teloxide::types::*; +use super::chat::MockPrivateChat; +use crate::{proc_macros::Changeable, MockUser}; + macro_rules! Message { ( #[derive($($derive:meta),*)] diff --git a/teloxide_tests/src/dataset/message_common.rs b/teloxide_tests/src/dataset/message_common.rs index 2574d9c..00b343a 100644 --- a/teloxide_tests/src/dataset/message_common.rs +++ b/teloxide_tests/src/dataset/message_common.rs @@ -1,12 +1,14 @@ -use super::message::Message; -use super::{chat::MockPrivateChat, MockUser}; -use super::{MockLocation, MockPhotoSize, MockVideo}; -use crate::proc_macros::Changeable; -use chrono::{DateTime, Utc}; use core::sync::atomic::{AtomicI32, Ordering}; + +use chrono::{DateTime, Utc}; use mime::Mime; use teloxide::types::*; +use super::{ + chat::MockPrivateChat, message::Message, MockLocation, MockPhotoSize, MockUser, MockVideo, +}; +use crate::proc_macros::Changeable; + macro_rules! MessageCommon { // Rust was supposed to be used without inheritance, and yet here i am, reinventing it... ( #[derive($($derive:meta),*)] diff --git a/teloxide_tests/src/dataset/queries.rs b/teloxide_tests/src/dataset/queries.rs index ef232c4..7bea3dd 100644 --- a/teloxide_tests/src/dataset/queries.rs +++ b/teloxide_tests/src/dataset/queries.rs @@ -1,11 +1,9 @@ use std::sync::atomic::{AtomicI32, Ordering}; -use crate::proc_macros::Changeable; use teloxide::types::*; -use super::MockMessageText; - -use super::MockUser; +use super::{MockMessageText, MockUser}; +use crate::proc_macros::Changeable; #[derive(Changeable, Clone)] pub struct MockCallbackQuery { diff --git a/teloxide_tests/src/dataset/tests.rs b/teloxide_tests/src/dataset/tests.rs index 9abb1dd..f6b3c06 100644 --- a/teloxide_tests/src/dataset/tests.rs +++ b/teloxide_tests/src/dataset/tests.rs @@ -1,10 +1,10 @@ -use crate::dataset::*; -use crate::proc_macros::Changeable; use teloxide::{ dispatching::dialogue::GetChatId, types::{ChatId, MessageEntity, MessageId, True, UpdateId, UserId}, }; +use crate::{dataset::*, proc_macros::Changeable}; + #[derive(Changeable)] struct Test { pub field1: String, diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 5884038..b96788f 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -1,13 +1,4 @@ //! Mock bot that sends requests to the fake server -use crate::{ - dataset::{IntoUpdate, MockMe}, - server::ServerManager, - state::State, - utils::{assert_eqn, default_distribution_function, find_chat_id}, -}; -use crate::{listener::InsertingListener, server}; -use gag::Gag; -use lazy_static::lazy_static; use std::{ env, fmt::Debug, @@ -16,21 +7,30 @@ use std::{ panic, sync::{atomic::AtomicI32, Arc, Mutex, MutexGuard, PoisonError}, }; -use teloxide::{ - dispatching::dialogue::ErasedStorage, dptree::di::DependencySupplier, - types::MaybeInaccessibleMessage, -}; + +use gag::Gag; +use lazy_static::lazy_static; use teloxide::{ dispatching::{ - dialogue::{GetChatId, InMemStorage, Storage}, + dialogue::{ErasedStorage, GetChatId, InMemStorage, Storage}, UpdateHandler, }, + dptree::di::DependencySupplier, + error_handlers::ErrorHandler, prelude::*, - types::Me, + types::{MaybeInaccessibleMessage, Me, UpdateKind}, }; -use teloxide::{error_handlers::ErrorHandler, types::UpdateKind}; + // Needed for trait bound stuff pub use crate::utils::DistributionKey; +use crate::{ + dataset::{IntoUpdate, MockMe}, + listener::InsertingListener, + server, + server::ServerManager, + state::State, + utils::{assert_eqn, default_distribution_function, find_chat_id}, +}; lazy_static! { static ref BOT_LOCK: Mutex<()> = Mutex::new(()); diff --git a/teloxide_tests/src/server/messages.rs b/teloxide_tests/src/server/messages.rs index 7fe4c30..564573f 100644 --- a/teloxide_tests/src/server/messages.rs +++ b/teloxide_tests/src/server/messages.rs @@ -65,11 +65,12 @@ impl Messages { #[cfg(test)] mod tests { - use super::*; - use crate::dataset::*; use serial_test::serial; use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup}; + use super::*; + use crate::dataset::*; + #[test] #[serial] fn test_add_messages() { diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 14d150e..d380766 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -1,5 +1,12 @@ //! A fake telegram bot API for testing purposes. Read more in teloxide_tests crate. pub mod routes; +use std::{ + error::Error, + io, + net::TcpListener, + sync::{Arc, Mutex}, +}; + use actix_web::{ web::{get, post, scope, Data, Json, ServiceConfig}, App, HttpResponse, HttpServer, Responder, @@ -16,16 +23,9 @@ use routes::{ set_message_reaction::*, set_my_commands::*, unban_chat_member::*, unpin_all_chat_messages::*, unpin_chat_message::*, }; -use std::{ - error::Error, - io, - net::TcpListener, - sync::{Arc, Mutex}, -}; use teloxide::types::Me; -use tokio::sync::mpsc::Sender; use tokio::{ - sync::mpsc::channel, + sync::mpsc::{channel, Sender}, task::{JoinError, JoinHandle}, }; use tokio_util::sync::CancellationToken; diff --git a/teloxide_tests/src/server/responses.rs b/teloxide_tests/src/server/responses.rs index 7f69992..525c15f 100644 --- a/teloxide_tests/src/server/responses.rs +++ b/teloxide_tests/src/server/responses.rs @@ -1,3 +1,5 @@ +use teloxide::types::{Message, MessageId}; + use super::routes::{ answer_callback_query::*, ban_chat_member::*, copy_message::*, delete_message::*, edit_message_caption::*, edit_message_reply_markup::*, edit_message_text::*, @@ -8,7 +10,6 @@ use super::routes::{ set_message_reaction::*, set_my_commands::*, unban_chat_member::*, unpin_all_chat_messages::*, unpin_chat_message::*, }; -use teloxide::types::{Message, MessageId}; #[derive(Clone, Debug)] pub struct SentMessageText { diff --git a/teloxide_tests/src/server/routes/answer_callback_query.rs b/teloxide_tests/src/server/routes/answer_callback_query.rs index 58573ab..bfc1a6d 100644 --- a/teloxide_tests/src/server/routes/answer_callback_query.rs +++ b/teloxide_tests/src/server/routes/answer_callback_query.rs @@ -3,9 +3,8 @@ use std::sync::Mutex; use actix_web::{web, Responder}; use serde::Deserialize; -use crate::state::State; - use super::make_telegram_result; +use crate::state::State; #[derive(Debug, Deserialize, Clone)] pub struct AnswerCallbackQueryBody { diff --git a/teloxide_tests/src/server/routes/ban_chat_member.rs b/teloxide_tests/src/server/routes/ban_chat_member.rs index d339303..2c633f5 100644 --- a/teloxide_tests/src/server/routes/ban_chat_member.rs +++ b/teloxide_tests/src/server/routes/ban_chat_member.rs @@ -3,10 +3,8 @@ use std::sync::Mutex; use actix_web::{web, Responder}; use serde::Deserialize; -use crate::server::routes::make_telegram_result; -use crate::state::State; - use super::BodyChatId; +use crate::{server::routes::make_telegram_result, state::State}; #[derive(Debug, Deserialize, Clone)] pub struct BanChatMemberBody { diff --git a/teloxide_tests/src/server/routes/copy_message.rs b/teloxide_tests/src/server/routes/copy_message.rs index 983c50f..522770f 100644 --- a/teloxide_tests/src/server/routes/copy_message.rs +++ b/teloxide_tests/src/server/routes/copy_message.rs @@ -1,7 +1,6 @@ use std::sync::Mutex; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; use serde_json::json; use teloxide::types::{ @@ -9,11 +8,11 @@ use teloxide::types::{ MessageEntity, MessageId, MessageKind, ParseMode, ReplyMarkup, }; -use crate::server::routes::check_if_message_exists; -use crate::server::CopiedMessage; -use crate::state::State; - use super::{make_telegram_result, BodyChatId}; +use crate::{ + server::{routes::check_if_message_exists, CopiedMessage}, + state::State, +}; #[derive(Debug, Deserialize, Clone)] pub struct CopyMessageBody { diff --git a/teloxide_tests/src/server/routes/delete_message.rs b/teloxide_tests/src/server/routes/delete_message.rs index 3ce6606..69a045a 100644 --- a/teloxide_tests/src/server/routes/delete_message.rs +++ b/teloxide_tests/src/server/routes/delete_message.rs @@ -1,14 +1,13 @@ use std::sync::Mutex; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use crate::server::routes::make_telegram_result; -use crate::server::DeletedMessage; -use crate::state::State; - use super::{check_if_message_exists, BodyChatId}; +use crate::{ + server::{routes::make_telegram_result, DeletedMessage}, + state::State, +}; #[derive(Debug, Deserialize, Clone)] pub struct DeleteMessageBody { diff --git a/teloxide_tests/src/server/routes/edit_message_caption.rs b/teloxide_tests/src/server/routes/edit_message_caption.rs index 6a30bf8..cc66d84 100644 --- a/teloxide_tests/src/server/routes/edit_message_caption.rs +++ b/teloxide_tests/src/server/routes/edit_message_caption.rs @@ -1,15 +1,14 @@ use std::sync::Mutex; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; use teloxide::types::{MessageEntity, ParseMode, ReplyMarkup}; -use crate::server::routes::make_telegram_result; -use crate::server::EditedMessageCaption; -use crate::state::State; - use super::{check_if_message_exists, BodyChatId}; +use crate::{ + server::{routes::make_telegram_result, EditedMessageCaption}, + state::State, +}; #[derive(Debug, Deserialize, Clone)] pub struct EditMessageCaptionBody { diff --git a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs index c7e515f..8e33eff 100644 --- a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs +++ b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs @@ -1,14 +1,17 @@ -use crate::server::routes::{check_if_message_exists, make_telegram_result}; -use crate::state::State; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; -use serde::Deserialize; use std::sync::Mutex; -use teloxide::types::ReplyMarkup; -use crate::server::EditedMessageReplyMarkup; +use actix_web::{error::ErrorBadRequest, web, Responder}; +use serde::Deserialize; +use teloxide::types::ReplyMarkup; use super::BodyChatId; +use crate::{ + server::{ + routes::{check_if_message_exists, make_telegram_result}, + EditedMessageReplyMarkup, + }, + state::State, +}; #[derive(Debug, Deserialize, Clone)] pub struct EditMessageReplyMarkupBody { diff --git a/teloxide_tests/src/server/routes/edit_message_text.rs b/teloxide_tests/src/server/routes/edit_message_text.rs index fb6a7a3..de86741 100644 --- a/teloxide_tests/src/server/routes/edit_message_text.rs +++ b/teloxide_tests/src/server/routes/edit_message_text.rs @@ -4,13 +4,12 @@ use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; use teloxide::types::{LinkPreviewOptions, MessageEntity, ParseMode, ReplyMarkup}; +use super::{check_if_message_exists, BodyChatId}; use crate::{ server::{routes::make_telegram_result, EditedMessageText}, state::State, }; -use super::{check_if_message_exists, BodyChatId}; - #[derive(Debug, Deserialize, Clone)] pub struct EditMessageTextBody { pub chat_id: Option, diff --git a/teloxide_tests/src/server/routes/forward_message.rs b/teloxide_tests/src/server/routes/forward_message.rs index 1f7a743..f8ecba7 100644 --- a/teloxide_tests/src/server/routes/forward_message.rs +++ b/teloxide_tests/src/server/routes/forward_message.rs @@ -1,14 +1,14 @@ use std::sync::Mutex; -use crate::server::routes::check_if_message_exists; -use crate::server::ForwardedMessage; -use crate::state::State; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; use teloxide::types::{ChatKind, Me, MessageId, MessageKind, MessageOrigin, PublicChatKind}; use super::{make_telegram_result, BodyChatId}; +use crate::{ + server::{routes::check_if_message_exists, ForwardedMessage}, + state::State, +}; #[derive(Debug, Deserialize, Clone)] pub struct ForwardMessageBody { diff --git a/teloxide_tests/src/server/routes/get_file.rs b/teloxide_tests/src/server/routes/get_file.rs index b6b31e8..ce12320 100644 --- a/teloxide_tests/src/server/routes/get_file.rs +++ b/teloxide_tests/src/server/routes/get_file.rs @@ -3,9 +3,8 @@ use std::sync::Mutex; use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use crate::state::State; - use super::make_telegram_result; +use crate::state::State; #[derive(Deserialize)] pub struct GetFileQuery { diff --git a/teloxide_tests/src/server/routes/mod.rs b/teloxide_tests/src/server/routes/mod.rs index b2cf069..d0a940f 100644 --- a/teloxide_tests/src/server/routes/mod.rs +++ b/teloxide_tests/src/server/routes/mod.rs @@ -1,15 +1,14 @@ -use std::collections::HashMap; -use std::str::from_utf8; +use std::{collections::HashMap, str::from_utf8}; -use crate::dataset::{MockPrivateChat, MockSupergroupChat}; use actix_web::HttpResponse; -use futures_util::stream::StreamExt as _; -use futures_util::TryStreamExt; +use futures_util::{stream::StreamExt as _, TryStreamExt}; use rand::distributions::{Alphanumeric, DistString}; use serde::{Deserialize, Serialize}; use serde_json::json; use teloxide::types::{Chat, MessageEntity, ParseMode, Seconds}; +use crate::dataset::{MockPrivateChat, MockSupergroupChat}; + pub mod answer_callback_query; pub mod ban_chat_member; pub mod copy_message; diff --git a/teloxide_tests/src/server/routes/pin_chat_message.rs b/teloxide_tests/src/server/routes/pin_chat_message.rs index 50088a6..49aa157 100644 --- a/teloxide_tests/src/server/routes/pin_chat_message.rs +++ b/teloxide_tests/src/server/routes/pin_chat_message.rs @@ -1,13 +1,10 @@ use std::sync::Mutex; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use crate::server::routes::make_telegram_result; -use crate::state::State; - use super::{check_if_message_exists, BodyChatId}; +use crate::{server::routes::make_telegram_result, state::State}; #[derive(Debug, Deserialize, Clone)] pub struct PinChatMessageBody { diff --git a/teloxide_tests/src/server/routes/restrict_chat_member.rs b/teloxide_tests/src/server/routes/restrict_chat_member.rs index 823be13..386385e 100644 --- a/teloxide_tests/src/server/routes/restrict_chat_member.rs +++ b/teloxide_tests/src/server/routes/restrict_chat_member.rs @@ -4,9 +4,8 @@ use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::ChatPermissions; -use crate::{server::routes::make_telegram_result, state::State}; - use super::BodyChatId; +use crate::{server::routes::make_telegram_result, state::State}; #[derive(Debug, Deserialize, Clone)] pub struct RestrictChatMemberBody { diff --git a/teloxide_tests/src/server/routes/send_animation.rs b/teloxide_tests/src/server/routes/send_animation.rs index dd0ae3c..fdb0c39 100644 --- a/teloxide_tests/src/server/routes/send_animation.rs +++ b/teloxide_tests/src/server/routes/send_animation.rs @@ -1,24 +1,22 @@ -use crate::server::routes::Attachment; -use crate::server::routes::{FileType, SerializeRawFields}; -use crate::server::SentMessageAnimation; -use crate::state::State; -use crate::MockMessageAnimation; -use std::collections::HashMap; -use std::str::FromStr; -use std::sync::Mutex; +use std::{collections::HashMap, str::FromStr, sync::Mutex}; -use crate::proc_macros::SerializeRawFields; use actix_multipart::Multipart; -use actix_web::Responder; -use actix_web::{error::ErrorBadRequest, web}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use mime::Mime; use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::routes::check_if_message_exists; - use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; +use crate::{ + proc_macros::SerializeRawFields, + server::{ + routes::{check_if_message_exists, Attachment, FileType, SerializeRawFields}, + SentMessageAnimation, + }, + state::State, + MockMessageAnimation, +}; pub async fn send_animation( mut payload: Multipart, diff --git a/teloxide_tests/src/server/routes/send_audio.rs b/teloxide_tests/src/server/routes/send_audio.rs index bbf3ea2..e506f13 100644 --- a/teloxide_tests/src/server/routes/send_audio.rs +++ b/teloxide_tests/src/server/routes/send_audio.rs @@ -1,27 +1,22 @@ -use crate::server::routes::Attachment; -use crate::state::State; -use crate::{ - server::{ - routes::{FileType, SerializeRawFields}, - SentMessageAudio, - }, - MockMessageAudio, -}; -use std::sync::Mutex; -use std::{collections::HashMap, str::FromStr}; +use std::{collections::HashMap, str::FromStr, sync::Mutex}; -use crate::proc_macros::SerializeRawFields; use actix_multipart::Multipart; -use actix_web::Responder; -use actix_web::{error::ErrorBadRequest, web}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use mime::Mime; use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::routes::check_if_message_exists; - use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; +use crate::{ + proc_macros::SerializeRawFields, + server::{ + routes::{check_if_message_exists, Attachment, FileType, SerializeRawFields}, + SentMessageAudio, + }, + state::State, + MockMessageAudio, +}; pub async fn send_audio( mut payload: Multipart, diff --git a/teloxide_tests/src/server/routes/send_chat_action.rs b/teloxide_tests/src/server/routes/send_chat_action.rs index b03536c..8d87515 100644 --- a/teloxide_tests/src/server/routes/send_chat_action.rs +++ b/teloxide_tests/src/server/routes/send_chat_action.rs @@ -3,9 +3,8 @@ use std::sync::Mutex; use actix_web::{web, Responder}; use serde::Deserialize; -use crate::{server::routes::make_telegram_result, state::State}; - use super::BodyChatId; +use crate::{server::routes::make_telegram_result, state::State}; #[derive(Debug, Deserialize, Clone)] pub struct SendChatActionBody { diff --git a/teloxide_tests/src/server/routes/send_contact.rs b/teloxide_tests/src/server/routes/send_contact.rs index 7e94907..36f5eef 100644 --- a/teloxide_tests/src/server/routes/send_contact.rs +++ b/teloxide_tests/src/server/routes/send_contact.rs @@ -1,16 +1,15 @@ use std::sync::Mutex; -use crate::server::SentMessageContact; -use crate::state::State; -use crate::MockMessageContact; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; use teloxide::types::{Me, ReplyMarkup, ReplyParameters}; -use crate::server::routes::check_if_message_exists; - use super::{make_telegram_result, BodyChatId}; +use crate::{ + server::{routes::check_if_message_exists, SentMessageContact}, + state::State, + MockMessageContact, +}; #[derive(Debug, Deserialize, Clone)] pub struct SendMessageContactBody { diff --git a/teloxide_tests/src/server/routes/send_dice.rs b/teloxide_tests/src/server/routes/send_dice.rs index 8ead70e..5346623 100644 --- a/teloxide_tests/src/server/routes/send_dice.rs +++ b/teloxide_tests/src/server/routes/send_dice.rs @@ -1,15 +1,15 @@ use std::sync::Mutex; -use crate::server::routes::check_if_message_exists; -use crate::server::SentMessageDice; -use crate::state::State; -use crate::MockMessageDice; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; use teloxide::types::{DiceEmoji, ReplyMarkup, ReplyParameters}; use super::{make_telegram_result, BodyChatId}; +use crate::{ + server::{routes::check_if_message_exists, SentMessageDice}, + state::State, + MockMessageDice, +}; #[derive(Debug, Deserialize, Clone)] pub struct SendMessageDiceBody { diff --git a/teloxide_tests/src/server/routes/send_document.rs b/teloxide_tests/src/server/routes/send_document.rs index 49f51ea..9dd0f58 100644 --- a/teloxide_tests/src/server/routes/send_document.rs +++ b/teloxide_tests/src/server/routes/send_document.rs @@ -1,23 +1,22 @@ -use crate::server::routes::Attachment; -use crate::server::routes::{FileType, SerializeRawFields}; -use crate::state::State; -use std::collections::HashMap; -use std::str::FromStr; -use std::sync::Mutex; +use std::{collections::HashMap, str::FromStr, sync::Mutex}; -use crate::dataset::MockMessageDocument; -use crate::proc_macros::SerializeRawFields; use actix_multipart::Multipart; -use actix_web::Responder; -use actix_web::{error::ErrorBadRequest, web}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use mime::Mime; use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters}; -use crate::server::{routes::check_if_message_exists, SentMessageDocument}; - use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; +use crate::{ + dataset::MockMessageDocument, + proc_macros::SerializeRawFields, + server::{ + routes::{check_if_message_exists, Attachment, FileType, SerializeRawFields}, + SentMessageDocument, + }, + state::State, +}; pub async fn send_document( mut payload: Multipart, diff --git a/teloxide_tests/src/server/routes/send_location.rs b/teloxide_tests/src/server/routes/send_location.rs index b950bec..b0ae244 100644 --- a/teloxide_tests/src/server/routes/send_location.rs +++ b/teloxide_tests/src/server/routes/send_location.rs @@ -1,16 +1,15 @@ use std::sync::Mutex; -use crate::server::SentMessageLocation; -use crate::state::State; -use crate::MockMessageLocation; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; use teloxide::types::{Me, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::routes::check_if_message_exists; - use super::{make_telegram_result, BodyChatId}; +use crate::{ + server::{routes::check_if_message_exists, SentMessageLocation}, + state::State, + MockMessageLocation, +}; #[derive(Debug, Deserialize, Clone)] pub struct SendMessageLocationBody { diff --git a/teloxide_tests/src/server/routes/send_media_group.rs b/teloxide_tests/src/server/routes/send_media_group.rs index 7c696bc..88cef1c 100644 --- a/teloxide_tests/src/server/routes/send_media_group.rs +++ b/teloxide_tests/src/server/routes/send_media_group.rs @@ -1,27 +1,23 @@ -use crate::server::SentMediaGroup; -use crate::state::State; -use crate::{ - MockMessageAudio, MockMessageDocument, MockMessagePhoto, MockMessageVideo, MockPhotoSize, - MockVideo, -}; -use std::collections::HashMap; -use std::sync::Mutex; +use std::{collections::HashMap, sync::Mutex}; use actix_multipart::Multipart; -use actix_web::Responder; -use actix_web::{error::ErrorBadRequest, web}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use serde_json::Value; use teloxide::types::{Me, Message, MessageEntity, MessageId, ParseMode, ReplyParameters, Seconds}; -use crate::server::routes::check_if_message_exists; - use super::{ get_raw_multipart_fields, make_telegram_result, Attachment, BodyChatId, MediaGroupInputMedia, MediaGroupInputMediaAudio, MediaGroupInputMediaDocument, MediaGroupInputMediaPhoto, MediaGroupInputMediaVideo, }; +use crate::{ + server::{routes::check_if_message_exists, SentMediaGroup}, + state::State, + MockMessageAudio, MockMessageDocument, MockMessagePhoto, MockMessageVideo, MockPhotoSize, + MockVideo, +}; pub async fn send_media_group( mut payload: Multipart, diff --git a/teloxide_tests/src/server/routes/send_message.rs b/teloxide_tests/src/server/routes/send_message.rs index 249fd2e..1147f4c 100644 --- a/teloxide_tests/src/server/routes/send_message.rs +++ b/teloxide_tests/src/server/routes/send_message.rs @@ -1,17 +1,17 @@ use std::sync::Mutex; -use crate::dataset::message_common::MockMessageText; -use crate::state::State; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; use teloxide::types::{ LinkPreviewOptions, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, }; -use crate::server::{routes::check_if_message_exists, SentMessageText}; - use super::{make_telegram_result, BodyChatId}; +use crate::{ + dataset::message_common::MockMessageText, + server::{routes::check_if_message_exists, SentMessageText}, + state::State, +}; #[derive(Debug, Deserialize, Clone)] pub struct SendMessageTextBody { diff --git a/teloxide_tests/src/server/routes/send_photo.rs b/teloxide_tests/src/server/routes/send_photo.rs index dae47fb..ad5ac7c 100644 --- a/teloxide_tests/src/server/routes/send_photo.rs +++ b/teloxide_tests/src/server/routes/send_photo.rs @@ -1,24 +1,23 @@ -use crate::server::routes::Attachment; -use crate::server::routes::{FileType, SerializeRawFields}; -use crate::state::State; +use std::{collections::HashMap, sync::Mutex}; -use std::collections::HashMap; -use std::sync::Mutex; - -use crate::dataset::{MockMessagePhoto, MockPhotoSize}; -use crate::proc_macros::SerializeRawFields; use actix_multipart::Multipart; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{ LinkPreviewOptions, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, }; -use crate::server::{routes::check_if_message_exists, SentMessagePhoto}; - use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; +use crate::{ + dataset::{MockMessagePhoto, MockPhotoSize}, + proc_macros::SerializeRawFields, + server::{ + routes::{check_if_message_exists, Attachment, FileType, SerializeRawFields}, + SentMessagePhoto, + }, + state::State, +}; pub async fn send_photo( mut payload: Multipart, diff --git a/teloxide_tests/src/server/routes/send_poll.rs b/teloxide_tests/src/server/routes/send_poll.rs index d9f94f4..293c0d1 100644 --- a/teloxide_tests/src/server/routes/send_poll.rs +++ b/teloxide_tests/src/server/routes/send_poll.rs @@ -1,19 +1,18 @@ use std::sync::Mutex; -use crate::server::SentMessagePoll; -use crate::state::State; -use crate::MockMessagePoll; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use chrono::DateTime; use serde::Deserialize; use teloxide::types::{ Me, MessageEntity, ParseMode, PollOption, PollType, ReplyMarkup, ReplyParameters, Seconds, }; -use crate::server::routes::check_if_message_exists; - use super::{make_telegram_result, BodyChatId}; +use crate::{ + server::{routes::check_if_message_exists, SentMessagePoll}, + state::State, + MockMessagePoll, +}; #[derive(Debug, Deserialize, Clone)] pub struct SendMessagePollBody { diff --git a/teloxide_tests/src/server/routes/send_sticker.rs b/teloxide_tests/src/server/routes/send_sticker.rs index e6424b2..fb99446 100644 --- a/teloxide_tests/src/server/routes/send_sticker.rs +++ b/teloxide_tests/src/server/routes/send_sticker.rs @@ -1,21 +1,20 @@ -use crate::server::routes::Attachment; -use crate::server::routes::{FileType, SerializeRawFields}; -use crate::server::SentMessageSticker; -use crate::state::State; -use crate::MockMessageSticker; -use std::collections::HashMap; -use std::sync::Mutex; +use std::{collections::HashMap, sync::Mutex}; -use crate::proc_macros::SerializeRawFields; use actix_multipart::Multipart; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; use teloxide::types::{Me, ReplyMarkup, ReplyParameters}; -use crate::server::routes::check_if_message_exists; - use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; +use crate::{ + proc_macros::SerializeRawFields, + server::{ + routes::{check_if_message_exists, Attachment, FileType, SerializeRawFields}, + SentMessageSticker, + }, + state::State, + MockMessageSticker, +}; pub async fn send_sticker( mut payload: Multipart, diff --git a/teloxide_tests/src/server/routes/send_venue.rs b/teloxide_tests/src/server/routes/send_venue.rs index c9cfd74..d6f968b 100644 --- a/teloxide_tests/src/server/routes/send_venue.rs +++ b/teloxide_tests/src/server/routes/send_venue.rs @@ -1,16 +1,15 @@ use std::sync::Mutex; -use crate::server::SentMessageVenue; -use crate::state::State; -use crate::{MockLocation, MockMessageVenue}; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; use teloxide::types::{Me, ReplyMarkup, ReplyParameters}; -use crate::server::routes::check_if_message_exists; - use super::{make_telegram_result, BodyChatId}; +use crate::{ + server::{routes::check_if_message_exists, SentMessageVenue}, + state::State, + MockLocation, MockMessageVenue, +}; #[derive(Debug, Deserialize, Clone)] pub struct SendMessageVenueBody { diff --git a/teloxide_tests/src/server/routes/send_video.rs b/teloxide_tests/src/server/routes/send_video.rs index ccc7274..c20eee7 100644 --- a/teloxide_tests/src/server/routes/send_video.rs +++ b/teloxide_tests/src/server/routes/send_video.rs @@ -1,23 +1,22 @@ -use crate::server::routes::Attachment; -use crate::server::routes::{FileType, SerializeRawFields}; -use crate::state::State; -use std::collections::HashMap; -use std::str::FromStr; -use std::sync::Mutex; +use std::{collections::HashMap, str::FromStr, sync::Mutex}; -use crate::dataset::{MockMessageVideo, MockVideo}; -use crate::proc_macros::SerializeRawFields; use actix_multipart::Multipart; -use actix_web::Responder; -use actix_web::{error::ErrorBadRequest, web}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use mime::Mime; use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::{routes::check_if_message_exists, SentMessageVideo}; - use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; +use crate::{ + dataset::{MockMessageVideo, MockVideo}, + proc_macros::SerializeRawFields, + server::{ + routes::{check_if_message_exists, Attachment, FileType, SerializeRawFields}, + SentMessageVideo, + }, + state::State, +}; pub async fn send_video( mut payload: Multipart, diff --git a/teloxide_tests/src/server/routes/send_video_note.rs b/teloxide_tests/src/server/routes/send_video_note.rs index b9ccd81..cd16777 100644 --- a/teloxide_tests/src/server/routes/send_video_note.rs +++ b/teloxide_tests/src/server/routes/send_video_note.rs @@ -1,26 +1,21 @@ -use crate::server::routes::Attachment; -use crate::state::State; -use crate::{ - server::{ - routes::{FileType, SerializeRawFields}, - SentMessageVideoNote, - }, - MockMessageVideoNote, -}; -use std::collections::HashMap; -use std::sync::Mutex; +use std::{collections::HashMap, sync::Mutex}; -use crate::proc_macros::SerializeRawFields; use actix_multipart::Multipart; -use actix_web::Responder; -use actix_web::{error::ErrorBadRequest, web}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::routes::check_if_message_exists; - use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; +use crate::{ + proc_macros::SerializeRawFields, + server::{ + routes::{check_if_message_exists, Attachment, FileType, SerializeRawFields}, + SentMessageVideoNote, + }, + state::State, + MockMessageVideoNote, +}; pub async fn send_video_note( mut payload: Multipart, diff --git a/teloxide_tests/src/server/routes/send_voice.rs b/teloxide_tests/src/server/routes/send_voice.rs index 06405ea..e088eb9 100644 --- a/teloxide_tests/src/server/routes/send_voice.rs +++ b/teloxide_tests/src/server/routes/send_voice.rs @@ -1,27 +1,22 @@ -use crate::server::routes::Attachment; -use crate::state::State; -use crate::{ - server::{ - routes::{FileType, SerializeRawFields}, - SentMessageVoice, - }, - MockMessageVoice, -}; -use std::sync::Mutex; -use std::{collections::HashMap, str::FromStr}; +use std::{collections::HashMap, str::FromStr, sync::Mutex}; -use crate::proc_macros::SerializeRawFields; use actix_multipart::Multipart; -use actix_web::Responder; -use actix_web::{error::ErrorBadRequest, web}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use mime::Mime; use rand::distributions::{Alphanumeric, DistString}; use serde::Deserialize; use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; -use crate::server::routes::check_if_message_exists; - use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; +use crate::{ + proc_macros::SerializeRawFields, + server::{ + routes::{check_if_message_exists, Attachment, FileType, SerializeRawFields}, + SentMessageVoice, + }, + state::State, + MockMessageVoice, +}; pub async fn send_voice( mut payload: Multipart, diff --git a/teloxide_tests/src/server/routes/set_message_reaction.rs b/teloxide_tests/src/server/routes/set_message_reaction.rs index 91304d7..430a670 100644 --- a/teloxide_tests/src/server/routes/set_message_reaction.rs +++ b/teloxide_tests/src/server/routes/set_message_reaction.rs @@ -1,14 +1,11 @@ use std::sync::Mutex; -use crate::state::State; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; use teloxide::types::ReactionType; -use crate::server::routes::check_if_message_exists; - use super::{make_telegram_result, BodyChatId}; +use crate::{server::routes::check_if_message_exists, state::State}; #[derive(Debug, Deserialize, Clone)] pub struct SetMessageReactionBody { diff --git a/teloxide_tests/src/server/routes/set_my_commands.rs b/teloxide_tests/src/server/routes/set_my_commands.rs index 4931133..4904bad 100644 --- a/teloxide_tests/src/server/routes/set_my_commands.rs +++ b/teloxide_tests/src/server/routes/set_my_commands.rs @@ -4,9 +4,8 @@ use actix_web::{web, Responder}; use serde::Deserialize; use teloxide::types::{BotCommand, BotCommandScope}; -use crate::state::State; - use super::make_telegram_result; +use crate::state::State; #[derive(Debug, Deserialize, Clone)] pub struct SetMyCommandsBody { diff --git a/teloxide_tests/src/server/routes/unban_chat_member.rs b/teloxide_tests/src/server/routes/unban_chat_member.rs index b7906de..a9236ab 100644 --- a/teloxide_tests/src/server/routes/unban_chat_member.rs +++ b/teloxide_tests/src/server/routes/unban_chat_member.rs @@ -3,9 +3,8 @@ use std::sync::Mutex; use actix_web::{web, Responder}; use serde::Deserialize; -use crate::{server::routes::make_telegram_result, state::State}; - use super::BodyChatId; +use crate::{server::routes::make_telegram_result, state::State}; #[derive(Debug, Deserialize, Clone)] pub struct UnbanChatMemberBody { diff --git a/teloxide_tests/src/server/routes/unpin_all_chat_messages.rs b/teloxide_tests/src/server/routes/unpin_all_chat_messages.rs index 5d4d1b8..aa3196b 100644 --- a/teloxide_tests/src/server/routes/unpin_all_chat_messages.rs +++ b/teloxide_tests/src/server/routes/unpin_all_chat_messages.rs @@ -3,9 +3,8 @@ use std::sync::Mutex; use actix_web::{web, Responder}; use serde::Deserialize; -use crate::{server::routes::make_telegram_result, state::State}; - use super::BodyChatId; +use crate::{server::routes::make_telegram_result, state::State}; #[derive(Debug, Deserialize, Clone)] pub struct UnpinAllChatMessagesBody { diff --git a/teloxide_tests/src/server/routes/unpin_chat_message.rs b/teloxide_tests/src/server/routes/unpin_chat_message.rs index 4d7e312..652f3fe 100644 --- a/teloxide_tests/src/server/routes/unpin_chat_message.rs +++ b/teloxide_tests/src/server/routes/unpin_chat_message.rs @@ -1,13 +1,10 @@ use std::sync::Mutex; -use actix_web::error::ErrorBadRequest; -use actix_web::{web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use crate::server::routes::make_telegram_result; -use crate::state::State; - use super::{check_if_message_exists, BodyChatId}; +use crate::{server::routes::make_telegram_result, state::State}; #[derive(Debug, Deserialize, Clone)] pub struct UnpinChatMessageBody { diff --git a/teloxide_tests/src/state.rs b/teloxide_tests/src/state.rs index a01122f..6bd6691 100644 --- a/teloxide_tests/src/state.rs +++ b/teloxide_tests/src/state.rs @@ -1,8 +1,9 @@ -use teloxide::prelude::*; -use teloxide::types::{File, MessageId, MessageKind}; +use teloxide::{ + prelude::*, + types::{File, MessageId, MessageKind}, +}; -use crate::MockMessageText; -use crate::{server::messages::Messages, utils::find_file, Responses}; +use crate::{server::messages::Messages, utils::find_file, MockMessageText, Responses}; #[derive(Default)] pub(crate) struct State { diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index 0a7b2bf..8bd8dcc 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -1,39 +1,35 @@ -use std::fmt::Display; -use std::sync::atomic::AtomicBool; -use std::sync::Arc; -use std::thread; +use std::{ + fmt::Display, + sync::{atomic::AtomicBool, Arc}, + thread, +}; -use super::*; -use crate::dataset::*; use futures_util::future::BoxFuture; use serde::{Deserialize, Serialize}; -use teloxide::dispatching::dialogue::serializer::Json; -use teloxide::dispatching::dialogue::{ErasedStorage, SqliteStorage, Storage}; -use teloxide::dispatching::{HandlerExt, UpdateHandler}; -use teloxide::dptree::case; -use teloxide::error_handlers::ErrorHandler; -use teloxide::net::Download; -use teloxide::payloads::{ - BanChatMemberSetters, CopyMessageSetters, SendPhotoSetters, SendPollSetters, -}; -use teloxide::requests::Requester; -use teloxide::sugar::request::RequestReplyExt; -use teloxide::types::{ - BotCommand, ChatAction, ChatPermissions, DiceEmoji, InlineKeyboardButton, InlineKeyboardMarkup, - InputFile, InputMedia, InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo, - LinkPreviewOptions, Message, MessageEntity, MessageId, PollOption, PollType, ReactionType, - ReplyParameters, Seconds, Update, -}; use teloxide::{ dispatching::{ - dialogue::{self, InMemStorage}, - UpdateFilterExt, + dialogue::{self, serializer::Json, ErasedStorage, InMemStorage, SqliteStorage, Storage}, + HandlerExt, UpdateFilterExt, UpdateHandler, }, - dptree::deps, + dptree::{case, deps}, + error_handlers::ErrorHandler, macros::BotCommands, + net::Download, + payloads::{BanChatMemberSetters, CopyMessageSetters, SendPhotoSetters, SendPollSetters}, prelude::*, + requests::Requester, + sugar::request::RequestReplyExt, + types::{ + BotCommand, ChatAction, ChatPermissions, DiceEmoji, InlineKeyboardButton, + InlineKeyboardMarkup, InputFile, InputMedia, InputMediaAudio, InputMediaDocument, + InputMediaPhoto, InputMediaVideo, LinkPreviewOptions, Message, MessageEntity, MessageId, + PollOption, PollType, ReactionType, ReplyParameters, Seconds, Update, + }, }; +use super::*; +use crate::dataset::*; + // // // diff --git a/teloxide_tests/src/utils.rs b/teloxide_tests/src/utils.rs index 9809b1d..76906cc 100644 --- a/teloxide_tests/src/utils.rs +++ b/teloxide_tests/src/utils.rs @@ -1,6 +1,5 @@ use serde_json::Value; -use teloxide::prelude::*; -use teloxide::types::FileMeta; +use teloxide::{prelude::*, types::FileMeta}; macro_rules! assert_eqn { ($actual:expr, $expected:expr $(,)?) => { From 090a64a7bc9e55a7096fee98c38967936bdd478a Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Tue, 12 Nov 2024 08:23:12 +0000 Subject: [PATCH 120/138] add a clippy disable --- teloxide_tests/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/teloxide_tests/src/lib.rs b/teloxide_tests/src/lib.rs index e7318fb..512d76e 100644 --- a/teloxide_tests/src/lib.rs +++ b/teloxide_tests/src/lib.rs @@ -142,6 +142,7 @@ html_logo_url = "https://github.com/user-attachments/assets/627beca8-5852-4c70-97e0-5f4fcb5e2040", html_favicon_url = "https://github.com/user-attachments/assets/627beca8-5852-4c70-97e0-5f4fcb5e2040" )] +#![allow(clippy::too_long_first_doc_paragraph)] #![allow(clippy::to_string_in_format_args)] #![allow(clippy::new_without_default)] #![allow(clippy::too_many_arguments)] From c831110e324e6fcaba47c38818516d06907cfbee Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 14 Nov 2024 04:33:45 +0000 Subject: [PATCH 121/138] make server public --- teloxide_tests/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teloxide_tests/src/lib.rs b/teloxide_tests/src/lib.rs index 512d76e..b301453 100644 --- a/teloxide_tests/src/lib.rs +++ b/teloxide_tests/src/lib.rs @@ -162,7 +162,7 @@ mod dataset; pub(crate) mod listener; pub mod mock_bot; -mod server; +pub mod server; pub(crate) mod state; #[cfg(test)] mod tests; From 2e7d0ad81838cb161b0cd425156283212cdf9578 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 14 Nov 2024 04:36:30 +0000 Subject: [PATCH 122/138] make routes private --- teloxide_tests/src/server/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index d380766..b4a270c 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -1,5 +1,5 @@ //! A fake telegram bot API for testing purposes. Read more in teloxide_tests crate. -pub mod routes; +mod routes; use std::{ error::Error, io, From fd024c06e0aec3dcfa6a62027a8b86c3d7d8b9d5 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 14 Nov 2024 04:38:40 +0000 Subject: [PATCH 123/138] make ServerManager start pub(crate) --- teloxide_tests/src/server/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index b4a270c..f6f58ce 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -50,7 +50,7 @@ pub struct ServerManager { #[warn(clippy::unwrap_used)] impl ServerManager { - pub async fn start(me: Me, state: Arc>) -> Result> { + pub(crate) async fn start(me: Me, state: Arc>) -> Result> { let listener = TcpListener::bind("127.0.0.1:0")?; let port = listener.local_addr()?.port(); From 82bd80f9cd6a64c4f484ca777fe8a3dd8410d5f8 Mon Sep 17 00:00:00 2001 From: Will Lynas <43895423+will-lynas@users.noreply.github.com> Date: Thu, 14 Nov 2024 04:48:13 +0000 Subject: [PATCH 124/138] expose the body types --- teloxide_tests/src/server/mod.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index f6f58ce..e2c1205 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -23,6 +23,19 @@ use routes::{ set_message_reaction::*, set_my_commands::*, unban_chat_member::*, unpin_all_chat_messages::*, unpin_chat_message::*, }; +pub use routes::{ + copy_message::CopyMessageBody, delete_message::DeleteMessageBody, + edit_message_caption::EditMessageCaptionBody, + edit_message_reply_markup::EditMessageReplyMarkupBody, edit_message_text::EditMessageTextBody, + forward_message::ForwardMessageBody, send_animation::SendMessageAnimationBody, + send_audio::SendMessageAudioBody, send_contact::SendMessageContactBody, + send_dice::SendMessageDiceBody, send_document::SendMessageDocumentBody, + send_location::SendMessageLocationBody, send_media_group::SendMediaGroupBody, + send_message::SendMessageTextBody, send_photo::SendMessagePhotoBody, + send_poll::SendMessagePollBody, send_sticker::SendMessageStickerBody, + send_venue::SendMessageVenueBody, send_video::SendMessageVideoBody, + send_video_note::SendMessageVideoNoteBody, +}; use teloxide::types::Me; use tokio::{ sync::mpsc::{channel, Sender}, From 3e04a1967f0aee2b3df63bf151b135735475c2d1 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Thu, 14 Nov 2024 17:25:57 +0200 Subject: [PATCH 125/138] Fixed some exposed functions --- teloxide_tests/src/server/mod.rs | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index e2c1205..f051655 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -8,8 +8,8 @@ use std::{ }; use actix_web::{ - web::{get, post, scope, Data, Json, ServiceConfig}, - App, HttpResponse, HttpServer, Responder, + web::{get, post, scope, Data, ServiceConfig}, + App, HttpServer, }; pub use responses::*; use routes::{ @@ -48,14 +48,7 @@ use crate::state::State; pub mod messages; pub mod responses; -#[allow(dead_code)] -pub async fn log_request(body: Json) -> impl Responder { - dbg!(body); - HttpResponse::Ok() -} - -#[allow(dead_code)] -pub struct ServerManager { +pub(crate) struct ServerManager { pub port: u16, server: JoinHandle<()>, cancel_token: CancellationToken, @@ -87,7 +80,7 @@ impl ServerManager { }) } - pub async fn stop(self) -> Result<(), JoinError> { + pub(crate) async fn stop(self) -> Result<(), JoinError> { self.cancel_token.cancel(); self.server.await } From 53a05450f0a15e2d9508a4e067983444d3ae6768 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Tue, 19 Nov 2024 22:19:47 +0200 Subject: [PATCH 126/138] Added send_invoice endpoint --- teloxide_tests/src/dataset/message.rs | 61 +++++++++++++ teloxide_tests/src/lib.rs | 1 + teloxide_tests/src/server/mod.rs | 15 ++-- teloxide_tests/src/server/responses.rs | 15 +++- teloxide_tests/src/server/routes/mod.rs | 1 + .../src/server/routes/send_invoice.rs | 85 +++++++++++++++++++ teloxide_tests/src/tests.rs | 36 +++++++- 7 files changed, 203 insertions(+), 11 deletions(-) create mode 100644 teloxide_tests/src/server/routes/send_invoice.rs diff --git a/teloxide_tests/src/dataset/message.rs b/teloxide_tests/src/dataset/message.rs index fc62236..6a9781b 100644 --- a/teloxide_tests/src/dataset/message.rs +++ b/teloxide_tests/src/dataset/message.rs @@ -133,3 +133,64 @@ impl MockMessageDice { })) } } + +Message! { + #[derive(Changeable, Clone)] + pub struct MockMessageInvoice { + pub title: String, + pub description: String, + pub start_parameter: String, + pub currency: String, + pub total_amount: u32, + } +} + +impl MockMessageInvoice { + pub const TITLE: &'static str = "Title of Invoice"; + pub const DESCRIPTION: &'static str = "Description of Invoice"; + pub const START_PARAMETER: &'static str = "Start parameter of Invoice"; + pub const CURRENCY: &'static str = "XTR"; + pub const TOTAL_AMOUNT: u32 = 0; + + /// Creates a new easily changable message invoice builder + /// + /// # Example + /// ``` + /// let message = teloxide_tests::MockMessageInvoice::new() + /// .title("Some title") + /// .build(); + /// assert_eq!(message.invoice().unwrap().title, "Some title".to_owned()); + /// ``` + /// + pub fn new() -> Self { + Self::new_message( + Self::TITLE.to_owned(), + Self::DESCRIPTION.to_owned(), + Self::START_PARAMETER.to_owned(), + Self::CURRENCY.to_owned(), + Self::TOTAL_AMOUNT, + ) + } + + /// Builds the message dice + /// + /// # Example + /// ``` + /// let mock_message = teloxide_tests::MockMessageInvoice::new(); + /// let message = mock_message.build(); + /// assert_eq!(message.invoice().unwrap().currency, teloxide_tests::MockMessageInvoice::CURRENCY); // CURRENCY is a default value + /// ``` + /// + pub fn build(self) -> Message { + self.clone() + .build_message(MessageKind::Invoice(MessageInvoice { + invoice: Invoice { + title: self.title, + description: self.description, + start_parameter: self.start_parameter, + currency: self.currency, + total_amount: self.total_amount, + }, + })) + } +} diff --git a/teloxide_tests/src/lib.rs b/teloxide_tests/src/lib.rs index b301453..ec46a33 100644 --- a/teloxide_tests/src/lib.rs +++ b/teloxide_tests/src/lib.rs @@ -78,6 +78,7 @@ //! - /SendSticker //! - /SendChatAction //! - /SendMediaGroup +//! - /SendInvoice //! - /PinChatMessage //! - /UnpinChatMessage //! - /UnpinAllChatMessages diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index f051655..952352e 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -18,8 +18,8 @@ use routes::{ edit_message_text::*, forward_message::*, get_file::*, get_me::*, get_updates::*, get_webhook_info::*, pin_chat_message::*, restrict_chat_member::*, send_animation::*, send_audio::*, send_chat_action::*, send_contact::*, send_dice::*, send_document::*, - send_location::*, send_media_group::*, send_message::*, send_photo::*, send_poll::*, - send_sticker::*, send_venue::*, send_video::*, send_video_note::*, send_voice::*, + send_invoice::*, send_location::*, send_media_group::*, send_message::*, send_photo::*, + send_poll::*, send_sticker::*, send_venue::*, send_video::*, send_video_note::*, send_voice::*, set_message_reaction::*, set_my_commands::*, unban_chat_member::*, unpin_all_chat_messages::*, unpin_chat_message::*, }; @@ -30,11 +30,11 @@ pub use routes::{ forward_message::ForwardMessageBody, send_animation::SendMessageAnimationBody, send_audio::SendMessageAudioBody, send_contact::SendMessageContactBody, send_dice::SendMessageDiceBody, send_document::SendMessageDocumentBody, - send_location::SendMessageLocationBody, send_media_group::SendMediaGroupBody, - send_message::SendMessageTextBody, send_photo::SendMessagePhotoBody, - send_poll::SendMessagePollBody, send_sticker::SendMessageStickerBody, - send_venue::SendMessageVenueBody, send_video::SendMessageVideoBody, - send_video_note::SendMessageVideoNoteBody, + send_invoice::SendMessageInvoiceBody, send_location::SendMessageLocationBody, + send_media_group::SendMediaGroupBody, send_message::SendMessageTextBody, + send_photo::SendMessagePhotoBody, send_poll::SendMessagePollBody, + send_sticker::SendMessageStickerBody, send_venue::SendMessageVenueBody, + send_video::SendMessageVideoBody, send_video_note::SendMessageVideoNoteBody, }; use teloxide::types::Me; use tokio::{ @@ -146,6 +146,7 @@ fn set_bot_routes(cfg: &mut ServiceConfig) { .route("/SendDice", post().to(send_dice)) .route("/SendPoll", post().to(send_poll)) .route("/SendMediaGroup", post().to(send_media_group)) + .route("/SendInvoice", post().to(send_invoice)) .route("/EditMessageText", post().to(edit_message_text)) .route("/EditMessageCaption", post().to(edit_message_caption)) .route( diff --git a/teloxide_tests/src/server/responses.rs b/teloxide_tests/src/server/responses.rs index 525c15f..fd95a58 100644 --- a/teloxide_tests/src/server/responses.rs +++ b/teloxide_tests/src/server/responses.rs @@ -5,8 +5,8 @@ use super::routes::{ edit_message_caption::*, edit_message_reply_markup::*, edit_message_text::*, forward_message::*, pin_chat_message::*, restrict_chat_member::*, send_animation::*, send_audio::*, send_chat_action::*, send_contact::*, send_dice::*, send_document::*, - send_location::*, send_media_group::*, send_message::*, send_photo::*, send_poll::*, - send_sticker::*, send_venue::*, send_video::*, send_video_note::*, send_voice::*, + send_invoice::*, send_location::*, send_media_group::*, send_message::*, send_photo::*, + send_poll::*, send_sticker::*, send_venue::*, send_video::*, send_video_note::*, send_voice::*, set_message_reaction::*, set_my_commands::*, unban_chat_member::*, unpin_all_chat_messages::*, unpin_chat_message::*, }; @@ -102,6 +102,12 @@ pub struct SentMediaGroup { pub bot_request: SendMediaGroupBody, } +#[derive(Clone, Debug)] +pub struct SentMessageInvoice { + pub message: Message, + pub bot_request: SendMessageInvoiceBody, +} + #[derive(Clone, Debug)] pub struct EditedMessageText { pub message: Message, @@ -219,6 +225,11 @@ pub struct Responses { /// has the request that was sent to the fake server pub sent_media_group: Vec, + /// This has only messages that are invoice messages, sent by the bot. + /// The `.message` field has the sent by bot message, and `.bot_request` + /// has the request that was sent to the fake server + pub sent_messages_invoice: Vec, + /// This has only edited by the bot text messages. /// The `.message` field has the new edited message, and `.bot_request` /// has the request that was sent to the fake server diff --git a/teloxide_tests/src/server/routes/mod.rs b/teloxide_tests/src/server/routes/mod.rs index d0a940f..0a697ef 100644 --- a/teloxide_tests/src/server/routes/mod.rs +++ b/teloxide_tests/src/server/routes/mod.rs @@ -30,6 +30,7 @@ pub mod send_chat_action; pub mod send_contact; pub mod send_dice; pub mod send_document; +pub mod send_invoice; pub mod send_location; pub mod send_media_group; pub mod send_message; diff --git a/teloxide_tests/src/server/routes/send_invoice.rs b/teloxide_tests/src/server/routes/send_invoice.rs new file mode 100644 index 0000000..8f668e6 --- /dev/null +++ b/teloxide_tests/src/server/routes/send_invoice.rs @@ -0,0 +1,85 @@ +use std::sync::Mutex; + +use actix_web::{web, Responder}; +use serde::Deserialize; +use teloxide::types::{LabeledPrice, Me, ReplyMarkup, ReplyParameters}; + +use super::{make_telegram_result, BodyChatId}; +use crate::{server::SentMessageInvoice, state::State, MockMessageInvoice}; + +#[derive(Debug, Deserialize, Clone)] +pub struct SendMessageInvoiceBody { + pub chat_id: BodyChatId, + pub message_thread_id: Option, + pub title: String, + pub description: String, + pub payload: String, + pub provider_token: Option, + pub currency: String, + pub prices: Vec, + pub max_tip_amount: Option, + pub suggested_tip_amounts: Option>, + pub start_parameter: Option, + pub provider_data: Option, + pub photo_url: Option, + pub photo_size: Option, + pub photo_width: Option, + pub photo_height: Option, + pub need_name: Option, + pub need_phone_number: Option, + pub need_email: Option, + pub need_shipping_address: Option, + pub send_phone_number_to_provider: Option, + pub send_email_to_provider: Option, + pub is_flexible: Option, + pub disable_notification: Option, + pub protect_content: Option, + pub message_effect_id: Option, + pub reply_parameters: Option, + pub reply_markup: Option, +} + +pub async fn send_invoice( + body: web::Json, + me: web::Data, + state: web::Data>, +) -> impl Responder { + let mut lock = state.lock().unwrap(); + + let chat = body.chat_id.chat(); + let mut message = MockMessageInvoice::new() + .chat(chat) + .title(body.title.clone()) + .description(body.description.clone()) + .start_parameter(body.start_parameter.clone().unwrap_or("".to_owned())) + .total_amount(body.prices.first().unwrap().amount); + message.from = Some(me.user.clone()); + + // Commented until teloxides new release + // message.has_protected_content = body.protect_content.unwrap_or(false); + + // if let Some(reply_parameters) = &body.reply_parameters { + // check_if_message_exists!(lock, reply_parameters.message_id.0); + // let reply_to_message = lock + // .messages + // .get_message(reply_parameters.message_id.0) + // .unwrap(); + // message.reply_to_message = Some(Box::new(reply_to_message.clone())); + // } + // if let Some(ReplyMarkup::InlineKeyboard(markup)) = body.reply_markup.clone() { + // message.reply_markup = Some(markup); + // } + + let last_id = lock.messages.max_message_id(); + let message = lock.messages.add_message(message.id(last_id + 1).build()); + + lock.responses.sent_messages.push(message.clone()); + lock.responses + .sent_messages_invoice + .push(SentMessageInvoice { + message: message.clone(), + bot_request: body.into_inner(), + }); + + make_telegram_result(message) +} diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index 8bd8dcc..ee92ad4 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -22,8 +22,8 @@ use teloxide::{ types::{ BotCommand, ChatAction, ChatPermissions, DiceEmoji, InlineKeyboardButton, InlineKeyboardMarkup, InputFile, InputMedia, InputMediaAudio, InputMediaDocument, - InputMediaPhoto, InputMediaVideo, LinkPreviewOptions, Message, MessageEntity, MessageId, - PollOption, PollType, ReactionType, ReplyParameters, Seconds, Update, + InputMediaPhoto, InputMediaVideo, LabeledPrice, LinkPreviewOptions, Message, MessageEntity, + MessageId, PollOption, PollType, ReactionType, ReplyParameters, Seconds, Update, }, }; @@ -216,6 +216,8 @@ pub enum AllCommands { #[command()] MediaGroup, #[command()] + Invoice, + #[command()] EditCaption, #[command()] PinMessage, @@ -475,6 +477,21 @@ async fn handler( .reply_to(MessageId(344382918)) .await?; } + AllCommands::Invoice => { + bot.send_invoice( + msg.chat.id, + "Absolutely Nothing", + "Demo", + "test_payload", + "", + "XTR", + vec![LabeledPrice { + label: "Stars".into(), + amount: 1, + }], + ) + .await?; + } } Ok(()) } @@ -1145,3 +1162,18 @@ async fn test_set_my_commands() { }) ); } + +#[tokio::test] +async fn test_send_invoice() { + let mut bot = MockBot::new(MockMessageText::new().text("/invoice"), get_schema()); + + bot.dispatch().await; + + let responses = bot.get_responses(); + let invoice_message = responses.sent_messages_invoice.last().unwrap(); + + assert_eq!( + invoice_message.message.invoice().unwrap().title, + "Absolutely Nothing" + ); +} From 4422574a5d23a66c155251a954e7e2ebcab6420e Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Tue, 19 Nov 2024 22:36:46 +0200 Subject: [PATCH 127/138] Better error message on no endpoint --- teloxide_tests/src/server/mod.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index 952352e..a1c7ad3 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -8,8 +8,8 @@ use std::{ }; use actix_web::{ - web::{get, post, scope, Data, ServiceConfig}, - App, HttpServer, + web::{self, get, post, scope, Data, ServiceConfig}, + App, HttpResponse, HttpServer, Responder, }; pub use responses::*; use routes::{ @@ -164,5 +164,10 @@ fn set_bot_routes(cfg: &mut ServiceConfig) { .route("/UnbanChatMember", post().to(unban_chat_member)) .route("/RestrictChatMember", post().to(restrict_chat_member)) .route("/SetMessageReaction", post().to(set_message_reaction)) - .route("/SetMyCommands", post().to(set_my_commands)); + .route("/SetMyCommands", post().to(set_my_commands)) + .route("/{unknown_endpoint}", post().to(unknown_endpoint)); +} + +async fn unknown_endpoint(path: web::Path<(String, String)>) -> impl Responder { + HttpResponse::InternalServerError().message_body(format!("Endpoint \"{}\" is not yet implemented! Please make an issue to https://github.com/LasterAlex/teloxide_tests/issues/new?assignees=&labels=no+endpoint&projects=&template=add-endpoint-template.md&title=", path.1)) } From e2e144542f5ccddf0081a887cf41beaff23ee5b9 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Sat, 28 Dec 2024 21:15:49 +0200 Subject: [PATCH 128/138] Fixed strange data failure --- teloxide_tests/src/server/routes/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teloxide_tests/src/server/routes/mod.rs b/teloxide_tests/src/server/routes/mod.rs index 0a697ef..9479cc7 100644 --- a/teloxide_tests/src/server/routes/mod.rs +++ b/teloxide_tests/src/server/routes/mod.rs @@ -237,7 +237,7 @@ pub async fn get_raw_multipart_fields( Attachment { raw_name: data.0.to_string(), file_name: filename.to_string(), - file_data: from_utf8(&data.1).unwrap().to_string(), + file_data: from_utf8(&data.1).unwrap_or("error_getting_data").to_string(), }, ); } From 6dc7f70813e526a888d1de8283e1fd1f7c84c75a Mon Sep 17 00:00:00 2001 From: Ilya Bizyaev Date: Sat, 11 Jan 2025 16:00:39 +0100 Subject: [PATCH 129/138] Implement deleteMessages It's the batch version of deleteMessage that does not return errors for messages that were not found. Docs: https://core.telegram.org/bots/api#deletemessages --- teloxide_tests/src/lib.rs | 1 + teloxide_tests/src/server/messages.rs | 44 +++++++++++++++++- teloxide_tests/src/server/mod.rs | 19 ++++---- .../src/server/routes/delete_messages.rs | 46 +++++++++++++++++++ teloxide_tests/src/server/routes/mod.rs | 5 +- teloxide_tests/src/tests.rs | 19 ++++++++ 6 files changed, 122 insertions(+), 12 deletions(-) create mode 100644 teloxide_tests/src/server/routes/delete_messages.rs diff --git a/teloxide_tests/src/lib.rs b/teloxide_tests/src/lib.rs index ec46a33..da0d76e 100644 --- a/teloxide_tests/src/lib.rs +++ b/teloxide_tests/src/lib.rs @@ -58,6 +58,7 @@ //! //! - /AnswerCallbackQuery //! - /DeleteMessage +//! - /DeleteMessages //! - /EditMessageText //! - /EditMessageReplyMarkup //! - /EditMessageCaption diff --git a/teloxide_tests/src/server/messages.rs b/teloxide_tests/src/server/messages.rs index 564573f..2a6677e 100644 --- a/teloxide_tests/src/server/messages.rs +++ b/teloxide_tests/src/server/messages.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use serde::Serialize; use teloxide::types::{Message, ReplyMarkup}; @@ -61,12 +63,24 @@ impl Messages { self.messages.retain(|m| m.id.0 != message_id); Some(message) } + + pub fn delete_messages(&mut self, message_ids: &[i32]) -> Vec { + let message_ids: HashSet = message_ids.iter().cloned().collect(); + let deleted = self + .messages + .iter() + .filter(|m| message_ids.contains(&m.id.0)) + .cloned() + .collect(); + self.messages.retain(|m| !message_ids.contains(&m.id.0)); + deleted + } } #[cfg(test)] mod tests { use serial_test::serial; - use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup}; + use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup, MessageId}; use super::*; use crate::dataset::*; @@ -125,7 +139,7 @@ mod tests { #[test] #[serial] - fn test_delete_messages() { + fn test_delete_message() { let mut messages = Messages::default(); messages.add_message( message_common::MockMessageText::new() @@ -137,6 +151,32 @@ mod tests { assert_eq!(messages.get_message(1), None); } + #[test] + #[serial] + fn test_delete_messages() { + let mut messages = Messages::default(); + for id in 1..=5 { + messages.add_message( + message_common::MockMessageText::new() + .text(format!("Message {}", id)) + .id(id) + .build(), + ); + } + + let deleted = messages.delete_messages(&[2, 3]); + + assert_eq!(deleted.len(), 2); + assert_eq!(deleted[0].id, MessageId(2)); + assert_eq!(deleted[1].id, MessageId(3)); + + assert!(messages.get_message(1).is_some()); + assert_eq!(messages.get_message(2), None); + assert_eq!(messages.get_message(3), None); + assert!(messages.get_message(4).is_some()); + assert!(messages.get_message(5).is_some()); + } + #[test] #[serial] fn test_edit_message_reply_markup() { diff --git a/teloxide_tests/src/server/mod.rs b/teloxide_tests/src/server/mod.rs index a1c7ad3..3bffee3 100644 --- a/teloxide_tests/src/server/mod.rs +++ b/teloxide_tests/src/server/mod.rs @@ -14,18 +14,18 @@ use actix_web::{ pub use responses::*; use routes::{ answer_callback_query::*, ban_chat_member::*, copy_message::*, delete_message::*, - download_file::download_file, edit_message_caption::*, edit_message_reply_markup::*, - edit_message_text::*, forward_message::*, get_file::*, get_me::*, get_updates::*, - get_webhook_info::*, pin_chat_message::*, restrict_chat_member::*, send_animation::*, - send_audio::*, send_chat_action::*, send_contact::*, send_dice::*, send_document::*, - send_invoice::*, send_location::*, send_media_group::*, send_message::*, send_photo::*, - send_poll::*, send_sticker::*, send_venue::*, send_video::*, send_video_note::*, send_voice::*, - set_message_reaction::*, set_my_commands::*, unban_chat_member::*, unpin_all_chat_messages::*, - unpin_chat_message::*, + delete_messages::*, download_file::download_file, edit_message_caption::*, + edit_message_reply_markup::*, edit_message_text::*, forward_message::*, get_file::*, get_me::*, + get_updates::*, get_webhook_info::*, pin_chat_message::*, restrict_chat_member::*, + send_animation::*, send_audio::*, send_chat_action::*, send_contact::*, send_dice::*, + send_document::*, send_invoice::*, send_location::*, send_media_group::*, send_message::*, + send_photo::*, send_poll::*, send_sticker::*, send_venue::*, send_video::*, send_video_note::*, + send_voice::*, set_message_reaction::*, set_my_commands::*, unban_chat_member::*, + unpin_all_chat_messages::*, unpin_chat_message::*, }; pub use routes::{ copy_message::CopyMessageBody, delete_message::DeleteMessageBody, - edit_message_caption::EditMessageCaptionBody, + delete_messages::DeleteMessagesBody, edit_message_caption::EditMessageCaptionBody, edit_message_reply_markup::EditMessageReplyMarkupBody, edit_message_text::EditMessageTextBody, forward_message::ForwardMessageBody, send_animation::SendMessageAnimationBody, send_audio::SendMessageAudioBody, send_contact::SendMessageContactBody, @@ -154,6 +154,7 @@ fn set_bot_routes(cfg: &mut ServiceConfig) { post().to(edit_message_reply_markup), ) .route("/DeleteMessage", post().to(delete_message)) + .route("/DeleteMessages", post().to(delete_messages)) .route("/ForwardMessage", post().to(forward_message)) .route("/CopyMessage", post().to(copy_message)) .route("/AnswerCallbackQuery", post().to(answer_callback_query)) diff --git a/teloxide_tests/src/server/routes/delete_messages.rs b/teloxide_tests/src/server/routes/delete_messages.rs new file mode 100644 index 0000000..b5f80ab --- /dev/null +++ b/teloxide_tests/src/server/routes/delete_messages.rs @@ -0,0 +1,46 @@ +use std::sync::Mutex; + +use actix_web::{web, Responder}; +use serde::Deserialize; + +use super::BodyChatId; +use crate::{ + server::{ + routes::{delete_message::DeleteMessageBody, make_telegram_result}, + DeletedMessage, + }, + state::State, +}; + +#[derive(Debug, Deserialize, Clone)] +pub struct DeleteMessagesBody { + pub chat_id: BodyChatId, + pub message_ids: Vec, +} + +pub async fn delete_messages( + state: web::Data>, + body: web::Json, +) -> impl Responder { + let mut lock = state.lock().unwrap(); + let bot_request = body.into_inner(); + // deleteMessages skips messages that are not found, no error is returned. + let mut deleted_messages = lock + .messages + .delete_messages(&bot_request.message_ids) + .into_iter() + .map(|m| DeletedMessage { + message: m.clone(), + bot_request: DeleteMessageBody { + chat_id: bot_request.chat_id.clone(), + message_id: m.id.0, + }, + }) + .collect(); + + lock.responses + .deleted_messages + .append(&mut deleted_messages); + + make_telegram_result(true) +} diff --git a/teloxide_tests/src/server/routes/mod.rs b/teloxide_tests/src/server/routes/mod.rs index 9479cc7..574aa41 100644 --- a/teloxide_tests/src/server/routes/mod.rs +++ b/teloxide_tests/src/server/routes/mod.rs @@ -13,6 +13,7 @@ pub mod answer_callback_query; pub mod ban_chat_member; pub mod copy_message; pub mod delete_message; +pub mod delete_messages; pub mod download_file; pub mod edit_message_caption; pub mod edit_message_reply_markup; @@ -237,7 +238,9 @@ pub async fn get_raw_multipart_fields( Attachment { raw_name: data.0.to_string(), file_name: filename.to_string(), - file_data: from_utf8(&data.1).unwrap_or("error_getting_data").to_string(), + file_data: from_utf8(&data.1) + .unwrap_or("error_getting_data") + .to_string(), }, ); } diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index ee92ad4..baf51ab 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -186,6 +186,8 @@ pub enum AllCommands { #[command()] Delete, #[command()] + DeleteBatch, + #[command()] EditReplyMarkup, #[command()] Photo, @@ -264,6 +266,10 @@ async fn handler( AllCommands::Delete => { bot.delete_message(msg.chat.id, sent_message.id).await?; } + AllCommands::DeleteBatch => { + bot.delete_messages(msg.chat.id, vec![sent_message.id, MessageId(404)]) + .await?; + } AllCommands::EditReplyMarkup => { bot.edit_message_reply_markup(msg.chat.id, sent_message.id) .reply_markup(InlineKeyboardMarkup::new(vec![vec![ @@ -1024,6 +1030,19 @@ async fn test_delete_message() { assert_eq!(last_deleted_response.message.id, last_sent_message.id); } +#[tokio::test] +async fn test_delete_messages() { + let mut bot = MockBot::new(MockMessageText::new().text("/deletebatch"), get_schema()); + + bot.dispatch().await; + + let last_sent_message = bot.get_responses().sent_messages.pop().unwrap(); + let last_deleted_response = bot.get_responses().deleted_messages.pop().unwrap(); + + assert_eq!(last_sent_message.text(), Some("/deletebatch")); + assert_eq!(last_deleted_response.message.id, last_sent_message.id); +} + #[tokio::test] async fn test_answer_callback_query() { let mut bot = MockBot::new(MockCallbackQuery::new().data("test"), get_schema()); From 313d4a1f545e392a28752bbd1116518c42f3aa60 Mon Sep 17 00:00:00 2001 From: Ilya Bizyaev Date: Mon, 13 Jan 2025 21:16:17 +0100 Subject: [PATCH 130/138] Add MockMessageNewChatMembers Teloxide definition: https://docs.rs/teloxide/latest/teloxide/types/struct.MessageNewChatMembers.html --- teloxide_tests/src/dataset/message.rs | 37 +++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/teloxide_tests/src/dataset/message.rs b/teloxide_tests/src/dataset/message.rs index 6a9781b..a401373 100644 --- a/teloxide_tests/src/dataset/message.rs +++ b/teloxide_tests/src/dataset/message.rs @@ -194,3 +194,40 @@ impl MockMessageInvoice { })) } } + +Message! { + #[derive(Changeable, Clone)] + pub struct MockMessageNewChatMembers { + pub new_chat_members: Vec, + } +} + +impl MockMessageNewChatMembers { + /// Creates a new easily changeable new chat member message builder + /// + /// # Example + /// ``` + /// let message = teloxide_tests::MockMessageNewChatMembers::new() + /// .new_chat_members(vec![teloxide_tests::MockUser::new().id(123).build()]) + /// .build(); + /// assert_eq!(message.new_chat_members().unwrap()[0].id.0, 123); + pub fn new() -> Self { + Self::new_message(vec![MockUser::new().build()]) + } + + /// Builds the new chat member message + /// + /// # Example + /// ``` + /// let mock_message = teloxide_tests::MockMessageNewChatMembers::new(); + /// let message = mock_message.build(); + /// assert_eq!(message.new_chat_members().unwrap().len(), 1); // Contains a single MockUser by default + /// ``` + /// + pub fn build(self) -> Message { + self.clone() + .build_message(MessageKind::NewChatMembers(MessageNewChatMembers { + new_chat_members: self.new_chat_members, + })) + } +} From 5e4513c58808305aaebf266fab8d65bd183b4528 Mon Sep 17 00:00:00 2001 From: Ilya Bizyaev Date: Sat, 22 Feb 2025 15:17:34 +0100 Subject: [PATCH 131/138] Fix forward origin According to the Telegram Bot API docs, the cases of the forward origins are as follows: * MessageOriginChannel: The message was originally sent to a channel chat. * MessageOriginChat: The message was originally sent on behalf of a chat to a group chat. * MessageOriginUser: The message was originally sent by a known user. * MessageOriginHiddenUser: The message was originally sent by an unknown user. Testing with the actual bot API, I do get users, not the chat, for messages forwarded from a supergroup. MessageOriginHiddenUser is determined by the user's settings, which are not exposed to the bot API. --- .../src/server/routes/forward_message.rs | 54 +++++++++---------- teloxide_tests/src/tests.rs | 4 ++ 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/teloxide_tests/src/server/routes/forward_message.rs b/teloxide_tests/src/server/routes/forward_message.rs index f8ecba7..fb71573 100644 --- a/teloxide_tests/src/server/routes/forward_message.rs +++ b/teloxide_tests/src/server/routes/forward_message.rs @@ -2,7 +2,7 @@ use std::sync::Mutex; use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use teloxide::types::{ChatKind, Me, MessageId, MessageKind, MessageOrigin, PublicChatKind}; +use teloxide::types::{Me, MessageId, MessageKind, MessageOrigin}; use super::{make_telegram_result, BodyChatId}; use crate::{ @@ -36,34 +36,30 @@ pub async fn forward_message( let message_clone = message.clone(); if let MessageKind::Common(ref mut common) = message.kind { - common.forward_origin = Some(match message.chat.kind { - ChatKind::Private(_) => match message.from { - Some(ref user) => MessageOrigin::User { - date: message_clone.date, - sender_user: user.clone(), - }, - None => MessageOrigin::HiddenUser { - date: message_clone.date, - sender_user_name: message_clone - .chat - .username() - .unwrap_or("no_username") - .to_string(), - }, - }, - ChatKind::Public(public_chat) => match public_chat.kind { - PublicChatKind::Group(_) => MessageOrigin::Chat { - date: message_clone.date, - sender_chat: message_clone.chat, - author_signature: None, - }, - _ => MessageOrigin::Channel { - date: message_clone.date, - chat: message_clone.chat, - message_id: message_clone.id, - author_signature: None, - }, - }, + common.forward_origin = Some(if message.chat.is_channel() { + MessageOrigin::Channel { + date: message_clone.date, + chat: message_clone.chat, + message_id: message_clone.id, + author_signature: None, + } + } else if let Some(sender_chat) = &message.sender_chat { + MessageOrigin::Chat { + date: message_clone.date, + sender_chat: sender_chat.clone(), + author_signature: None, + } + } else if let Some(user) = &message.from { + MessageOrigin::User { + date: message_clone.date, + sender_user: user.clone(), + } + } else { + // This is probably unreachable. + MessageOrigin::HiddenUser { + date: message_clone.date, + sender_user_name: "Unknown user".to_string(), + } }); common.has_protected_content = body.protect_content.unwrap_or(false); } diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index baf51ab..ac274d3 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -1084,6 +1084,10 @@ async fn test_forward_message() { last_sent_message.forward_date(), Some(first_sent_message.date) ); + assert_eq!( + last_sent_message.forward_from_user().unwrap().id, + first_sent_message.from.as_ref().unwrap().id + ); } #[tokio::test] From b2b4339ab8544095ced221f7c4929a81808c0c59 Mon Sep 17 00:00:00 2001 From: Ilya Bizyaev Date: Wed, 26 Feb 2025 22:54:01 +0100 Subject: [PATCH 132/138] Make editMessageText delete reply markup to match Telegram's behavior This is not documented properly in Telegram's API docs, but it's the go-to way to remove the inline keyboard from a message. --- teloxide_tests/src/server/messages.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/teloxide_tests/src/server/messages.rs b/teloxide_tests/src/server/messages.rs index 2a6677e..175af90 100644 --- a/teloxide_tests/src/server/messages.rs +++ b/teloxide_tests/src/server/messages.rs @@ -36,11 +36,15 @@ impl Messages { reply_markup: Option, ) -> Option { match reply_markup { + None => { + // Telegram deletes reply markup when `editMessageText` is called without any. + self.edit_message(message_id, "reply_markup", None::<()>) + } // Only the inline keyboard can be inside of a message Some(ReplyMarkup::InlineKeyboard(reply_markup)) => { self.edit_message(message_id, "reply_markup", reply_markup) } - _ => self.get_message(message_id), + _ => unreachable!("Only InlineKeyboard is allowed"), } } From 14f0876e8ea65f29b40a9f7ebfddd20eb929d76d Mon Sep 17 00:00:00 2001 From: Ilya Bizyaev Date: Sun, 2 Feb 2025 13:06:29 +0100 Subject: [PATCH 133/138] Add support for UpdateKind::EditedMessage * A wrapper is introduced that changes a Message's into_update() behavior. Having edit_date set seems to be a requirement for correct parsing. * MockBot is updated to support UpdateKind::EditedMessage. * Renamed the old Messages::edit_message to edit_message_field for clarity. * I also fixed a couple of copy-paste errors along the way. --- teloxide_tests/src/dataset/message.rs | 55 ++++++++++++++++++- teloxide_tests/src/mock_bot.rs | 4 ++ teloxide_tests/src/server/messages.rs | 47 ++++++++++++++-- .../src/server/routes/edit_message_caption.rs | 4 +- .../routes/edit_message_reply_markup.rs | 4 +- .../src/server/routes/edit_message_text.rs | 4 +- teloxide_tests/src/state.rs | 28 ++++++++++ teloxide_tests/src/tests.rs | 35 +++++++++++- 8 files changed, 168 insertions(+), 13 deletions(-) diff --git a/teloxide_tests/src/dataset/message.rs b/teloxide_tests/src/dataset/message.rs index a401373..2785ac7 100644 --- a/teloxide_tests/src/dataset/message.rs +++ b/teloxide_tests/src/dataset/message.rs @@ -60,7 +60,7 @@ macro_rules! Message { } impl crate::dataset::IntoUpdate for $name { - /// Converts the MockCallbackQuery into an updates vector + /// Converts the mock message into an updates vector /// /// # Example /// ``` @@ -87,6 +87,59 @@ macro_rules! Message { pub(crate) use Message; +#[derive(Clone, Debug, PartialEq)] +pub struct MockEditedMessage(Message); + +impl MockEditedMessage { + /// Creates a new MockEditedMessage wrapper. + /// + /// This is useful for testing the `UpdateKind::EditedMessage` variant. + /// + /// # Example + /// ``` + /// use chrono::Utc; + /// + /// let message = teloxide_tests::MockMessageText::new().edit_date(Utc::now()).build(); + /// let edited_message = teloxide_tests::MockEditedMessage::new(message.clone()); + /// assert_eq!(edited_message.message(), &message); + pub fn new(mut message: Message) -> Self { + if let MessageKind::Common(ref mut common) = message.kind { + common.edit_date = common.edit_date.or(Some(Utc::now())); + } + Self(message) + } + + pub fn message(&self) -> &Message { + &self.0 + } +} + +impl crate::dataset::IntoUpdate for MockEditedMessage { + /// Converts the edited Message into an updates vector + /// + /// # Example + /// ``` + /// use chrono::Utc; + /// use teloxide_tests::IntoUpdate; + /// use teloxide::types::{UpdateId, UpdateKind}; + /// use std::sync::atomic::AtomicI32; + /// + /// let message = teloxide_tests::MockMessageText::new().edit_date(Utc::now()).build(); + /// let edited_message = teloxide_tests::MockEditedMessage::new(message.clone()); + /// let update = edited_message.into_update(&AtomicI32::new(42))[0].clone(); + /// + /// assert_eq!(update.id, UpdateId(42)); + /// assert_eq!(update.kind, UpdateKind::EditedMessage(message)); + /// ``` + /// + fn into_update(self, id: &AtomicI32) -> Vec { + vec![Update { + id: UpdateId(id.fetch_add(1, Ordering::Relaxed) as u32), + kind: UpdateKind::EditedMessage(self.0), + }] + } +} + // More messages like Webapp data is needed Message! { diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index b96788f..6a6046c 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -237,6 +237,10 @@ where self.state.lock().unwrap().add_message(&mut message); update.kind = UpdateKind::Message(message.clone()); } + UpdateKind::EditedMessage(mut message) => { + self.state.lock().unwrap().edit_message(&mut message); + update.kind = UpdateKind::EditedMessage(message.clone()); + } UpdateKind::CallbackQuery(mut callback) => { if let Some(MaybeInaccessibleMessage::Regular(ref mut message)) = callback.message diff --git a/teloxide_tests/src/server/messages.rs b/teloxide_tests/src/server/messages.rs index 175af90..0b2f148 100644 --- a/teloxide_tests/src/server/messages.rs +++ b/teloxide_tests/src/server/messages.rs @@ -14,7 +14,20 @@ impl Messages { self.last_message_id } - pub fn edit_message(&mut self, message_id: i32, field: &str, value: T) -> Option + pub fn edit_message(&mut self, message: Message) -> Option { + self.messages.iter().find(|m| m.id == message.id)?; // Find the message (return None if not found) + + self.messages.retain(|m| m.id != message.id); // Remove the old message + self.messages.push(message.clone()); // Add the new message + Some(message) // Profit! + } + + pub fn edit_message_field( + &mut self, + message_id: i32, + field: &str, + value: T, + ) -> Option where T: Serialize, { @@ -38,11 +51,11 @@ impl Messages { match reply_markup { None => { // Telegram deletes reply markup when `editMessageText` is called without any. - self.edit_message(message_id, "reply_markup", None::<()>) + self.edit_message_field(message_id, "reply_markup", None::<()>) } // Only the inline keyboard can be inside of a message Some(ReplyMarkup::InlineKeyboard(reply_markup)) => { - self.edit_message(message_id, "reply_markup", reply_markup) + self.edit_message_field(message_id, "reply_markup", reply_markup) } _ => unreachable!("Only InlineKeyboard is allowed"), } @@ -83,6 +96,7 @@ impl Messages { #[cfg(test)] mod tests { + use chrono::{TimeZone, Utc}; use serial_test::serial; use teloxide::types::{InlineKeyboardButton, InlineKeyboardMarkup, MessageId}; @@ -116,7 +130,30 @@ mod tests { #[test] #[serial] - fn test_edit_messages() { + fn test_edit_message() { + let mut messages = Messages::default(); + let date = Utc.with_ymd_and_hms(2020, 1, 1, 0, 0, 0).unwrap(); + messages.add_message( + message_common::MockMessageText::new() + .text("123") + .id(1) + .build(), + ); + messages.edit_message( + message_common::MockMessageText::new() + .text("321") + .edit_date(date) + .id(1) + .build(), + ); + let message = messages.get_message(1).unwrap(); + assert_eq!(message.text().unwrap(), "321"); + assert_eq!(message.edit_date().unwrap(), &date); + } + + #[test] + #[serial] + fn test_edit_message_field() { let mut messages = Messages::default(); messages.add_message( message_common::MockMessageText::new() @@ -124,7 +161,7 @@ mod tests { .id(1) .build(), ); - messages.edit_message(1, "text", "1234"); + messages.edit_message_field(1, "text", "1234"); assert_eq!(messages.get_message(1).unwrap().text().unwrap(), "1234"); } diff --git a/teloxide_tests/src/server/routes/edit_message_caption.rs b/teloxide_tests/src/server/routes/edit_message_caption.rs index cc66d84..1856df3 100644 --- a/teloxide_tests/src/server/routes/edit_message_caption.rs +++ b/teloxide_tests/src/server/routes/edit_message_caption.rs @@ -35,8 +35,8 @@ pub async fn edit_message_caption( let mut lock = state.lock().unwrap(); check_if_message_exists!(lock, message_id); lock.messages - .edit_message(message_id, "caption", body.caption.clone()); - lock.messages.edit_message( + .edit_message_field(message_id, "caption", body.caption.clone()); + lock.messages.edit_message_field( message_id, "caption_entities", body.caption_entities.clone().unwrap_or_default(), diff --git a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs index 8e33eff..5e624da 100644 --- a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs +++ b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs @@ -37,11 +37,11 @@ pub async fn edit_message_reply_markup( let message = match body.reply_markup.clone() { Some(reply_markup) => lock .messages - .edit_message(message_id, "reply_markup", reply_markup) + .edit_message_field(message_id, "reply_markup", reply_markup) .unwrap(), None => lock .messages - .edit_message(message_id, "reply_markup", None::<()>) + .edit_message_field(message_id, "reply_markup", None::<()>) .unwrap(), }; diff --git a/teloxide_tests/src/server/routes/edit_message_text.rs b/teloxide_tests/src/server/routes/edit_message_text.rs index de86741..959722b 100644 --- a/teloxide_tests/src/server/routes/edit_message_text.rs +++ b/teloxide_tests/src/server/routes/edit_message_text.rs @@ -36,8 +36,8 @@ pub async fn edit_message_text( check_if_message_exists!(lock, message_id); lock.messages - .edit_message(message_id, "text", body.text.clone()); - lock.messages.edit_message( + .edit_message_field(message_id, "text", body.text.clone()); + lock.messages.edit_message_field( message_id, "entities", body.entities.clone().unwrap_or(vec![]), diff --git a/teloxide_tests/src/state.rs b/teloxide_tests/src/state.rs index 6bd6691..73a279b 100644 --- a/teloxide_tests/src/state.rs +++ b/teloxide_tests/src/state.rs @@ -50,4 +50,32 @@ impl State { log::debug!("Inserted message with {}.", message.id); self.messages.add_message(message.clone()); } + + pub(crate) fn edit_message(&mut self, message: &mut Message) { + let old_message = self.messages.get_message(message.id.0); + + if old_message.is_none() { + log::error!( + "Not editing message with id {}, this id does not exist in the database.", + message.id + ); + return; + } + + if let Some(file_meta) = find_file(serde_json::to_value(&message).unwrap()) { + if self + .files + .iter() + .all(|f| f.meta.unique_id != file_meta.unique_id) + { + let file = File { + meta: file_meta, + path: "some_path.txt".to_string(), // This doesn't really matter + }; + self.files.push(file); + } + } + log::debug!("Edited message with {}.", message.id); + self.messages.edit_message(message.clone()); + } } diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index ac274d3..46f3d22 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -4,6 +4,7 @@ use std::{ thread, }; +use chrono::Utc; use futures_util::future::BoxFuture; use serde::{Deserialize, Serialize}; use teloxide::{ @@ -519,7 +520,11 @@ fn get_schema() -> UpdateHandler() .endpoint(handler), ) - .branch(Update::filter_message().endpoint(handler)) + .branch( + Update::filter_edited_message() + .filter_command::() + .branch(case![AllCommands::ForwardMessage].endpoint(handler)), + ) .branch(Update::filter_callback_query().endpoint(callback_handler)) } @@ -1088,6 +1093,8 @@ async fn test_forward_message() { last_sent_message.forward_from_user().unwrap().id, first_sent_message.from.as_ref().unwrap().id ); + assert_eq!(responses.forwarded_messages.len(), 1); + assert_eq!(&responses.forwarded_messages[0].message, last_sent_message); } #[tokio::test] @@ -1200,3 +1207,29 @@ async fn test_send_invoice() { "Absolutely Nothing" ); } + +#[tokio::test] +async fn test_edited_message() { + let mock_message = MockMessageText::new().text("/forwardmessage first"); + let mut bot = MockBot::new(mock_message.clone(), get_schema()); + bot.dispatch().await; + + let responses = bot.get_responses(); + assert_eq!(responses.forwarded_messages.len(), 1); + let forwarded_message = &responses.forwarded_messages[0].message; + assert_eq!(forwarded_message.text(), Some("/forwardmessage first")); + + let edited_message = MockEditedMessage::new( + mock_message + .text("/forwardmessage second") + .edit_date(Utc::now()) + .build(), + ); + bot.update(edited_message); + bot.dispatch().await; + + let responses = bot.get_responses(); + assert_eq!(responses.forwarded_messages.len(), 1); + let forwarded_message = &responses.forwarded_messages[0].message; + assert_eq!(forwarded_message.text(), Some("/forwardmessage second")); +} From 4c4f82eeed921377bd0355fb95314d27d31f6592 Mon Sep 17 00:00:00 2001 From: Ilya Bizyaev Date: Fri, 28 Feb 2025 21:22:26 +0100 Subject: [PATCH 134/138] Make edit_message_text return ApiError::MessageNotModified Editing message text to the same value is an easy mistake to make, so I would like to test my code against it. I would also like to receive the error properly as an ApiError enum variant, so this commit introduces a way for teloxide_tests actions to return standard error values of Telegram Bot API that teloxide can actually parse. In the future, other usages of check_if_message_exists and ErrorBadRequest should also be replaced with ApiErrors where possible. --- .../src/server/routes/edit_message_text.rs | 20 +++++-- teloxide_tests/src/server/routes/mod.rs | 47 ++++++++++++++++- teloxide_tests/src/tests.rs | 52 +++++++++++++++---- 3 files changed, 103 insertions(+), 16 deletions(-) diff --git a/teloxide_tests/src/server/routes/edit_message_text.rs b/teloxide_tests/src/server/routes/edit_message_text.rs index 959722b..bfeeccf 100644 --- a/teloxide_tests/src/server/routes/edit_message_text.rs +++ b/teloxide_tests/src/server/routes/edit_message_text.rs @@ -1,10 +1,13 @@ use std::sync::Mutex; -use actix_web::{error::ErrorBadRequest, web, Responder}; +use actix_web::{error::ErrorBadRequest, web, Responder, ResponseError}; use serde::Deserialize; -use teloxide::types::{LinkPreviewOptions, MessageEntity, ParseMode, ReplyMarkup}; +use teloxide::{ + types::{LinkPreviewOptions, MessageEntity, ParseMode, ReplyMarkup}, + ApiError, +}; -use super::{check_if_message_exists, BodyChatId}; +use super::{BodyChatId, BotApiError}; use crate::{ server::{routes::make_telegram_result, EditedMessageText}, state::State, @@ -33,7 +36,16 @@ pub async fn edit_message_text( ) { (Some(_), Some(message_id), None) => { let mut lock = state.lock().unwrap(); - check_if_message_exists!(lock, message_id); + let Some(old_message) = lock.messages.get_message(message_id) else { + return BotApiError::new(ApiError::MessageToEditNotFound).error_response(); + }; + + let old_reply_markup = old_message + .reply_markup() + .map(|kb| ReplyMarkup::InlineKeyboard(kb.clone())); + if old_message.text() == Some(&body.text) && old_reply_markup == body.reply_markup { + return BotApiError::new(ApiError::MessageNotModified).error_response(); + } lock.messages .edit_message_field(message_id, "text", body.text.clone()); diff --git a/teloxide_tests/src/server/routes/mod.rs b/teloxide_tests/src/server/routes/mod.rs index 574aa41..51188bf 100644 --- a/teloxide_tests/src/server/routes/mod.rs +++ b/teloxide_tests/src/server/routes/mod.rs @@ -1,11 +1,14 @@ use std::{collections::HashMap, str::from_utf8}; -use actix_web::HttpResponse; +use actix_web::{error::ResponseError, http::header::ContentType, HttpResponse}; use futures_util::{stream::StreamExt as _, TryStreamExt}; use rand::distributions::{Alphanumeric, DistString}; use serde::{Deserialize, Serialize}; use serde_json::json; -use teloxide::types::{Chat, MessageEntity, ParseMode, Seconds}; +use teloxide::{ + types::{Chat, MessageEntity, ParseMode, Seconds}, + ApiError, +}; use crate::dataset::{MockPrivateChat, MockSupergroupChat}; @@ -167,6 +170,46 @@ pub trait SerializeRawFields { Self: Sized; } +#[derive(Debug, Serialize)] +struct TelegramResponse { + ok: bool, + description: String, +} + +#[derive(Debug, PartialEq, Hash, Eq, Clone)] +struct BotApiError { + error: ApiError, +} + +impl BotApiError { + pub fn new(error: ApiError) -> Self { + Self { error } + } +} + +impl std::fmt::Display for BotApiError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.error.fmt(f) + } +} + +impl ResponseError for BotApiError { + fn status_code(&self) -> actix_web::http::StatusCode { + actix_web::http::StatusCode::BAD_REQUEST + } + + fn error_response(&self) -> HttpResponse { + let response = TelegramResponse { + ok: false, + description: self.error.to_string(), + }; + HttpResponse::build(self.status_code()) + .insert_header(ContentType::json()) + .body(serde_json::to_string(&response).unwrap()) + } +} + +// TODO: replace usages with appropriate error values from teloxide::ApiError. macro_rules! check_if_message_exists { ($lock:expr, $msg_id:expr) => { if $lock.messages.get_message($msg_id).is_none() { diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index 46f3d22..cdd15d6 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -1,6 +1,6 @@ use std::{ fmt::Display, - sync::{atomic::AtomicBool, Arc}, + sync::{Arc, RwLock}, thread, }; @@ -185,6 +185,8 @@ pub enum AllCommands { #[command()] Edit, #[command()] + EditUnchanged, + #[command()] Delete, #[command()] DeleteBatch, @@ -264,6 +266,11 @@ async fn handler( .link_preview_options(link_preview_options) .await?; } + AllCommands::EditUnchanged => { + bot.edit_message_text(msg.chat.id, sent_message.id, msg.text().unwrap()) + .link_preview_options(link_preview_options) + .await?; + } AllCommands::Delete => { bot.delete_message(msg.chat.id, sent_message.id).await?; } @@ -554,22 +561,33 @@ async fn test_panic() { } pub struct MyErrorHandler { - some_bool: Arc, + errors: Arc>>, +} + +impl MyErrorHandler { + pub fn new() -> Self { + Self { + errors: Arc::new(RwLock::new(vec![])), + } + } + + pub fn errors(&self) -> Vec { + self.errors.read().unwrap().clone() + } } impl ErrorHandler for MyErrorHandler where E: std::fmt::Debug + Display + 'static + Sync + Send, { - fn handle_error(self: Arc, _error: E) -> BoxFuture<'static, ()> { + fn handle_error(self: Arc, error: E) -> BoxFuture<'static, ()> { thread::spawn(|| { respond_to_error(); }) .join() .unwrap(); - self.some_bool - .swap(true, std::sync::atomic::Ordering::SeqCst); + self.errors.write().unwrap().push(format!("{error:?}")); Box::pin(async {}) } } @@ -585,14 +603,14 @@ async fn respond_to_error() { #[tokio::test] async fn test_error_handler() { let mut bot = MockBot::new(MockMessageText::new().text("/panic"), get_schema()); - let some_bool = Arc::new(AtomicBool::new(false)); + let error_handler = Arc::new(MyErrorHandler::new()); + bot.error_handler(error_handler.clone()); - bot.error_handler(Arc::new(MyErrorHandler { - some_bool: some_bool.clone(), - })); bot.dispatch_and_check_last_text("Error detected!").await; - assert!(some_bool.load(std::sync::atomic::Ordering::SeqCst)); + let errors = error_handler.errors(); + assert_eq!(errors.len(), 1); + assert!(errors[0].contains("Message not found")); } #[tokio::test] @@ -981,6 +999,20 @@ async fn test_edit_message() { ); } +#[tokio::test] +async fn test_edit_message_unchanged() { + let mut bot = MockBot::new(MockMessageText::new().text("/editunchanged"), get_schema()); + let error_handler = Arc::new(MyErrorHandler::new()); + bot.error_handler(error_handler.clone()); + + bot.dispatch().await; + + assert!(bot.get_responses().edited_messages_text.is_empty()); + let errors = error_handler.errors(); + assert_eq!(errors.len(), 1); + assert_eq!(errors[0], "Api(MessageNotModified)"); +} + #[tokio::test] async fn test_edit_caption() { let mut bot = MockBot::new(MockMessageText::new().text("/editcaption"), get_schema()); From e7d64e06d61c0be750a8c24637924208ae52c919 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Sun, 2 Mar 2025 16:00:21 +0200 Subject: [PATCH 135/138] Added support for TBA 7.5 --- Cargo.lock | 1016 ++++++++-------- examples/Cargo.lock | 1050 +++++++++-------- examples/album_bot/Cargo.toml | 2 +- examples/album_bot/src/main.rs | 32 +- examples/calculator_bot/Cargo.toml | 2 +- examples/calculator_bot/src/handler_tree.rs | 21 +- examples/calculator_bot/src/handlers.rs | 3 +- examples/calculator_bot/src/main.rs | 7 +- examples/calculator_bot/src/tests.rs | 4 +- examples/deep_linking_bot/Cargo.toml | 2 +- examples/deep_linking_bot/src/handler_tree.rs | 10 +- examples/deep_linking_bot/src/handlers.rs | 3 +- examples/deep_linking_bot/src/main.rs | 6 +- examples/deep_linking_bot/src/tests.rs | 3 +- examples/file_download_bot/Cargo.toml | 2 +- examples/file_download_bot/src/main.rs | 3 +- examples/hello_world_bot/Cargo.toml | 2 +- examples/hello_world_bot/src/main.rs | 3 +- examples/phrase_bot/Cargo.toml | 2 +- examples/phrase_bot/src/db/mod.rs | 3 +- examples/phrase_bot/src/db/models.rs | 3 +- examples/phrase_bot/src/handlers/private.rs | 18 +- examples/phrase_bot/src/handlers/public.rs | 3 +- examples/phrase_bot/src/main.rs | 12 +- .../phrase_bot/src/resources/handler_tree.rs | 22 +- examples/phrase_bot/src/resources/text.rs | 8 +- teloxide_tests/Cargo.toml | 4 +- teloxide_tests/src/dataset/chat.rs | 141 +-- teloxide_tests/src/dataset/chat_full_info.rs | 371 ++++++ teloxide_tests/src/dataset/message_common.rs | 20 +- teloxide_tests/src/dataset/mod.rs | 65 +- teloxide_tests/src/dataset/tests.rs | 47 +- .../src/server/routes/copy_message.rs | 1 + .../src/server/routes/edit_message_caption.rs | 8 +- .../routes/edit_message_reply_markup.rs | 3 +- .../src/server/routes/edit_message_text.rs | 3 +- teloxide_tests/src/server/routes/mod.rs | 7 +- .../src/server/routes/pin_chat_message.rs | 2 + .../src/server/routes/send_animation.rs | 14 +- .../src/server/routes/send_audio.rs | 13 +- .../src/server/routes/send_chat_action.rs | 2 + .../src/server/routes/send_contact.rs | 5 +- teloxide_tests/src/server/routes/send_dice.rs | 3 +- .../src/server/routes/send_document.rs | 13 +- .../src/server/routes/send_location.rs | 7 +- .../src/server/routes/send_media_group.rs | 27 +- .../src/server/routes/send_message.rs | 6 +- .../src/server/routes/send_photo.rs | 14 +- teloxide_tests/src/server/routes/send_poll.rs | 12 +- .../src/server/routes/send_sticker.rs | 5 +- .../src/server/routes/send_venue.rs | 5 +- .../src/server/routes/send_video.rs | 14 +- .../src/server/routes/send_video_note.rs | 11 +- .../src/server/routes/send_voice.rs | 13 +- .../src/server/routes/unpin_chat_message.rs | 2 + teloxide_tests/src/tests.rs | 13 +- 56 files changed, 1797 insertions(+), 1296 deletions(-) create mode 100644 teloxide_tests/src/dataset/chat_full_info.rs diff --git a/Cargo.lock b/Cargo.lock index c9c2bb3..4dcab42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "actix-codec" @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.6.0", + "bitflags", "bytes", "futures-core", "futures-sink", @@ -31,11 +31,11 @@ dependencies = [ "actix-utils", "ahash", "base64", - "bitflags 2.6.0", + "bitflags", "brotli", "bytes", "bytestring", - "derive_more 0.99.18", + "derive_more 0.99.19", "encoding_rs", "flate2", "futures-core", @@ -49,7 +49,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand", + "rand 0.8.5", "sha1", "smallvec", "tokio", @@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -77,7 +77,7 @@ dependencies = [ "actix-multipart-derive", "actix-utils", "actix-web", - "derive_more 0.99.18", + "derive_more 0.99.19", "futures-core", "futures-util", "httparse", @@ -85,7 +85,7 @@ dependencies = [ "log", "memchr", "mime", - "rand", + "rand 0.8.5", "serde", "serde_json", "serde_plain", @@ -99,11 +99,11 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e11eb847f49a700678ea2fa73daeb3208061afa2b9d1a8527c03390f4c4a1c6b" dependencies = [ - "darling 0.20.10", + "darling", "parse-size", "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -189,7 +189,7 @@ dependencies = [ "bytestring", "cfg-if", "cookie", - "derive_more 0.99.18", + "derive_more 0.99.19", "encoding_rs", "futures-core", "futures-util", @@ -220,7 +220,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -269,7 +269,7 @@ checksum = "4c221da13534b9352f3f79fcbbd6095f6d8aee63bdf1da8a73d36f9eeea17d5a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -294,10 +294,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -326,9 +326,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.19" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611cc2ae7d2e242c457e4be7f97036b8ad9ca152b499f53faf99b1ed8fc2553f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -386,26 +386,27 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] [[package]] name = "aquamarine" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21cc1548309245035eb18aa7f0967da6bc65587005170c56e6ef2788a4cf3f4e" +checksum = "0f50776554130342de4836ba542aa85a4ddb361690d7e8df13774d7284c3d5c2" dependencies = [ "include_dir", "itertools 0.10.5", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -458,15 +459,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "block-buffer" @@ -490,9 +485,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.1" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -500,15 +495,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" -version = "1.19.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" @@ -518,24 +513,24 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "bytestring" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" +checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" dependencies = [ "bytes", ] [[package]] name = "cc" -version = "1.1.37" +version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ "jobserver", "libc", @@ -556,16 +551,17 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -618,9 +614,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -651,18 +647,18 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" @@ -676,9 +672,9 @@ dependencies = [ [[package]] name = "csv" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" dependencies = [ "csv-core", "itoa", @@ -688,9 +684,9 @@ dependencies = [ [[package]] name = "csv-core" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" dependencies = [ "memchr", ] @@ -705,38 +701,14 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core 0.13.4", - "darling_macro 0.13.4", -] - [[package]] name = "darling" version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "darling_core 0.20.10", - "darling_macro 0.20.10", -] - -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", + "darling_core", + "darling_macro", ] [[package]] @@ -749,19 +721,8 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim 0.11.1", - "syn 2.0.87", -] - -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core 0.13.4", - "quote", - "syn 1.0.109", + "strsim", + "syn", ] [[package]] @@ -770,9 +731,9 @@ version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core 0.20.10", + "darling_core", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -782,19 +743,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", + "serde", ] [[package]] name = "derive_more" -version = "0.99.18" +version = "0.99.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 2.0.87", + "syn", ] [[package]] @@ -814,7 +776,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", "unicode-xid", ] @@ -837,7 +799,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -863,9 +825,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" dependencies = [ "serde", ] @@ -881,9 +843,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ "log", "regex", @@ -904,9 +866,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" dependencies = [ "anstream", "anstyle", @@ -917,15 +879,15 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erasable" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f11890ce181d47a64e5d1eb4b6caba0e7bae911a356723740d058a5d0340b7d" +checksum = "437cfb75878119ed8265685c41a115724eae43fb7cc5a0bf0e4ecc3b803af1c4" dependencies = [ "autocfg", "scopeguard", @@ -933,12 +895,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -954,9 +916,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ "concurrent-queue", "parking", @@ -965,26 +927,26 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "filedescriptor" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e" +checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" dependencies = [ "libc", - "thiserror", + "thiserror 1.0.69", "winapi", ] [[package]] name = "flate2" -version = "1.0.34" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" dependencies = [ "crc32fast", "miniz_oxide", @@ -1007,6 +969,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "foreign-types" version = "0.3.2" @@ -1098,7 +1066,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -1159,7 +1127,19 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", ] [[package]] @@ -1180,7 +1160,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -1189,17 +1169,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.1.0", - "indexmap", + "http 1.2.0", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -1208,47 +1188,36 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "hashlink" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - [[package]] name = "hermit-abi" version = "0.4.0" @@ -1281,11 +1250,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1301,9 +1270,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -1317,7 +1286,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http 1.2.0", ] [[package]] @@ -1328,16 +1297,16 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "httpdate" @@ -1353,15 +1322,15 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.6", - "http 1.1.0", + "h2 0.4.8", + "http 1.2.0", "http-body", "httparse", "itoa", @@ -1373,12 +1342,12 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 1.1.0", + "http 1.2.0", "hyper", "hyper-util", "rustls", @@ -1413,7 +1382,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body", "hyper", "pin-project-lite", @@ -1561,7 +1530,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -1593,9 +1562,9 @@ dependencies = [ [[package]] name = "impl-more" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae21c3177a27788957044151cc2800043d127acaa460a47ebb9b84dfa2c6aa0" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" [[package]] name = "include_dir" @@ -1618,29 +1587,41 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", - "hashbrown 0.15.1", + "hashbrown 0.15.2", + "serde", ] [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is-terminal" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" dependencies = [ - "hermit-abi 0.4.0", + "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1669,9 +1650,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jobserver" @@ -1684,10 +1665,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -1705,9 +1687,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.162" +version = "0.2.170" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" [[package]] name = "libsqlite3-sys" @@ -1722,15 +1704,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "local-channel" @@ -1761,9 +1743,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "md-5" @@ -1777,9 +1759,9 @@ dependencies = [ [[package]] name = "mediatype" -version = "0.19.18" +version = "0.19.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8878cd8d1b3c8c8ae4b2ba0a36652b7cf192f618a599a7fbdfa25cffd4ea72dd" +checksum = "659f336e6cbe1083b58900e48649ed99fc99952a983e8d8cc992494394dd3732" [[package]] name = "memchr" @@ -1803,39 +1785,32 @@ dependencies = [ "unicase", ] -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -1854,22 +1829,12 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.6.0", + "bitflags", "cfg-if", "cfg_aliases", "libc", ] -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "num-conv" version = "0.1.0" @@ -1887,26 +1852,26 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" dependencies = [ - "bitflags 2.6.0", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -1923,20 +1888,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" dependencies = [ "cc", "libc", @@ -1993,29 +1958,29 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -2041,7 +2006,7 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -2055,43 +2020,40 @@ dependencies = [ ] [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ + "proc-macro-error-attr2", "proc-macro2", "quote", - "version_check", ] [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -2103,8 +2065,19 @@ 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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "zerocopy 0.8.21", ] [[package]] @@ -2114,7 +2087,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.3", ] [[package]] @@ -2123,25 +2106,34 @@ 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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.1", ] [[package]] name = "rc-box" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0690759eabf094030c2cdabc25ade1395bac02210d920d655053c1d49583fd8" +checksum = "897fecc9fac6febd4408f9e935e86df739b0023b625e610e0357535b9c8adad0" dependencies = [ "erasable", ] [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" dependencies = [ - "bitflags 2.6.0", + "bitflags", ] [[package]] @@ -2158,9 +2150,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -2181,17 +2173,17 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.4.6", - "http 1.1.0", + "h2 0.4.8", + "http 1.2.0", "http-body", "http-body-util", "hyper", @@ -2216,6 +2208,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-util", + "tower", "tower-service", "url", "wasm-bindgen", @@ -2236,15 +2229,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -2266,22 +2258,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.39" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.16" +version = "0.23.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" dependencies = [ "once_cell", "rustls-pki-types", @@ -2301,9 +2293,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-webpki" @@ -2316,26 +2308,32 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "scc" -version = "2.2.4" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8d25269dd3a12467afe2e510f69fb0b46b698e5afb296b59f2145259deaf8e8" +checksum = "ea091f6cac2595aa38993f04f4ee692ed43757035c36e67c180b6828356385b1" dependencies = [ "sdd", ] [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] @@ -2348,9 +2346,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sdd" -version = "3.0.4" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49c1eeaf4b6a87c7479688c6d52b9f1153cedd3c489300564f932b065c6eab95" +checksum = "b07779b9b918cc05650cb30f404d4d7835d26df37c235eded8a6832e2fb82cca" [[package]] name = "security-framework" @@ -2358,7 +2356,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -2367,9 +2365,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -2377,38 +2375,38 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" -version = "1.0.214" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "serde_html_form" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de514ef58196f1fc96dcaef80fe6170a1ce6215df9687a93fe8300e773fefc5" +checksum = "9d2de91cf02bbc07cde38891769ccd5d4f073d22a40683aa4bc7a95781aaa2c4" dependencies = [ "form_urlencoded", - "indexmap", + "indexmap 2.7.1", "itoa", "ryu", "serde", @@ -2416,9 +2414,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" dependencies = [ "itoa", "memchr", @@ -2459,24 +2457,32 @@ dependencies = [ [[package]] name = "serde_with" -version = "1.14.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.7.1", "serde", + "serde_derive", + "serde_json", "serde_with_macros", + "time", ] [[package]] name = "serde_with_macros" -version = "1.5.2" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ - "darling 0.13.4", + "darling", "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] @@ -2501,7 +2507,7 @@ checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -2552,18 +2558,18 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" dependencies = [ "serde", ] [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -2578,21 +2584,11 @@ dependencies = [ "lock_api", ] -[[package]] -name = "sqlformat" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" -dependencies = [ - "nom", - "unicode_categories", -] - [[package]] name = "sqlx" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" +checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2602,38 +2598,32 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" +checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" dependencies = [ - "atoi", - "byteorder", "bytes", "crc", "crossbeam-queue", "either", "event-listener", - "futures-channel", "futures-core", "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.14.5", + "hashbrown 0.15.2", "hashlink", - "hex", - "indexmap", + "indexmap 2.7.1", "log", "memchr", "native-tls", "once_cell", - "paste", "percent-encoding", "serde", "serde_json", "sha2", "smallvec", - "sqlformat", - "thiserror", + "thiserror 2.0.11", "tokio", "tokio-stream", "tracing", @@ -2642,26 +2632,26 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" +checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.87", + "syn", ] [[package]] name = "sqlx-macros-core" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" +checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" dependencies = [ "dotenvy", "either", - "heck 0.5.0", + "heck", "hex", "once_cell", "proc-macro2", @@ -2672,7 +2662,7 @@ dependencies = [ "sqlx-core", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.87", + "syn", "tempfile", "tokio", "url", @@ -2680,20 +2670,19 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" +checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" dependencies = [ "atoi", "base64", - "bitflags 2.6.0", + "bitflags", "byteorder", "crc", "dotenvy", "etcetera", "futures-channel", "futures-core", - "futures-io", "futures-util", "hex", "hkdf", @@ -2704,23 +2693,23 @@ dependencies = [ "md-5", "memchr", "once_cell", - "rand", + "rand 0.8.5", "serde", "serde_json", "sha2", "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 2.0.11", "tracing", "whoami", ] [[package]] name = "sqlx-sqlite" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" +checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" dependencies = [ "atoi", "flume", @@ -2756,12 +2745,6 @@ dependencies = [ "unicode-properties", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -2776,20 +2759,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.87" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -2798,9 +2770,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] @@ -2813,7 +2785,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -2822,7 +2794,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.6.0", + "bitflags", "core-foundation", "system-configuration-sys", ] @@ -2852,11 +2824,11 @@ checksum = "20f34339676cdcab560c9a82300c4c2581f68b9369aedf0fae86f2ff9565ff3e" [[package]] name = "teloxide" version = "0.13.0" -source = "git+https://github.com/teloxide/teloxide.git?rev=94db1757dc96116f4756a586fcbce3ac5ebd0c59#94db1757dc96116f4756a586fcbce3ac5ebd0c59" +source = "git+https://github.com/teloxide/teloxide.git?rev=c590976722378a3a02ad5f5dac06b30a4e013395#c590976722378a3a02ad5f5dac06b30a4e013395" dependencies = [ "aquamarine", "bytes", - "derive_more 0.99.18", + "derive_more 1.0.0", "dptree", "either", "futures", @@ -2868,7 +2840,7 @@ dependencies = [ "sqlx", "teloxide-core", "teloxide-macros", - "thiserror", + "thiserror 2.0.11", "tokio", "tokio-stream", "tokio-util", @@ -2878,12 +2850,12 @@ dependencies = [ [[package]] name = "teloxide-core" version = "0.10.1" -source = "git+https://github.com/teloxide/teloxide.git?rev=94db1757dc96116f4756a586fcbce3ac5ebd0c59#94db1757dc96116f4756a586fcbce3ac5ebd0c59" +source = "git+https://github.com/teloxide/teloxide.git?rev=c590976722378a3a02ad5f5dac06b30a4e013395#c590976722378a3a02ad5f5dac06b30a4e013395" dependencies = [ - "bitflags 1.3.2", + "bitflags", "bytes", "chrono", - "derive_more 0.99.18", + "derive_more 1.0.0", "either", "futures", "log", @@ -2898,7 +2870,7 @@ dependencies = [ "serde_with", "take_mut", "takecell", - "thiserror", + "thiserror 2.0.11", "tokio", "tokio-util", "url", @@ -2908,13 +2880,12 @@ dependencies = [ [[package]] name = "teloxide-macros" version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e2d33d809c3e7161a9ab18bedddf98821245014f0a78fa4d2c9430b2ec018c1" +source = "git+https://github.com/teloxide/teloxide.git?rev=c590976722378a3a02ad5f5dac06b30a4e013395#c590976722378a3a02ad5f5dac06b30a4e013395" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] @@ -2927,7 +2898,7 @@ dependencies = [ "chrono", "ctrlc", "dotenv", - "env_logger 0.11.5", + "env_logger 0.11.6", "futures-util", "gag", "lazy_static", @@ -2935,7 +2906,7 @@ dependencies = [ "mime", "mime_guess", "pretty_env_logger", - "rand", + "rand 0.9.0", "reqwest", "serde", "serde_json", @@ -2953,7 +2924,7 @@ version = "0.2.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -2964,17 +2935,18 @@ checksum = "4a6bc538b4fd0adfd705c62a79db2eca5fad350347fb2e6af54358ea0c52095a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "tempfile" -version = "3.14.0" +version = "3.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" dependencies = [ "cfg-if", "fastrand", + "getrandom 0.3.1", "once_cell", "rustix", "windows-sys 0.59.0", @@ -2991,29 +2963,49 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.68" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +dependencies = [ + "thiserror-impl 2.0.11", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "thiserror-impl" -version = "1.0.68" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -3032,9 +3024,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -3052,9 +3044,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -3067,9 +3059,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.1" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -3085,13 +3077,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -3106,20 +3098,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -3128,9 +3119,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -3139,6 +3130,27 @@ dependencies = [ "tokio", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -3147,9 +3159,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -3159,20 +3171,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", ] @@ -3185,27 +3197,27 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicase" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-bidi" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" [[package]] name = "unicode-normalization" @@ -3228,12 +3240,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - [[package]] name = "untrusted" version = "0.9.0" @@ -3242,9 +3248,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -3272,11 +3278,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.11.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" dependencies = [ - "getrandom", + "getrandom 0.3.1", ] [[package]] @@ -3306,6 +3312,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasite" version = "0.1.0" @@ -3314,47 +3329,48 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3362,22 +3378,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-streams" @@ -3394,9 +3413,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -3452,6 +3471,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + [[package]] name = "windows-registry" version = "0.2.0" @@ -3630,6 +3655,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags", +] + [[package]] name = "write16" version = "1.0.0" @@ -3644,9 +3678,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "yoke" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -3656,13 +3690,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", "synstructure", ] @@ -3673,7 +3707,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf01143b2dd5d134f11f545cf9f1431b13b749695cb33bcce051e7568f99478" +dependencies = [ + "zerocopy-derive 0.8.21", ] [[package]] @@ -3684,27 +3727,38 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712c8386f4f4299382c9abee219bee7084f78fb939d88b6840fcc1320d5f6da2" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", "synstructure", ] @@ -3733,32 +3787,32 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "zstd" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.14+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" dependencies = [ "cc", "pkg-config", diff --git a/examples/Cargo.lock b/examples/Cargo.lock index 74fb564..a211fc4 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.6.0", + "bitflags", "bytes", "futures-core", "futures-sink", @@ -31,11 +31,11 @@ dependencies = [ "actix-utils", "ahash", "base64", - "bitflags 2.6.0", + "bitflags", "brotli", "bytes", "bytestring", - "derive_more 0.99.18", + "derive_more 0.99.19", "encoding_rs", "flate2", "futures-core", @@ -49,7 +49,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand", + "rand 0.8.5", "sha1", "smallvec", "tokio", @@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -77,7 +77,7 @@ dependencies = [ "actix-multipart-derive", "actix-utils", "actix-web", - "derive_more 0.99.18", + "derive_more 0.99.19", "futures-core", "futures-util", "httparse", @@ -85,7 +85,7 @@ dependencies = [ "log", "memchr", "mime", - "rand", + "rand 0.8.5", "serde", "serde_json", "serde_plain", @@ -99,11 +99,11 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e11eb847f49a700678ea2fa73daeb3208061afa2b9d1a8527c03390f4c4a1c6b" dependencies = [ - "darling 0.20.10", + "darling", "parse-size", "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -189,7 +189,7 @@ dependencies = [ "bytestring", "cfg-if", "cookie", - "derive_more 0.99.18", + "derive_more 0.99.19", "encoding_rs", "futures-core", "futures-util", @@ -220,7 +220,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -269,7 +269,7 @@ checksum = "4c221da13534b9352f3f79fcbbd6095f6d8aee63bdf1da8a73d36f9eeea17d5a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -294,10 +294,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.2.15", "once_cell", "version_check", - "zerocopy", + "zerocopy 0.7.35", ] [[package]] @@ -338,9 +338,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.19" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611cc2ae7d2e242c457e4be7f97036b8ad9ca152b499f53faf99b1ed8fc2553f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -398,26 +398,27 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", + "once_cell", "windows-sys 0.59.0", ] [[package]] name = "aquamarine" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21cc1548309245035eb18aa7f0967da6bc65587005170c56e6ef2788a4cf3f4e" +checksum = "0f50776554130342de4836ba542aa85a4ddb361690d7e8df13774d7284c3d5c2" dependencies = [ "include_dir", "itertools 0.10.5", - "proc-macro-error", + "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -428,13 +429,13 @@ checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -481,15 +482,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "block-buffer" @@ -513,9 +508,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.1" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -523,15 +518,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" -version = "1.19.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" @@ -541,15 +536,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" [[package]] name = "bytestring" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" +checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" dependencies = [ "bytes", ] @@ -570,9 +565,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.37" +version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40545c26d092346d8a8dab71ee48e7685a7a9cba76e634790c215b41a4a7b4cf" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ "jobserver", "libc", @@ -593,16 +588,17 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-link", ] [[package]] @@ -669,9 +665,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -702,18 +698,18 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto-common" @@ -727,9 +723,9 @@ dependencies = [ [[package]] name = "csv" -version = "1.3.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" dependencies = [ "csv-core", "itoa", @@ -739,9 +735,9 @@ dependencies = [ [[package]] name = "csv-core" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" dependencies = [ "memchr", ] @@ -756,38 +752,14 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core 0.13.4", - "darling_macro 0.13.4", -] - [[package]] name = "darling" version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ - "darling_core 0.20.10", - "darling_macro 0.20.10", -] - -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", + "darling_core", + "darling_macro", ] [[package]] @@ -800,19 +772,8 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "strsim 0.11.1", - "syn 2.0.87", -] - -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core 0.13.4", - "quote", - "syn 1.0.109", + "strsim", + "syn", ] [[package]] @@ -821,18 +782,17 @@ version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ - "darling_core 0.20.10", + "darling_core", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "deadpool" -version = "0.10.0" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb84100978c1c7b37f09ed3ce3e5f843af02c2a2c431bae5b19230dad2c1b490" +checksum = "5ed5957ff93768adf7a65ab167a17835c3d2c3c50d084fe305174c112f468e2f" dependencies = [ - "async-trait", "deadpool-runtime", "num_cpus", "tokio", @@ -840,9 +800,9 @@ dependencies = [ [[package]] name = "deadpool-redis" -version = "0.14.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f2381b0e993d06a1f6d49f486b33bc4004085bf980340fc05726bacc681fff" +checksum = "bfae6799b68a735270e4344ee3e834365f707c72da09c9a8bb89b45cc3351395" dependencies = [ "deadpool", "redis", @@ -876,19 +836,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", + "serde", ] [[package]] name = "derive_more" -version = "0.99.18" +version = "0.99.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" dependencies = [ "convert_case", "proc-macro2", "quote", "rustc_version", - "syn 2.0.87", + "syn", ] [[package]] @@ -908,17 +869,17 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", "unicode-xid", ] [[package]] name = "diesel" -version = "2.2.4" +version = "2.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "158fe8e2e68695bd615d7e4f3227c0727b151330d3e253b525086c348d055d5e" +checksum = "04001f23ba8843dc315804fa324000376084dfb1c30794ff68dd279e6e5696d5" dependencies = [ - "bitflags 2.6.0", + "bitflags", "byteorder", "diesel_derives", "itoa", @@ -935,7 +896,7 @@ dependencies = [ "dsl_auto_type", "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -944,7 +905,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" dependencies = [ - "syn 2.0.87", + "syn", ] [[package]] @@ -966,7 +927,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -992,23 +953,23 @@ dependencies = [ [[package]] name = "dsl_auto_type" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5d9abe6314103864cc2d8901b7ae224e0ab1a103a0a416661b4097b0779b607" +checksum = "139ae9aca7527f85f26dd76483eb38533fd84bd571065da1739656ef71c5ff5b" dependencies = [ - "darling 0.20.10", + "darling", "either", - "heck 0.5.0", + "heck", "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "either" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" dependencies = [ "serde", ] @@ -1024,9 +985,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ "log", "regex", @@ -1047,9 +1008,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" dependencies = [ "anstream", "anstyle", @@ -1060,15 +1021,15 @@ dependencies = [ [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erasable" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f11890ce181d47a64e5d1eb4b6caba0e7bae911a356723740d058a5d0340b7d" +checksum = "437cfb75878119ed8265685c41a115724eae43fb7cc5a0bf0e4ecc3b803af1c4" dependencies = [ "autocfg", "scopeguard", @@ -1076,12 +1037,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1097,9 +1058,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ "concurrent-queue", "parking", @@ -1108,9 +1069,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "file_download_bot" @@ -1124,20 +1085,20 @@ dependencies = [ [[package]] name = "filedescriptor" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7199d965852c3bac31f779ef99cbb4537f80e952e2d6aa0ffeb30cce00f4f46e" +checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" dependencies = [ "libc", - "thiserror", + "thiserror 1.0.69", "winapi", ] [[package]] name = "flate2" -version = "1.0.34" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" dependencies = [ "crc32fast", "miniz_oxide", @@ -1160,6 +1121,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "foreign-types" version = "0.3.2" @@ -1251,7 +1218,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -1312,7 +1279,19 @@ checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.13.3+wasi-0.2.2", + "windows-targets 0.52.6", ] [[package]] @@ -1333,7 +1312,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -1342,17 +1321,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.6" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.1.0", - "indexmap", + "http 1.2.0", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -1367,35 +1346,30 @@ checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "hashlink" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "heck" version = "0.5.0" @@ -1450,11 +1424,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1470,9 +1444,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -1486,7 +1460,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http 1.2.0", ] [[package]] @@ -1497,16 +1471,16 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.9.5" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" [[package]] name = "httpdate" @@ -1522,15 +1496,15 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.6", - "http 1.1.0", + "h2 0.4.8", + "http 1.2.0", "http-body", "httparse", "itoa", @@ -1542,12 +1516,12 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 1.1.0", + "http 1.2.0", "hyper", "hyper-util", "rustls", @@ -1582,7 +1556,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body", "hyper", "pin-project-lite", @@ -1730,7 +1704,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -1762,9 +1736,9 @@ dependencies = [ [[package]] name = "impl-more" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae21c3177a27788957044151cc2800043d127acaa460a47ebb9b84dfa2c6aa0" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" [[package]] name = "include_dir" @@ -1787,29 +1761,41 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", - "hashbrown 0.15.1", + "hashbrown 0.15.2", + "serde", ] [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is-terminal" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" dependencies = [ "hermit-abi 0.4.0", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1838,9 +1824,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jobserver" @@ -1853,10 +1839,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -1874,9 +1861,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.162" +version = "0.2.170" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" [[package]] name = "libsqlite3-sys" @@ -1891,15 +1878,15 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" [[package]] name = "local-channel" @@ -1930,9 +1917,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" [[package]] name = "md-5" @@ -1946,9 +1933,9 @@ dependencies = [ [[package]] name = "mediatype" -version = "0.19.18" +version = "0.19.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8878cd8d1b3c8c8ae4b2ba0a36652b7cf192f618a599a7fbdfa25cffd4ea72dd" +checksum = "659f336e6cbe1083b58900e48649ed99fc99952a983e8d8cc992494394dd3732" [[package]] name = "memchr" @@ -1972,39 +1959,32 @@ dependencies = [ "unicase", ] -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", ] [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ "libc", "log", @@ -2023,20 +2003,20 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.6.0", + "bitflags", "cfg-if", "cfg_aliases", "libc", ] [[package]] -name = "nom" -version = "7.1.3" +name = "num-bigint" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "memchr", - "minimal-lexical", + "num-integer", + "num-traits", ] [[package]] @@ -2045,6 +2025,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2066,26 +2055,26 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.2" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" dependencies = [ - "bitflags 2.6.0", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -2102,20 +2091,20 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" dependencies = [ "cc", "libc", @@ -2187,29 +2176,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pin-utils" @@ -2235,15 +2224,16 @@ version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy", + "zerocopy 0.7.35", ] [[package]] name = "pq-sys" -version = "0.6.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6cc05d7ea95200187117196eee9edd0644424911821aeb28a18ce60ea0b8793" +checksum = "30b51d65ebe1cb1f40641b15abae017fed35ccdda46e3dab1ff8768f625a3222" dependencies = [ + "libc", "vcpkg", ] @@ -2258,43 +2248,40 @@ dependencies = [ ] [[package]] -name = "proc-macro-error" -version = "1.0.4" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "proc-macro-error-attr", "proc-macro2", "quote", - "syn 1.0.109", - "version_check", ] [[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ + "proc-macro-error-attr2", "proc-macro2", "quote", - "version_check", ] [[package]] name = "proc-macro2" -version = "1.0.89" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -2306,8 +2293,19 @@ 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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", + "zerocopy 0.8.21", ] [[package]] @@ -2317,7 +2315,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.3", ] [[package]] @@ -2326,29 +2334,41 @@ 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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.1", ] [[package]] name = "rc-box" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0690759eabf094030c2cdabc25ade1395bac02210d920d655053c1d49583fd8" +checksum = "897fecc9fac6febd4408f9e935e86df739b0023b625e610e0357535b9c8adad0" dependencies = [ "erasable", ] [[package]] name = "redis" -version = "0.24.0" +version = "0.27.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c580d9cbbe1d1b479e8d67cf9daf6a62c957e6846048408b80b43ac3f6af84cd" +checksum = "09d8f99a4090c89cc489a94833c901ead69bfbf3877b4867d5482e321ee875bc" dependencies = [ + "arc-swap", "async-trait", "bytes", "combine", "futures-util", + "itertools 0.13.0", "itoa", + "num-bigint", "percent-encoding", "pin-project-lite", "ryu", @@ -2359,11 +2379,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" dependencies = [ - "bitflags 2.6.0", + "bitflags", ] [[package]] @@ -2380,9 +2400,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -2403,17 +2423,17 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.9" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.4.6", - "http 1.1.0", + "h2 0.4.8", + "http 1.2.0", "http-body", "http-body-util", "hyper", @@ -2438,6 +2458,7 @@ dependencies = [ "tokio", "tokio-native-tls", "tokio-util", + "tower", "tower-service", "url", "wasm-bindgen", @@ -2458,15 +2479,14 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.8" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.15", "libc", - "spin", "untrusted", "windows-sys 0.52.0", ] @@ -2488,22 +2508,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.39" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "rustls" -version = "0.23.16" +version = "0.23.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" dependencies = [ "once_cell", "rustls-pki-types", @@ -2523,9 +2543,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-webpki" @@ -2538,17 +2558,23 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] @@ -2565,7 +2591,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -2574,9 +2600,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" dependencies = [ "core-foundation-sys", "libc", @@ -2584,15 +2610,15 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" [[package]] name = "serde" -version = "1.0.214" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" dependencies = [ "serde_derive", ] @@ -2609,23 +2635,23 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.218" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "serde_html_form" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de514ef58196f1fc96dcaef80fe6170a1ce6215df9687a93fe8300e773fefc5" +checksum = "9d2de91cf02bbc07cde38891769ccd5d4f073d22a40683aa4bc7a95781aaa2c4" dependencies = [ "form_urlencoded", - "indexmap", + "indexmap 2.7.1", "itoa", "ryu", "serde", @@ -2633,9 +2659,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.139" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" dependencies = [ "itoa", "memchr", @@ -2676,24 +2702,32 @@ dependencies = [ [[package]] name = "serde_with" -version = "1.14.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.7.1", "serde", + "serde_derive", + "serde_json", "serde_with_macros", + "time", ] [[package]] name = "serde_with_macros" -version = "1.5.2" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ - "darling 0.13.4", + "darling", "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] @@ -2744,18 +2778,18 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.13.2" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" dependencies = [ "serde", ] [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -2770,21 +2804,11 @@ dependencies = [ "lock_api", ] -[[package]] -name = "sqlformat" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" -dependencies = [ - "nom", - "unicode_categories", -] - [[package]] name = "sqlx" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93334716a037193fac19df402f8571269c84a00852f6a7066b5d2616dcd64d3e" +checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2794,38 +2818,32 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d8060b456358185f7d50c55d9b5066ad956956fddec42ee2e8567134a8936e" +checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" dependencies = [ - "atoi", - "byteorder", "bytes", "crc", "crossbeam-queue", "either", "event-listener", - "futures-channel", "futures-core", "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.14.5", + "hashbrown 0.15.2", "hashlink", - "hex", - "indexmap", + "indexmap 2.7.1", "log", "memchr", "native-tls", "once_cell", - "paste", "percent-encoding", "serde", "serde_json", "sha2", "smallvec", - "sqlformat", - "thiserror", + "thiserror 2.0.11", "tokio", "tokio-stream", "tracing", @@ -2834,26 +2852,26 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cac0692bcc9de3b073e8d747391827297e075c7710ff6276d9f7a1f3d58c6657" +checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.87", + "syn", ] [[package]] name = "sqlx-macros-core" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1804e8a7c7865599c9c79be146dc8a9fd8cc86935fa641d3ea58e5f0688abaa5" +checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" dependencies = [ "dotenvy", "either", - "heck 0.5.0", + "heck", "hex", "once_cell", "proc-macro2", @@ -2864,7 +2882,7 @@ dependencies = [ "sqlx-core", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.87", + "syn", "tempfile", "tokio", "url", @@ -2872,20 +2890,19 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fa91a732d854c5d7726349bb4bb879bb9478993ceb764247660aee25f67c2f8" +checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" dependencies = [ "atoi", "base64", - "bitflags 2.6.0", + "bitflags", "byteorder", "crc", "dotenvy", "etcetera", "futures-channel", "futures-core", - "futures-io", "futures-util", "hex", "hkdf", @@ -2896,23 +2913,23 @@ dependencies = [ "md-5", "memchr", "once_cell", - "rand", + "rand 0.8.5", "serde", "serde_json", "sha2", "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 2.0.11", "tracing", "whoami", ] [[package]] name = "sqlx-sqlite" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5b2cf34a45953bfd3daaf3db0f7a7878ab9b7a6b91b422d24a7a9e4c857b680" +checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" dependencies = [ "atoi", "flume", @@ -2948,12 +2965,6 @@ dependencies = [ "unicode-properties", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "strsim" version = "0.11.1" @@ -2968,20 +2979,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -2990,9 +2990,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] @@ -3005,7 +3005,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -3014,7 +3014,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.6.0", + "bitflags", "core-foundation", "system-configuration-sys", ] @@ -3044,12 +3044,12 @@ checksum = "20f34339676cdcab560c9a82300c4c2581f68b9369aedf0fae86f2ff9565ff3e" [[package]] name = "teloxide" version = "0.13.0" -source = "git+https://github.com/teloxide/teloxide.git?rev=94db1757dc96116f4756a586fcbce3ac5ebd0c59#94db1757dc96116f4756a586fcbce3ac5ebd0c59" +source = "git+https://github.com/teloxide/teloxide.git?rev=c590976722378a3a02ad5f5dac06b30a4e013395#c590976722378a3a02ad5f5dac06b30a4e013395" dependencies = [ "aquamarine", "bytes", "deadpool-redis", - "derive_more 0.99.18", + "derive_more 1.0.0", "dptree", "either", "futures", @@ -3062,7 +3062,7 @@ dependencies = [ "sqlx", "teloxide-core", "teloxide-macros", - "thiserror", + "thiserror 2.0.11", "tokio", "tokio-stream", "tokio-util", @@ -3072,12 +3072,12 @@ dependencies = [ [[package]] name = "teloxide-core" version = "0.10.1" -source = "git+https://github.com/teloxide/teloxide.git?rev=94db1757dc96116f4756a586fcbce3ac5ebd0c59#94db1757dc96116f4756a586fcbce3ac5ebd0c59" +source = "git+https://github.com/teloxide/teloxide.git?rev=c590976722378a3a02ad5f5dac06b30a4e013395#c590976722378a3a02ad5f5dac06b30a4e013395" dependencies = [ - "bitflags 1.3.2", + "bitflags", "bytes", "chrono", - "derive_more 0.99.18", + "derive_more 1.0.0", "either", "futures", "log", @@ -3092,7 +3092,7 @@ dependencies = [ "serde_with", "take_mut", "takecell", - "thiserror", + "thiserror 2.0.11", "tokio", "tokio-util", "url", @@ -3102,13 +3102,12 @@ dependencies = [ [[package]] name = "teloxide-macros" version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e2d33d809c3e7161a9ab18bedddf98821245014f0a78fa4d2c9430b2ec018c1" +source = "git+https://github.com/teloxide/teloxide.git?rev=c590976722378a3a02ad5f5dac06b30a4e013395#c590976722378a3a02ad5f5dac06b30a4e013395" dependencies = [ - "heck 0.4.1", + "heck", "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] @@ -3121,7 +3120,7 @@ dependencies = [ "chrono", "ctrlc", "dotenv", - "env_logger 0.11.5", + "env_logger 0.11.6", "futures-util", "gag", "lazy_static", @@ -3129,7 +3128,7 @@ dependencies = [ "mime", "mime_guess", "pretty_env_logger", - "rand", + "rand 0.9.0", "reqwest", "serde", "serde_json", @@ -3148,17 +3147,18 @@ checksum = "4a6bc538b4fd0adfd705c62a79db2eca5fad350347fb2e6af54358ea0c52095a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "tempfile" -version = "3.14.0" +version = "3.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" dependencies = [ "cfg-if", "fastrand", + "getrandom 0.3.1", "once_cell", "rustix", "windows-sys 0.59.0", @@ -3175,29 +3175,49 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.68" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +dependencies = [ + "thiserror-impl 2.0.11", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "thiserror-impl" -version = "1.0.68" +version = "2.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -3216,9 +3236,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -3236,9 +3256,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -3251,9 +3271,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.1" +version = "1.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" dependencies = [ "backtrace", "bytes", @@ -3269,13 +3289,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] @@ -3290,20 +3310,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -3312,9 +3331,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -3323,6 +3342,27 @@ dependencies = [ "tokio", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -3331,9 +3371,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -3343,20 +3383,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", ] @@ -3369,27 +3409,27 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicase" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-bidi" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" [[package]] name = "unicode-normalization" @@ -3412,12 +3452,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - [[package]] name = "untrusted" version = "0.9.0" @@ -3426,9 +3460,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -3456,11 +3490,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.11.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" +checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" dependencies = [ - "getrandom", + "getrandom 0.3.1", ] [[package]] @@ -3490,6 +3524,15 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasi" +version = "0.13.3+wasi-0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +dependencies = [ + "wit-bindgen-rt", +] + [[package]] name = "wasite" version = "0.1.0" @@ -3498,47 +3541,48 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3546,22 +3590,25 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "wasm-streams" @@ -3578,9 +3625,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", @@ -3636,6 +3683,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-link" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" + [[package]] name = "windows-registry" version = "0.2.0" @@ -3814,6 +3867,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "wit-bindgen-rt" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +dependencies = [ + "bitflags", +] + [[package]] name = "write16" version = "1.0.0" @@ -3828,9 +3890,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "yoke" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -3840,13 +3902,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", "synstructure", ] @@ -3857,7 +3919,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "byteorder", - "zerocopy-derive", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf01143b2dd5d134f11f545cf9f1431b13b749695cb33bcce051e7568f99478" +dependencies = [ + "zerocopy-derive 0.8.21", ] [[package]] @@ -3868,27 +3939,38 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712c8386f4f4299382c9abee219bee7084f78fb939d88b6840fcc1320d5f6da2" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", "synstructure", ] @@ -3917,32 +3999,32 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn", ] [[package]] name = "zstd" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.13+zstd.1.5.6" +version = "2.0.14+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" dependencies = [ "cc", "pkg-config", diff --git a/examples/album_bot/Cargo.toml b/examples/album_bot/Cargo.toml index baa1eb4..ea34aba 100644 --- a/examples/album_bot/Cargo.toml +++ b/examples/album_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" log = "0.4" diff --git a/examples/album_bot/src/main.rs b/examples/album_bot/src/main.rs index 50589f3..ba1774a 100644 --- a/examples/album_bot/src/main.rs +++ b/examples/album_bot/src/main.rs @@ -1,15 +1,19 @@ //! This is a copy of the repo //! https://github.com/LasterAlex/AlbumTeloxideBot/blob/main/src/main.rs -use std::collections::HashMap; -use std::error::Error; -use std::sync::{Arc, Mutex}; +use std::{ + collections::HashMap, + error::Error, + sync::{Arc, Mutex}, +}; use dotenv::dotenv; -use teloxide::dispatching::UpdateHandler; -use teloxide::prelude::*; -use teloxide::types::{ - InputFile, InputMedia, InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo, - UpdateKind, +use teloxide::{ + dispatching::UpdateHandler, + prelude::*, + types::{ + InputFile, InputMedia, InputMediaAudio, InputMediaDocument, InputMediaPhoto, + InputMediaVideo, UpdateKind, + }, }; use tokio::time::{sleep, Duration}; @@ -34,7 +38,7 @@ async fn get_album(msg: Message, album: AlbumStorage) -> Option> { .lock() .unwrap() .entry(msg.chat.id.to_string()) - .or_insert_with(Vec::new) // If there is no entry + .or_default() // If there is no entry .push(msg.clone()); // Record length @@ -101,11 +105,10 @@ async fn main() { async fn example_handler(bot: Bot, msg: Message, album_mutex: AlbumStorage) -> HandlerResult { let album = get_album(msg.clone(), album_mutex).await; // Get either all the messages, or // None, which means that it is not the last message in the album, and we chould return - let album_messages: Vec; // Uninitialized variable, so that scoping is correct - match album { - Some(album_unwrapped) => album_messages = album_unwrapped, + let album_messages: Vec = match album { + Some(album_unwrapped) => album_unwrapped, None => return Ok(()), // If not the last message, return - } + }; // Now we have all the media group messages in the album_messages variable // And parameter msg is the last message in the album @@ -159,10 +162,11 @@ async fn example_handler(bot: Bot, msg: Message, album_mutex: AlbumStorage) -> H #[cfg(test)] mod tests { - use super::*; use teloxide::dptree::deps; use teloxide_tests::{MockBot, MockMessagePhoto, MockMessageText}; + use super::*; + #[tokio::test] async fn test_get_one_message() { let mut bot = MockBot::new_with_distribution_function( diff --git a/examples/calculator_bot/Cargo.toml b/examples/calculator_bot/Cargo.toml index 3f1b183..861d2b5 100644 --- a/examples/calculator_bot/Cargo.toml +++ b/examples/calculator_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros", "redis-storage", "cbor-serializer"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros", "redis-storage", "cbor-serializer"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" serde = { version = "1.0", features = ["derive"] } diff --git a/examples/calculator_bot/src/handler_tree.rs b/examples/calculator_bot/src/handler_tree.rs index 7a3235d..970fd5a 100644 --- a/examples/calculator_bot/src/handler_tree.rs +++ b/examples/calculator_bot/src/handler_tree.rs @@ -1,18 +1,21 @@ -use crate::{get_bot_storage, handlers::*, text, MyDialogue}; -use crate::{handlers::StartCommand, State}; -use dptree::case; use std::error::Error; -use teloxide::dispatching::dialogue::GetChatId; -use teloxide::dispatching::UpdateFilterExt; -use teloxide::prelude::*; + +use dptree::case; use teloxide::{ dispatching::{ - dialogue::{self, ErasedStorage}, - UpdateHandler, + dialogue::{self, ErasedStorage, GetChatId}, + UpdateFilterExt, UpdateHandler, }, + prelude::*, types::Update, }; +use crate::{ + get_bot_storage, + handlers::{StartCommand, *}, + text, MyDialogue, State, +}; + async fn check_if_the_state_is_ok(update: Update) -> bool { // This function doesn't have anything to do with tests, but i thought i would put it here, // because i've encountered that if you update the state, and the user is on that @@ -32,7 +35,7 @@ async fn check_if_the_state_is_ok(update: Update) -> bool { .await .unwrap(); dialogue.update(State::default()).await.unwrap(); - return false; + false } } } diff --git a/examples/calculator_bot/src/handlers.rs b/examples/calculator_bot/src/handlers.rs index 1525bd7..e902908 100644 --- a/examples/calculator_bot/src/handlers.rs +++ b/examples/calculator_bot/src/handlers.rs @@ -1,4 +1,3 @@ -use crate::{text, HandlerResult, MyDialogue, State}; use teloxide::{ dispatching::dialogue::GetChatId, macros::BotCommands, @@ -6,6 +5,8 @@ use teloxide::{ types::{InlineKeyboardButton, InlineKeyboardMarkup}, }; +use crate::{text, HandlerResult, MyDialogue, State}; + #[derive(BotCommands, Clone)] #[command(rename_rule = "lowercase")] pub enum StartCommand { diff --git a/examples/calculator_bot/src/main.rs b/examples/calculator_bot/src/main.rs index de1d9d0..e8f58c5 100644 --- a/examples/calculator_bot/src/main.rs +++ b/examples/calculator_bot/src/main.rs @@ -8,9 +8,10 @@ use std::error::Error; use dotenv::dotenv; use handler_tree::handler_tree; -use teloxide::dispatching::dialogue::serializer::Cbor; -use teloxide::dispatching::dialogue::{Dialogue, ErasedStorage, RedisStorage, Storage}; -use teloxide::prelude::*; +use teloxide::{ + dispatching::dialogue::{serializer::Cbor, Dialogue, ErasedStorage, RedisStorage, Storage}, + prelude::*, +}; pub type MyDialogue = Dialogue>; pub type HandlerResult = Result<(), Box>; diff --git a/examples/calculator_bot/src/tests.rs b/examples/calculator_bot/src/tests.rs index 89b595d..00f4ac0 100644 --- a/examples/calculator_bot/src/tests.rs +++ b/examples/calculator_bot/src/tests.rs @@ -1,8 +1,8 @@ -use crate::{get_bot_storage, handler_tree::handler_tree, text, State}; - use teloxide::dptree::deps; use teloxide_tests::{MockBot, MockCallbackQuery, MockMessagePhoto, MockMessageText}; +use crate::{get_bot_storage, handler_tree::handler_tree, text, State}; + #[tokio::test] async fn test_start() { let mut bot = MockBot::new(MockMessageText::new().text("/start"), handler_tree()); diff --git a/examples/deep_linking_bot/Cargo.toml b/examples/deep_linking_bot/Cargo.toml index 3fd2ded..dd942d9 100644 --- a/examples/deep_linking_bot/Cargo.toml +++ b/examples/deep_linking_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" serde = { version = "1.0", features = ["derive"] } diff --git a/examples/deep_linking_bot/src/handler_tree.rs b/examples/deep_linking_bot/src/handler_tree.rs index 71c0a32..4c46e3a 100644 --- a/examples/deep_linking_bot/src/handler_tree.rs +++ b/examples/deep_linking_bot/src/handler_tree.rs @@ -1,10 +1,10 @@ -use crate::handlers::*; use dptree::case; -use teloxide::dispatching::dialogue::InMemStorage; -use teloxide::dispatching::{dialogue, UpdateFilterExt, UpdateHandler}; -use teloxide::prelude::*; +use teloxide::{ + dispatching::{dialogue, dialogue::InMemStorage, UpdateFilterExt, UpdateHandler}, + prelude::*, +}; -use crate::{StartCommand, State}; +use crate::{handlers::*, StartCommand, State}; pub fn handler_tree() -> UpdateHandler> { dialogue::enter::, State, _>() diff --git a/examples/deep_linking_bot/src/handlers.rs b/examples/deep_linking_bot/src/handlers.rs index a77b3f7..3898d86 100644 --- a/examples/deep_linking_bot/src/handlers.rs +++ b/examples/deep_linking_bot/src/handlers.rs @@ -1,6 +1,7 @@ -use crate::{add_deep_link, text, HandlerResult, MyDialogue, StartCommand, State}; use teloxide::{prelude::*, types::Me}; +use crate::{add_deep_link, text, HandlerResult, MyDialogue, StartCommand, State}; + pub async fn start( bot: Bot, msg: Message, diff --git a/examples/deep_linking_bot/src/main.rs b/examples/deep_linking_bot/src/main.rs index 194f14f..b384985 100644 --- a/examples/deep_linking_bot/src/main.rs +++ b/examples/deep_linking_bot/src/main.rs @@ -4,11 +4,11 @@ pub mod handlers; pub mod tests; pub mod text; +use std::error::Error; + use dptree::deps; use handler_tree::handler_tree; -use std::error::Error; -use teloxide::types::Me; -use teloxide::{dispatching::dialogue::InMemStorage, macros::BotCommands, prelude::*}; +use teloxide::{dispatching::dialogue::InMemStorage, macros::BotCommands, prelude::*, types::Me}; pub type MyDialogue = Dialogue>; pub type HandlerResult = Result<(), Box>; diff --git a/examples/deep_linking_bot/src/tests.rs b/examples/deep_linking_bot/src/tests.rs index 5a8b352..9d59dc6 100644 --- a/examples/deep_linking_bot/src/tests.rs +++ b/examples/deep_linking_bot/src/tests.rs @@ -1,7 +1,8 @@ -use crate::{add_deep_link, handler_tree::handler_tree, text, State}; use teloxide::{dispatching::dialogue::InMemStorage, dptree::deps}; use teloxide_tests::{MockBot, MockMessagePhoto, MockMessageText}; +use crate::{add_deep_link, handler_tree::handler_tree, text, State}; + #[tokio::test] async fn test_start() { // Just a regular start diff --git a/examples/file_download_bot/Cargo.toml b/examples/file_download_bot/Cargo.toml index 9aef32b..e93a5a5 100644 --- a/examples/file_download_bot/Cargo.toml +++ b/examples/file_download_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" diff --git a/examples/file_download_bot/src/main.rs b/examples/file_download_bot/src/main.rs index bf75ec6..eadddb4 100644 --- a/examples/file_download_bot/src/main.rs +++ b/examples/file_download_bot/src/main.rs @@ -48,9 +48,10 @@ async fn main() { #[cfg(test)] mod tests { - use super::*; use teloxide_tests::{MockBot, MockMessageDocument, MockMessageText}; + use super::*; + #[tokio::test] async fn test_not_a_document() { let mut bot = MockBot::new(MockMessageText::new().text("Hi!"), handler_tree()); diff --git a/examples/hello_world_bot/Cargo.toml b/examples/hello_world_bot/Cargo.toml index 3b0668f..729ae0d 100644 --- a/examples/hello_world_bot/Cargo.toml +++ b/examples/hello_world_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" diff --git a/examples/hello_world_bot/src/main.rs b/examples/hello_world_bot/src/main.rs index 934fb9b..8f15692 100644 --- a/examples/hello_world_bot/src/main.rs +++ b/examples/hello_world_bot/src/main.rs @@ -30,9 +30,10 @@ async fn main() { #[cfg(test)] mod tests { - use super::*; use teloxide_tests::{MockBot, MockMessageText}; + use super::*; + #[tokio::test] async fn test_hello_world() { // This is a message builder. You can check the docs for more info about mocked types diff --git a/examples/phrase_bot/Cargo.toml b/examples/phrase_bot/Cargo.toml index 91f4bea..6267b10 100644 --- a/examples/phrase_bot/Cargo.toml +++ b/examples/phrase_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros", "redis-storage", "cbor-serializer"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros", "redis-storage", "cbor-serializer"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" serde = { version = "1.0", features = ["derive"] } diff --git a/examples/phrase_bot/src/db/mod.rs b/examples/phrase_bot/src/db/mod.rs index f7870a1..88c3130 100644 --- a/examples/phrase_bot/src/db/mod.rs +++ b/examples/phrase_bot/src/db/mod.rs @@ -2,9 +2,8 @@ //! that are used in the bot. pub mod models; pub mod schema; -use models::*; - use diesel::prelude::*; +use models::*; pub fn establish_connection() -> PgConnection { dotenv::dotenv().ok(); diff --git a/examples/phrase_bot/src/db/models.rs b/examples/phrase_bot/src/db/models.rs index 47a3885..dc0e54f 100644 --- a/examples/phrase_bot/src/db/models.rs +++ b/examples/phrase_bot/src/db/models.rs @@ -1,7 +1,8 @@ -use super::schema; use diesel::prelude::*; use serde::{Deserialize, Serialize}; +use super::schema; + #[derive(Queryable, Selectable)] #[diesel(table_name = schema::users)] #[diesel(check_for_backend(diesel::pg::Pg))] diff --git a/examples/phrase_bot/src/handlers/private.rs b/examples/phrase_bot/src/handlers/private.rs index 4071705..b75a07a 100644 --- a/examples/phrase_bot/src/handlers/private.rs +++ b/examples/phrase_bot/src/handlers/private.rs @@ -1,10 +1,10 @@ -use teloxide::prelude::*; -use teloxide::types::KeyboardRemove; -use teloxide::{macros::BotCommands, payloads::SendMessageSetters}; +use teloxide::{ + macros::BotCommands, payloads::SendMessageSetters, prelude::*, types::KeyboardRemove, +}; -use crate::db::models; -use crate::keyboards::menu_keyboard; -use crate::{db, keyboards, text, HandlerResult, MyDialogue, State}; +use crate::{ + db, db::models, keyboards, keyboards::menu_keyboard, text, HandlerResult, MyDialogue, State, +}; #[derive(BotCommands, Clone)] #[command(rename_rule = "lowercase")] @@ -228,13 +228,13 @@ pub async fn added_phrase( #[cfg(test)] mod tests { - use crate::{get_bot_storage, handler_tree::handler_tree}; - - use super::*; use dptree::deps; use teloxide::types::ReplyMarkup; use teloxide_tests::{MockBot, MockMessageDocument, MockMessageText, MockUser}; + use super::*; + use crate::{get_bot_storage, handler_tree::handler_tree}; + #[tokio::test] async fn test_start() { let mut bot = MockBot::new(MockMessageText::new().text("/start"), handler_tree()); diff --git a/examples/phrase_bot/src/handlers/public.rs b/examples/phrase_bot/src/handlers/public.rs index e540a38..51c80e2 100644 --- a/examples/phrase_bot/src/handlers/public.rs +++ b/examples/phrase_bot/src/handlers/public.rs @@ -51,9 +51,10 @@ pub async fn bot_phrase(bot: Bot, msg: Message) -> HandlerResult { #[cfg(test)] mod tests { - use crate::{db, handler_tree::handler_tree, text}; use teloxide_tests::{MockBot, MockGroupChat, MockMessageText, MockUser}; + use crate::{db, handler_tree::handler_tree, text}; + #[tokio::test] async fn test_phrase() { let chat = MockGroupChat::new().build(); diff --git a/examples/phrase_bot/src/main.rs b/examples/phrase_bot/src/main.rs index 652a968..a996982 100644 --- a/examples/phrase_bot/src/main.rs +++ b/examples/phrase_bot/src/main.rs @@ -1,17 +1,17 @@ pub mod db; pub mod handlers; pub mod resources; -use db::models::Phrase; -use resources::{handler_tree, keyboards, text}; - use std::error::Error; +use db::models::Phrase; use dotenv::dotenv; use handler_tree::handler_tree; use handlers::*; -use teloxide::dispatching::dialogue::serializer::Cbor; -use teloxide::dispatching::dialogue::{Dialogue, ErasedStorage, RedisStorage, Storage}; -use teloxide::prelude::*; +use resources::{handler_tree, keyboards, text}; +use teloxide::{ + dispatching::dialogue::{serializer::Cbor, Dialogue, ErasedStorage, RedisStorage, Storage}, + prelude::*, +}; pub type MyDialogue = Dialogue>; pub type HandlerResult = Result<(), Box>; diff --git a/examples/phrase_bot/src/resources/handler_tree.rs b/examples/phrase_bot/src/resources/handler_tree.rs index 883ff55..57b390c 100644 --- a/examples/phrase_bot/src/resources/handler_tree.rs +++ b/examples/phrase_bot/src/resources/handler_tree.rs @@ -1,18 +1,22 @@ -use crate::{get_bot_storage, keyboards, private::*, public::*, text, MyDialogue}; -use crate::{private::StartCommand, State}; -use dptree::{case, entry, filter}; use std::error::Error; -use teloxide::dispatching::dialogue::GetChatId; -use teloxide::dispatching::UpdateFilterExt; -use teloxide::prelude::*; + +use dptree::{case, entry, filter}; use teloxide::{ dispatching::{ - dialogue::{self, ErasedStorage}, - UpdateHandler, + dialogue::{self, ErasedStorage, GetChatId}, + UpdateFilterExt, UpdateHandler, }, + prelude::*, types::Update, }; +use crate::{ + get_bot_storage, keyboards, + private::{StartCommand, *}, + public::*, + text, MyDialogue, State, +}; + async fn check_if_the_state_is_ok(update: Update) -> bool { // This function doesn't have anything to do with tests, but i thought i would put it here, // because i've encountered that if you update the state, and the user is on that @@ -32,7 +36,7 @@ async fn check_if_the_state_is_ok(update: Update) -> bool { .await .unwrap(); dialogue.update(State::default()).await.unwrap(); - return false; + false } } } diff --git a/examples/phrase_bot/src/resources/text.rs b/examples/phrase_bot/src/resources/text.rs index d17b595..b7d1ad1 100644 --- a/examples/phrase_bot/src/resources/text.rs +++ b/examples/phrase_bot/src/resources/text.rs @@ -25,7 +25,7 @@ If you want to return, send /cancel"; pub const CANCELED: &str = "Canceled."; -pub fn delete_phrase(all_phrases: &Vec) -> String { +pub fn delete_phrase(all_phrases: &[models::Phrase]) -> String { format!( "These are your phrases: @@ -97,17 +97,17 @@ pub fn make_phrase_string(phrase: &models::Phrase) -> String { format!("{} - {} | {}", phrase.text, phrase.emoji, phrase.bot_text) } -pub fn list_all_phrases(phrases: &Vec) -> String { +pub fn list_all_phrases(phrases: &[models::Phrase]) -> String { phrases .iter() - .map(|phrase| make_phrase_string(phrase)) + .map(make_phrase_string) .enumerate() .map(|(i, phrase)| format!("{}. {}", i + 1, phrase)) .collect::>() .join("\n\n") } -pub fn profile(nickname: Option, phrases: &Vec) -> String { +pub fn profile(nickname: Option, phrases: &[models::Phrase]) -> String { format!( "Your nickname📜: {} diff --git a/teloxide_tests/Cargo.toml b/teloxide_tests/Cargo.toml index f617448..1ebb678 100644 --- a/teloxide_tests/Cargo.toml +++ b/teloxide_tests/Cargo.toml @@ -20,7 +20,7 @@ log = "0.4" pretty_env_logger = "0.5" url = "2.5.1" reqwest = "0.12.5" -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "94db1757dc96116f4756a586fcbce3ac5ebd0c59", features = ["macros", "sqlite-storage-nativetls"] } +teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros", "sqlite-storage-nativetls"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" @@ -29,7 +29,7 @@ mime = "0.3.17" chrono = "0.4.38" actix-web-lab = "0.23.0" mime_guess = "2.0.5" -rand = "0.8.5" +rand = "0.9.0" actix-multipart = "0.7.2" lazy_static = "1.5.0" futures-util = "0.3" diff --git a/teloxide_tests/src/dataset/chat.rs b/teloxide_tests/src/dataset/chat.rs index 3aa0911..dda1757 100644 --- a/teloxide_tests/src/dataset/chat.rs +++ b/teloxide_tests/src/dataset/chat.rs @@ -1,9 +1,6 @@ -use teloxide::types::{ - Chat, ChatId, ChatKind, ChatLocation, ChatPermissions, ChatPhoto, ChatPrivate, ChatPublic, - Message, PublicChatChannel, PublicChatGroup, PublicChatKind, PublicChatSupergroup, True, *, -}; +use teloxide::types::*; -use super::{MockChatFullInfo, MockUser}; +use super::MockUser; use crate::proc_macros::Changeable; macro_rules! Chat { @@ -16,30 +13,14 @@ macro_rules! Chat { #[derive($($derive),*)] $pub struct $name { // This is basically a template pub id: ChatId, - pub photo: Option, - pub available_reactions: Option>, - pub pinned_message: Option>, - pub message_auto_delete_time: Option, - pub has_hidden_members: bool, - pub has_aggressive_anti_spam_enabled: bool, - pub chat_full_info: ChatFullInfo, $($fpub $field : $type,)* } impl $name { pub const ID: i64 = -12345678; // Make them into a constant cuz why not - pub const HAS_HIDDEN_MEMBERS: bool = false; - pub const AGGRESSIVE_ANTI_SPAM_ENABLED: bool = false; - pub(crate) fn new_chat($($field:$type,)*) -> Self{ + pub(crate) fn new_chat($($field:$type,)*) -> Self { Self { // To not repeat this over and over again id: ChatId(Self::ID), - photo: None, - available_reactions: None, - pinned_message: None, - message_auto_delete_time: None, - has_hidden_members: Self::HAS_HIDDEN_MEMBERS, - has_aggressive_anti_spam_enabled: Self::AGGRESSIVE_ANTI_SPAM_ENABLED, - chat_full_info: MockChatFullInfo::new().build(), $($field,)* } } @@ -48,20 +29,13 @@ macro_rules! Chat { Chat { id: self.id, kind: chat_kind, - available_reactions: self.available_reactions, - photo: self.photo, - pinned_message: self.pinned_message, - message_auto_delete_time: self.message_auto_delete_time, - has_hidden_members: self.has_hidden_members, - has_aggressive_anti_spam_enabled: self.has_aggressive_anti_spam_enabled, - chat_full_info: self.chat_full_info, } } } } } -macro_rules! PublicChat { // A specialization of Chat!, again, to not repeat myself +macro_rules! ChatPublic { // A specialization of Chat!, again, to not repeat myself ( #[derive($($derive:meta),*)] $pub:vis struct $name:ident { @@ -72,41 +46,30 @@ macro_rules! PublicChat { // A specialization of Chat!, again, to not repeat my #[derive($($derive),*)] $pub struct $name { pub title: Option, - pub description: Option, - pub invite_link: Option, - pub has_protected_content: Option, $($fpub $field : $type,)* } } impl $name { - pub(crate) fn new_public_chat($($field:$type,)*) -> Self { + pub(crate) fn new_chat_public($($field:$type,)*) -> Self { $name::new_chat( - None, - None, - None, None, $($field,)* ) } - pub(crate) fn build_public_chat(self, public_chat_kind: PublicChatKind) -> Chat { - self.clone().build_chat(ChatKind::Public(Box::new(ChatPublic { + pub(crate) fn build_chat_public(self, chat_public_kind: PublicChatKind) -> Chat { + self.clone().build_chat(ChatKind::Public(ChatPublic { title: self.title, - kind: public_chat_kind, - description: self.description, - invite_link: self.invite_link, - has_protected_content: self.has_protected_content, - }))) + kind: chat_public_kind, + })) } } } } -PublicChat! { +ChatPublic! { #[derive(Changeable, Clone)] - pub struct MockGroupChat { - pub permissions: Option, - } + pub struct MockGroupChat { } } impl MockGroupChat { @@ -121,7 +84,7 @@ impl MockGroupChat { /// ``` /// pub fn new() -> Self { - Self::new_public_chat(None) + Self::new_chat_public() } /// Builds the group chat @@ -134,23 +97,19 @@ impl MockGroupChat { /// ``` /// pub fn build(self) -> Chat { - self.clone() - .build_public_chat(PublicChatKind::Group(PublicChatGroup { - permissions: self.permissions, - })) + self.clone().build_chat_public(PublicChatKind::Group) } } -PublicChat! { +ChatPublic! { #[derive(Changeable, Clone)] pub struct MockChannelChat { - pub linked_chat_id: Option, pub username: Option, } } impl MockChannelChat { - /// Creates a new easily changable channel chat builder + /// Creates a new easily changable channel builder /// /// Example: /// ``` @@ -163,7 +122,7 @@ impl MockChannelChat { /// ``` /// pub fn new() -> Self { - Self::new_public_chat(None, None) + Self::new_chat_public(None) } /// Builds the channel chat @@ -178,36 +137,24 @@ impl MockChannelChat { /// pub fn build(self) -> Chat { self.clone() - .build_public_chat(PublicChatKind::Channel(PublicChatChannel { - linked_chat_id: self.linked_chat_id, + .build_chat_public(PublicChatKind::Channel(PublicChatChannel { username: self.username, })) } } -PublicChat! { +ChatPublic! { #[derive(Changeable, Clone)] pub struct MockSupergroupChat { pub username: Option, - pub active_usernames: Option>, pub is_forum: bool, - pub sticker_set_name: Option, - pub can_set_sticker_set: Option, - pub permissions: Option, - pub slow_mode_delay: Option, - pub linked_chat_id: Option, - pub location: Option, - pub join_to_send_messages: Option, - pub join_by_request: Option, - pub custom_emoji_sticker_set_name: Option, - pub unrestrict_boost_count: Option, } } impl MockSupergroupChat { pub const IS_FORUM: bool = false; - /// Creates a new easily changable supergroup chat builder + /// Creates a new easily changable supergroup chat full info builder /// /// Example: /// ``` @@ -218,21 +165,7 @@ impl MockSupergroupChat { /// ``` /// pub fn new() -> Self { - Self::new_public_chat( - None, - None, - Self::IS_FORUM, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - ) + Self::new_chat_public(None, Self::IS_FORUM) } /// Builds the supergroup chat @@ -246,20 +179,9 @@ impl MockSupergroupChat { /// pub fn build(self) -> Chat { self.clone() - .build_public_chat(PublicChatKind::Supergroup(PublicChatSupergroup { + .build_chat_public(PublicChatKind::Supergroup(PublicChatSupergroup { username: self.username, - active_usernames: self.active_usernames, is_forum: self.is_forum, - sticker_set_name: self.sticker_set_name, - can_set_sticker_set: self.can_set_sticker_set, - permissions: self.permissions, - slow_mode_delay: self.slow_mode_delay, - linked_chat_id: self.linked_chat_id, - location: self.location, - join_to_send_messages: self.join_to_send_messages, - join_by_request: self.join_by_request, - custom_emoji_sticker_set_name: self.custom_emoji_sticker_set_name, - unrestrict_boost_count: self.unrestrict_boost_count, })) } } @@ -270,14 +192,6 @@ Chat! { pub username: Option, pub first_name: Option, pub last_name: Option, - pub bio: Option, - pub has_private_forwards: Option, - pub has_restricted_voice_and_video_messages: Option, - pub birthdate: Option, - pub business_intro: Option, - pub business_location: Option, - pub business_opening_hours: Option, - pub personal_chat: Option>, } } @@ -293,10 +207,7 @@ impl MockPrivateChat { /// ``` /// pub fn new() -> Self { - Self::new_chat( - None, None, None, None, None, None, None, None, None, None, None, - ) - .id(MockUser::ID as i64) + Self::new_chat(None, None, None).id(MockUser::ID as i64) } /// Builds the private chat @@ -313,14 +224,6 @@ impl MockPrivateChat { username: self.username, first_name: self.first_name, last_name: self.last_name, - bio: self.bio, - has_private_forwards: self.has_private_forwards, - has_restricted_voice_and_video_messages: self.has_restricted_voice_and_video_messages, - birthdate: self.birthdate, - business_intro: self.business_intro, - business_location: self.business_location, - business_opening_hours: self.business_opening_hours, - personal_chat: self.personal_chat, })) } } diff --git a/teloxide_tests/src/dataset/chat_full_info.rs b/teloxide_tests/src/dataset/chat_full_info.rs new file mode 100644 index 0000000..f739f17 --- /dev/null +++ b/teloxide_tests/src/dataset/chat_full_info.rs @@ -0,0 +1,371 @@ +use chrono::{DateTime, Utc}; +use teloxide::types::*; + +use super::MockUser; +use crate::proc_macros::Changeable; + +macro_rules! ChatFullInfo { + ( + #[derive($($derive:meta),*)] + $pub:vis struct $name:ident { + $($fpub:vis $field:ident : $type:ty,)* + } + ) => { + #[derive($($derive),*)] + $pub struct $name { // This is basically a template + pub id: ChatId, + pub photo: Option, + pub pinned_message: Option>, + pub message_auto_delete_time: Option, + pub has_hidden_members: bool, + pub has_aggressive_anti_spam_enabled: bool, + pub accent_color_id: Option, + pub background_custom_emoji_id: Option, + pub profile_accent_color_id: Option, + pub profile_background_custom_emoji_id: Option, + pub emoji_status_custom_emoji_id: Option, + pub emoji_status_expiration_date: Option>, + pub has_visible_history: bool, + pub max_reaction_count: u8, + $($fpub $field : $type,)* + } + impl $name { + pub const ID: i64 = -12345678; // Make them into a constant cuz why not + pub const HAS_HIDDEN_MEMBERS: bool = false; + pub const AGGRESSIVE_ANTI_SPAM_ENABLED: bool = false; + pub const HAS_VISIBLE_HISTORY: bool = true; + pub const MAX_REACTION_COUNT: u8 = 100; + + pub(crate) fn new_chat_full_info($($field:$type,)*) -> Self{ + Self { // To not repeat this over and over again + id: ChatId(Self::ID), + photo: None, + pinned_message: None, + message_auto_delete_time: None, + has_hidden_members: Self::HAS_HIDDEN_MEMBERS, + has_aggressive_anti_spam_enabled: Self::AGGRESSIVE_ANTI_SPAM_ENABLED, + accent_color_id: None, + background_custom_emoji_id: None, + profile_accent_color_id: None, + profile_background_custom_emoji_id: None, + emoji_status_custom_emoji_id: None, + emoji_status_expiration_date: None, + has_visible_history: Self::HAS_VISIBLE_HISTORY, + max_reaction_count: Self::MAX_REACTION_COUNT, + $($field,)* + } + } + + pub(crate) fn build_chat_full_info(self, chat_full_info_kind: ChatFullInfoKind) -> ChatFullInfo { + ChatFullInfo { + id: self.id, + photo: self.photo, + pinned_message: self.pinned_message, + message_auto_delete_time: self.message_auto_delete_time, + has_hidden_members: self.has_hidden_members, + has_aggressive_anti_spam_enabled: self.has_aggressive_anti_spam_enabled, + accent_color_id: self.accent_color_id, + background_custom_emoji_id: self.background_custom_emoji_id, + profile_accent_color_id: self.profile_accent_color_id, + profile_background_custom_emoji_id: self.profile_background_custom_emoji_id, + emoji_status_custom_emoji_id: self.emoji_status_custom_emoji_id, + emoji_status_expiration_date: self.emoji_status_expiration_date, + has_visible_history: self.has_visible_history, + max_reaction_count: self.max_reaction_count, + kind: chat_full_info_kind, + } + } + } + } +} + +macro_rules! ChatFullInfoPublic { // A specialization of Chat!, again, to not repeat myself + ( + #[derive($($derive:meta),*)] + $pub:vis struct $name:ident { + $($fpub:vis $field:ident : $type:ty,)* + } + ) => { + ChatFullInfo! { + #[derive($($derive),*)] + $pub struct $name { + pub title: Option, + pub description: Option, + pub invite_link: Option, + pub has_protected_content: bool, + pub available_reactions: Option>, + $($fpub $field : $type,)* + } + } + impl $name { + pub const HAS_PROTECTED_CONTENT: bool = false; + + pub(crate) fn new_chat_full_info_public($($field:$type,)*) -> Self { + $name::new_chat_full_info( + None, + None, + None, + Self::HAS_PROTECTED_CONTENT, + None, + $($field,)* + ) + } + + pub(crate) fn build_chat_full_info_public(self, chat_full_info_public_kind: ChatFullInfoPublicKind) -> ChatFullInfo { + self.clone().build_chat_full_info(ChatFullInfoKind::Public(Box::new(ChatFullInfoPublic { + title: self.title, + kind: chat_full_info_public_kind, + description: self.description, + invite_link: self.invite_link, + has_protected_content: self.has_protected_content, + available_reactions: self.available_reactions, + }))) + } + } + } +} + +ChatFullInfoPublic! { + #[derive(Changeable, Clone)] + pub struct MockChatFullInfoGroup { + pub permissions: Option, + } +} + +impl MockChatFullInfoGroup { + /// Creates a new easily changable group chat full info builder + /// + /// Example: + /// ``` + /// let chat = teloxide_tests::MockChatFullInfoGroup::new() + /// .id(-1234) + /// .build(); + /// assert_eq!(chat.id.0, -1234); + /// ``` + /// + pub fn new() -> Self { + Self::new_chat_full_info_public(None) + } + + /// Builds the group chat full info + /// + /// Example: + /// ``` + /// let mock_chat = teloxide_tests::MockChatFullInfoGroup::new(); + /// let chat = mock_chat.build(); + /// assert_eq!(chat.id.0, teloxide_tests::MockChatFullInfoGroup::ID); // ID is a default value + /// ``` + /// + pub fn build(self) -> ChatFullInfo { + self.clone() + .build_chat_full_info_public(ChatFullInfoPublicKind::Group(ChatFullInfoPublicGroup { + permissions: self.permissions, + })) + } +} + +ChatFullInfoPublic! { + #[derive(Changeable, Clone)] + pub struct MockChatFullInfoChannel { + pub username: Option, + pub linked_chat_id: Option, + } +} + +impl MockChatFullInfoChannel { + /// Creates a new easily changable channel chat full info builder + /// + /// Example: + /// ``` + /// let chat = teloxide_tests::MockChatFullInfoChannel::new() + /// .id(-1234) + /// .username("test_channel") + /// .build(); + /// assert_eq!(chat.id.0, -1234); + /// assert_eq!(chat.username(), Some("test_channel")); + /// ``` + /// + pub fn new() -> Self { + Self::new_chat_full_info_public(None, None) + } + + /// Builds the channel chat full info + /// + /// Example: + /// ``` + /// let mock_chat = teloxide_tests::MockChatFullInfoChannel::new(); + /// let chat = mock_chat.build(); + /// assert_eq!(chat.id.0, teloxide_tests::MockChatFullInfoChannel::ID); // ID is a default value + /// assert_eq!(chat.username(), None); + /// ``` + /// + pub fn build(self) -> ChatFullInfo { + self.clone() + .build_chat_full_info_public(ChatFullInfoPublicKind::Channel( + ChatFullInfoPublicChannel { + username: self.username, + linked_chat_id: self.linked_chat_id, + }, + )) + } +} + +ChatFullInfoPublic! { + #[derive(Changeable, Clone)] + pub struct MockChatFullInfoSupergroup { + pub username: Option, + pub active_usernames: Option>, + pub is_forum: bool, + pub sticker_set_name: Option, + pub can_set_sticker_set: bool, + pub custom_emoji_sticker_set_name: Option, + pub permissions: Option, + pub slow_mode_delay: Option, + pub unrestrict_boost_count: Option, + pub linked_chat_id: Option, + pub location: Option, + pub join_to_send_messages: bool, + pub join_by_request: bool, + } +} + +impl MockChatFullInfoSupergroup { + pub const IS_FORUM: bool = false; + pub const CAN_SET_STICKER_SET: bool = false; + pub const JOIN_TO_SEND_MESSAGES: bool = false; + pub const JOIN_BY_REQUEST: bool = false; + + /// Creates a new easily changable supergroup chat full info builder + /// + /// Example: + /// ``` + /// let chat = teloxide_tests::MockChatFullInfoSupergroup::new() + /// .id(-1234) + /// .build(); + /// assert_eq!(chat.id.0, -1234); + /// ``` + /// + pub fn new() -> Self { + Self::new_chat_full_info_public( + None, + None, + Self::IS_FORUM, + None, + Self::CAN_SET_STICKER_SET, + None, + None, + None, + None, + None, + None, + Self::JOIN_TO_SEND_MESSAGES, + Self::JOIN_BY_REQUEST, + ) + } + + /// Builds the supergroup chat + /// + /// Example: + /// ``` + /// let mock_chat = teloxide_tests::MockChatFullInfoSupergroup::new(); + /// let chat = mock_chat.build(); + /// assert_eq!(chat.id.0, teloxide_tests::MockChatFullInfoSupergroup::ID); // ID is a default value + /// ``` + /// + pub fn build(self) -> ChatFullInfo { + self.clone() + .build_chat_full_info_public(ChatFullInfoPublicKind::Supergroup( + ChatFullInfoPublicSupergroup { + username: self.username, + active_usernames: self.active_usernames, + is_forum: self.is_forum, + sticker_set_name: self.sticker_set_name, + can_set_sticker_set: self.can_set_sticker_set, + permissions: self.permissions, + slow_mode_delay: self.slow_mode_delay, + linked_chat_id: self.linked_chat_id, + location: self.location, + join_to_send_messages: self.join_to_send_messages, + join_by_request: self.join_by_request, + custom_emoji_sticker_set_name: self.custom_emoji_sticker_set_name, + unrestrict_boost_count: self.unrestrict_boost_count, + }, + )) + } +} + +ChatFullInfo! { + #[derive(Changeable, Clone)] + pub struct MockChatFullInfoPrivate { + pub username: Option, + pub first_name: Option, + pub last_name: Option, + pub bio: Option, + pub has_private_forwards: bool, + pub has_restricted_voice_and_video_messages: bool, + pub personal_chat: Option>, + pub birthdate: Option, + pub business_intro: Option, + pub business_location: Option, + pub business_opening_hours: Option, + } +} + +impl MockChatFullInfoPrivate { + pub const HAS_PRIVATE_FORWARDS: bool = false; + pub const HAS_RESTRICTED_VOICE_AND_VIDEO_MESSAGES: bool = false; + + /// Creates a new easily changable private chat full info builder + /// + /// Example: + /// ``` + /// let chat = teloxide_tests::MockChatFullInfoPrivate::new() + /// .id(-1234) + /// .build(); + /// assert_eq!(chat.id.0, -1234); + /// ``` + /// + pub fn new() -> Self { + Self::new_chat_full_info( + None, + None, + None, + None, + Self::HAS_PRIVATE_FORWARDS, + Self::HAS_RESTRICTED_VOICE_AND_VIDEO_MESSAGES, + None, + None, + None, + None, + None, + ) + .id(MockUser::ID as i64) + } + + /// Builds the private chat full info + /// + /// Example: + /// ``` + /// let mock_chat = teloxide_tests::MockChatFullInfoPrivate::new(); + /// let chat = mock_chat.build(); + /// assert_eq!(chat.id.0 as u64, teloxide_tests::MockUser::ID); // Private chats have the id of users + /// ``` + /// + pub fn build(self) -> ChatFullInfo { + self.clone() + .build_chat_full_info(ChatFullInfoKind::Private(Box::new(ChatFullInfoPrivate { + username: self.username, + first_name: self.first_name, + last_name: self.last_name, + bio: self.bio, + has_private_forwards: self.has_private_forwards, + has_restricted_voice_and_video_messages: self + .has_restricted_voice_and_video_messages, + birthdate: self.birthdate, + business_intro: self.business_intro, + business_location: self.business_location, + business_opening_hours: self.business_opening_hours, + personal_chat: self.personal_chat, + }))) + } +} diff --git a/teloxide_tests/src/dataset/message_common.rs b/teloxide_tests/src/dataset/message_common.rs index 00b343a..8316359 100644 --- a/teloxide_tests/src/dataset/message_common.rs +++ b/teloxide_tests/src/dataset/message_common.rs @@ -20,6 +20,7 @@ macro_rules! MessageCommon { // Rust was supposed to be used without inheritanc #[derive($($derive),*)] $pub struct $name { pub author_signature: Option, + pub effect_id: Option, pub forward_origin: Option, pub reply_to_message: Option>, pub external_reply: Option, @@ -50,6 +51,7 @@ macro_rules! MessageCommon { // Rust was supposed to be used without inheritanc None, None, None, + None, $name::IS_AUTOMATIC_FORWARD, $name::HAS_PROTECTED_CONTENT, $name::IS_FROM_OFFLINE, @@ -63,6 +65,7 @@ macro_rules! MessageCommon { // Rust was supposed to be used without inheritanc pub(crate) fn build_message_common(self, media_kind: MediaKind) -> Message { self.clone().build_message(MessageKind::Common(MessageCommon { author_signature: self.author_signature, + effect_id: self.effect_id, forward_origin: self.forward_origin, reply_to_message: self.reply_to_message, external_reply: self.external_reply, @@ -142,6 +145,7 @@ MessageCommon! { pub struct MockMessageAnimation { pub caption: Option, pub caption_entities: Vec, + pub show_caption_above_media: bool, pub has_media_spoiler: bool, // Animation pub width: u32, @@ -159,6 +163,7 @@ MessageCommon! { impl MockMessageAnimation { pub const HAS_MEDIA_SPOILER: bool = false; + pub const SHOW_CAPTION_ABOVE_MEDIA: bool = false; pub const WIDTH: u32 = 50; pub const HEIGHT: u32 = 50; pub const DURATION: Seconds = Seconds::from_seconds(60); @@ -180,6 +185,7 @@ impl MockMessageAnimation { Self::new_message_common( None, vec![], + Self::SHOW_CAPTION_ABOVE_MEDIA, Self::HAS_MEDIA_SPOILER, Self::WIDTH, Self::HEIGHT, @@ -207,6 +213,7 @@ impl MockMessageAnimation { .build_message_common(MediaKind::Animation(MediaAnimation { caption: self.caption, caption_entities: self.caption_entities, + show_caption_above_media: self.show_caption_above_media, has_media_spoiler: self.has_media_spoiler, animation: Animation { file: FileMeta { @@ -575,7 +582,7 @@ MessageCommon! { pub latitude: f64, pub longitude: f64, pub horizontal_accuracy: Option, - pub live_period: Option, + pub live_period: Option, pub heading: Option, pub proximity_alert_radius: Option, } @@ -629,6 +636,7 @@ MessageCommon! { pub caption: Option, pub caption_entities: Vec, pub media_group_id: Option, + pub show_caption_above_media: bool, pub has_media_spoiler: bool, pub photo: Vec, } @@ -636,6 +644,7 @@ MessageCommon! { impl MockMessagePhoto { pub const HAS_MEDIA_SPOILER: bool = false; + pub const SHOW_CAPTION_ABOVE_MEDIA: bool = false; /// Creates a new easily changable message photo builder /// @@ -654,6 +663,7 @@ impl MockMessagePhoto { None, vec![], None, + Self::SHOW_CAPTION_ABOVE_MEDIA, Self::HAS_MEDIA_SPOILER, vec![MockPhotoSize::new().build()], ) @@ -674,6 +684,7 @@ impl MockMessagePhoto { caption: self.caption, caption_entities: self.caption_entities, media_group_id: self.media_group_id, + show_caption_above_media: self.show_caption_above_media, has_media_spoiler: self.has_media_spoiler, photo: self.photo, })) @@ -685,6 +696,7 @@ MessageCommon! { pub struct MockMessagePoll { pub poll_id: String, pub question: String, + pub question_entities: Option>, pub options: Vec, pub is_closed: bool, pub total_voter_count: u32, @@ -723,6 +735,7 @@ impl MockMessagePoll { Self::new_message_common( Self::POLL_ID.to_string(), Self::QUESTION.to_string(), + None, vec![], Self::IS_CLOSED, Self::TOTAL_VOTER_COUNT, @@ -752,6 +765,7 @@ impl MockMessagePoll { poll: Poll { id: self.poll_id, question: self.question, + question_entities: self.question_entities, options: self.options, is_closed: self.is_closed, total_voter_count: self.total_voter_count, @@ -861,6 +875,7 @@ MessageCommon! { pub caption: Option, pub caption_entities: Vec, pub media_group_id: Option, + pub show_caption_above_media: bool, pub has_media_spoiler: bool, pub video: Video, } @@ -868,6 +883,7 @@ MessageCommon! { impl MockMessageVideo { pub const HAS_MEDIA_SPOILER: bool = false; + pub const SHOW_CAPTION_ABOVE_MEDIA: bool = false; /// Creates a new easily changable message video builder /// @@ -883,6 +899,7 @@ impl MockMessageVideo { None, vec![], None, + Self::SHOW_CAPTION_ABOVE_MEDIA, Self::HAS_MEDIA_SPOILER, MockVideo::new().build(), ) @@ -903,6 +920,7 @@ impl MockMessageVideo { caption: self.caption, caption_entities: self.caption_entities, media_group_id: self.media_group_id, + show_caption_above_media: self.show_caption_above_media, has_media_spoiler: self.has_media_spoiler, video: self.video, })) diff --git a/teloxide_tests/src/dataset/mod.rs b/teloxide_tests/src/dataset/mod.rs index b30a585..2ccdde5 100644 --- a/teloxide_tests/src/dataset/mod.rs +++ b/teloxide_tests/src/dataset/mod.rs @@ -1,19 +1,20 @@ //! A set of mocked structs for testing purposes. Read more in teloxide_tests crate. use std::sync::atomic::{AtomicI32, Ordering}; -use chrono::{DateTime, Utc}; use mime::Mime; use proc_macros::Changeable; use teloxide::types::{ - ChatFullInfo, ChatPhoto, FileMeta, LinkPreviewOptions, Location, Me, PhotoSize, Seconds, - Update, User, UserId, Video, + ChatPhoto, FileMeta, LinkPreviewOptions, LivePeriod, Location, Me, PhotoSize, Seconds, Update, + User, UserId, Video, }; pub mod chat; +pub mod chat_full_info; pub mod message; pub mod message_common; pub mod queries; pub use chat::*; +pub use chat_full_info::*; pub use message::*; pub use message_common::*; pub use queries::*; @@ -251,7 +252,7 @@ pub struct MockLocation { pub latitude: f64, pub longitude: f64, pub horizontal_accuracy: Option, - pub live_period: Option, + pub live_period: Option, pub heading: Option, pub proximity_alert_radius: Option, } @@ -433,62 +434,6 @@ impl MockVideo { } } -#[derive(Changeable, Clone)] -pub struct MockChatFullInfo { - pub accent_color_id: Option, - pub background_custom_emoji_id: Option, - pub profile_accent_color_id: Option, - pub profile_background_custom_emoji_id: Option, - pub emoji_status_custom_emoji_id: Option, - pub emoji_status_expiration_date: Option>, - pub has_visible_history: bool, -} - -impl MockChatFullInfo { - /// Creates a new easily changable chat full info builder - /// - /// # Examples - /// ``` - /// let chat_full_info = teloxide_tests::MockChatFullInfo::new() - /// .accent_color_id(1) - /// .build(); - /// assert_eq!(chat_full_info.accent_color_id, Some(1)); - /// ``` - /// - pub fn new() -> Self { - Self { - accent_color_id: None, - background_custom_emoji_id: None, - profile_accent_color_id: None, - profile_background_custom_emoji_id: None, - emoji_status_custom_emoji_id: None, - emoji_status_expiration_date: None, - has_visible_history: true, - } - } - - /// Builds the chat full info - /// - /// # Examples - /// ``` - /// let mock_chat_full_info = teloxide_tests::MockChatFullInfo::new(); - /// let chat_full_info = mock_chat_full_info.build(); - /// assert_eq!(chat_full_info.has_visible_history, true); - /// ``` - /// - pub fn build(self) -> ChatFullInfo { - ChatFullInfo { - accent_color_id: self.accent_color_id, - background_custom_emoji_id: self.background_custom_emoji_id, - profile_accent_color_id: self.profile_accent_color_id, - profile_background_custom_emoji_id: self.profile_background_custom_emoji_id, - emoji_status_custom_emoji_id: self.emoji_status_custom_emoji_id, - emoji_status_expiration_date: self.emoji_status_expiration_date, - has_visible_history: self.has_visible_history, - } - } -} - #[derive(Changeable, Clone)] pub struct MockLinkPreviewOptions { pub is_disabled: bool, diff --git a/teloxide_tests/src/dataset/tests.rs b/teloxide_tests/src/dataset/tests.rs index f6b3c06..4136cdb 100644 --- a/teloxide_tests/src/dataset/tests.rs +++ b/teloxide_tests/src/dataset/tests.rs @@ -1,6 +1,6 @@ use teloxide::{ dispatching::dialogue::GetChatId, - types::{ChatId, MessageEntity, MessageId, True, UpdateId, UserId}, + types::{ChatId, MessageEntity, MessageId, UpdateId, UserId}, }; use crate::{dataset::*, proc_macros::Changeable}; @@ -62,42 +62,61 @@ fn test_location() { #[test] fn test_public_group_chat() { - let chat = MockGroupChat::new() - .title("Test") + let chat = MockGroupChat::new().title("Test").id(-1234); + let chat_photo = MockChatPhoto::new().build(); + let chat_full_info = MockChatFullInfoGroup::new() + .title("Test2") .id(-1234) - .photo(MockChatPhoto::new().build()); + .photo(chat_photo.clone()); let chat_object = chat.build(); assert_eq!(chat_object.title(), Some("Test")); assert_eq!(chat_object.id, ChatId(-1234)); - assert_eq!(chat_object.photo, Some(MockChatPhoto::new().build())); + + let chat_full_info_object = chat_full_info.build(); + assert_eq!(chat_full_info_object.title(), Some("Test2")); + assert_eq!(chat_full_info_object.id, ChatId(-1234)); + assert_eq!(chat_full_info_object.photo, Some(chat_photo)); } #[test] fn test_supergroup_chat() { - let chat = MockSupergroupChat::new().join_by_request(True).id(-1234); + let chat = MockSupergroupChat::new().id(-1234); + let chat_full_info = MockChatFullInfoSupergroup::new() + .join_by_request(true) + .id(-1234); let chat_object = chat.build(); assert_eq!(chat_object.id, ChatId(-1234)); - assert_eq!(chat_object.join_by_request(), Some(True)); + + let chat_full_info_object = chat_full_info.build(); + assert_eq!(chat_full_info_object.id, ChatId(-1234)); + assert_eq!(chat_full_info_object.join_by_request(), true); } #[test] fn test_channel_chat() { - let chat = MockChannelChat::new() - .linked_chat_id(-12345) + let chat = MockChannelChat::new().username("test_channel").id(-1234); + let chat_full_info = MockChatFullInfoChannel::new() .username("test_channel") + .linked_chat_id(-12345) .id(-1234); let chat_object = chat.build(); assert_eq!(chat_object.id, ChatId(-1234)); - assert_eq!(chat_object.linked_chat_id(), Some(-12345)); assert_eq!(chat_object.username(), Some("test_channel")); + + let chat_full_info_object = chat_full_info.build(); + assert_eq!(chat_full_info_object.id, ChatId(-1234)); + assert_eq!(chat_full_info_object.username(), Some("test_channel")); + assert_eq!(chat_full_info_object.linked_chat_id(), Some(-12345)); } #[test] fn test_private_group_chat() { - let chat = MockPrivateChat::new() + let chat = MockPrivateChat::new().first_name("Test").id(1234); + + let chat_full_info = MockChatFullInfoPrivate::new() .first_name("Test") .id(1234) .bio("Test bio"); @@ -105,7 +124,11 @@ fn test_private_group_chat() { let chat_object = chat.build(); assert_eq!(chat_object.first_name(), Some("Test")); assert_eq!(chat_object.id, ChatId(1234)); - assert_eq!(chat_object.bio(), Some("Test bio")); + + let chat_full_info_object = chat_full_info.build(); + assert_eq!(chat_full_info_object.first_name(), Some("Test")); + assert_eq!(chat_full_info_object.id, ChatId(1234)); + assert_eq!(chat_full_info_object.bio(), Some("Test bio")); } // diff --git a/teloxide_tests/src/server/routes/copy_message.rs b/teloxide_tests/src/server/routes/copy_message.rs index 522770f..fc97efd 100644 --- a/teloxide_tests/src/server/routes/copy_message.rs +++ b/teloxide_tests/src/server/routes/copy_message.rs @@ -41,6 +41,7 @@ pub async fn copy_message( message.chat = chat; message.from = Some(me.user.clone()); + // FIXME: Use show_caption_above_media if let MessageKind::Common(ref mut common) = message.kind { common.forward_origin = None; common.external_reply = None; diff --git a/teloxide_tests/src/server/routes/edit_message_caption.rs b/teloxide_tests/src/server/routes/edit_message_caption.rs index 1856df3..2f53299 100644 --- a/teloxide_tests/src/server/routes/edit_message_caption.rs +++ b/teloxide_tests/src/server/routes/edit_message_caption.rs @@ -2,7 +2,7 @@ use std::sync::Mutex; use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use teloxide::types::{MessageEntity, ParseMode, ReplyMarkup}; +use teloxide::types::{BusinessConnectionId, MessageEntity, ParseMode, ReplyMarkup}; use super::{check_if_message_exists, BodyChatId}; use crate::{ @@ -20,6 +20,7 @@ pub struct EditMessageCaptionBody { pub caption_entities: Option>, pub show_caption_above_media: Option, pub reply_markup: Option, + pub business_connection_id: Option, } pub async fn edit_message_caption( @@ -41,6 +42,11 @@ pub async fn edit_message_caption( "caption_entities", body.caption_entities.clone().unwrap_or_default(), ); + lock.messages.edit_message_field( + message_id, + "show_caption_above_media", + body.show_caption_above_media.unwrap_or(false), + ); let message = lock .messages diff --git a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs index 5e624da..83538fa 100644 --- a/teloxide_tests/src/server/routes/edit_message_reply_markup.rs +++ b/teloxide_tests/src/server/routes/edit_message_reply_markup.rs @@ -2,7 +2,7 @@ use std::sync::Mutex; use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use teloxide::types::ReplyMarkup; +use teloxide::types::{BusinessConnectionId, ReplyMarkup}; use super::BodyChatId; use crate::{ @@ -19,6 +19,7 @@ pub struct EditMessageReplyMarkupBody { pub message_id: Option, pub inline_message_id: Option, pub reply_markup: Option, + pub business_connection_id: Option, } pub async fn edit_message_reply_markup( diff --git a/teloxide_tests/src/server/routes/edit_message_text.rs b/teloxide_tests/src/server/routes/edit_message_text.rs index bfeeccf..cf03f20 100644 --- a/teloxide_tests/src/server/routes/edit_message_text.rs +++ b/teloxide_tests/src/server/routes/edit_message_text.rs @@ -3,7 +3,7 @@ use std::sync::Mutex; use actix_web::{error::ErrorBadRequest, web, Responder, ResponseError}; use serde::Deserialize; use teloxide::{ - types::{LinkPreviewOptions, MessageEntity, ParseMode, ReplyMarkup}, + types::{BusinessConnectionId, LinkPreviewOptions, MessageEntity, ParseMode, ReplyMarkup}, ApiError, }; @@ -23,6 +23,7 @@ pub struct EditMessageTextBody { pub entities: Option>, pub link_preview_options: Option, pub reply_markup: Option, + pub business_connection_id: Option, } pub async fn edit_message_text( diff --git a/teloxide_tests/src/server/routes/mod.rs b/teloxide_tests/src/server/routes/mod.rs index 51188bf..743a660 100644 --- a/teloxide_tests/src/server/routes/mod.rs +++ b/teloxide_tests/src/server/routes/mod.rs @@ -2,7 +2,7 @@ use std::{collections::HashMap, str::from_utf8}; use actix_web::{error::ResponseError, http::header::ContentType, HttpResponse}; use futures_util::{stream::StreamExt as _, TryStreamExt}; -use rand::distributions::{Alphanumeric, DistString}; +use rand::distr::{Alphanumeric, SampleString}; use serde::{Deserialize, Serialize}; use serde_json::json; use teloxide::{ @@ -247,10 +247,7 @@ pub async fn get_raw_multipart_fields( .enumerate() .map(|(i, s)| { if i == 0 { - format!( - "{s}{}", - Alphanumeric.sample_string(&mut rand::thread_rng(), 5) - ) + format!("{s}{}", Alphanumeric.sample_string(&mut rand::rng(), 5)) } else { s.to_string() } diff --git a/teloxide_tests/src/server/routes/pin_chat_message.rs b/teloxide_tests/src/server/routes/pin_chat_message.rs index 49aa157..a879ef5 100644 --- a/teloxide_tests/src/server/routes/pin_chat_message.rs +++ b/teloxide_tests/src/server/routes/pin_chat_message.rs @@ -2,6 +2,7 @@ use std::sync::Mutex; use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; +use teloxide::types::BusinessConnectionId; use super::{check_if_message_exists, BodyChatId}; use crate::{server::routes::make_telegram_result, state::State}; @@ -11,6 +12,7 @@ pub struct PinChatMessageBody { pub chat_id: BodyChatId, pub message_id: i32, pub disable_notification: Option, + pub business_connection_id: Option, } pub async fn pin_chat_message( diff --git a/teloxide_tests/src/server/routes/send_animation.rs b/teloxide_tests/src/server/routes/send_animation.rs index fdb0c39..516ca41 100644 --- a/teloxide_tests/src/server/routes/send_animation.rs +++ b/teloxide_tests/src/server/routes/send_animation.rs @@ -3,9 +3,11 @@ use std::{collections::HashMap, str::FromStr, sync::Mutex}; use actix_multipart::Multipart; use actix_web::{error::ErrorBadRequest, web, Responder}; use mime::Mime; -use rand::distributions::{Alphanumeric, DistString}; +use rand::distr::{Alphanumeric, SampleString}; use serde::Deserialize; -use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; +use teloxide::types::{ + BusinessConnectionId, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds, +}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; use crate::{ @@ -37,6 +39,9 @@ pub async fn send_animation( message.caption = body.caption.clone(); message.caption_entities = body.caption_entities.clone().unwrap_or_default(); message.has_media_spoiler = body.has_spoiler.unwrap_or_default(); + message.effect_id = body.message_effect_id.clone(); + message.show_caption_above_media = body.show_caption_above_media.unwrap_or(false); + message.business_connection_id = body.business_connection_id.clone(); if let Some(reply_parameters) = &body.reply_parameters { check_if_message_exists!(lock, reply_parameters.message_id.0); @@ -50,8 +55,8 @@ pub async fn send_animation( message.reply_markup = Some(markup); } - let file_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 16); - let file_unique_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 8); + let file_id = Alphanumeric.sample_string(&mut rand::rng(), 16); + let file_unique_id = Alphanumeric.sample_string(&mut rand::rng(), 8); message.file_name = Some(body.file_name.clone()); message.file_id = file_id.clone(); @@ -103,4 +108,5 @@ pub struct SendMessageAnimationBody { pub message_effect_id: Option, pub reply_markup: Option, pub reply_parameters: Option, + pub business_connection_id: Option, } diff --git a/teloxide_tests/src/server/routes/send_audio.rs b/teloxide_tests/src/server/routes/send_audio.rs index e506f13..a6a09ce 100644 --- a/teloxide_tests/src/server/routes/send_audio.rs +++ b/teloxide_tests/src/server/routes/send_audio.rs @@ -3,9 +3,11 @@ use std::{collections::HashMap, str::FromStr, sync::Mutex}; use actix_multipart::Multipart; use actix_web::{error::ErrorBadRequest, web, Responder}; use mime::Mime; -use rand::distributions::{Alphanumeric, DistString}; +use rand::distr::{Alphanumeric, SampleString}; use serde::Deserialize; -use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; +use teloxide::types::{ + BusinessConnectionId, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds, +}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; use crate::{ @@ -34,6 +36,8 @@ pub async fn send_audio( message.from = Some(me.user.clone()); message.caption = body.caption.clone(); message.caption_entities = body.caption_entities.clone().unwrap_or_default(); + message.effect_id = body.message_effect_id.clone(); + message.business_connection_id = body.business_connection_id.clone(); if let Some(reply_parameters) = &body.reply_parameters { check_if_message_exists!(lock, reply_parameters.message_id.0); @@ -47,8 +51,8 @@ pub async fn send_audio( message.reply_markup = Some(markup); } - let file_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 16); - let file_unique_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 8); + let file_id = Alphanumeric.sample_string(&mut rand::rng(), 16); + let file_unique_id = Alphanumeric.sample_string(&mut rand::rng(), 8); message.file_id = file_id.clone(); message.file_unique_id = file_unique_id.clone(); @@ -92,4 +96,5 @@ pub struct SendMessageAudioBody { pub message_effect_id: Option, pub reply_parameters: Option, pub reply_markup: Option, + pub business_connection_id: Option, } diff --git a/teloxide_tests/src/server/routes/send_chat_action.rs b/teloxide_tests/src/server/routes/send_chat_action.rs index 8d87515..5f4c150 100644 --- a/teloxide_tests/src/server/routes/send_chat_action.rs +++ b/teloxide_tests/src/server/routes/send_chat_action.rs @@ -2,6 +2,7 @@ use std::sync::Mutex; use actix_web::{web, Responder}; use serde::Deserialize; +use teloxide::types::BusinessConnectionId; use super::BodyChatId; use crate::{server::routes::make_telegram_result, state::State}; @@ -11,6 +12,7 @@ pub struct SendChatActionBody { pub chat_id: BodyChatId, pub message_thread_id: Option, pub action: String, + pub business_connection_id: Option, } pub async fn send_chat_action( diff --git a/teloxide_tests/src/server/routes/send_contact.rs b/teloxide_tests/src/server/routes/send_contact.rs index 36f5eef..6bc0440 100644 --- a/teloxide_tests/src/server/routes/send_contact.rs +++ b/teloxide_tests/src/server/routes/send_contact.rs @@ -2,7 +2,7 @@ use std::sync::Mutex; use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use teloxide::types::{Me, ReplyMarkup, ReplyParameters}; +use teloxide::types::{BusinessConnectionId, Me, ReplyMarkup, ReplyParameters}; use super::{make_telegram_result, BodyChatId}; use crate::{ @@ -24,6 +24,7 @@ pub struct SendMessageContactBody { pub message_effect_id: Option, pub reply_markup: Option, pub reply_parameters: Option, + pub business_connection_id: Option, } pub async fn send_contact( @@ -41,6 +42,8 @@ pub async fn send_contact( message.last_name = body.last_name.clone(); message.vcard = body.vcard.clone(); message.has_protected_content = body.protect_content.unwrap_or(false); + message.effect_id = body.message_effect_id.clone(); + message.business_connection_id = body.business_connection_id.clone(); if let Some(reply_parameters) = &body.reply_parameters { check_if_message_exists!(lock, reply_parameters.message_id.0); diff --git a/teloxide_tests/src/server/routes/send_dice.rs b/teloxide_tests/src/server/routes/send_dice.rs index 5346623..8e0cf90 100644 --- a/teloxide_tests/src/server/routes/send_dice.rs +++ b/teloxide_tests/src/server/routes/send_dice.rs @@ -2,7 +2,7 @@ use std::sync::Mutex; use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use teloxide::types::{DiceEmoji, ReplyMarkup, ReplyParameters}; +use teloxide::types::{BusinessConnectionId, DiceEmoji, ReplyMarkup, ReplyParameters}; use super::{make_telegram_result, BodyChatId}; use crate::{ @@ -21,6 +21,7 @@ pub struct SendMessageDiceBody { pub message_effect_id: Option, pub reply_markup: Option, pub reply_parameters: Option, + pub business_connection_id: Option, } pub async fn send_dice( diff --git a/teloxide_tests/src/server/routes/send_document.rs b/teloxide_tests/src/server/routes/send_document.rs index 9dd0f58..6d848ee 100644 --- a/teloxide_tests/src/server/routes/send_document.rs +++ b/teloxide_tests/src/server/routes/send_document.rs @@ -3,9 +3,11 @@ use std::{collections::HashMap, str::FromStr, sync::Mutex}; use actix_multipart::Multipart; use actix_web::{error::ErrorBadRequest, web, Responder}; use mime::Mime; -use rand::distributions::{Alphanumeric, DistString}; +use rand::distr::{Alphanumeric, SampleString}; use serde::Deserialize; -use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters}; +use teloxide::types::{ + BusinessConnectionId, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, +}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; use crate::{ @@ -35,6 +37,8 @@ pub async fn send_document( message.from = Some(me.user.clone()); message.caption = body.caption.clone(); message.caption_entities = body.caption_entities.clone().unwrap_or_default(); + message.effect_id = body.message_effect_id.clone(); + message.business_connection_id = body.business_connection_id.clone(); if let Some(reply_parameters) = &body.reply_parameters { check_if_message_exists!(lock, reply_parameters.message_id.0); @@ -48,8 +52,8 @@ pub async fn send_document( message.reply_markup = Some(markup); } - let file_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 16); - let file_unique_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 8); + let file_id = Alphanumeric.sample_string(&mut rand::rng(), 16); + let file_unique_id = Alphanumeric.sample_string(&mut rand::rng(), 8); message.file_name = Some(body.file_name.clone()); message.file_id = file_id.clone(); @@ -95,4 +99,5 @@ pub struct SendMessageDocumentBody { pub message_effect_id: Option, pub reply_markup: Option, pub reply_parameters: Option, + pub business_connection_id: Option, } diff --git a/teloxide_tests/src/server/routes/send_location.rs b/teloxide_tests/src/server/routes/send_location.rs index b0ae244..381d802 100644 --- a/teloxide_tests/src/server/routes/send_location.rs +++ b/teloxide_tests/src/server/routes/send_location.rs @@ -2,7 +2,7 @@ use std::sync::Mutex; use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use teloxide::types::{Me, ReplyMarkup, ReplyParameters, Seconds}; +use teloxide::types::{BusinessConnectionId, LivePeriod, Me, ReplyMarkup, ReplyParameters}; use super::{make_telegram_result, BodyChatId}; use crate::{ @@ -17,7 +17,7 @@ pub struct SendMessageLocationBody { pub latitude: f64, pub longitude: f64, pub horizontal_accuracy: Option, - pub live_period: Option, + pub live_period: Option, pub heading: Option, pub proximity_alert_radius: Option, pub message_thread_id: Option, @@ -26,6 +26,7 @@ pub struct SendMessageLocationBody { pub message_effect_id: Option, pub reply_markup: Option, pub reply_parameters: Option, + pub business_connection_id: Option, } pub async fn send_location( @@ -44,6 +45,8 @@ pub async fn send_location( message.heading = body.heading; message.proximity_alert_radius = body.proximity_alert_radius; message.has_protected_content = body.protect_content.unwrap_or(false); + message.effect_id = body.message_effect_id.clone(); + message.business_connection_id = body.business_connection_id.clone(); if let Some(reply_parameters) = &body.reply_parameters { check_if_message_exists!(lock, reply_parameters.message_id.0); diff --git a/teloxide_tests/src/server/routes/send_media_group.rs b/teloxide_tests/src/server/routes/send_media_group.rs index 88cef1c..23b2d26 100644 --- a/teloxide_tests/src/server/routes/send_media_group.rs +++ b/teloxide_tests/src/server/routes/send_media_group.rs @@ -2,10 +2,13 @@ use std::{collections::HashMap, sync::Mutex}; use actix_multipart::Multipart; use actix_web::{error::ErrorBadRequest, web, Responder}; -use rand::distributions::{Alphanumeric, DistString}; +use rand::distr::{Alphanumeric, SampleString}; use serde::Deserialize; use serde_json::Value; -use teloxide::types::{Me, Message, MessageEntity, MessageId, ParseMode, ReplyParameters, Seconds}; +use teloxide::types::{ + BusinessConnectionId, Me, Message, MessageEntity, MessageId, ParseMode, ReplyParameters, + Seconds, +}; use super::{ get_raw_multipart_fields, make_telegram_result, Attachment, BodyChatId, MediaGroupInputMedia, @@ -34,6 +37,8 @@ pub async fn send_media_group( } let chat = body.chat_id.chat(); let protect_content = body.protect_content; + let message_effect_id = body.message_effect_id.clone(); + let business_connection_id = body.business_connection_id.clone(); let mut reply_to_message = None; if let Some(reply_parameters) = &body.reply_parameters { check_if_message_exists!(lock, reply_parameters.message_id.0); @@ -44,13 +49,13 @@ pub async fn send_media_group( .unwrap(), )); } - let media_group_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 16); + let media_group_id = Alphanumeric.sample_string(&mut rand::rng(), 16); let mut messages: Vec = vec![]; for media in &body.media { - let file_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 16); - let file_unique_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 8); + let file_id = Alphanumeric.sample_string(&mut rand::rng(), 16); + let file_unique_id = Alphanumeric.sample_string(&mut rand::rng(), 8); let last_id = lock.messages.max_message_id(); let message: Message; match media { @@ -67,6 +72,8 @@ pub async fn send_media_group( mock_message.performer = audio.performer.clone(); mock_message.title = audio.title.clone(); mock_message.duration = audio.duration.unwrap_or(Seconds::from_seconds(1)); + mock_message.effect_id = message_effect_id.clone(); + mock_message.business_connection_id = business_connection_id.clone(); mock_message.file_name = Some(audio.file_name.clone()); mock_message.file_id = file_id.clone(); @@ -93,6 +100,8 @@ pub async fn send_media_group( mock_message.caption_entities = document.caption_entities.clone().unwrap_or_default(); mock_message.media_group_id = Some(media_group_id.clone()); + mock_message.effect_id = message_effect_id.clone(); + mock_message.business_connection_id = business_connection_id.clone(); mock_message.file_name = Some(document.file_name.clone()); mock_message.file_id = file_id.clone(); @@ -118,6 +127,8 @@ pub async fn send_media_group( mock_message.caption = photo.caption.clone(); mock_message.caption_entities = photo.caption_entities.clone().unwrap_or_default(); mock_message.media_group_id = Some(media_group_id.clone()); + mock_message.effect_id = message_effect_id.clone(); + mock_message.business_connection_id = business_connection_id.clone(); let mut mock_photo = MockPhotoSize::new(); @@ -145,6 +156,8 @@ pub async fn send_media_group( mock_message.caption = video.caption.clone(); mock_message.caption_entities = video.caption_entities.clone().unwrap_or_default(); mock_message.media_group_id = Some(media_group_id.clone()); + mock_message.effect_id = message_effect_id.clone(); + mock_message.business_connection_id = business_connection_id.clone(); let mut mock_video = MockVideo::new(); @@ -190,6 +203,7 @@ pub struct SendMediaGroupBody { pub protect_content: Option, pub message_effect_id: Option, pub reply_parameters: Option, + pub business_connection_id: Option, } impl SendMediaGroupBody { @@ -327,6 +341,9 @@ impl SendMediaGroupBody { reply_parameters: fields .get("reply_parameters") .map(|s| serde_json::from_str(s).unwrap()), + business_connection_id: fields + .get("business_connection_id") + .map(|s| serde_json::from_str(s).unwrap()), }) } } diff --git a/teloxide_tests/src/server/routes/send_message.rs b/teloxide_tests/src/server/routes/send_message.rs index 1147f4c..9cada8a 100644 --- a/teloxide_tests/src/server/routes/send_message.rs +++ b/teloxide_tests/src/server/routes/send_message.rs @@ -3,7 +3,8 @@ use std::sync::Mutex; use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; use teloxide::types::{ - LinkPreviewOptions, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, + BusinessConnectionId, LinkPreviewOptions, Me, MessageEntity, ParseMode, ReplyMarkup, + ReplyParameters, }; use super::{make_telegram_result, BodyChatId}; @@ -26,6 +27,7 @@ pub struct SendMessageTextBody { pub message_effect_id: Option, pub reply_markup: Option, pub reply_parameters: Option, + pub business_connection_id: Option, } pub async fn send_message( @@ -39,6 +41,8 @@ pub async fn send_message( MockMessageText::new().text(&body.text).chat(chat); message.from = Some(me.user.clone()); message.has_protected_content = body.protect_content.unwrap_or(false); + message.effect_id = body.message_effect_id.clone(); + message.business_connection_id = body.business_connection_id.clone(); message.entities = body.entities.clone().unwrap_or_default(); if let Some(reply_parameters) = &body.reply_parameters { diff --git a/teloxide_tests/src/server/routes/send_photo.rs b/teloxide_tests/src/server/routes/send_photo.rs index ad5ac7c..059b472 100644 --- a/teloxide_tests/src/server/routes/send_photo.rs +++ b/teloxide_tests/src/server/routes/send_photo.rs @@ -2,10 +2,11 @@ use std::{collections::HashMap, sync::Mutex}; use actix_multipart::Multipart; use actix_web::{error::ErrorBadRequest, web, Responder}; -use rand::distributions::{Alphanumeric, DistString}; +use rand::distr::{Alphanumeric, SampleString}; use serde::Deserialize; use teloxide::types::{ - LinkPreviewOptions, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, + BusinessConnectionId, LinkPreviewOptions, Me, MessageEntity, ParseMode, ReplyMarkup, + ReplyParameters, }; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; @@ -36,6 +37,9 @@ pub async fn send_photo( message.has_protected_content = body.protect_content.unwrap_or(false); message.caption = body.caption.clone(); message.caption_entities = body.caption_entities.clone().unwrap_or_default(); + message.show_caption_above_media = body.show_caption_above_media.unwrap_or(false); + message.effect_id = body.message_effect_id.clone(); + message.business_connection_id = body.business_connection_id.clone(); if let Some(reply_parameters) = &body.reply_parameters { check_if_message_exists!(lock, reply_parameters.message_id.0); @@ -49,8 +53,8 @@ pub async fn send_photo( message.reply_markup = Some(markup); } - let file_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 16); - let file_unique_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 8); + let file_id = Alphanumeric.sample_string(&mut rand::rng(), 16); + let file_unique_id = Alphanumeric.sample_string(&mut rand::rng(), 8); message.photo = vec![MockPhotoSize::new() .file_id(file_id.clone()) @@ -86,7 +90,9 @@ pub struct SendMessagePhotoBody { pub link_preview_options: Option, pub disable_notification: Option, pub protect_content: Option, + pub show_caption_above_media: Option, pub message_effect_id: Option, pub reply_markup: Option, pub reply_parameters: Option, + pub business_connection_id: Option, } diff --git a/teloxide_tests/src/server/routes/send_poll.rs b/teloxide_tests/src/server/routes/send_poll.rs index 293c0d1..c7fb734 100644 --- a/teloxide_tests/src/server/routes/send_poll.rs +++ b/teloxide_tests/src/server/routes/send_poll.rs @@ -4,7 +4,8 @@ use actix_web::{error::ErrorBadRequest, web, Responder}; use chrono::DateTime; use serde::Deserialize; use teloxide::types::{ - Me, MessageEntity, ParseMode, PollOption, PollType, ReplyMarkup, ReplyParameters, Seconds, + BusinessConnectionId, InputPollOption, Me, MessageEntity, ParseMode, PollOption, PollType, + ReplyMarkup, ReplyParameters, Seconds, }; use super::{make_telegram_result, BodyChatId}; @@ -21,7 +22,7 @@ pub struct SendMessagePollBody { pub question: String, pub question_parse_mode: Option, pub question_entities: Option>, - pub options: Vec, + pub options: Vec, pub is_anonymous: Option, pub r#type: Option, pub allows_multiple_answers: Option, @@ -37,6 +38,7 @@ pub struct SendMessagePollBody { pub message_effect_id: Option, pub reply_markup: Option, pub reply_parameters: Option, + pub business_connection_id: Option, } pub async fn send_poll( @@ -50,12 +52,14 @@ pub async fn send_poll( MockMessagePoll::new().chat(chat); message.from = Some(me.user.clone()); message.has_protected_content = body.protect_content.unwrap_or(false); + message.business_connection_id = body.business_connection_id.clone(); message.question = body.question.clone(); let mut options = vec![]; for option in body.options.iter() { options.push(PollOption { - text: option.clone(), + text: option.text.clone(), + text_entities: None, voter_count: 0, }); } @@ -68,6 +72,8 @@ pub async fn send_poll( message.explanation_entities = body.explanation_entities.clone(); message.open_period = body.open_period; message.close_date = DateTime::from_timestamp(body.close_date.unwrap_or(0) as i64, 0); + message.effect_id = body.message_effect_id.clone(); + message.question_entities = body.question_entities.clone(); if let Some(reply_parameters) = &body.reply_parameters { check_if_message_exists!(lock, reply_parameters.message_id.0); diff --git a/teloxide_tests/src/server/routes/send_sticker.rs b/teloxide_tests/src/server/routes/send_sticker.rs index fb99446..4a04983 100644 --- a/teloxide_tests/src/server/routes/send_sticker.rs +++ b/teloxide_tests/src/server/routes/send_sticker.rs @@ -3,7 +3,7 @@ use std::{collections::HashMap, sync::Mutex}; use actix_multipart::Multipart; use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use teloxide::types::{Me, ReplyMarkup, ReplyParameters}; +use teloxide::types::{BusinessConnectionId, Me, ReplyMarkup, ReplyParameters}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; use crate::{ @@ -32,6 +32,8 @@ pub async fn send_sticker( message.from = Some(me.user.clone()); message.has_protected_content = body.protect_content.unwrap_or(false); message.emoji = body.emoji.clone(); + message.effect_id = body.message_effect_id.clone(); + message.business_connection_id = body.business_connection_id.clone(); // Idk how to get sticker kind and sticker format from this, sooooooooooo im not doing it, // ain't nobody testing that @@ -78,4 +80,5 @@ pub struct SendMessageStickerBody { pub message_effect_id: Option, pub reply_markup: Option, pub reply_parameters: Option, + pub business_connection_id: Option, } diff --git a/teloxide_tests/src/server/routes/send_venue.rs b/teloxide_tests/src/server/routes/send_venue.rs index d6f968b..af6b809 100644 --- a/teloxide_tests/src/server/routes/send_venue.rs +++ b/teloxide_tests/src/server/routes/send_venue.rs @@ -2,7 +2,7 @@ use std::sync::Mutex; use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; -use teloxide::types::{Me, ReplyMarkup, ReplyParameters}; +use teloxide::types::{BusinessConnectionId, Me, ReplyMarkup, ReplyParameters}; use super::{make_telegram_result, BodyChatId}; use crate::{ @@ -28,6 +28,7 @@ pub struct SendMessageVenueBody { pub message_effect_id: Option, pub reply_markup: Option, pub reply_parameters: Option, + pub business_connection_id: Option, } pub async fn send_venue( @@ -51,6 +52,8 @@ pub async fn send_venue( message.foursquare_type = body.foursquare_type.clone(); message.google_place_id = body.google_place_id.clone(); message.google_place_type = body.google_place_type.clone(); + message.effect_id = body.message_effect_id.clone(); + message.business_connection_id = body.business_connection_id.clone(); if let Some(reply_parameters) = &body.reply_parameters { check_if_message_exists!(lock, reply_parameters.message_id.0); diff --git a/teloxide_tests/src/server/routes/send_video.rs b/teloxide_tests/src/server/routes/send_video.rs index c20eee7..efe8c10 100644 --- a/teloxide_tests/src/server/routes/send_video.rs +++ b/teloxide_tests/src/server/routes/send_video.rs @@ -3,9 +3,11 @@ use std::{collections::HashMap, str::FromStr, sync::Mutex}; use actix_multipart::Multipart; use actix_web::{error::ErrorBadRequest, web, Responder}; use mime::Mime; -use rand::distributions::{Alphanumeric, DistString}; +use rand::distr::{Alphanumeric, SampleString}; use serde::Deserialize; -use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; +use teloxide::types::{ + BusinessConnectionId, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds, +}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; use crate::{ @@ -34,6 +36,9 @@ pub async fn send_video( message.has_protected_content = body.protect_content.unwrap_or(false); message.caption = body.caption.clone(); message.caption_entities = body.caption_entities.clone().unwrap_or_default(); + message.show_caption_above_media = body.show_caption_above_media.unwrap_or(false); + message.effect_id = body.message_effect_id.clone(); + message.business_connection_id = body.business_connection_id.clone(); if let Some(reply_parameters) = &body.reply_parameters { check_if_message_exists!(lock, reply_parameters.message_id.0); @@ -48,8 +53,8 @@ pub async fn send_video( message.reply_markup = Some(markup); } - let file_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 16); - let file_unique_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 8); + let file_id = Alphanumeric.sample_string(&mut rand::rng(), 16); + let file_unique_id = Alphanumeric.sample_string(&mut rand::rng(), 8); message.video = MockVideo::new() .file_id(file_id.clone()) @@ -98,4 +103,5 @@ pub struct SendMessageVideoBody { pub message_effect_id: Option, pub reply_markup: Option, pub reply_parameters: Option, + pub business_connection_id: Option, } diff --git a/teloxide_tests/src/server/routes/send_video_note.rs b/teloxide_tests/src/server/routes/send_video_note.rs index cd16777..3104812 100644 --- a/teloxide_tests/src/server/routes/send_video_note.rs +++ b/teloxide_tests/src/server/routes/send_video_note.rs @@ -2,9 +2,9 @@ use std::{collections::HashMap, sync::Mutex}; use actix_multipart::Multipart; use actix_web::{error::ErrorBadRequest, web, Responder}; -use rand::distributions::{Alphanumeric, DistString}; +use rand::distr::{Alphanumeric, SampleString}; use serde::Deserialize; -use teloxide::types::{Me, ReplyMarkup, ReplyParameters, Seconds}; +use teloxide::types::{BusinessConnectionId, Me, ReplyMarkup, ReplyParameters, Seconds}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; use crate::{ @@ -45,14 +45,16 @@ pub async fn send_video_note( message.reply_markup = Some(markup); } - let file_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 16); - let file_unique_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 8); + let file_id = Alphanumeric.sample_string(&mut rand::rng(), 16); + let file_unique_id = Alphanumeric.sample_string(&mut rand::rng(), 8); message.file_id = file_id.clone(); message.file_unique_id = file_unique_id.clone(); message.duration = body.duration.unwrap_or(Seconds::from_seconds(0)); message.length = body.length.unwrap_or(100); message.file_size = body.file_data.bytes().len() as u32; + message.effect_id = body.message_effect_id.clone(); + message.business_connection_id = body.business_connection_id.clone(); let last_id = lock.messages.max_message_id(); let message = lock.messages.add_message(message.id(last_id + 1).build()); @@ -85,4 +87,5 @@ pub struct SendMessageVideoNoteBody { pub message_effect_id: Option, pub reply_parameters: Option, pub reply_markup: Option, + pub business_connection_id: Option, } diff --git a/teloxide_tests/src/server/routes/send_voice.rs b/teloxide_tests/src/server/routes/send_voice.rs index e088eb9..15a764e 100644 --- a/teloxide_tests/src/server/routes/send_voice.rs +++ b/teloxide_tests/src/server/routes/send_voice.rs @@ -3,9 +3,11 @@ use std::{collections::HashMap, str::FromStr, sync::Mutex}; use actix_multipart::Multipart; use actix_web::{error::ErrorBadRequest, web, Responder}; use mime::Mime; -use rand::distributions::{Alphanumeric, DistString}; +use rand::distr::{Alphanumeric, SampleString}; use serde::Deserialize; -use teloxide::types::{Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds}; +use teloxide::types::{ + BusinessConnectionId, Me, MessageEntity, ParseMode, ReplyMarkup, ReplyParameters, Seconds, +}; use super::{get_raw_multipart_fields, make_telegram_result, BodyChatId}; use crate::{ @@ -34,6 +36,7 @@ pub async fn send_voice( message.has_protected_content = body.protect_content.unwrap_or(false); message.caption = body.caption.clone(); message.caption_entities = body.caption_entities.clone().unwrap_or_default(); + message.business_connection_id = body.business_connection_id.clone(); if let Some(reply_parameters) = &body.reply_parameters { check_if_message_exists!(lock, reply_parameters.message_id.0); @@ -47,14 +50,15 @@ pub async fn send_voice( message.reply_markup = Some(markup); } - let file_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 16); - let file_unique_id = Alphanumeric.sample_string(&mut rand::thread_rng(), 8); + let file_id = Alphanumeric.sample_string(&mut rand::rng(), 16); + let file_unique_id = Alphanumeric.sample_string(&mut rand::rng(), 8); message.file_id = file_id.clone(); message.file_unique_id = file_unique_id.clone(); message.duration = body.duration.unwrap_or(Seconds::from_seconds(0)); message.file_size = body.file_data.bytes().len() as u32; message.mime_type = Some(Mime::from_str("audio/mp3").unwrap()); + message.effect_id = body.message_effect_id.clone(); let last_id = lock.messages.max_message_id(); let message = lock.messages.add_message(message.id(last_id + 1).build()); @@ -87,4 +91,5 @@ pub struct SendMessageVoiceBody { pub message_effect_id: Option, pub reply_parameters: Option, pub reply_markup: Option, + pub business_connection_id: Option, } diff --git a/teloxide_tests/src/server/routes/unpin_chat_message.rs b/teloxide_tests/src/server/routes/unpin_chat_message.rs index 652f3fe..5bdb1a6 100644 --- a/teloxide_tests/src/server/routes/unpin_chat_message.rs +++ b/teloxide_tests/src/server/routes/unpin_chat_message.rs @@ -2,6 +2,7 @@ use std::sync::Mutex; use actix_web::{error::ErrorBadRequest, web, Responder}; use serde::Deserialize; +use teloxide::types::BusinessConnectionId; use super::{check_if_message_exists, BodyChatId}; use crate::{server::routes::make_telegram_result, state::State}; @@ -10,6 +11,7 @@ use crate::{server::routes::make_telegram_result, state::State}; pub struct UnpinChatMessageBody { pub chat_id: BodyChatId, pub message_id: Option, + pub business_connection_id: Option, } pub async fn unpin_chat_message( diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index cdd15d6..87b3850 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -24,7 +24,7 @@ use teloxide::{ BotCommand, ChatAction, ChatPermissions, DiceEmoji, InlineKeyboardButton, InlineKeyboardMarkup, InputFile, InputMedia, InputMediaAudio, InputMediaDocument, InputMediaPhoto, InputMediaVideo, LabeledPrice, LinkPreviewOptions, Message, MessageEntity, - MessageId, PollOption, PollType, ReactionType, ReplyParameters, Seconds, Update, + MessageId, PollOption, PollType, ReactionType, ReplyParameters, Update, }, }; @@ -358,7 +358,7 @@ async fn handler( } AllCommands::Location => { bot.send_location(msg.chat.id, 1.0, 1.0) - .live_period(60) + .live_period(60.into()) .reply_parameters(reply_options) .await?; } @@ -379,7 +379,7 @@ async fn handler( bot.send_poll( msg.chat.id, "what is test", - vec!["test".to_string(), "not test".to_string()], + vec!["test".to_string().into(), "not test".to_string().into()], ) .type_(PollType::Quiz) .reply_parameters(reply_options) @@ -874,10 +874,7 @@ async fn test_send_location() { ); assert_eq!(last_sent_message.location().unwrap().latitude, 1.0); assert_eq!(last_sent_message.location().unwrap().longitude, 1.0); - assert_eq!( - last_sent_location.bot_request.live_period, - Some(Seconds::from_seconds(60)) - ); + assert_eq!(last_sent_location.bot_request.live_period, Some(60.into())); } #[tokio::test] @@ -947,10 +944,12 @@ async fn test_send_poll() { vec![ PollOption { text: "test".to_string(), + text_entities: None, voter_count: 0 }, PollOption { text: "not test".to_string(), + text_entities: None, voter_count: 0 } ], From b16630098a99cd3122a3618eaad3a081c2108ba5 Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Fri, 7 Mar 2025 18:53:49 +0200 Subject: [PATCH 136/138] Added mocking of update poll Fmt --- teloxide_tests/src/dataset/mod.rs | 12 +++- teloxide_tests/src/dataset/tests.rs | 22 +++++++- teloxide_tests/src/dataset/update.rs | 82 ++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 teloxide_tests/src/dataset/update.rs diff --git a/teloxide_tests/src/dataset/mod.rs b/teloxide_tests/src/dataset/mod.rs index 2ccdde5..ef8d7e4 100644 --- a/teloxide_tests/src/dataset/mod.rs +++ b/teloxide_tests/src/dataset/mod.rs @@ -5,7 +5,7 @@ use mime::Mime; use proc_macros::Changeable; use teloxide::types::{ ChatPhoto, FileMeta, LinkPreviewOptions, LivePeriod, Location, Me, PhotoSize, Seconds, Update, - User, UserId, Video, + UpdateId, User, UserId, Video, }; pub mod chat; pub mod chat_full_info; @@ -13,12 +13,14 @@ pub mod chat_full_info; pub mod message; pub mod message_common; pub mod queries; +pub mod update; pub use chat::*; pub use chat_full_info::*; pub use message::*; pub use message_common::*; pub use queries::*; use teloxide_tests_macros as proc_macros; +pub use update::*; #[cfg(test)] mod tests; @@ -42,6 +44,14 @@ where } } +// Just to be able to use raw updates anywhere +impl IntoUpdate for Update { + fn into_update(mut self, id: &AtomicI32) -> Vec { + self.id = UpdateId(id.fetch_add(1, Ordering::Relaxed) as u32); + vec![self] + } +} + // // Structs below are just misc mocked structs // diff --git a/teloxide_tests/src/dataset/tests.rs b/teloxide_tests/src/dataset/tests.rs index 4136cdb..915c41b 100644 --- a/teloxide_tests/src/dataset/tests.rs +++ b/teloxide_tests/src/dataset/tests.rs @@ -1,7 +1,8 @@ use teloxide::{ dispatching::dialogue::GetChatId, - types::{ChatId, MessageEntity, MessageId, UpdateId, UserId}, + types::{ChatId, MessageEntity, MessageId, UpdateId, UpdateKind, UserId}, }; +use update::MockUpdatePoll; use crate::{dataset::*, proc_macros::Changeable}; @@ -399,3 +400,22 @@ fn test_callback_query() { assert_eq!(query_object.id, MockCallbackQuery::ID); assert_eq!(query_object.from.first_name, MockUser::FIRST_NAME); } + +// +// +// + +#[test] +fn test_update_poll() { + let update = MockUpdatePoll::new().poll_id("123"); + + let update_object = update.into_update(&AtomicI32::new(1))[0].clone(); + + if let UpdateKind::Poll(poll) = update_object.kind { + assert_eq!(poll.question, MockMessagePoll::QUESTION); + assert_eq!(poll.poll_type, MockMessagePoll::POLL_TYPE); + assert_eq!(poll.id, "123".to_owned()); + } else { + unreachable!() + } +} diff --git a/teloxide_tests/src/dataset/update.rs b/teloxide_tests/src/dataset/update.rs new file mode 100644 index 0000000..ce610dd --- /dev/null +++ b/teloxide_tests/src/dataset/update.rs @@ -0,0 +1,82 @@ +use std::sync::atomic::Ordering; + +use chrono::{DateTime, Utc}; +use teloxide::types::{ + MessageEntity, Poll, PollOption, PollType, Seconds, Update, UpdateId, UpdateKind, +}; +use teloxide_tests_macros::Changeable; + +use super::{IntoUpdate, MockMessagePoll}; + +#[derive(Changeable, Clone)] +pub struct MockUpdatePoll { + pub poll_id: String, + pub question: String, + pub question_entities: Option>, + pub options: Vec, + pub is_closed: bool, + pub total_voter_count: u32, + pub is_anonymous: bool, + pub poll_type: PollType, + pub allows_multiple_answers: bool, + pub correct_option_id: Option, + pub explanation: Option, + pub explanation_entities: Option>, + pub open_period: Option, + pub close_date: Option>, +} + +impl MockUpdatePoll { + /// Creates a new easily changable poll update builder + /// + /// # Example + /// ``` + /// let update = teloxide_tests::MockUpdatePoll::new() + /// .poll_id("123456"); + /// + /// assert_eq!(update.poll_id, "123456"); + /// ``` + pub fn new() -> Self { + let poll = MockMessagePoll::new(); + Self { + poll_id: poll.poll_id, + question: poll.question, + question_entities: poll.question_entities, + options: poll.options, + is_closed: poll.is_closed, + total_voter_count: poll.total_voter_count, + is_anonymous: poll.is_anonymous, + poll_type: poll.poll_type, + allows_multiple_answers: poll.allows_multiple_answers, + correct_option_id: poll.correct_option_id, + explanation: poll.explanation, + explanation_entities: poll.explanation_entities, + open_period: poll.open_period, + close_date: poll.close_date, + } + } +} + +impl IntoUpdate for MockUpdatePoll { + fn into_update(self, id: &std::sync::atomic::AtomicI32) -> Vec { + vec![Update { + id: UpdateId(id.fetch_add(1, Ordering::Relaxed) as u32), + kind: UpdateKind::Poll(Poll { + id: self.poll_id, + question: self.question, + question_entities: self.question_entities, + options: self.options, + is_closed: self.is_closed, + total_voter_count: self.total_voter_count, + is_anonymous: self.is_anonymous, + poll_type: self.poll_type, + allows_multiple_answers: self.allows_multiple_answers, + correct_option_id: self.correct_option_id, + explanation: self.explanation, + explanation_entities: self.explanation_entities, + open_period: self.open_period, + close_date: self.close_date, + }), + }] + } +} From 69e7d470de7e9c169c3551080410ca635cdbf81e Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Thu, 24 Apr 2025 14:36:15 +0300 Subject: [PATCH 137/138] Migrated to 0.15.0 --- Cargo.lock | 712 ++++++++++++++++---------- README.md | 2 +- examples/Cargo.lock | 60 ++- examples/album_bot/Cargo.toml | 2 +- examples/calculator_bot/Cargo.toml | 2 +- examples/deep_linking_bot/Cargo.toml | 2 +- examples/file_download_bot/Cargo.toml | 2 +- examples/hello_world_bot/Cargo.toml | 2 +- examples/phrase_bot/Cargo.toml | 2 +- teloxide_tests/Cargo.toml | 2 +- teloxide_tests/src/dataset/queries.rs | 2 +- teloxide_tests/src/mock_bot.rs | 1 - teloxide_tests/src/tests.rs | 1 - 13 files changed, 495 insertions(+), 297 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4dcab42..f9a3c54 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,23 +21,23 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.9.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4" +checksum = "0fa882656b67966045e4152c634051e70346939fced7117d5f0b52146a7c74c9" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-utils", - "ahash", "base64", "bitflags", "brotli", "bytes", "bytestring", - "derive_more 0.99.19", + "derive_more 2.0.1", "encoding_rs", "flate2", + "foldhash", "futures-core", "h2 0.3.26", "http 0.2.12", @@ -49,7 +49,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.8.5", + "rand 0.9.1", "sha1", "smallvec", "tokio", @@ -77,7 +77,7 @@ dependencies = [ "actix-multipart-derive", "actix-utils", "actix-web", - "derive_more 0.99.19", + "derive_more 0.99.20", "futures-core", "futures-util", "httparse", @@ -133,9 +133,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca2549781d8dd6d75c40cf6b6051260a2cc2f3c62343d761a969a0640646894" +checksum = "6398974fd4284f4768af07965701efbbb5fdc0616bff20cade1bb14b77675e24" dependencies = [ "actix-rt", "actix-service", @@ -150,12 +150,11 @@ dependencies = [ [[package]] name = "actix-service" -version = "2.0.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" +checksum = "9e46f36bf0e5af44bdc4bdb36fbbd421aa98c79a9bce724e1edeb3894e10dc7f" dependencies = [ "futures-core", - "paste", "pin-project-lite", ] @@ -171,9 +170,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.9.0" +version = "4.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9180d76e5cc7ccbc4d60a506f2c727730b154010262df5b910eb17dbe4b8cb38" +checksum = "f2e3b15b3dc6c6ed996e4032389e9849d4ab002b1e92fbfe85b5f307d1479b4d" dependencies = [ "actix-codec", "actix-http", @@ -184,13 +183,13 @@ dependencies = [ "actix-service", "actix-utils", "actix-web-codegen", - "ahash", "bytes", "bytestring", "cfg-if", "cookie", - "derive_more 0.99.19", + "derive_more 2.0.1", "encoding_rs", + "foldhash", "futures-core", "futures-util", "impl-more", @@ -208,6 +207,7 @@ dependencies = [ "smallvec", "socket2", "time", + "tracing", "url", ] @@ -294,7 +294,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "once_cell", "version_check", "zerocopy 0.7.35", @@ -474,9 +474,9 @@ dependencies = [ [[package]] name = "brotli" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -485,9 +485,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.2" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" +checksum = "a334ef7c9e23abf0ce748e8cd309037da93e606ad52eb372e4ce327a0dcfbdfd" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -501,9 +501,9 @@ checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" -version = "1.21.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" [[package]] name = "byteorder" @@ -513,9 +513,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "bytestring" @@ -528,9 +528,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.16" +version = "1.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" +checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" dependencies = [ "jobserver", "libc", @@ -693,9 +693,9 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.4.5" +version = "3.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" +checksum = "697b5419f348fd5ae2478e8018cb016c00a5881c7f46c717de98ffd135a5651c" dependencies = [ "nix", "windows-sys 0.59.0", @@ -703,9 +703,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -713,9 +713,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", @@ -727,9 +727,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", @@ -738,9 +738,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", "serde", @@ -748,9 +748,9 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.19" +version = "0.99.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "convert_case", "proc-macro2", @@ -765,7 +765,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" dependencies = [ - "derive_more-impl", + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", ] [[package]] @@ -780,6 +789,18 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "unicode-xid", +] + [[package]] name = "digest" version = "0.10.7" @@ -825,9 +846,9 @@ dependencies = [ [[package]] name = "either" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" dependencies = [ "serde", ] @@ -866,14 +887,14 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.6" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" dependencies = [ "anstream", "anstyle", "env_filter", - "humantime", + "jiff", "log", ] @@ -895,9 +916,9 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" dependencies = [ "libc", "windows-sys 0.59.0", @@ -944,9 +965,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", "miniz_oxide", @@ -971,9 +992,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foldhash" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "foreign-types" @@ -1121,9 +1142,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", @@ -1132,14 +1153,14 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if", "libc", - "wasi 0.13.3+wasi-0.2.2", - "windows-targets 0.52.6", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", ] [[package]] @@ -1160,7 +1181,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.7.1", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -1169,17 +1190,17 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" dependencies = [ "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "http 1.2.0", - "indexmap 2.7.1", + "http 1.3.1", + "indexmap 2.9.0", "slab", "tokio", "tokio-util", @@ -1220,9 +1241,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" [[package]] name = "hex" @@ -1270,9 +1291,9 @@ dependencies = [ [[package]] name = "http" -version = "1.2.0" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" dependencies = [ "bytes", "fnv", @@ -1286,27 +1307,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http 1.3.1", ] [[package]] name = "http-body-util" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ "bytes", - "futures-util", - "http 1.2.0", + "futures-core", + "http 1.3.1", "http-body", "pin-project-lite", ] [[package]] name = "httparse" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] name = "httpdate" @@ -1316,9 +1337,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" +checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] name = "hyper" @@ -1329,8 +1350,8 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.8", - "http 1.2.0", + "h2 0.4.9", + "http 1.3.1", "http-body", "httparse", "itoa", @@ -1347,7 +1368,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 1.2.0", + "http 1.3.1", "hyper", "hyper-util", "rustls", @@ -1375,16 +1396,17 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.2.0", + "http 1.3.1", "http-body", "hyper", + "libc", "pin-project-lite", "socket2", "tokio", @@ -1394,14 +1416,15 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.61" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", "windows-core", ] @@ -1456,9 +1479,9 @@ dependencies = [ [[package]] name = "icu_locid_transform_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" [[package]] name = "icu_normalizer" @@ -1480,9 +1503,9 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" [[package]] name = "icu_properties" @@ -1501,9 +1524,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" [[package]] name = "icu_provider" @@ -1598,9 +1621,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.1" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -1615,9 +1638,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is-terminal" -version = "0.4.15" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ "hermit-abi", "libc", @@ -1650,16 +1673,41 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jiff" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a064218214dc6a10fbae5ec5fa888d80c45d611aba169222fc272072bf7aef6" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde", +] + +[[package]] +name = "jiff-static" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "199b7932d97e325aff3a7030e141eafe7f2c6268e1d1b24859b753a627f45254" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ + "getrandom 0.3.2", "libc", ] @@ -1687,9 +1735,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.170" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "libsqlite3-sys" @@ -1704,9 +1752,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.15" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" @@ -1743,9 +1791,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.26" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "md-5" @@ -1759,9 +1807,9 @@ dependencies = [ [[package]] name = "mediatype" -version = "0.19.19" +version = "0.19.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "659f336e6cbe1083b58900e48649ed99fc99952a983e8d8cc992494394dd3732" +checksum = "33746aadcb41349ec291e7f2f0a3aa6834d1d7c58066fb4b01f68efc4c4b7631" [[package]] name = "memchr" @@ -1787,9 +1835,9 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", ] @@ -1861,15 +1909,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.3" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "openssl" -version = "0.10.71" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ "bitflags", "cfg-if", @@ -1899,9 +1947,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.106" +version = "0.9.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" +checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" dependencies = [ "cc", "libc", @@ -1944,12 +1992,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "487f2ccd1e17ce8c1bfab3a65c89525af41cfad4c8659021a1e9a2aacd73b89b" -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - [[package]] name = "percent-encoding" version = "2.3.1" @@ -1958,18 +2000,18 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfe2e71e1471fe07709406bf725f710b02927c9c54b2b5b2ec0e8087d97c327d" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.9" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e859e6e5bd50440ab63c47e3ebabc90f26251f7c73c3d3e837b74a1cc3fa67" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", @@ -1990,9 +2032,24 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "portable-atomic" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] [[package]] name = "powerfmt" @@ -2002,11 +2059,11 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.7.35", + "zerocopy 0.8.24", ] [[package]] @@ -2042,22 +2099,37 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.93" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] +[[package]] +name = "psm" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f58e5423e24c18cc840e1c98370b3993c6649cd1678b4d24318bcf0a083cbe88" +dependencies = [ + "cc", +] + [[package]] name = "quote" -version = "1.0.38" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + [[package]] name = "rand" version = "0.8.5" @@ -2071,13 +2143,12 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", - "zerocopy 0.8.21", ] [[package]] @@ -2106,7 +2177,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -2115,7 +2186,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.2", ] [[package]] @@ -2129,9 +2200,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" +checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" dependencies = [ "bitflags", ] @@ -2173,17 +2244,17 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.12" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" dependencies = [ "base64", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.4.8", - "http 1.2.0", + "h2 0.4.9", + "http 1.3.1", "http-body", "http-body-util", "hyper", @@ -2229,13 +2300,13 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.11" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", @@ -2258,9 +2329,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.44" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" dependencies = [ "bitflags", "errno", @@ -2271,9 +2342,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.23" +version = "0.23.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47796c98c480fce5406ef69d1c76378375492c3b0a0de587be0c1d9feb12f395" +checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" dependencies = [ "once_cell", "rustls-pki-types", @@ -2299,9 +2370,9 @@ checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" [[package]] name = "rustls-webpki" -version = "0.102.8" +version = "0.103.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" dependencies = [ "ring", "rustls-pki-types", @@ -2310,21 +2381,21 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" [[package]] name = "ryu" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "scc" -version = "2.3.3" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea091f6cac2595aa38993f04f4ee692ed43757035c36e67c180b6828356385b1" +checksum = "22b2d775fb28f245817589471dd49c5edf64237f4a19d10ce9a92ff4651a27f4" dependencies = [ "sdd", ] @@ -2346,9 +2417,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sdd" -version = "3.0.7" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07779b9b918cc05650cb30f404d4d7835d26df37c235eded8a6832e2fb82cca" +checksum = "584e070911c7017da6cb2eb0788d09f43d789029b5877d3e5ecc8acf86ceee21" [[package]] name = "security-framework" @@ -2375,24 +2446,24 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.25" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8dfc9d19bdbf6d17e22319da49161d5d0108e4188e8b680aef6299eed22df60" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.218" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09503e191f4e797cb8aac08e9a4a4695c5edf6a2e70e376d961ddd5c969f82b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", @@ -2406,7 +2477,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d2de91cf02bbc07cde38891769ccd5d4f073d22a40683aa4bc7a95781aaa2c4" dependencies = [ "form_urlencoded", - "indexmap 2.7.1", + "indexmap 2.9.0", "itoa", "ryu", "serde", @@ -2414,9 +2485,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.139" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f86c3acccc9c65b153fe1b85a3be07fe5515274ec9f0653b4a0875731c72a6" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -2426,9 +2497,9 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" dependencies = [ "itoa", "serde", @@ -2465,7 +2536,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.1", + "indexmap 2.9.0", "serde", "serde_derive", "serde_json", @@ -2540,9 +2611,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -2558,18 +2629,18 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" dependencies = [ "serde", ] [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" dependencies = [ "libc", "windows-sys 0.52.0", @@ -2586,9 +2657,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4410e73b3c0d8442c5f99b425d7a435b5ee0ae4167b3196771dd3f7a01be745f" +checksum = "f3c3a85280daca669cfd3bcb68a337882a8bc57ec882f72c5d13a430613a738e" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2598,10 +2669,11 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a007b6936676aa9ab40207cde35daab0a04b823be8ae004368c0793b96a61e0" +checksum = "f743f2a3cea30a58cd479013f75550e879009e3a02f616f18ca699335aa248c3" dependencies = [ + "base64", "bytes", "crc", "crossbeam-queue", @@ -2613,7 +2685,7 @@ dependencies = [ "futures-util", "hashbrown 0.15.2", "hashlink", - "indexmap 2.7.1", + "indexmap 2.9.0", "log", "memchr", "native-tls", @@ -2623,7 +2695,7 @@ dependencies = [ "serde_json", "sha2", "smallvec", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tokio-stream", "tracing", @@ -2632,9 +2704,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3112e2ad78643fef903618d78cf0aec1cb3134b019730edb039b69eaf531f310" +checksum = "7f4200e0fde19834956d4252347c12a083bdcb237d7a1a1446bffd8768417dce" dependencies = [ "proc-macro2", "quote", @@ -2645,9 +2717,9 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e9f90acc5ab146a99bf5061a7eb4976b573f560bc898ef3bf8435448dd5e7ad" +checksum = "882ceaa29cade31beca7129b6beeb05737f44f82dbe2a9806ecea5a7093d00b7" dependencies = [ "dotenvy", "either", @@ -2670,9 +2742,9 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b98a57f363ed6764d5b3a12bfedf62f07aa16e1856a7ddc2a0bb190a959613" +checksum = "a0bedbe1bbb5e2615ef347a5e9d8cd7680fb63e77d9dafc0f29be15e53f1ebe6" dependencies = [ "atoi", "base64", @@ -2700,16 +2772,16 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.11", + "thiserror 2.0.12", "tracing", "whoami", ] [[package]] name = "sqlx-sqlite" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f85ca71d3a5b24e64e1d08dd8fe36c6c95c339a896cc33068148906784620540" +checksum = "c26083e9a520e8eb87a06b12347679b142dc2ea29e6e409f805644a7a979a5bc" dependencies = [ "atoi", "flume", @@ -2724,6 +2796,7 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", + "thiserror 2.0.12", "tracing", "url", ] @@ -2734,6 +2807,19 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "stacker" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601f9201feb9b09c00266478bf459952b9ef9a6b94edb2f21eba14ab681a60a9" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + [[package]] name = "stringprep" version = "0.1.5" @@ -2759,9 +2845,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.98" +version = "2.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" dependencies = [ "proc-macro2", "quote", @@ -2823,8 +2909,9 @@ checksum = "20f34339676cdcab560c9a82300c4c2581f68b9369aedf0fae86f2ff9565ff3e" [[package]] name = "teloxide" -version = "0.13.0" -source = "git+https://github.com/teloxide/teloxide.git?rev=c590976722378a3a02ad5f5dac06b30a4e013395#c590976722378a3a02ad5f5dac06b30a4e013395" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cb7c03a9217286fe11021dc72d5a674acbb0d3b24ba38d04f7efe7920e4948" dependencies = [ "aquamarine", "bytes", @@ -2840,7 +2927,7 @@ dependencies = [ "sqlx", "teloxide-core", "teloxide-macros", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tokio-stream", "tokio-util", @@ -2849,8 +2936,9 @@ dependencies = [ [[package]] name = "teloxide-core" -version = "0.10.1" -source = "git+https://github.com/teloxide/teloxide.git?rev=c590976722378a3a02ad5f5dac06b30a4e013395#c590976722378a3a02ad5f5dac06b30a4e013395" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2f70a3cd58c2b31ca899691b99573a40c6da713ab230bb78bbb4fb0b5c751a" dependencies = [ "bitflags", "bytes", @@ -2868,9 +2956,10 @@ dependencies = [ "serde", "serde_json", "serde_with", + "stacker", "take_mut", "takecell", - "thiserror 2.0.11", + "thiserror 2.0.12", "tokio", "tokio-util", "url", @@ -2879,8 +2968,9 @@ dependencies = [ [[package]] name = "teloxide-macros" -version = "0.8.0" -source = "git+https://github.com/teloxide/teloxide.git?rev=c590976722378a3a02ad5f5dac06b30a4e013395#c590976722378a3a02ad5f5dac06b30a4e013395" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3118a980ed2ec11f73d9495a6606905bd74726e3ffe95a42fbeb187ded8fdbf4" dependencies = [ "heck", "proc-macro2", @@ -2898,7 +2988,7 @@ dependencies = [ "chrono", "ctrlc", "dotenv", - "env_logger 0.11.6", + "env_logger 0.11.8", "futures-util", "gag", "lazy_static", @@ -2906,7 +2996,7 @@ dependencies = [ "mime", "mime_guess", "pretty_env_logger", - "rand 0.9.0", + "rand 0.9.1", "reqwest", "serde", "serde_json", @@ -2940,13 +3030,12 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.17.1" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e5a0acb1f3f55f65cc4a866c361b2fb2a0ff6366785ae6fbb5f85df07ba230" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" dependencies = [ - "cfg-if", "fastrand", - "getrandom 0.3.1", + "getrandom 0.3.2", "once_cell", "rustix", "windows-sys 0.59.0", @@ -2972,11 +3061,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.11", + "thiserror-impl 2.0.12", ] [[package]] @@ -2992,9 +3081,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.11" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", @@ -3003,9 +3092,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.37" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -3018,15 +3107,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -3044,9 +3133,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -3059,9 +3148,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.43.0" +version = "1.44.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" dependencies = [ "backtrace", "bytes", @@ -3119,9 +3208,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", @@ -3215,9 +3304,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-normalization" @@ -3278,11 +3367,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.15.1" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" dependencies = [ - "getrandom 0.3.1", + "getrandom 0.3.2", ] [[package]] @@ -3314,9 +3403,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasi" -version = "0.13.3+wasi-0.2.2" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ "wit-bindgen-rt", ] @@ -3423,9 +3512,9 @@ dependencies = [ [[package]] name = "whoami" -version = "1.5.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" +checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" dependencies = [ "redox_syscall", "wasite", @@ -3464,47 +3553,81 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.52.0" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" dependencies = [ - "windows-targets 0.52.6", + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings 0.4.0", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] name = "windows-link" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dccfd733ce2b1753b03b6d3c65edf020262ea35e20ccdf3e288043e6dd620e3" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" [[package]] name = "windows-registry" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result", - "windows-strings", - "windows-targets 0.52.6", + "windows-strings 0.3.1", + "windows-targets 0.53.0", ] [[package]] name = "windows-result" -version = "0.2.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" dependencies = [ - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "windows-strings" -version = "0.1.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-result", - "windows-targets 0.52.6", + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", ] [[package]] @@ -3558,13 +3681,29 @@ 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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -3577,6 +3716,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -3589,6 +3734,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -3601,12 +3752,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -3619,6 +3782,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -3631,6 +3800,12 @@ 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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -3643,6 +3818,12 @@ 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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -3655,11 +3836,17 @@ 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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "wit-bindgen-rt" -version = "0.33.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ "bitflags", ] @@ -3706,17 +3893,16 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "byteorder", "zerocopy-derive 0.7.35", ] [[package]] name = "zerocopy" -version = "0.8.21" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf01143b2dd5d134f11f545cf9f1431b13b749695cb33bcce051e7568f99478" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" dependencies = [ - "zerocopy-derive 0.8.21", + "zerocopy-derive 0.8.24", ] [[package]] @@ -3732,9 +3918,9 @@ dependencies = [ [[package]] name = "zerocopy-derive" -version = "0.8.21" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712c8386f4f4299382c9abee219bee7084f78fb939d88b6840fcc1320d5f6da2" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" dependencies = [ "proc-macro2", "quote", @@ -3801,18 +3987,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.3" +version = "7.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3051792fbdc2e1e143244dc28c60f73d8470e93f3f9cbd0ead44da5ed802722" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.14+zstd.1.5.7" +version = "2.0.15+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb060d4926e4ac3a3ad15d864e99ceb5f343c6b34f5bd6d81ae6ed417311be5" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" dependencies = [ "cc", "pkg-config", diff --git a/README.md b/README.md index d779802..bb8bd9c 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ - + diff --git a/examples/Cargo.lock b/examples/Cargo.lock index a211fc4..1747b97 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -427,17 +427,6 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" -[[package]] -name = "async-trait" -version = "0.1.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644dd749086bf3771a2fbc5f256fdb982d53f011c7d5d560304eafeecebce79d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "atoi" version = "2.0.0" @@ -800,9 +789,9 @@ dependencies = [ [[package]] name = "deadpool-redis" -version = "0.18.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfae6799b68a735270e4344ee3e834365f707c72da09c9a8bb89b45cc3351395" +checksum = "c136f185b3ca9d1f4e4e19c11570e1002f4bfdd592d589053e225716d613851f" dependencies = [ "deadpool", "redis", @@ -2277,6 +2266,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "psm" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f58e5423e24c18cc840e1c98370b3993c6649cd1678b4d24318bcf0a083cbe88" +dependencies = [ + "cc", +] + [[package]] name = "quote" version = "1.0.38" @@ -2357,21 +2355,20 @@ dependencies = [ [[package]] name = "redis" -version = "0.27.6" +version = "0.29.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d8f99a4090c89cc489a94833c901ead69bfbf3877b4867d5482e321ee875bc" +checksum = "1bc42f3a12fd4408ce64d8efef67048a924e543bd35c6591c0447fda9054695f" dependencies = [ "arc-swap", - "async-trait", "bytes", "combine", "futures-util", - "itertools 0.13.0", "itoa", "num-bigint", "percent-encoding", "pin-project-lite", "ryu", + "socket2", "tokio", "tokio-util", "url", @@ -2954,6 +2951,19 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "stacker" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601f9201feb9b09c00266478bf459952b9ef9a6b94edb2f21eba14ab681a60a9" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.59.0", +] + [[package]] name = "stringprep" version = "0.1.5" @@ -3043,8 +3053,9 @@ checksum = "20f34339676cdcab560c9a82300c4c2581f68b9369aedf0fae86f2ff9565ff3e" [[package]] name = "teloxide" -version = "0.13.0" -source = "git+https://github.com/teloxide/teloxide.git?rev=c590976722378a3a02ad5f5dac06b30a4e013395#c590976722378a3a02ad5f5dac06b30a4e013395" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cb7c03a9217286fe11021dc72d5a674acbb0d3b24ba38d04f7efe7920e4948" dependencies = [ "aquamarine", "bytes", @@ -3071,8 +3082,9 @@ dependencies = [ [[package]] name = "teloxide-core" -version = "0.10.1" -source = "git+https://github.com/teloxide/teloxide.git?rev=c590976722378a3a02ad5f5dac06b30a4e013395#c590976722378a3a02ad5f5dac06b30a4e013395" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2f70a3cd58c2b31ca899691b99573a40c6da713ab230bb78bbb4fb0b5c751a" dependencies = [ "bitflags", "bytes", @@ -3090,6 +3102,7 @@ dependencies = [ "serde", "serde_json", "serde_with", + "stacker", "take_mut", "takecell", "thiserror 2.0.11", @@ -3101,8 +3114,9 @@ dependencies = [ [[package]] name = "teloxide-macros" -version = "0.8.0" -source = "git+https://github.com/teloxide/teloxide.git?rev=c590976722378a3a02ad5f5dac06b30a4e013395#c590976722378a3a02ad5f5dac06b30a4e013395" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3118a980ed2ec11f73d9495a6606905bd74726e3ffe95a42fbeb187ded8fdbf4" dependencies = [ "heck", "proc-macro2", diff --git a/examples/album_bot/Cargo.toml b/examples/album_bot/Cargo.toml index ea34aba..0e304cc 100644 --- a/examples/album_bot/Cargo.toml +++ b/examples/album_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros"] } +teloxide = { version = "0.15.0", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" log = "0.4" diff --git a/examples/calculator_bot/Cargo.toml b/examples/calculator_bot/Cargo.toml index 861d2b5..d908335 100644 --- a/examples/calculator_bot/Cargo.toml +++ b/examples/calculator_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros", "redis-storage", "cbor-serializer"] } +teloxide = { version = "0.15.0", features = ["macros", "redis-storage", "cbor-serializer"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" serde = { version = "1.0", features = ["derive"] } diff --git a/examples/deep_linking_bot/Cargo.toml b/examples/deep_linking_bot/Cargo.toml index dd942d9..4741c14 100644 --- a/examples/deep_linking_bot/Cargo.toml +++ b/examples/deep_linking_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros"] } +teloxide = { version = "0.15.0", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" serde = { version = "1.0", features = ["derive"] } diff --git a/examples/file_download_bot/Cargo.toml b/examples/file_download_bot/Cargo.toml index e93a5a5..0b4de67 100644 --- a/examples/file_download_bot/Cargo.toml +++ b/examples/file_download_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros"] } +teloxide = { version = "0.15.0", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" diff --git a/examples/hello_world_bot/Cargo.toml b/examples/hello_world_bot/Cargo.toml index 729ae0d..ca9d6fb 100644 --- a/examples/hello_world_bot/Cargo.toml +++ b/examples/hello_world_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros"] } +teloxide = { version = "0.15.0", features = ["macros"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" diff --git a/examples/phrase_bot/Cargo.toml b/examples/phrase_bot/Cargo.toml index 6267b10..353e9a8 100644 --- a/examples/phrase_bot/Cargo.toml +++ b/examples/phrase_bot/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros", "redis-storage", "cbor-serializer"] } +teloxide = { version = "0.15.0", features = ["macros", "redis-storage", "cbor-serializer"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } dotenv = "0.15.0" serde = { version = "1.0", features = ["derive"] } diff --git a/teloxide_tests/Cargo.toml b/teloxide_tests/Cargo.toml index 1ebb678..ec6c9f9 100644 --- a/teloxide_tests/Cargo.toml +++ b/teloxide_tests/Cargo.toml @@ -20,7 +20,7 @@ log = "0.4" pretty_env_logger = "0.5" url = "2.5.1" reqwest = "0.12.5" -teloxide = { git = "https://github.com/teloxide/teloxide.git", rev = "c590976722378a3a02ad5f5dac06b30a4e013395", features = ["macros", "sqlite-storage-nativetls"] } +teloxide = { version = "0.15.0", features = ["macros", "sqlite-storage-nativetls"] } tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/teloxide_tests/src/dataset/queries.rs b/teloxide_tests/src/dataset/queries.rs index 7bea3dd..7cc67d8 100644 --- a/teloxide_tests/src/dataset/queries.rs +++ b/teloxide_tests/src/dataset/queries.rs @@ -85,7 +85,7 @@ impl MockCallbackQuery { from: self.from, message: self.message.map(|message| { if !self.make_message_inaccessible { - MaybeInaccessibleMessage::Regular(message) + MaybeInaccessibleMessage::Regular(Box::new(message)) } else { MaybeInaccessibleMessage::Inaccessible(InaccessibleMessage { chat: message.chat, diff --git a/teloxide_tests/src/mock_bot.rs b/teloxide_tests/src/mock_bot.rs index 6a6046c..ffa3b58 100644 --- a/teloxide_tests/src/mock_bot.rs +++ b/teloxide_tests/src/mock_bot.rs @@ -272,7 +272,6 @@ where .dependencies(deps) .distribution_function(distribution_f) .error_handler(error_handler) - .stack_size(stack_size) .build() .dispatch_with_listener( InsertingListener { updates }, diff --git a/teloxide_tests/src/tests.rs b/teloxide_tests/src/tests.rs index 87b3850..07b7134 100644 --- a/teloxide_tests/src/tests.rs +++ b/teloxide_tests/src/tests.rs @@ -497,7 +497,6 @@ async fn handler( "Absolutely Nothing", "Demo", "test_payload", - "", "XTR", vec![LabeledPrice { label: "Stars".into(), From d24aee353b3de7cb908fa8c2130d39fc7103461c Mon Sep 17 00:00:00 2001 From: LasterAlex Date: Thu, 24 Apr 2025 14:42:19 +0300 Subject: [PATCH 138/138] Docs fix --- teloxide_tests/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/teloxide_tests/src/lib.rs b/teloxide_tests/src/lib.rs index da0d76e..67c71b5 100644 --- a/teloxide_tests/src/lib.rs +++ b/teloxide_tests/src/lib.rs @@ -36,7 +36,7 @@ //! //! #[tokio::test] //! async fn test_hello_world() { // A testing bot dispatch -//! let bot = MockBot::new(MockMessageText::new().text("Hi!"), handler_tree()); +//! let mut bot = MockBot::new(MockMessageText::new().text("Hi!"), handler_tree()); //! bot.dispatch().await; //! let message = bot.get_responses().sent_messages.last().unwrap(); //! // This is a regular teloxide::types::Message!