1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use super::{ESMTPCommand, Rfc5321};
use crate::common::*;
use crate::smtp::{ApplyCommand, SmtpRset, SmtpSessionCommand, SmtpState};

impl SmtpSessionCommand for ESMTPCommand<SmtpRset> {
    fn verb(&self) -> &str {
        "RSET"
    }

    fn apply(&self, state: SmtpState) -> S2Fut<SmtpState> {
        Rfc5321::apply_cmd(&self.instruction, state)
    }
}

impl ApplyCommand<SmtpRset> for Rfc5321 {
    fn apply_cmd(_cmd: &SmtpRset, mut state: SmtpState) -> S2Fut<SmtpState> {
        state.reset();
        state.say_ok();
        Box::pin(ready(state))
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::{
        mail::{Builder, Recipient},
        smtp::{SmtpMail, SmtpPath},
    };
    use futures_await_test::async_test;

    #[async_test]
    async fn transaction_gets_reset() {
        let mut set = SmtpState::new(Builder::default());
        set.transaction.id = "someid".to_owned();
        set.transaction.mail = Some(SmtpMail::Mail(SmtpPath::Null, vec![]));
        set.transaction.rcpts.push(Recipient::null());
        set.transaction.extra_headers.insert_str(0, "feeeha");
        let sut = Rfc5321::command(SmtpRset);
        let res = sut.apply(set).await;
        assert!(res.transaction.is_empty())
    }
}