use crate::common::actions::when;
use crate::common::assertions::{assert_msg_type, then};
use crate::common::cleanup::finally;
use crate::common::setup::given_an_active_session;
use hotfix::session::Status;
use hotfix_message::Part;
use hotfix_message::fix44::{MsgType, RESET_SEQ_NUM_FLAG};
#[tokio::test]
async fn test_reset_sequence_numbers_once() {
let (mut session, mut counterparty) = given_an_active_session().await;
when(&session)
.sends_message(crate::common::test_messages::TestMessage::dummy_execution_report())
.await;
then(&mut counterparty)
.receives(|msg| assert_msg_type(msg, MsgType::ExecutionReport))
.await;
let session_info = session.session_handle().get_session_info().await.unwrap();
assert!(
session_info.next_sender_seq_number > 2,
"sequence numbers should be incremented"
);
session
.session_handle()
.request_reset_on_next_logon()
.await
.expect("reset request to succeed");
finally(&session, &mut counterparty).disconnect().await;
when(&mut counterparty).gets_reconnected(true).await;
then(&mut counterparty)
.receives(|msg| {
assert_msg_type(msg, MsgType::Logon);
let reset_flag = msg.get::<&str>(RESET_SEQ_NUM_FLAG);
assert_eq!(reset_flag, Ok("Y"), "ResetSeqNumFlag should be Y");
})
.await;
when(&mut counterparty).sends_logon().await;
then(&mut session).status_changes_to(Status::Active).await;
let session_info = session.session_handle().get_session_info().await.unwrap();
assert_eq!(
session_info.next_sender_seq_number, 2,
"sender sequence number should be 2 (after the logon)"
);
assert_eq!(
session_info.next_target_seq_number, 2,
"target sequence number should be 2 (after receiving logon)"
);
finally(&session, &mut counterparty).disconnect().await;
}