| |
|
|
| 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()); |
|
|
| |
| tracker.clear_events(); |
| let account_id = manager.add_account().await?; |
| tracker |
| .get_matching(|evt| matches!(evt, EventType::AccountsChanged)) |
| .await; |
|
|
| |
| tracker.clear_events(); |
| manager.remove_account(account_id).await?; |
| tracker |
| .get_matching(|evt| matches!(evt, EventType::AccountsChanged)) |
| .await; |
|
|
| |
| tracker.clear_events(); |
| manager.add_closed_account().await?; |
| tracker |
| .get_matching(|evt| matches!(evt, EventType::AccountsChanged)) |
| .await; |
|
|
| Ok(()) |
| } |
|
|
| |
|
|
| #[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(); |
| |
| let ctx0 = tcm.alice().await; |
| |
| let provider = BackupProvider::prepare(&ctx0).await.unwrap(); |
| |
| let ctx1 = tcm.unconfigured().await; |
|
|
| ctx1.evtracker.clear_events(); |
| get_backup(&ctx1, provider.qr()).await.unwrap(); |
|
|
| |
| 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(()) |
| } |
|
|