mirror of
https://github.com/chatmail/core.git
synced 2026-05-02 21:06:31 +03:00
feat: tests: add TestCheckpointEvent and Context.trigger_checkpoint_event
This commit is contained in:
@@ -152,6 +152,13 @@ impl CommandApi {
|
|||||||
tokio::time::sleep(std::time::Duration::from_secs_f64(delay)).await
|
tokio::time::sleep(std::time::Duration::from_secs_f64(delay)).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Emit the test checkpoint event, used for tests.
|
||||||
|
/// Returns a unique id of the emitted `TestCheckpointEvent`.
|
||||||
|
async fn trigger_checkpoint_event(&self, account_id: u32) -> Result<usize> {
|
||||||
|
let ctx = self.get_context(account_id).await?;
|
||||||
|
Ok(ctx.emit_test_checkpoint_event().await)
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
// Misc top level functions
|
// Misc top level functions
|
||||||
// ---------------------------------------------
|
// ---------------------------------------------
|
||||||
|
|||||||
@@ -259,6 +259,13 @@ pub enum EventType {
|
|||||||
/// If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache.
|
/// If `chat_id` is set to None, then all currently visible chats need to be rerendered, and all not-visible items need to be cleared from cache if the UI has a cache.
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
ChatlistItemChanged { chat_id: Option<u32> },
|
ChatlistItemChanged { chat_id: Option<u32> },
|
||||||
|
|
||||||
|
/// Tests can trigger this event and then wait for it, to make sure all events before it were consumed.
|
||||||
|
/// Useful for tests that test whether a specific event is emitted,
|
||||||
|
TestCheckpointEvent {
|
||||||
|
/// unique id to recognize the event
|
||||||
|
id: usize,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<CoreEventType> for EventType {
|
impl From<CoreEventType> for EventType {
|
||||||
@@ -370,6 +377,7 @@ impl From<CoreEventType> for EventType {
|
|||||||
chat_id: chat_id.map(|id| id.to_u32()),
|
chat_id: chat_id.map(|id| id.to_u32()),
|
||||||
},
|
},
|
||||||
CoreEventType::ChatlistChanged => ChatlistChanged,
|
CoreEventType::ChatlistChanged => ChatlistChanged,
|
||||||
|
CoreEventType::TestCheckpointEvent { id } => TestCheckpointEvent { id },
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use std::collections::{BTreeMap, HashMap};
|
|||||||
use std::ffi::OsString;
|
use std::ffi::OsString;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicBool, AtomicI64, AtomicU64, Ordering};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
@@ -288,6 +288,9 @@ pub struct InnerContext {
|
|||||||
|
|
||||||
/// True if account has subscribed to push notifications via IMAP.
|
/// True if account has subscribed to push notifications via IMAP.
|
||||||
pub(crate) push_subscribed: AtomicBool,
|
pub(crate) push_subscribed: AtomicBool,
|
||||||
|
|
||||||
|
/// Counter for the id for the test checkpoint event that is used by tests.
|
||||||
|
pub(crate) test_event_checkpoint_counter: Mutex<usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The state of ongoing process.
|
/// The state of ongoing process.
|
||||||
@@ -445,6 +448,7 @@ impl Context {
|
|||||||
debug_logging: std::sync::RwLock::new(None),
|
debug_logging: std::sync::RwLock::new(None),
|
||||||
push_subscriber,
|
push_subscriber,
|
||||||
push_subscribed: AtomicBool::new(false),
|
push_subscribed: AtomicBool::new(false),
|
||||||
|
test_event_checkpoint_counter: Mutex::new(0),
|
||||||
};
|
};
|
||||||
|
|
||||||
let ctx = Context {
|
let ctx = Context {
|
||||||
@@ -1362,6 +1366,15 @@ impl Context {
|
|||||||
wal_fname.push("-wal");
|
wal_fname.push("-wal");
|
||||||
dbfile.with_file_name(wal_fname)
|
dbfile.with_file_name(wal_fname)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Emit the test checkpoint event, used for tests.
|
||||||
|
/// Returns a unique id of the emitted `TestCheckpointEvent`.
|
||||||
|
pub async fn emit_test_checkpoint_event(&self) -> usize {
|
||||||
|
let mut counter = self.inner.test_event_checkpoint_counter.lock().await;
|
||||||
|
*counter = counter.wrapping_add(1);
|
||||||
|
self.emit_event(EventType::TestCheckpointEvent { id: *counter });
|
||||||
|
*counter
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns core version as a string.
|
/// Returns core version as a string.
|
||||||
|
|||||||
@@ -302,4 +302,11 @@ pub enum EventType {
|
|||||||
/// ID of the changed chat
|
/// ID of the changed chat
|
||||||
chat_id: Option<ChatId>,
|
chat_id: Option<ChatId>,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/// Tests can trigger this event and then wait for it, to make sure all events before it were consumed.
|
||||||
|
/// Useful for tests that test whether a specific event is emitted,
|
||||||
|
TestCheckpointEvent {
|
||||||
|
/// unique id to recognize the event
|
||||||
|
id: usize,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user