@@ -179,3 +179,145 @@ pub async fn handler(
179
179
180
180
Ok ( Json ( SingleResponse :: new_canonical ( User :: from ( user) ) ) )
181
181
}
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