mirror of
https://github.com/chatmail/core.git
synced 2026-04-25 17:36:30 +03:00
171 lines
5.3 KiB
Rust
171 lines
5.3 KiB
Rust
//! contains tests for account (list) events
|
|
|
|
use std::time::Duration;
|
|
|
|
use anyhow::Result;
|
|
use tempfile::tempdir;
|
|
|
|
use crate::EventType;
|
|
use crate::accounts::Accounts;
|
|
use crate::config::Config;
|
|
use crate::imex::{BackupProvider, ImexMode, get_backup, has_backup, imex};
|
|
use crate::test_utils::{EventTracker, TestContext, TestContextManager, sync};
|
|
|
|
async fn wait_for_item_changed(context: &TestContext) {
|
|
context
|
|
.evtracker
|
|
.get_matching(|evt| matches!(evt, EventType::AccountsItemChanged))
|
|
.await;
|
|
}
|
|
|
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
|
async fn test_account_event() -> Result<()> {
|
|
let dir = tempdir().unwrap();
|
|
let mut manager = Accounts::new(dir.path().join("accounts"), true).await?;
|
|
let tracker = EventTracker::new(manager.get_event_emitter());
|
|
|
|
// create account
|
|
tracker.clear_events();
|
|
let account_id = manager.add_account().await?;
|
|
tracker
|
|
.get_matching(|evt| matches!(evt, EventType::AccountsChanged))
|
|
.await;
|
|
|
|
// remove account
|
|
tracker.clear_events();
|
|
manager.remove_account(account_id).await?;
|
|
tracker
|
|
.get_matching(|evt| matches!(evt, EventType::AccountsChanged))
|
|
.await;
|
|
|
|
// create closed account
|
|
tracker.clear_events();
|
|
manager.add_closed_account().await?;
|
|
tracker
|
|
.get_matching(|evt| matches!(evt, EventType::AccountsChanged))
|
|
.await;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
// configuration is tested by python tests in deltachat-rpc-client/tests/test_account_events.py
|
|
|
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
|
async fn test_set_displayname() -> Result<()> {
|
|
let mut tcm = TestContextManager::new();
|
|
let context = tcm.alice().await;
|
|
context.evtracker.clear_events();
|
|
context
|
|
.set_config(crate::config::Config::Displayname, Some("🐰 Alice"))
|
|
.await?;
|
|
wait_for_item_changed(&context).await;
|
|
Ok(())
|
|
}
|
|
|
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
|
async fn test_set_selfavatar() -> Result<()> {
|
|
let mut tcm = TestContextManager::new();
|
|
let context = tcm.alice().await;
|
|
let file = context.dir.path().join("avatar.jpg");
|
|
let bytes = include_bytes!("../../test-data/image/avatar1000x1000.jpg");
|
|
tokio::fs::write(&file, bytes).await?;
|
|
context.evtracker.clear_events();
|
|
context
|
|
.set_config(
|
|
crate::config::Config::Selfavatar,
|
|
Some(file.to_str().unwrap()),
|
|
)
|
|
.await?;
|
|
wait_for_item_changed(&context).await;
|
|
Ok(())
|
|
}
|
|
|
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
|
async fn test_set_private_tag() -> Result<()> {
|
|
let mut tcm = TestContextManager::new();
|
|
let context = tcm.alice().await;
|
|
context.evtracker.clear_events();
|
|
context
|
|
.set_config(crate::config::Config::PrivateTag, Some("Wonderland"))
|
|
.await?;
|
|
wait_for_item_changed(&context).await;
|
|
Ok(())
|
|
}
|
|
|
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
|
async fn test_import_backup() -> Result<()> {
|
|
let mut tcm = TestContextManager::new();
|
|
let context1 = tcm.alice().await;
|
|
let backup_dir = tempfile::tempdir().unwrap();
|
|
assert!(
|
|
imex(&context1, ImexMode::ExportBackup, backup_dir.path(), None)
|
|
.await
|
|
.is_ok()
|
|
);
|
|
|
|
let context2 = TestContext::new().await;
|
|
assert!(!context2.is_configured().await?);
|
|
context2.evtracker.clear_events();
|
|
let backup = has_backup(&context2, backup_dir.path()).await?;
|
|
imex(&context2, ImexMode::ImportBackup, backup.as_ref(), None).await?;
|
|
assert!(context2.is_configured().await?);
|
|
wait_for_item_changed(&context2).await;
|
|
Ok(())
|
|
}
|
|
|
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
|
async fn test_receive_backup() {
|
|
let mut tcm = TestContextManager::new();
|
|
// Create first device.
|
|
let ctx0 = tcm.alice().await;
|
|
// Prepare to transfer backup.
|
|
let provider = BackupProvider::prepare(&ctx0).await.unwrap();
|
|
// Set up second device.
|
|
let ctx1 = tcm.unconfigured().await;
|
|
|
|
ctx1.evtracker.clear_events();
|
|
get_backup(&ctx1, provider.qr()).await.unwrap();
|
|
|
|
// Make sure the provider finishes without an error.
|
|
tokio::time::timeout(Duration::from_secs(30), provider)
|
|
.await
|
|
.expect("timed out")
|
|
.expect("error in provider");
|
|
|
|
wait_for_item_changed(&ctx1).await;
|
|
}
|
|
|
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
|
async fn test_sync() -> Result<()> {
|
|
let alice0 = TestContext::new_alice().await;
|
|
let alice1 = TestContext::new_alice().await;
|
|
for a in [&alice0, &alice1] {
|
|
a.set_config_bool(Config::SyncMsgs, true).await?;
|
|
}
|
|
|
|
let new_name = "new name";
|
|
alice0
|
|
.set_config(Config::Displayname, Some(new_name))
|
|
.await?;
|
|
alice1.evtracker.clear_events();
|
|
sync(&alice0, &alice1).await;
|
|
wait_for_item_changed(&alice1).await;
|
|
assert_eq!(
|
|
alice1.get_config(Config::Displayname).await?,
|
|
Some(new_name.to_owned())
|
|
);
|
|
|
|
assert!(alice0.get_config(Config::Selfavatar).await?.is_none());
|
|
let file = alice0.dir.path().join("avatar.png");
|
|
let bytes = include_bytes!("../../test-data/image/avatar64x64.png");
|
|
tokio::fs::write(&file, bytes).await?;
|
|
alice0
|
|
.set_config(Config::Selfavatar, Some(file.to_str().unwrap()))
|
|
.await?;
|
|
alice1.evtracker.clear_events();
|
|
sync(&alice0, &alice1).await;
|
|
wait_for_item_changed(&alice1).await;
|
|
|
|
Ok(())
|
|
}
|