use super::super::defs::*;
use crate::account::model::Flag;
#[test]
fn store_unchanged_since() {
let setup = set_up();
let mut client = setup.connect("7162cfsu");
quick_log_in(&mut client);
quick_create(&mut client, "7162cfsu");
quick_append_enron(&mut client, "7162cfsu", 3);
command!(mut responses = client, c("SELECT 7162cfsu (CONDSTORE)"));
assert_tagged_ok_any(responses.pop().unwrap());
let max_modseq = has_untagged_response_matching! {
s::Response::Cond(s::CondResponse {
code: Some(s::RespTextCode::HighestModseq(mm)),
..
}) in responses => mm
};
command!(mut responses = client,
cb(&format!(
"STORE 1,3 (UNCHANGEDSINCE {}) +FLAGS.SILENT (\\seen)",
max_modseq)));
assert_tagged_ok(responses.pop().unwrap());
command!(mut responses = client, cb(&format!(
"STORE 1:3 (UNCHANGEDSINCE {}) +FLAGS.SILENT (\\deleted)",
max_modseq
)));
unpack_cond_response! {
(Some(_), s::RespCondType::Ok,
Some(s::RespTextCode::Modified(ref modified)), _) =
responses.pop().unwrap() =>
{
assert_eq!("1,3", modified);
}
};
let new_modseq = has_untagged_response_matching! {
s::Response::Fetch(ref fr @ s::FetchResponse {
seqnum: 1,
..
}) in responses => {
has_msgatt_matching! {
s::MsgAtt::Flags(..) in fr
};
has_msgatt_matching! {
s::MsgAtt::Modseq(m) in fr => m
}
}
};
command!(responses = client, c("FETCH 1:2 FLAGS"));
has_untagged_response_matching! {
s::Response::Fetch(ref fr @ s::FetchResponse {
seqnum: 1,
..
}) in responses => {
has_msgatt_matching! {
s::MsgAtt::Flags(s::FlagsFetch::Recent(ref flags)) in fr => {
assert!(!flags.contains(&Flag::Deleted));
}
};
}
};
has_untagged_response_matching! {
s::Response::Fetch(ref fr @ s::FetchResponse {
seqnum: 2,
..
}) in responses => {
has_msgatt_matching! {
s::MsgAtt::Flags(s::FlagsFetch::Recent(ref flags)) in fr => {
assert!(flags.contains(&Flag::Deleted));
}
};
}
};
command!(mut responses = client, cb(&format!(
"STORE 1 (UNCHANGEDSINCE {}) +FLAGS.SILENT (\\deleted)",
new_modseq
)));
assert_tagged_ok(responses.pop().unwrap());
command!(responses = client, c("FETCH 1 FLAGS"));
has_untagged_response_matching! {
s::Response::Fetch(ref fr @ s::FetchResponse {
seqnum: 1,
..
}) in responses => {
has_msgatt_matching! {
s::MsgAtt::Flags(s::FlagsFetch::Recent(ref flags)) in fr => {
assert!(flags.contains(&Flag::Deleted));
}
};
}
};
}
#[test]
fn store_unchanged_concurrent() {
let setup = set_up();
let mut client = setup.connect("7162cfuc");
quick_log_in(&mut client);
quick_create(&mut client, "7162cfuc");
quick_append_enron(&mut client, "7162cfuc", 2);
command!(mut responses = client, c("SELECT 7162cfuc (CONDSTORE)"));
assert_tagged_ok_any(responses.pop().unwrap());
let max_modseq = has_untagged_response_matching! {
s::Response::Cond(s::CondResponse {
code: Some(s::RespTextCode::HighestModseq(mm)),
..
}) in responses => mm
};
let mut client2 = setup.connect("7162cfuc2");
quick_log_in(&mut client2);
quick_select(&mut client2, "7162cfuc");
ok_command!(client2, c("STORE 1 +FLAGS (\\seen)"));
ok_command!(client2, c("XVANQUISH 2"));
command!(mut responses = client, cb(&format!(
"STORE 1:2 (UNCHANGEDSINCE {}) +FLAGS.SILENT (\\deleted)",
max_modseq
)));
unpack_cond_response! {
(Some(_), s::RespCondType::Ok,
Some(s::RespTextCode::Modified(ref modified)), _) =
responses.pop().unwrap() =>
{
assert_eq!("1:2", modified);
}
};
has_untagged_response_matching! {
s::Response::Fetch(ref fr @ s::FetchResponse {
seqnum: 1,
..
}) in responses => {
has_msgatt_matching! {
s::MsgAtt::Flags(s::FlagsFetch::Recent(ref flags)) in fr => {
assert!(!flags.contains(&Flag::Deleted));
}
};
}
};
let new_modseq = has_untagged_response_matching! {
s::Response::Fetch(ref fr @ s::FetchResponse {
seqnum: 2,
..
}) in responses => {
has_msgatt_matching! {
s::MsgAtt::Flags(s::FlagsFetch::Recent(ref flags)) in fr => {
assert!(!flags.contains(&Flag::Deleted));
}
};
has_msgatt_matching! {
s::MsgAtt::Modseq(m) in fr => m
}
}
};
command!(mut responses = client, cb(&format!(
"STORE 1:2 (UNCHANGEDSINCE {}) +FLAGS.SILENT (\\deleted)",
new_modseq
)));
unpack_cond_response! {
(Some(_), s::RespCondType::Ok,
Some(s::RespTextCode::ExpungeIssued(())), _) = responses.pop().unwrap()
};
command!(responses = client, c("FETCH 1:2 FLAGS"));
has_untagged_response_matching! {
s::Response::Fetch(ref fr @ s::FetchResponse {
seqnum: 1,
..
}) in responses => {
has_msgatt_matching! {
s::MsgAtt::Flags(s::FlagsFetch::Recent(ref flags)) in fr => {
assert!(flags.contains(&Flag::Deleted));
}
};
}
};
has_untagged_response_matching! {
s::Response::Fetch(ref fr @ s::FetchResponse {
seqnum: 2,
..
}) in responses => {
has_msgatt_matching! {
s::MsgAtt::Flags(s::FlagsFetch::Recent(ref flags)) in fr => {
assert!(flags.contains(&Flag::Deleted));
}
}
}
};
}