fixup! add support for the imap quota extension (RFC 2087)

This commit is contained in:
Edward Rudd 2022-10-18 21:36:01 -04:00
parent b3529a058f
commit 733aba99fe
2 changed files with 43 additions and 1 deletions

View file

@ -2450,6 +2450,27 @@ mod tests {
assert_quota_resource(&quota.resources[0], QuotaResourceName::Storage, 500, 10); assert_quota_resource(&quota.resources[0], QuotaResourceName::Storage, 500, 10);
} }
#[test]
fn set_quota_via_quota_resource_limit_new() {
let response = b"* QUOTA my_root (STORAGE 10 500)\r\n\
a1 OK completed\r\n"
.to_vec();
let mock_stream = MockStream::new(response);
let mut session = mock_session!(mock_stream);
let quota = session
.set_quota("my_root", &[QuotaResourceLimit::new("STORAGE", 500)])
.unwrap();
assert_eq!(
session.stream.get_ref().written_buf,
b"a1 SETQUOTA \"my_root\" (STORAGE 500)\r\n".to_vec(),
"Invalid setquota command"
);
let quota = quota.parsed().as_ref().unwrap();
assert_eq!(quota.root_name, "my_root");
assert_eq!(quota.resources.len(), 1);
assert_quota_resource(&quota.resources[0], QuotaResourceName::Storage, 500, 10);
}
#[test] #[test]
fn set_quota_no_such_quota_root() { fn set_quota_no_such_quota_root() {
let response = b"a1 NO no such quota root\r\n".to_vec(); let response = b"a1 NO no such quota root\r\n".to_vec();

View file

@ -21,7 +21,8 @@ pub struct QuotaResourceLimit<'a> {
impl<'a> QuotaResourceLimit<'a> { impl<'a> QuotaResourceLimit<'a> {
/// Creates a new [`QuotaResourceLimit`] /// Creates a new [`QuotaResourceLimit`]
pub fn new(name: QuotaResourceName<'a>, amount: u64) -> Self { pub fn new(name: impl Into<QuotaResourceName<'a>>, amount: u64) -> Self {
let name = name.into();
Self { name, amount } Self { name, amount }
} }
} }
@ -46,6 +47,18 @@ pub enum QuotaResourceName<'a> {
Atom(Cow<'a, str>), Atom(Cow<'a, str>),
} }
impl<'a> From<&'a str> for QuotaResourceName<'a> {
fn from(input: &'a str) -> Self {
if input == "STORAGE" {
QuotaResourceName::Storage
} else if input == "MESSAGE" {
QuotaResourceName::Message
} else {
QuotaResourceName::Atom(Cow::from(input))
}
}
}
impl Display for QuotaResourceName<'_> { impl Display for QuotaResourceName<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self { match self {
@ -243,4 +256,12 @@ mod tests {
let new_owned = borrowed.into_owned(); let new_owned = borrowed.into_owned();
assert!(matches!(new_owned, QuotaResourceName::Atom(Cow::Owned(_)))); assert!(matches!(new_owned, QuotaResourceName::Atom(Cow::Owned(_))));
} }
#[test]
fn test_quota_resource_limit_new() {
let limit = QuotaResourceLimit::new("STORAGE", 1000);
assert_eq!(limit.name, QuotaResourceName::Storage);
assert_eq!(limit.amount, 1000);
}
} }