Skip to content
This repository was archived by the owner on Sep 10, 2024. It is now read-only.

Commit 5833f1a

Browse files
committed
handlers: tests for the add user admin API
1 parent 015f6e2 commit 5833f1a

File tree

1 file changed

+142
-0
lines changed
  • crates/handlers/src/admin/v1/users

1 file changed

+142
-0
lines changed

crates/handlers/src/admin/v1/users/add.rs

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,145 @@ pub async fn handler(
179179

180180
Ok(Json(SingleResponse::new_canonical(User::from(user))))
181181
}
182+
183+
#[cfg(test)]
184+
mod tests {
185+
use hyper::{Request, StatusCode};
186+
use mas_storage::{user::UserRepository, RepositoryAccess};
187+
use sqlx::PgPool;
188+
189+
use crate::test_utils::{setup, RequestBuilderExt, ResponseExt, TestState};
190+
191+
#[sqlx::test(migrator = "mas_storage_pg::MIGRATOR")]
192+
async fn test_add_user(pool: PgPool) {
193+
setup();
194+
let mut state = TestState::from_pool(pool).await.unwrap();
195+
let token = state.token_with_scope("urn:mas:admin").await;
196+
197+
let request = Request::post("/api/admin/v1/users")
198+
.bearer(&token)
199+
.json(serde_json::json!({
200+
"username": "alice",
201+
}));
202+
203+
let response = state.request(request).await;
204+
response.assert_status(StatusCode::OK);
205+
206+
let body: serde_json::Value = response.json();
207+
assert_eq!(body["data"]["type"], "user");
208+
let id = body["data"]["id"].as_str().unwrap();
209+
assert_eq!(body["data"]["attributes"]["username"], "alice");
210+
211+
// Check that the user was created in the database
212+
let mut repo = state.repository().await.unwrap();
213+
let user = repo
214+
.user()
215+
.lookup(id.parse().unwrap())
216+
.await
217+
.unwrap()
218+
.unwrap();
219+
220+
assert_eq!(user.username, "alice");
221+
}
222+
223+
#[sqlx::test(migrator = "mas_storage_pg::MIGRATOR")]
224+
async fn test_add_user_invalid_username(pool: PgPool) {
225+
setup();
226+
let mut state = TestState::from_pool(pool).await.unwrap();
227+
let token = state.token_with_scope("urn:mas:admin").await;
228+
229+
let request = Request::post("/api/admin/v1/users")
230+
.bearer(&token)
231+
.json(serde_json::json!({
232+
"username": "this is invalid",
233+
}));
234+
235+
let response = state.request(request).await;
236+
response.assert_status(StatusCode::BAD_REQUEST);
237+
238+
let body: serde_json::Value = response.json();
239+
assert_eq!(body["errors"][0]["title"], "Username is not valid");
240+
}
241+
242+
#[sqlx::test(migrator = "mas_storage_pg::MIGRATOR")]
243+
async fn test_add_user_exists(pool: PgPool) {
244+
setup();
245+
let mut state = TestState::from_pool(pool).await.unwrap();
246+
let token = state.token_with_scope("urn:mas:admin").await;
247+
248+
let request = Request::post("/api/admin/v1/users")
249+
.bearer(&token)
250+
.json(serde_json::json!({
251+
"username": "alice",
252+
}));
253+
254+
let response = state.request(request).await;
255+
response.assert_status(StatusCode::OK);
256+
257+
let body: serde_json::Value = response.json();
258+
assert_eq!(body["data"]["type"], "user");
259+
assert_eq!(body["data"]["attributes"]["username"], "alice");
260+
261+
let request = Request::post("/api/admin/v1/users")
262+
.bearer(&token)
263+
.json(serde_json::json!({
264+
"username": "alice",
265+
}));
266+
267+
let response = state.request(request).await;
268+
response.assert_status(StatusCode::CONFLICT);
269+
270+
let body: serde_json::Value = response.json();
271+
assert_eq!(body["errors"][0]["title"], "User already exists");
272+
}
273+
274+
#[sqlx::test(migrator = "mas_storage_pg::MIGRATOR")]
275+
async fn test_add_user_reserved(pool: PgPool) {
276+
setup();
277+
let mut state = TestState::from_pool(pool).await.unwrap();
278+
let token = state.token_with_scope("urn:mas:admin").await;
279+
280+
// Reserve a username on the homeserver and try to add it
281+
state.homeserver_connection.reserve_localpart("bob").await;
282+
283+
let request = Request::post("/api/admin/v1/users")
284+
.bearer(&token)
285+
.json(serde_json::json!({
286+
"username": "bob",
287+
}));
288+
289+
let response = state.request(request).await;
290+
291+
let body: serde_json::Value = response.json();
292+
assert_eq!(
293+
body["errors"][0]["title"],
294+
"Username is reserved by the homeserver"
295+
);
296+
297+
// But we can force it with the skip_homeserver_check flag
298+
let request = Request::post("/api/admin/v1/users")
299+
.bearer(&token)
300+
.json(serde_json::json!({
301+
"username": "bob",
302+
"skip_homeserver_check": true,
303+
}));
304+
305+
let response = state.request(request).await;
306+
response.assert_status(StatusCode::OK);
307+
308+
let body: serde_json::Value = response.json();
309+
let id = body["data"]["id"].as_str().unwrap();
310+
assert_eq!(body["data"]["attributes"]["username"], "bob");
311+
312+
// Check that the user was created in the database
313+
let mut repo = state.repository().await.unwrap();
314+
let user = repo
315+
.user()
316+
.lookup(id.parse().unwrap())
317+
.await
318+
.unwrap()
319+
.unwrap();
320+
321+
assert_eq!(user.username, "bob");
322+
}
323+
}

0 commit comments

Comments
 (0)