use quetty::app::updates::messages::MessagePaginationState;
use quetty_server::model::{BodyData, MessageModel, MessageState};
use std::time::{Duration, SystemTime};
fn create_test_message(id: &str, sequence: i64) -> MessageModel {
let timestamp = SystemTime::UNIX_EPOCH + Duration::from_secs(1700000000 + sequence as u64);
MessageModel {
sequence,
id: id.to_string(),
enqueued_at: timestamp.into(),
delivery_count: 1,
state: MessageState::Active,
body: BodyData::RawString(format!("Test message {id}")),
}
}
#[test]
fn test_page_size_decrease_from_1000_to_100_uses_loaded_messages() {
let mut pagination = MessagePaginationState::default();
let mut messages = Vec::new();
for i in 1..=2000 {
messages.push(create_test_message(&format!("msg{i}"), i as i64));
}
pagination.all_loaded_messages = messages.clone();
pagination.last_loaded_sequence = Some(2000);
pagination.total_pages_loaded = 2;
pagination.current_page = 1; pagination.update(1000);
let page_1_messages = pagination.get_current_page_messages(1000);
assert_eq!(page_1_messages.len(), 1000);
assert_eq!(page_1_messages[0].sequence, 1001); assert_eq!(page_1_messages[999].sequence, 2000);
pagination.all_loaded_messages.drain(10..12); assert_eq!(pagination.all_loaded_messages.len(), 1998);
pagination.update(1000);
let current_loaded_count = pagination.all_loaded_messages.len();
let new_page_size = 100u32;
assert!(current_loaded_count >= new_page_size as usize);
pagination.current_page = 0;
pagination.update(new_page_size);
let page_0_after_resize = pagination.get_current_page_messages(new_page_size);
assert_eq!(page_0_after_resize.len(), 100);
assert_eq!(page_0_after_resize[0].sequence, 1); assert!(page_0_after_resize[99].sequence <= 102);
let total_pages = pagination
.all_loaded_messages
.len()
.div_ceil(new_page_size as usize);
assert_eq!(total_pages, 20);
pagination.current_page = 1;
let page_1_after_resize = pagination.get_current_page_messages(new_page_size);
assert_eq!(page_1_after_resize.len(), 100);
assert!(page_1_after_resize[0].sequence > 100);
assert!(page_1_after_resize[0].sequence < 200);
pagination.current_page = 19;
let last_page = pagination.get_current_page_messages(new_page_size);
assert_eq!(last_page.len(), 98);
let last_message_seq = last_page.last().unwrap().sequence;
assert!(last_message_seq <= 2000); assert!(last_message_seq > 1900); }
#[test]
fn test_page_size_decrease_insufficient_messages_triggers_reload() {
let mut pagination = MessagePaginationState::default();
let mut messages = Vec::new();
for i in 1..=50 {
messages.push(create_test_message(&format!("msg{i}"), i as i64));
}
pagination.all_loaded_messages = messages;
pagination.last_loaded_sequence = Some(50);
pagination.total_pages_loaded = 1;
pagination.current_page = 0;
pagination.update(50);
let current_loaded_count = pagination.all_loaded_messages.len();
let new_page_size = 100u32;
assert!(current_loaded_count < new_page_size as usize);
assert_eq!(current_loaded_count, 50);
assert_eq!(new_page_size, 100);
}
#[test]
fn test_page_size_decrease_preserves_message_order() {
let mut pagination = MessagePaginationState::default();
let mut messages = Vec::new();
for i in 1..=500 {
messages.push(create_test_message(&format!("msg{i}"), i as i64));
}
pagination.all_loaded_messages = messages;
pagination.last_loaded_sequence = Some(500);
pagination.total_pages_loaded = 1;
pagination.current_page = 0;
pagination.update(500);
let new_page_size = 100u32;
pagination.current_page = 0;
pagination.update(new_page_size);
let page_0 = pagination.get_current_page_messages(new_page_size);
assert_eq!(page_0.len(), 100);
for (i, message) in page_0.iter().enumerate() {
assert_eq!(message.sequence, (i + 1) as i64);
}
pagination.current_page = 1;
let page_1 = pagination.get_current_page_messages(new_page_size);
assert_eq!(page_1.len(), 100);
for (i, message) in page_1.iter().enumerate() {
assert_eq!(message.sequence, (i + 101) as i64);
}
pagination.current_page = 4;
let page_4 = pagination.get_current_page_messages(new_page_size);
assert_eq!(page_4.len(), 100);
for (i, message) in page_4.iter().enumerate() {
assert_eq!(message.sequence, (i + 401) as i64);
}
}