Files
inbuxa-server/tests/src/imap/search.rs
T
jcoffey-dev 7dae9b29fd Import upstream v0.16.22, stripped
Upstream commit: 474dd0229cb20cf513036619781ed97bd8073c3f
Enterprise-only files removed or emptied: 63
Enterprise-only snippets removed: 117 in 50 files
Dangling module declarations removed: 5
Cargo edits turning enterprise off: 14
Verification: clean
Enterprise feature gates left for rebuilt features: 19 in 18 files

Produced by tools/fork/strip.py. The full report is in docs/fork/strip-reports/ on main.
2026-09-18 10:21:56 -07:00

140 lines
4.2 KiB
Rust

/*
* SPDX-FileCopyrightText: 2020 Stalwart Labs LLC <[email protected]>
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
*/
use crate::utils::server::TestServer;
use super::{AssertResult, ImapConnection, Type};
use imap_proto::ResponseType;
pub async fn test(imap: &mut ImapConnection, imap_check: &mut ImapConnection, test: &TestServer) {
println!("Running SEARCH tests...");
// Searches without selecting a mailbox should fail.
imap.send("SEARCH RETURN (MIN MAX COUNT ALL) ALL").await;
imap.assert_read(Type::Tagged, ResponseType::Bad).await;
// Select INBOX
imap.send("SELECT INBOX").await;
imap.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_contains("10 EXISTS")
.assert_contains("[UIDNEXT 11]");
imap_check.send("SELECT INBOX").await;
imap_check.assert_read(Type::Tagged, ResponseType::Ok).await;
// Min, Max and Count
imap.send("SEARCH RETURN (MIN MAX COUNT ALL) ALL").await;
imap.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_contains("COUNT 10 MIN 1 MAX 10 ALL 1,10");
imap_check.send("UID SEARCH ALL").await;
imap_check
.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_equals("* SEARCH 1 2 3 4 5 6 7 8 9 10");
// Filters
imap_check
.send("UID SEARCH OR FROM nathaniel SUBJECT argentina")
.await;
imap_check
.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_equals("* SEARCH 1 3 4 6");
imap_check
.send("UID SEARCH UNSEEN OR KEYWORD Flag_007 KEYWORD Flag_004")
.await;
imap_check
.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_equals("* SEARCH 5 8");
imap_check
.send("UID SEARCH TEXT coffee FROM vandelay SUBJECT exporting SENTON 20-Nov-2021")
.await;
imap_check
.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_equals("* SEARCH 10");
imap_check
.send(concat!(
"UID SEARCH CHARSET UTF-8 TEXT {75+}\r\n",
"ℌ𝔢𝔩𝔭 𝔪𝔢 𝔢𝔵𝔭𝔬𝔯𝔱 𝔪𝔶 𝔟𝔬𝔬𝔨"
))
.await;
imap_check
.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_equals("* SEARCH 10");
imap_check
.send("UID SEARCH NOT (FROM nathaniel ANSWERED)")
.await;
imap_check
.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_equals("* SEARCH 2 3 5 7 8 9 10");
imap_check
.send("UID SEARCH UID 0:6 LARGER 1000 SMALLER 2000")
.await;
imap_check
.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_equals("* SEARCH 1 2");
// Saved search
imap_check.send(
"UID SEARCH RETURN (SAVE ALL) OR OR FROM nathaniel FROM vandelay OR SUBJECT rfc FROM gore",
)
.await;
imap_check
.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_contains("1,3:4,6,8,10");
imap_check.send("UID SEARCH NOT $").await;
imap_check
.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_equals("* SEARCH 2 5 7 9");
imap_check
.send("UID SEARCH $ SMALLER 1000 SUBJECT section")
.await;
imap_check
.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_equals("* SEARCH 8");
imap_check.send("UID SEARCH RETURN (MIN MAX) NOT $").await;
imap_check
.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_contains("MIN 2 MAX 9");
// Sort
imap_check
.send("UID SORT (REVERSE SUBJECT REVERSE DATE) UTF-8 FROM Nathaniel")
.await;
imap_check
.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_equals("* SORT 6 4 1");
imap.send("UID SORT RETURN (COUNT ALL) (DATE SUBJECT) UTF-8 ALL")
.await;
imap.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_contains(if !test.server.search_store().is_mysql() {
"COUNT 10 ALL 6,4:5,1,10,3,7:8,2,9"
} else {
"COUNT 10 ALL 9,3,7:8,2,6,4:5,1,10"
}); //6,4:5,1,10,9,3,7:8,2");
}