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 44 45 46 47
use super::{ESMTPCommand, Rfc5321}; use crate::{ common::*, smtp::{ApplyCommand, SmtpSessionCommand, SmtpState, SmtpUnknownCommand}, }; impl SmtpSessionCommand for ESMTPCommand<SmtpUnknownCommand> { fn verb(&self) -> &str { self.instruction.verb.as_str() } fn apply(&self, state: SmtpState) -> S2Fut<SmtpState> { Rfc5321::apply_cmd(&self.instruction, state) } } impl ApplyCommand<SmtpUnknownCommand> for Rfc5321 { fn apply_cmd(_cmd: &SmtpUnknownCommand, mut state: SmtpState) -> S2Fut<SmtpState> { state.say_not_implemented(); Box::pin(ready(state)) } } #[cfg(test)] mod tests { use super::*; use crate::{ mail::{Builder, Recipient}, smtp::{CodecControl, SmtpMail, SmtpPath, SmtpState}, }; use futures_await_test::async_test; #[async_test] async fn response_is_not_implemented() { 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(SmtpUnknownCommand::new("HOOO".to_owned(), vec![])); let mut res = sut.apply(set).await; match res.writes.pop_front() { Some(CodecControl::Response(bytes)) if bytes.starts_with(b"502 ") => {} otherwise => panic!("Expected command not implemented, got {:?}", otherwise), } } }