Skip to content

Commit 9002f82

Browse files
committed
task(backup_tests): Move mock helpers into MatrixMockServer
1 parent 5f7fb46 commit 9002f82

File tree

2 files changed

+89
-74
lines changed

2 files changed

+89
-74
lines changed

crates/matrix-sdk/src/encryption/backups/mod.rs

Lines changed: 14 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,11 +1010,11 @@ mod test {
10101010
use serde_json::json;
10111011
use wiremock::{
10121012
matchers::{header, method, path},
1013-
Mock, MockGuard, MockServer, ResponseTemplate,
1013+
Mock, MockServer, ResponseTemplate,
10141014
};
10151015

10161016
use super::*;
1017-
use crate::test_utils::logged_in_client;
1017+
use crate::test_utils::{logged_in_client, mocks::MatrixMockServer};
10181018

10191019
fn room_key() -> ExportedRoomKey {
10201020
let json = json!({
@@ -1120,10 +1120,10 @@ mod test {
11201120

11211121
#[async_test]
11221122
async fn test_when_a_backup_exists_then_exists_on_server_returns_true() {
1123-
let server = MockServer::start().await;
1124-
let client = logged_in_client(Some(server.uri())).await;
1123+
let server = MatrixMockServer::new().await;
1124+
let client = server.client_builder().build().await;
11251125

1126-
let _scope = mock_backup_exists(&server).await;
1126+
server.mock_room_keys_version().exists().expect(1).mount().await;
11271127

11281128
let exists = client
11291129
.encryption()
@@ -1133,16 +1133,14 @@ mod test {
11331133
.expect("We should be able to check if backups exist on the server");
11341134

11351135
assert!(exists, "We should deduce that a backup exists on the server");
1136-
1137-
server.verify().await;
11381136
}
11391137

11401138
#[async_test]
11411139
async fn test_when_no_backup_exists_then_exists_on_server_returns_false() {
1142-
let server = MockServer::start().await;
1143-
let client = logged_in_client(Some(server.uri())).await;
1140+
let server = MatrixMockServer::new().await;
1141+
let client = server.client_builder().build().await;
11441142

1145-
let _scope = mock_backup_none(&server).await;
1143+
server.mock_room_keys_version().none().expect(1).mount().await;
11461144

11471145
let exists = client
11481146
.encryption()
@@ -1152,32 +1150,30 @@ mod test {
11521150
.expect("We should be able to check if backups exist on the server");
11531151

11541152
assert!(!exists, "We should deduce that no backup exists on the server");
1155-
1156-
server.verify().await;
11571153
}
11581154

11591155
#[async_test]
11601156
async fn test_when_server_returns_an_error_then_exists_on_server_returns_an_error() {
1161-
let server = MockServer::start().await;
1162-
let client = logged_in_client(Some(server.uri())).await;
1157+
let server = MatrixMockServer::new().await;
1158+
let client = server.client_builder().build().await;
11631159

11641160
{
1165-
let _scope = mock_backup_too_many_requests(&server).await;
1161+
let _scope =
1162+
server.mock_room_keys_version().error429().expect(1).mount_as_scoped().await;
11661163

11671164
client.encryption().backups().exists_on_server().await.expect_err(
11681165
"If the /version endpoint returns a non 404 error we should throw an error",
11691166
);
11701167
}
11711168

11721169
{
1173-
let _scope = mock_backup_404(&server);
1170+
let _scope =
1171+
server.mock_room_keys_version().error404().expect(1).mount_as_scoped().await;
11741172

11751173
client.encryption().backups().exists_on_server().await.expect_err(
11761174
"If the /version endpoint returns a non-Matrix 404 error we should throw an error",
11771175
);
11781176
}
1179-
1180-
server.verify().await;
11811177
}
11821178

11831179
#[async_test]
@@ -1254,60 +1250,4 @@ mod test {
12541250

12551251
server.verify().await;
12561252
}
1257-
1258-
async fn mock_backup_exists(server: &MockServer) -> MockGuard {
1259-
Mock::given(method("GET"))
1260-
.and(path("_matrix/client/r0/room_keys/version"))
1261-
.and(header("authorization", "Bearer 1234"))
1262-
.respond_with(ResponseTemplate::new(200).set_body_json(json!({
1263-
"algorithm": "m.megolm_backup.v1.curve25519-aes-sha2",
1264-
"auth_data": {
1265-
"public_key": "abcdefg",
1266-
"signatures": {},
1267-
},
1268-
"count": 42,
1269-
"etag": "anopaquestring",
1270-
"version": "1",
1271-
})))
1272-
.expect(1)
1273-
.mount_as_scoped(server)
1274-
.await
1275-
}
1276-
1277-
async fn mock_backup_none(server: &MockServer) -> MockGuard {
1278-
Mock::given(method("GET"))
1279-
.and(path("_matrix/client/r0/room_keys/version"))
1280-
.and(header("authorization", "Bearer 1234"))
1281-
.respond_with(ResponseTemplate::new(404).set_body_json(json!({
1282-
"errcode": "M_NOT_FOUND",
1283-
"error": "No current backup version"
1284-
})))
1285-
.expect(1)
1286-
.mount_as_scoped(server)
1287-
.await
1288-
}
1289-
1290-
async fn mock_backup_too_many_requests(server: &MockServer) -> MockGuard {
1291-
Mock::given(method("GET"))
1292-
.and(path("_matrix/client/r0/room_keys/version"))
1293-
.and(header("authorization", "Bearer 1234"))
1294-
.respond_with(ResponseTemplate::new(429).set_body_json(json!({
1295-
"errcode": "M_LIMIT_EXCEEDED",
1296-
"error": "Too many requests",
1297-
"retry_after_ms": 2000
1298-
})))
1299-
.expect(1)
1300-
.mount_as_scoped(server)
1301-
.await
1302-
}
1303-
1304-
async fn mock_backup_404(server: &MockServer) -> MockGuard {
1305-
Mock::given(method("GET"))
1306-
.and(path("_matrix/client/r0/room_keys/version"))
1307-
.and(header("authorization", "Bearer 1234"))
1308-
.respond_with(ResponseTemplate::new(404))
1309-
.expect(1)
1310-
.mount_as_scoped(server)
1311-
.await
1312-
}
13131253
}

crates/matrix-sdk/src/test_utils/mocks.rs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,36 @@ impl MatrixMockServer {
560560
let mock = Mock::given(method("POST")).and(path_regex(r"/_matrix/client/v3/publicRooms"));
561561
MockEndpoint { mock, server: &self.server, endpoint: PublicRoomsEndpoint }
562562
}
563+
564+
/// Create a prebuilt mock for fetching information about key storage
565+
/// backups.
566+
///
567+
/// # Examples
568+
///
569+
/// ```
570+
/// # #[cfg(feature = "e2e-encryption")]
571+
/// # {
572+
/// # tokio_test::block_on(async {
573+
/// use matrix_sdk::test_utils::mocks::MatrixMockServer;
574+
///
575+
/// let mock_server = MatrixMockServer::new().await;
576+
/// let client = mock_server.client_builder().build().await;
577+
///
578+
/// mock_server.mock_room_keys_version().exists().expect(1).mount().await;
579+
///
580+
/// let exists =
581+
/// client.encryption().backups().exists_on_server().await.unwrap();
582+
///
583+
/// assert!(exists);
584+
/// # });
585+
/// # }
586+
/// ```
587+
pub fn mock_room_keys_version(&self) -> MockEndpoint<'_, RoomKeysVersionEndpoint> {
588+
let mock = Mock::given(method("GET"))
589+
.and(path_regex(r"_matrix/client/v3/room_keys/version"))
590+
.and(header("authorization", "Bearer 1234"));
591+
MockEndpoint { mock, server: &self.server, endpoint: RoomKeysVersionEndpoint }
592+
}
563593
}
564594

565595
/// Parameter to [`MatrixMockServer::sync_room`].
@@ -1503,3 +1533,48 @@ impl<'a> MockEndpoint<'a, PublicRoomsEndpoint> {
15031533
MatrixMock { server: self.server, mock }
15041534
}
15051535
}
1536+
1537+
/// A prebuilt mock for `room_keys/version`: storage ("backup") of room keys.
1538+
pub struct RoomKeysVersionEndpoint;
1539+
1540+
impl<'a> MockEndpoint<'a, RoomKeysVersionEndpoint> {
1541+
/// Returns an endpoint that says there is a single room keys backup
1542+
pub fn exists(self) -> MatrixMock<'a> {
1543+
let mock = self.mock.respond_with(ResponseTemplate::new(200).set_body_json(json!({
1544+
"algorithm": "m.megolm_backup.v1.curve25519-aes-sha2",
1545+
"auth_data": {
1546+
"public_key": "abcdefg",
1547+
"signatures": {},
1548+
},
1549+
"count": 42,
1550+
"etag": "anopaquestring",
1551+
"version": "1",
1552+
})));
1553+
MatrixMock { server: self.server, mock }
1554+
}
1555+
1556+
/// Returns an endpoint that says there is no room keys backup
1557+
pub fn none(self) -> MatrixMock<'a> {
1558+
let mock = self.mock.respond_with(ResponseTemplate::new(404).set_body_json(json!({
1559+
"errcode": "M_NOT_FOUND",
1560+
"error": "No current backup version"
1561+
})));
1562+
MatrixMock { server: self.server, mock }
1563+
}
1564+
1565+
/// Returns an endpoint that 429 errors when we get it
1566+
pub fn error429(self) -> MatrixMock<'a> {
1567+
let mock = self.mock.respond_with(ResponseTemplate::new(429).set_body_json(json!({
1568+
"errcode": "M_LIMIT_EXCEEDED",
1569+
"error": "Too many requests",
1570+
"retry_after_ms": 2000
1571+
})));
1572+
MatrixMock { server: self.server, mock }
1573+
}
1574+
1575+
/// Returns an endpoint that 404 errors when we get it
1576+
pub fn error404(self) -> MatrixMock<'a> {
1577+
let mock = self.mock.respond_with(ResponseTemplate::new(404));
1578+
MatrixMock { server: self.server, mock }
1579+
}
1580+
}

0 commit comments

Comments
 (0)