@@ -455,3 +455,106 @@ func TestValidTokenInputAndPasswordHasChanged(t *testing.T) {
455455 assert .Equal (t , userInfo ["id" ], result3 ["user" ].(map [string ]interface {})["id" ].(string ))
456456 assert .Equal (t , userInfo ["email" ], result3 ["user" ].(map [string ]interface {})["email" ].(string ))
457457}
458+
459+ func TestPasswordResetLinkUsesOriginFunctionIfProvided (t * testing.T ) {
460+ resetURL := ""
461+ tokenInfo := ""
462+ ridInfo := ""
463+ sendEmailFunc := func (input emaildelivery.EmailType , userContext supertokens.UserContext ) error {
464+ u , err := url .Parse (input .PasswordReset .PasswordResetLink )
465+ if err != nil {
466+ return err
467+ }
468+ resetURL = u .Scheme + "://" + u .Host + u .Path
469+ tokenInfo = u .Query ().Get ("token" )
470+ ridInfo = u .Query ().Get ("rid" )
471+ return nil
472+ }
473+ configValue := supertokens.TypeInput {
474+ Supertokens : & supertokens.ConnectionInfo {
475+ ConnectionURI : "http://localhost:8080" ,
476+ },
477+ AppInfo : supertokens.AppInfo {
478+ APIDomain : "api.supertokens.io" ,
479+ AppName : "SuperTokens" ,
480+ GetOrigin : func (request * http.Request , userContext supertokens.UserContext ) (string , error ) {
481+ // read request body
482+ decoder := json .NewDecoder (request .Body )
483+ var requestBody map [string ]interface {}
484+ err := decoder .Decode (& requestBody )
485+ if err != nil {
486+ return "https://supertokens.com" , nil
487+ }
488+ if requestBody ["origin" ] == nil {
489+ return "https://supertokens.com" , nil
490+ }
491+ return requestBody ["origin" ].(string ), nil
492+ },
493+ },
494+ RecipeList : []supertokens.Recipe {
495+ Init (& epmodels.TypeInput {
496+ EmailDelivery : & emaildelivery.TypeInput {
497+ Service : & emaildelivery.EmailDeliveryInterface {
498+ SendEmail : & sendEmailFunc ,
499+ },
500+ },
501+ }),
502+ session .Init (nil ),
503+ },
504+ }
505+
506+ BeforeEach ()
507+ unittesting .StartUpST ("localhost" , "8080" )
508+ defer AfterEach ()
509+ err := supertokens .Init (configValue )
510+ if err != nil {
511+ t .Error (err .Error ())
512+ }
513+ mux := http .NewServeMux ()
514+ testServer := httptest .NewServer (supertokens .Middleware (mux ))
515+ defer testServer .Close ()
516+
517+ res ,
err := unittesting .
SignupRequest (
"[email protected] " ,
"validpass123" ,
testServer .
URL )
518+ if err != nil {
519+ t .Error (err .Error ())
520+ }
521+ assert .NoError (t , err )
522+ dataInBytes , err := io .ReadAll (res .Body )
523+ if err != nil {
524+ t .Error (err .Error ())
525+ }
526+ res .Body .Close ()
527+ var result map [string ]interface {}
528+ err = json .Unmarshal (dataInBytes , & result )
529+ if err != nil {
530+ t .Error (err .Error ())
531+ }
532+ assert .Equal (t , 200 , res .StatusCode )
533+ assert .Equal (t , "OK" , result ["status" ])
534+
535+ formFields := map [string ]interface {}{
536+ "origin" : "localhost:2000" ,
537+ "formFields" : []map [string ]interface {}{{
538+ "id" : "email" ,
539+ 540+ }},
541+ }
542+
543+ postBody , err := json .Marshal (formFields )
544+ if err != nil {
545+ t .Error (err .Error ())
546+ }
547+
548+ resp , err := http .Post (testServer .URL + "/auth/user/password/reset/token" , "application/json" , bytes .NewBuffer (postBody ))
549+
550+ if err != nil {
551+ t .Error (err .Error ())
552+ }
553+
554+ assert .NoError (t , err )
555+
556+ assert .Equal (t , 200 , resp .StatusCode )
557+ assert .Equal (t , "http://localhost:2000/auth/reset-password" , resetURL )
558+ assert .NotEmpty (t , tokenInfo )
559+ assert .True (t , strings .HasPrefix (ridInfo , "emailpassword" ))
560+ }
0 commit comments