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 crate::common::test_messages::{TestMessage, build_sequence_reset_without_new_seq_no};
use hotfix_message::fix44::MsgType;
use tokio::test;
#[test]
async fn test_receive_reset_with_new_seq_number_higher_than_current() {
const NEW_SEQ_NO: u64 = 10;
let (mut session, mut counterparty) = given_an_active_session().await;
when(&mut counterparty)
.sends_sequence_reset(1, NEW_SEQ_NO)
.await;
then(&mut session)
.target_sequence_number_reaches(NEW_SEQ_NO - 1)
.await;
finally(&session, &mut counterparty).disconnect().await;
}
#[test]
async fn test_sequence_number_is_ignored_in_resets() {
let (mut session, mut counterparty) = given_an_active_session().await;
let sequence_number = counterparty.next_target_sequence_number();
when(&mut counterparty)
.sends_message(TestMessage::dummy_execution_report())
.await;
then(&mut session)
.target_sequence_number_reaches(sequence_number)
.await;
counterparty.delete_last_message_from_store();
let new_sequence_number = sequence_number + 10;
when(&mut counterparty)
.sends_sequence_reset(sequence_number, new_sequence_number)
.await;
then(&mut session)
.target_sequence_number_reaches(new_sequence_number - 1)
.await;
finally(&session, &mut counterparty).disconnect().await;
}
#[test]
async fn test_reset_moving_sequence_number_back_is_rejected() {
let (mut session, mut counterparty) = given_an_active_session().await;
let sequence_number = counterparty.next_target_sequence_number();
when(&mut counterparty)
.sends_message(TestMessage::dummy_execution_report())
.await;
then(&mut session)
.target_sequence_number_reaches(sequence_number)
.await;
when(&mut counterparty)
.sends_sequence_reset(sequence_number + 1, 1)
.await;
then(&mut counterparty)
.receives(|msg| assert_msg_type(msg, MsgType::Reject))
.await;
let sequence_number = counterparty.next_target_sequence_number();
when(&mut counterparty)
.sends_message(TestMessage::dummy_execution_report())
.await;
then(&mut session)
.target_sequence_number_reaches(sequence_number)
.await;
finally(&session, &mut counterparty).disconnect().await;
}
#[test]
async fn test_reject_sequence_reset_without_new_seq_no() {
let (mut session, mut counterparty) = given_an_active_session().await;
let sequence_number = counterparty.next_target_sequence_number();
let invalid_reset = build_sequence_reset_without_new_seq_no(sequence_number);
when(&mut counterparty)
.sends_raw_message(invalid_reset)
.await;
then(&mut counterparty)
.receives(|msg| {
assert_msg_type(msg, MsgType::Reject);
})
.await;
counterparty.delete_last_message_from_store();
let sequence_number = counterparty.next_target_sequence_number();
when(&mut counterparty)
.sends_message(TestMessage::dummy_execution_report())
.await;
then(&mut session)
.target_sequence_number_reaches(sequence_number)
.await;
finally(&session, &mut counterparty).disconnect().await;
}