@@ -258,7 +258,7 @@ func SaneMockAuthRequest(t *testing.T, m Manager, ls *LoginSession, cl *client.C
258258 return c
259259}
260260
261- func ManagerTests (m Manager , clientManager client.Manager , fositeManager x.FositeStorer ) func (t * testing.T ) {
261+ func ManagerTests (m Manager , clientManager client.Manager , scopeStrategy fosite. ScopeStrategy , fositeManager x.FositeStorer ) func (t * testing.T ) {
262262 return func (t * testing.T ) {
263263 t .Run ("case=init-fks" , func (t * testing.T ) {
264264 for _ , k := range []string {"1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "10" , "rv1" , "rv2" } {
@@ -486,6 +486,165 @@ func ManagerTests(m Manager, clientManager client.Manager, fositeManager x.Fosit
486486 }
487487 })
488488
489+ t .Run ("case=extend consent request" , func (t * testing.T ) {
490+ cl := & client.Client {OutfacingID : "client-1" }
491+ _ = clientManager .CreateClient (context .Background (), cl )
492+ consentHandler := func (subject , sessionId , challenge string , initialRememberFor , remainingValidTime time.Duration ) {
493+ require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
494+ ID : sessionId ,
495+ Subject : subject ,
496+ }))
497+ require .NoError (t , m .CreateConsentRequest (context .Background (), & ConsentRequest {
498+ Client : cl ,
499+ Subject : subject ,
500+ ID : challenge ,
501+ LoginSessionID : sqlxx .NullString (sessionId ),
502+ Skip : false ,
503+ RequestedAt : time .Now ().UTC ().Add (- initialRememberFor * time .Second ),
504+ Verifier : uuid .New ().String (),
505+ RequestedScope : []string {"scopea" },
506+ }))
507+ requestedTimeInPast := time .Now ().UTC ().Round (time .Second ).Add (- (initialRememberFor - remainingValidTime ) * time .Second )
508+ _ , err := m .HandleConsentRequest (context .Background (), challenge , & HandledConsentRequest {
509+ ID : challenge ,
510+ Remember : true ,
511+ RememberFor : int (initialRememberFor ),
512+ RequestedAt : requestedTimeInPast ,
513+ WasHandled : true ,
514+ GrantedScope : []string {"scopea" },
515+ })
516+ require .NoError (t , err )
517+ }
518+
519+ t .Run ("case=extend session related and latest consent expiry times" , func (t * testing.T ) {
520+ var initialRememberForSession1 time.Duration = 300
521+ var remainingValidTimeSession1 time.Duration = 100
522+ var initialRememberForSession2 time.Duration = 300
523+ var remainingValidTimeSession2 time.Duration = 150
524+ subject := uuid .New ().String ()
525+ session1 := uuid .New ().String ()
526+ challenge1 := uuid .New ().String ()
527+ challenge2 := uuid .New ().String ()
528+ challenge3 := uuid .New ().String ()
529+ consentHandler (subject , session1 , challenge1 , initialRememberForSession1 , remainingValidTimeSession1 )
530+ consentHandler (subject , uuid .New ().String (), challenge2 , initialRememberForSession2 , remainingValidTimeSession2 )
531+ cr := & ConsentRequest {
532+ Client : cl ,
533+ Subject : subject ,
534+ ID : challenge3 ,
535+ LoginSessionID : sqlxx .NullString (session1 ),
536+ RequestedAt : time .Now ().UTC (),
537+ Skip : true ,
538+ }
539+ require .NoError (t , m .CreateConsentRequest (context .Background (), cr ))
540+ var extendRememberFor time.Duration = 300
541+ _ , err := m .HandleConsentRequest (context .Background (), challenge3 , & HandledConsentRequest {
542+ ID : challenge3 ,
543+ Remember : true ,
544+ RememberFor : int (extendRememberFor ),
545+ WasHandled : true ,
546+ RequestedAt : time .Now ().UTC (),
547+ })
548+ require .NoError (t , err )
549+ require .NoError (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , int (extendRememberFor )))
550+ crs , err := m .FindSubjectsGrantedConsentRequests (context .Background (), subject , 100 , 0 )
551+ require .NoError (t , err )
552+ require .EqualValues (t , 2 , len (crs ))
553+
554+ cr1 := crs [1 ]
555+ require .EqualValues (t , challenge1 , cr1 .ID )
556+ expectedRememberFor1 := int (initialRememberForSession1 + extendRememberFor - remainingValidTimeSession1 )
557+ require .InDelta (t , expectedRememberFor1 , cr1 .RememberFor , 1 )
558+
559+ cr2 := crs [0 ]
560+ require .EqualValues (t , challenge2 , cr2 .ID )
561+ expectedRememberFor2 := int (initialRememberForSession2 + extendRememberFor - remainingValidTimeSession2 )
562+ require .InDelta (t , expectedRememberFor2 , cr2 .RememberFor , 1 )
563+ })
564+
565+ t .Run ("case=session related consent not found" , func (t * testing.T ) {
566+ cr := & ConsentRequest {
567+ Client : cl ,
568+ Subject : "subject-1" ,
569+ LoginSessionID : "session-1" ,
570+ }
571+ require .ErrorIs (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , 300 ), ErrNoPreviousConsentFound )
572+ })
573+
574+ t .Run ("case=invalid requested scope" , func (t * testing.T ) {
575+ subject := uuid .New ().String ()
576+ session1 := uuid .New ().String ()
577+ challenge1 := uuid .New ().String ()
578+ challenge2 := uuid .New ().String ()
579+
580+ consentHandler (subject , session1 , challenge1 , 300 , 100 )
581+ cr := & ConsentRequest {
582+ Client : cl ,
583+ Subject : subject ,
584+ ID : challenge2 ,
585+ LoginSessionID : sqlxx .NullString (session1 ),
586+ RequestedAt : time .Now ().UTC (),
587+ Skip : true ,
588+ RequestedScope : []string {"scopeb" },
589+ Verifier : uuid .New ().String (),
590+ }
591+ require .NoError (t , m .CreateConsentRequest (context .Background (), cr ))
592+ var extendRememberFor time.Duration = 300
593+ _ , err := m .HandleConsentRequest (context .Background (), challenge2 , & HandledConsentRequest {
594+ ID : challenge2 ,
595+ Remember : true ,
596+ RememberFor : int (extendRememberFor ),
597+ WasHandled : true ,
598+ RequestedAt : time .Now ().UTC (),
599+ })
600+ require .NoError (t , err )
601+
602+ require .NoError (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , int (extendRememberFor )))
603+
604+ crs , err := m .FindSubjectsGrantedConsentRequests (context .Background (), subject , 100 , 0 )
605+ require .NoError (t , err )
606+ require .EqualValues (t , 1 , len (crs ))
607+ cr1 := crs [0 ]
608+ require .EqualValues (t , challenge1 , cr1 .ID )
609+ require .EqualValues (t , 300 , cr1 .RememberFor )
610+ })
611+
612+ t .Run ("case=initial consent request expired" , func (t * testing.T ) {
613+ subject := uuid .New ().String ()
614+ session1 := uuid .New ().String ()
615+ challenge1 := uuid .New ().String ()
616+ challenge2 := uuid .New ().String ()
617+
618+ consentHandler (subject , session1 , challenge1 , 300 , 0 )
619+ time .Sleep (time .Second )
620+
621+ cr := & ConsentRequest {
622+ Client : cl ,
623+ Subject : subject ,
624+ ID : challenge2 ,
625+ LoginSessionID : sqlxx .NullString (session1 ),
626+ RequestedAt : time .Now ().UTC (),
627+ Skip : true ,
628+ Verifier : uuid .New ().String (),
629+ }
630+ require .NoError (t , m .CreateConsentRequest (context .Background (), cr ))
631+ var extendRememberFor time.Duration = 300
632+ _ , err := m .HandleConsentRequest (context .Background (), challenge2 , & HandledConsentRequest {
633+ ID : challenge2 ,
634+ Remember : true ,
635+ RememberFor : int (extendRememberFor ),
636+ WasHandled : true ,
637+ RequestedAt : time .Now ().UTC (),
638+ })
639+ require .NoError (t , err )
640+
641+ require .NoError (t , m .ExtendConsentRequest (context .Background (), scopeStrategy , cr , int (extendRememberFor )))
642+
643+ _ , err = m .FindSubjectsGrantedConsentRequests (context .Background (), subject , 100 , 0 )
644+ require .Error (t , err , ErrNoPreviousConsentFound )
645+ })
646+ })
647+
489648 t .Run ("case=revoke-auth-request" , func (t * testing.T ) {
490649 require .NoError (t , m .CreateLoginSession (context .Background (), & LoginSession {
491650 ID : "rev-session-1" ,
0 commit comments