@@ -271,6 +271,74 @@ fn revoke_token_success() {
271
271
} ) ;
272
272
}
273
273
274
+ #[ test]
275
+ fn revoke_current_token_success ( ) {
276
+ let ( app, _, user, token) = TestApp :: init ( ) . with_token ( ) ;
277
+
278
+ // Ensure that the token currently exists in the database
279
+ app. db ( |conn| {
280
+ let tokens: Vec < ApiToken > = assert_ok ! ( ApiToken :: belonging_to( user. as_model( ) )
281
+ . filter( api_tokens:: revoked. eq( false ) )
282
+ . load( conn) ) ;
283
+ assert_eq ! ( tokens. len( ) , 1 ) ;
284
+ assert_eq ! ( tokens[ 0 ] . name, token. as_model( ) . name) ;
285
+ } ) ;
286
+
287
+ // Revoke the token
288
+ let response = token. delete :: < ( ) > ( "/api/v1/tokens/current" ) ;
289
+ assert_eq ! ( response. status( ) , StatusCode :: NO_CONTENT ) ;
290
+
291
+ // Ensure that the token was removed from the database
292
+ app. db ( |conn| {
293
+ let tokens: Vec < ApiToken > = assert_ok ! ( ApiToken :: belonging_to( user. as_model( ) )
294
+ . filter( api_tokens:: revoked. eq( false ) )
295
+ . load( conn) ) ;
296
+ assert_eq ! ( tokens. len( ) , 0 ) ;
297
+ } ) ;
298
+ }
299
+
300
+ #[ test]
301
+ fn revoke_current_token_without_auth ( ) {
302
+ let ( _, anon) = TestApp :: init ( ) . empty ( ) ;
303
+
304
+ let response = anon. delete :: < ( ) > ( "/api/v1/tokens/current" ) ;
305
+ assert_eq ! ( response. status( ) , StatusCode :: FORBIDDEN ) ;
306
+ assert_eq ! (
307
+ response. json( ) ,
308
+ json!( { "errors" : [ { "detail" : "must be logged in to perform that action" } ] } )
309
+ ) ;
310
+ }
311
+
312
+ #[ test]
313
+ fn revoke_current_token_with_cookie_user ( ) {
314
+ let ( app, _, user, token) = TestApp :: init ( ) . with_token ( ) ;
315
+
316
+ // Ensure that the token currently exists in the database
317
+ app. db ( |conn| {
318
+ let tokens: Vec < ApiToken > = assert_ok ! ( ApiToken :: belonging_to( user. as_model( ) )
319
+ . filter( api_tokens:: revoked. eq( false ) )
320
+ . load( conn) ) ;
321
+ assert_eq ! ( tokens. len( ) , 1 ) ;
322
+ assert_eq ! ( tokens[ 0 ] . name, token. as_model( ) . name) ;
323
+ } ) ;
324
+
325
+ // Revoke the token
326
+ let response = user. delete :: < ( ) > ( "/api/v1/tokens/current" ) ;
327
+ assert_eq ! ( response. status( ) , StatusCode :: BAD_REQUEST ) ;
328
+ assert_eq ! (
329
+ response. json( ) ,
330
+ json!( { "errors" : [ { "detail" : "token not provided" } ] } )
331
+ ) ;
332
+
333
+ // Ensure that the token still exists in the database after the failed request
334
+ app. db ( |conn| {
335
+ let tokens: Vec < ApiToken > = assert_ok ! ( ApiToken :: belonging_to( user. as_model( ) )
336
+ . filter( api_tokens:: revoked. eq( false ) )
337
+ . load( conn) ) ;
338
+ assert_eq ! ( tokens. len( ) , 1 ) ;
339
+ } ) ;
340
+ }
341
+
274
342
#[ test]
275
343
fn using_token_updates_last_used_at ( ) {
276
344
let url = "/api/v1/me" ;
0 commit comments