mirror of
https://github.com/chatmail/core.git
synced 2026-09-22 04:58:47 +03:00
Start adding some tests
This commit is contained in:
@@ -139,6 +139,18 @@ class Account:
|
|||||||
"""Add a new transport using a QR code."""
|
"""Add a new transport using a QR code."""
|
||||||
yield self._rpc.add_transport_from_qr.future(self.id, qr)
|
yield self._rpc.add_transport_from_qr.future(self.id, qr)
|
||||||
|
|
||||||
|
@futuremethod
|
||||||
|
def init_transports(self, qr: Optional[str] = None):
|
||||||
|
"""Automatically adds up to three transports.
|
||||||
|
|
||||||
|
If the user just scanned a QR code of type `Account`, `Login`,
|
||||||
|
`AskVerifyContact`, `AskVerifyGroup`, or `AskJoinBroadcast`,
|
||||||
|
then UI implementations should pass it as the `qr` parameter.
|
||||||
|
The host(s) from the QR code will then also be considered
|
||||||
|
for creating an account there.
|
||||||
|
"""
|
||||||
|
yield self._rpc.init_transports.future(self.id, qr)
|
||||||
|
|
||||||
def delete_transport(self, addr: str):
|
def delete_transport(self, addr: str):
|
||||||
"""Delete a transport."""
|
"""Delete a transport."""
|
||||||
self._rpc.delete_transport(self.id, addr)
|
self._rpc.delete_transport(self.id, addr)
|
||||||
|
|||||||
@@ -92,9 +92,10 @@ class RPCAccountFactory:
|
|||||||
"""Create a new configured account."""
|
"""Create a new configured account."""
|
||||||
account = self.get_unconfigured_account()
|
account = self.get_unconfigured_account()
|
||||||
qr = self.get_account_qr()
|
qr = self.get_account_qr()
|
||||||
yield account.add_transport_from_qr.future(qr)
|
yield account.init_transports.future(qr)
|
||||||
|
|
||||||
assert account.is_configured()
|
assert account.is_configured()
|
||||||
|
assert len(account.list_transports()) == 1
|
||||||
return account
|
return account
|
||||||
|
|
||||||
def new_configured_bot(self) -> Bot:
|
def new_configured_bot(self) -> Bot:
|
||||||
|
|||||||
@@ -32,6 +32,12 @@ def test_add_second_address(acf) -> None:
|
|||||||
account.add_transport_from_qr(qr)
|
account.add_transport_from_qr(qr)
|
||||||
assert len(account.list_transports()) == 2
|
assert len(account.list_transports()) == 2
|
||||||
|
|
||||||
|
# init_transports() only works on an unconfigured profile:
|
||||||
|
with pytest.raises(JsonRpcError):
|
||||||
|
account.init_transports(qr)
|
||||||
|
with pytest.raises(JsonRpcError):
|
||||||
|
account.init_transports()
|
||||||
|
|
||||||
account.add_transport_from_qr(qr)
|
account.add_transport_from_qr(qr)
|
||||||
assert len(account.list_transports()) == 3
|
assert len(account.list_transports()) == 3
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ pub(crate) async fn init_transports_inner(
|
|||||||
default_relays.shuffle(&mut rng());
|
default_relays.shuffle(&mut rng());
|
||||||
|
|
||||||
let (relays_sender, relays_receiver) = async_channel::unbounded::<String>();
|
let (relays_sender, relays_receiver) = async_channel::unbounded::<String>();
|
||||||
let relays_from_qr: BTreeSet<_> = addrs_from_qr
|
let relays_from_qr: BTreeSet<String> = addrs_from_qr
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.filter_map(|addr| EmailAddress::new(&addr).ok())
|
.filter_map(|addr| EmailAddress::new(&addr).ok())
|
||||||
.map(|email| email.domain)
|
.map(|email| email.domain)
|
||||||
|
|||||||
@@ -4,6 +4,71 @@ use super::*;
|
|||||||
use crate::test_utils::TestContext;
|
use crate::test_utils::TestContext;
|
||||||
use crate::tools::SystemTime;
|
use crate::tools::SystemTime;
|
||||||
|
|
||||||
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
|
async fn test_init_transports_basic() -> Result<()> {
|
||||||
|
let t = &TestContext::new().await;
|
||||||
|
assert!(t.list_transports().await?.is_empty());
|
||||||
|
|
||||||
|
let skip_network = true;
|
||||||
|
init_transports_inner(t, vec![], skip_network).await?;
|
||||||
|
|
||||||
|
// Wait until the tasks adding transports are finished:
|
||||||
|
let _ = t.background_task_lock.write().await;
|
||||||
|
|
||||||
|
let relays = get_configured_relays(t).await;
|
||||||
|
assert_eq!(relays.len(), NUM_TRANSPORTS_TARGET);
|
||||||
|
for relay in &relays {
|
||||||
|
assert!(DEFAULT_RELAY_CANDIDATES.contains(&relay.as_ref()));
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_eq!(t.get_config_bool(Config::Autorelay).await?, true);
|
||||||
|
assert_eq!(t.get_config_bool(Config::AutorelayFinished).await?, true);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
|
async fn test_init_transports_use_extra_addrs() -> Result<()> {
|
||||||
|
let t = &TestContext::new().await;
|
||||||
|
|
||||||
|
let skip_network = true;
|
||||||
|
init_transports_inner(
|
||||||
|
t,
|
||||||
|
vec![
|
||||||
|
"alice@example.org".to_string(),
|
||||||
|
"bob@example.org".to_string(),
|
||||||
|
"bob@nine.testrun.org".to_string(),
|
||||||
|
],
|
||||||
|
skip_network,
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
// Wait until the tasks adding transports are finished:
|
||||||
|
let _ = t.background_task_lock.write().await;
|
||||||
|
|
||||||
|
let relays = get_configured_relays(t).await;
|
||||||
|
assert_eq!(relays.len(), NUM_TRANSPORTS_TARGET);
|
||||||
|
assert!(relays.contains(&"example.org".to_string()));
|
||||||
|
assert!(relays.contains(&"nine.testrun.org".to_string()));
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_configured_relays(t: &TestContext) -> Vec<String> {
|
||||||
|
let transports = t.list_transports().await.unwrap();
|
||||||
|
let mut relays: Vec<_> = transports
|
||||||
|
.iter()
|
||||||
|
.map(|t| t.addr.split_once('@').unwrap().1)
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
// Check that every relay is used only once:
|
||||||
|
relays.sort();
|
||||||
|
relays.dedup();
|
||||||
|
assert_eq!(relays.len(), transports.len());
|
||||||
|
|
||||||
|
relays.into_iter().map(|s| s.to_string()).collect()
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
async fn test_load_relay_candidates_single() -> Result<()> {
|
async fn test_load_relay_candidates_single() -> Result<()> {
|
||||||
let t = &TestContext::new_alice().await;
|
let t = &TestContext::new_alice().await;
|
||||||
|
|||||||
Reference in New Issue
Block a user