test(oidc): Use MatrixMockServer for qrcode login tests

Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
This commit is contained in:
Kévin Commaille
2025-02-24 15:55:23 +01:00
committed by Damir Jelić
parent 52909b0eeb
commit 6026b0c4b7
2 changed files with 92 additions and 48 deletions

View File

@@ -358,11 +358,11 @@ mod test {
requests::GrantType,
};
use matrix_sdk_base::crypto::types::{qr_login::QrCodeModeData, SecretsBundle};
use matrix_sdk_test::{async_test, test_json};
use matrix_sdk_test::async_test;
use serde_json::{json, Value};
use url::Url;
use wiremock::{
matchers::{header, method, path},
matchers::{method, path},
Mock, MockServer, ResponseTemplate,
};
@@ -374,6 +374,7 @@ mod test {
},
config::RequestConfig,
http_client::HttpClient,
test_utils::mocks::MatrixMockServer,
};
enum AliceBehaviour {
@@ -521,7 +522,7 @@ mod test {
fn token() -> Value {
json!({
"access_token": "mat_z65RpDAbvR5aTr7MzD0aPw40xFbwch_09xTgn",
"access_token": "1234",
"expires_in": 300,
"refresh_token": "mar_CHFh124AMHsdishuHgLSx1svdKMVQA_080gj2",
"scope": "urn:matrix:org.matrix.msc2967.client:api:* \
@@ -636,40 +637,20 @@ mod test {
#[async_test]
async fn test_qr_login() {
let server = MockServer::start().await;
let rendezvous_server = MockedRendezvousServer::new(&server, "abcdEFG12345").await;
let server = MatrixMockServer::new().await;
let rendezvous_server = MockedRendezvousServer::new(server.server(), "abcdEFG12345").await;
let (sender, receiver) = tokio::sync::oneshot::channel();
mock_oauth_authorization_server(&server, ResponseTemplate::new(200).set_body_json(token()))
.await;
mock_oauth_authorization_server(
server.server(),
ResponseTemplate::new(200).set_body_json(token()),
)
.await;
Mock::given(method("GET"))
.and(path("/_matrix/client/r0/account/whoami"))
.respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::WHOAMI))
.mount(&server)
.await;
Mock::given(method("GET"))
.and(path("/_matrix/client/versions"))
.respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::VERSIONS))
.mount(&server)
.await;
Mock::given(method("POST"))
.and(path("/_matrix/client/r0/keys/upload"))
.and(header("authorization", "Bearer mat_z65RpDAbvR5aTr7MzD0aPw40xFbwch_09xTgn"))
.respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::KEYS_UPLOAD))
.expect(1)
.mount(&server)
.await;
Mock::given(method("POST"))
.and(path("/_matrix/client/r0/keys/query"))
.and(header("authorization", "Bearer mat_z65RpDAbvR5aTr7MzD0aPw40xFbwch_09xTgn"))
.respond_with(ResponseTemplate::new(200).set_body_json(json!({})))
.expect(1)
.mount(&server)
.await;
server.mock_versions().ok().expect(1..).named("versions").mount().await;
server.mock_who_am_i().ok().expect(1).named("whoami").mount().await;
server.mock_upload_keys().ok().expect(1).named("upload_keys").mount().await;
server.mock_query_keys().ok().expect(1).named("query_keys").mount().await;
let client = HttpClient::new(reqwest::Client::new(), Default::default());
let alice = SecureChannel::new(client, &rendezvous_server.homeserver_url)
@@ -732,23 +713,14 @@ mod test {
token_response: ResponseTemplate,
alice_behavior: AliceBehaviour,
) -> Result<(), QRCodeLoginError> {
let server = MockServer::start().await;
let rendezvous_server = MockedRendezvousServer::new(&server, "abcdEFG12345").await;
let server = MatrixMockServer::new().await;
let rendezvous_server = MockedRendezvousServer::new(server.server(), "abcdEFG12345").await;
let (sender, receiver) = tokio::sync::oneshot::channel();
mock_oauth_authorization_server(&server, token_response).await;
mock_oauth_authorization_server(server.server(), token_response).await;
Mock::given(method("GET"))
.and(path("/_matrix/client/r0/account/whoami"))
.respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::WHOAMI))
.mount(&server)
.await;
Mock::given(method("GET"))
.and(path("/_matrix/client/versions"))
.respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::VERSIONS))
.mount(&server)
.await;
server.mock_versions().ok().named("versions").mount().await;
server.mock_who_am_i().ok().named("whoami").mount().await;
let client = HttpClient::new(reqwest::Client::new(), Default::default());
let alice = SecureChannel::new(client, &rendezvous_server.homeserver_url)

View File

@@ -940,6 +940,33 @@ impl MatrixMockServer {
.and(header("authorization", "Bearer 1234"));
MockEndpoint { mock, server: &self.server, endpoint: SetRoomPinnedEventsEndpoint }
}
/// Creates a prebuilt mock for the endpoint used to get information about
/// the owner of the current access token.
pub fn mock_who_am_i(&self) -> MockEndpoint<'_, WhoAmIEndpoint> {
let mock = Mock::given(method("GET"))
.and(path_regex(r"^/_matrix/client/v3/account/whoami"))
.and(header("authorization", "Bearer 1234"));
MockEndpoint { mock, server: &self.server, endpoint: WhoAmIEndpoint }
}
/// Creates a prebuilt mock for the endpoint used to publish end-to-end
/// encryption keys.
pub fn mock_upload_keys(&self) -> MockEndpoint<'_, UploadKeysEndpoint> {
let mock = Mock::given(method("POST"))
.and(path_regex(r"^/_matrix/client/v3/keys/upload"))
.and(header("authorization", "Bearer 1234"));
MockEndpoint { mock, server: &self.server, endpoint: UploadKeysEndpoint }
}
/// Creates a prebuilt mock for the endpoint used to query end-to-end
/// encryption keys.
pub fn mock_query_keys(&self) -> MockEndpoint<'_, QueryKeysEndpoint> {
let mock = Mock::given(method("POST"))
.and(path_regex(r"^/_matrix/client/v3/keys/query"))
.and(header("authorization", "Bearer 1234"));
MockEndpoint { mock, server: &self.server, endpoint: QueryKeysEndpoint }
}
}
/// Parameter to [`MatrixMockServer::sync_room`].
@@ -2342,3 +2369,48 @@ impl<'a> MockEndpoint<'a, SetRoomPinnedEventsEndpoint> {
MatrixMock { server: self.server, mock }
}
}
/// A prebuilt mock for `GET /account/whoami` request.
pub struct WhoAmIEndpoint;
impl<'a> MockEndpoint<'a, WhoAmIEndpoint> {
/// Returns a successful response with the user ID `@joe:example.org` and no
/// device ID.
pub fn ok(self) -> MatrixMock<'a> {
let mock = self.mock.respond_with(ResponseTemplate::new(200).set_body_json(json!({
"user_id": "@joe:example.org",
})));
MatrixMock { server: self.server, mock }
}
}
/// A prebuilt mock for `POST /keys/upload` request.
pub struct UploadKeysEndpoint;
impl<'a> MockEndpoint<'a, UploadKeysEndpoint> {
/// Returns a successful response with counts of 10 curve25519 keys and 20
/// signed curve25519 keys.
pub fn ok(self) -> MatrixMock<'a> {
let mock = self.mock.respond_with(ResponseTemplate::new(200).set_body_json(json!({
"one_time_key_counts": {
"curve25519": 10,
"signed_curve25519": 20,
},
})));
MatrixMock { server: self.server, mock }
}
}
/// A prebuilt mock for `POST /keys/query` request.
pub struct QueryKeysEndpoint;
impl<'a> MockEndpoint<'a, QueryKeysEndpoint> {
/// Returns a successful empty response.
pub fn ok(self) -> MatrixMock<'a> {
let mock = self.mock.respond_with(ResponseTemplate::new(200).set_body_json(json!({})));
MatrixMock { server: self.server, mock }
}
}