2016-07-19 01:10:36 -05:00
"use strict" ;
const request = require ( 'request' ) ;
2016-08-15 16:48:39 -04:00
const Config = require ( '../src/Config' ) ;
2016-07-19 01:10:36 -05:00
describe ( "Email Verification Token Expiration: " , ( ) => {
2016-08-15 16:48:39 -04:00
it ( 'show the invalid link page, if the user clicks on the verify email link after the email verify token expires' , done => {
2016-07-19 01:10:36 -05:00
var user = new Parse . User ( ) ;
var sendEmailOptions ;
var emailAdapter = {
sendVerificationEmail : options => {
sendEmailOptions = options ;
} ,
sendPasswordResetEmail : ( ) => Promise . resolve ( ) ,
sendMail : ( ) => { }
}
reconfigureServer ( {
appName : 'emailVerifyToken' ,
verifyUserEmails : true ,
emailAdapter : emailAdapter ,
emailVerifyTokenValidityDuration : 0.5 , // 0.5 second
publicServerURL : "http://localhost:8378/1"
} )
. then ( ( ) => {
user . setUsername ( "testEmailVerifyTokenValidity" ) ;
user . setPassword ( "expiringToken" ) ;
user . set ( 'email' , 'user@parse.com' ) ;
return user . signUp ( ) ;
} ) . then ( ( ) => {
// wait for 1 second - simulate user behavior to some extent
setTimeout ( ( ) => {
expect ( sendEmailOptions ) . not . toBeUndefined ( ) ;
request . get ( sendEmailOptions . link , {
2016-11-24 15:47:41 -05:00
followRedirect : false ,
} , ( error , response ) => {
2016-07-19 01:10:36 -05:00
expect ( response . statusCode ) . toEqual ( 302 ) ;
expect ( response . body ) . toEqual ( 'Found. Redirecting to http://localhost:8378/1/apps/invalid_link.html' ) ;
done ( ) ;
} ) ;
} , 1000 ) ;
2016-08-15 16:48:39 -04:00
} ) . catch ( ( err ) => {
jfail ( err ) ;
done ( ) ;
2016-07-19 01:10:36 -05:00
} ) ;
} ) ;
2016-08-15 16:48:39 -04:00
it ( 'emailVerified should set to false, if the user does not verify their email before the email verify token expires' , done => {
2016-07-19 01:10:36 -05:00
var user = new Parse . User ( ) ;
var sendEmailOptions ;
var emailAdapter = {
sendVerificationEmail : options => {
sendEmailOptions = options ;
} ,
sendPasswordResetEmail : ( ) => Promise . resolve ( ) ,
sendMail : ( ) => { }
}
reconfigureServer ( {
appName : 'emailVerifyToken' ,
verifyUserEmails : true ,
emailAdapter : emailAdapter ,
emailVerifyTokenValidityDuration : 0.5 , // 0.5 second
publicServerURL : "http://localhost:8378/1"
} )
. then ( ( ) => {
user . setUsername ( "testEmailVerifyTokenValidity" ) ;
user . setPassword ( "expiringToken" ) ;
user . set ( 'email' , 'user@parse.com' ) ;
return user . signUp ( ) ;
} ) . then ( ( ) => {
// wait for 1 second - simulate user behavior to some extent
setTimeout ( ( ) => {
expect ( sendEmailOptions ) . not . toBeUndefined ( ) ;
request . get ( sendEmailOptions . link , {
2016-11-24 15:47:41 -05:00
followRedirect : false ,
} , ( error , response ) => {
2016-07-19 01:10:36 -05:00
expect ( response . statusCode ) . toEqual ( 302 ) ;
user . fetch ( )
. then ( ( ) => {
expect ( user . get ( 'emailVerified' ) ) . toEqual ( false ) ;
done ( ) ;
} )
2016-11-24 15:47:41 -05:00
. catch ( ( ) => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
2016-07-19 01:10:36 -05:00
done ( ) ;
} ) ;
} ) ;
} , 1000 ) ;
2016-11-24 15:47:41 -05:00
} ) . catch ( ( error ) => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
done ( ) ;
2016-07-19 01:10:36 -05:00
} ) ;
} ) ;
2016-08-15 16:48:39 -04:00
it ( 'if user clicks on the email verify link before email verification token expiration then show the verify email success page' , done => {
2016-07-19 01:10:36 -05:00
var user = new Parse . User ( ) ;
var sendEmailOptions ;
var emailAdapter = {
sendVerificationEmail : options => {
sendEmailOptions = options ;
} ,
sendPasswordResetEmail : ( ) => Promise . resolve ( ) ,
sendMail : ( ) => { }
}
reconfigureServer ( {
appName : 'emailVerifyToken' ,
verifyUserEmails : true ,
emailAdapter : emailAdapter ,
emailVerifyTokenValidityDuration : 5 , // 5 seconds
publicServerURL : "http://localhost:8378/1"
} )
. then ( ( ) => {
user . setUsername ( "testEmailVerifyTokenValidity" ) ;
user . setPassword ( "expiringToken" ) ;
user . set ( 'email' , 'user@parse.com' ) ;
return user . signUp ( ) ;
} ) . then ( ( ) => {
request . get ( sendEmailOptions . link , {
2016-11-24 15:47:41 -05:00
followRedirect : false ,
} , ( error , response ) => {
2016-07-19 01:10:36 -05:00
expect ( response . statusCode ) . toEqual ( 302 ) ;
expect ( response . body ) . toEqual ( 'Found. Redirecting to http://localhost:8378/1/apps/verify_email_success.html?username=testEmailVerifyTokenValidity' ) ;
done ( ) ;
} ) ;
2016-11-24 15:47:41 -05:00
} ) . catch ( ( error ) => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
done ( ) ;
2016-07-19 01:10:36 -05:00
} ) ;
} ) ;
2016-08-15 16:48:39 -04:00
it ( 'if user clicks on the email verify link before email verification token expiration then emailVerified should be true' , done => {
2016-07-19 01:10:36 -05:00
var user = new Parse . User ( ) ;
var sendEmailOptions ;
var emailAdapter = {
sendVerificationEmail : options => {
sendEmailOptions = options ;
} ,
sendPasswordResetEmail : ( ) => Promise . resolve ( ) ,
sendMail : ( ) => { }
}
reconfigureServer ( {
appName : 'emailVerifyToken' ,
verifyUserEmails : true ,
emailAdapter : emailAdapter ,
emailVerifyTokenValidityDuration : 5 , // 5 seconds
publicServerURL : "http://localhost:8378/1"
} )
. then ( ( ) => {
user . setUsername ( "testEmailVerifyTokenValidity" ) ;
user . setPassword ( "expiringToken" ) ;
user . set ( 'email' , 'user@parse.com' ) ;
return user . signUp ( ) ;
} ) . then ( ( ) => {
request . get ( sendEmailOptions . link , {
2016-11-24 15:47:41 -05:00
followRedirect : false ,
} , ( error , response ) => {
2016-07-19 01:10:36 -05:00
expect ( response . statusCode ) . toEqual ( 302 ) ;
user . fetch ( )
. then ( ( ) => {
expect ( user . get ( 'emailVerified' ) ) . toEqual ( true ) ;
done ( ) ;
} )
2016-11-24 15:47:41 -05:00
. catch ( ( error ) => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
2016-07-19 01:10:36 -05:00
done ( ) ;
} ) ;
} ) ;
2016-11-24 15:47:41 -05:00
} ) . catch ( ( error ) => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
done ( ) ;
2016-07-19 01:10:36 -05:00
} ) ;
} ) ;
2016-08-15 16:48:39 -04:00
it ( 'if user clicks on the email verify link before email verification token expiration then user should be able to login' , done => {
2016-07-19 01:10:36 -05:00
var user = new Parse . User ( ) ;
var sendEmailOptions ;
var emailAdapter = {
sendVerificationEmail : options => {
sendEmailOptions = options ;
} ,
sendPasswordResetEmail : ( ) => Promise . resolve ( ) ,
sendMail : ( ) => { }
}
reconfigureServer ( {
appName : 'emailVerifyToken' ,
verifyUserEmails : true ,
emailAdapter : emailAdapter ,
emailVerifyTokenValidityDuration : 5 , // 5 seconds
publicServerURL : "http://localhost:8378/1"
} )
. then ( ( ) => {
user . setUsername ( "testEmailVerifyTokenValidity" ) ;
user . setPassword ( "expiringToken" ) ;
user . set ( 'email' , 'user@parse.com' ) ;
return user . signUp ( ) ;
} ) . then ( ( ) => {
request . get ( sendEmailOptions . link , {
2016-11-24 15:47:41 -05:00
followRedirect : false ,
} , ( error , response ) => {
2016-07-19 01:10:36 -05:00
expect ( response . statusCode ) . toEqual ( 302 ) ;
Parse . User . logIn ( "testEmailVerifyTokenValidity" , "expiringToken" )
. then ( user => {
expect ( typeof user ) . toBe ( 'object' ) ;
expect ( user . get ( 'emailVerified' ) ) . toBe ( true ) ;
done ( ) ;
} )
. catch ( ( error ) => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
2016-07-19 01:10:36 -05:00
done ( ) ;
} ) ;
} ) ;
2016-11-24 15:47:41 -05:00
} ) . catch ( ( error ) => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
done ( ) ;
2016-07-19 01:10:36 -05:00
} ) ;
} ) ;
2016-08-15 16:48:39 -04:00
it ( 'sets the _email_verify_token_expires_at and _email_verify_token fields after user SignUp' , done => {
2016-07-19 01:10:36 -05:00
var user = new Parse . User ( ) ;
var sendEmailOptions ;
var emailAdapter = {
sendVerificationEmail : options => {
sendEmailOptions = options ;
} ,
sendPasswordResetEmail : ( ) => Promise . resolve ( ) ,
sendMail : ( ) => { }
}
reconfigureServer ( {
appName : 'emailVerifyToken' ,
verifyUserEmails : true ,
emailAdapter : emailAdapter ,
emailVerifyTokenValidityDuration : 5 , // 5 seconds
publicServerURL : 'http://localhost:8378/1'
} )
. then ( ( ) => {
user . setUsername ( 'sets_email_verify_token_expires_at' ) ;
user . setPassword ( 'expiringToken' ) ;
user . set ( 'email' , 'user@parse.com' ) ;
return user . signUp ( ) ;
} )
. then ( ( ) => {
2016-08-15 16:48:39 -04:00
let config = new Config ( 'test' ) ;
return config . database . find ( '_User' , { username : 'sets_email_verify_token_expires_at' } ) ;
2016-07-19 01:10:36 -05:00
} )
2016-08-15 16:48:39 -04:00
. then ( results => {
expect ( results . length ) . toBe ( 1 ) ;
let user = results [ 0 ] ;
2016-07-19 01:10:36 -05:00
expect ( typeof user ) . toBe ( 'object' ) ;
expect ( user . emailVerified ) . toEqual ( false ) ;
expect ( typeof user . _email _verify _token ) . toBe ( 'string' ) ;
expect ( typeof user . _email _verify _token _expires _at ) . toBe ( 'object' ) ;
2016-11-24 15:47:41 -05:00
expect ( sendEmailOptions ) . toBeDefined ( ) ;
2016-07-19 01:10:36 -05:00
done ( ) ;
} )
. catch ( error => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
2016-07-19 01:10:36 -05:00
done ( ) ;
} ) ;
} ) ;
2016-08-15 16:48:39 -04:00
it ( 'unsets the _email_verify_token_expires_at and _email_verify_token fields in the User class if email verification is successful' , done => {
2016-07-19 01:10:36 -05:00
var user = new Parse . User ( ) ;
var sendEmailOptions ;
var emailAdapter = {
sendVerificationEmail : options => {
sendEmailOptions = options ;
} ,
sendPasswordResetEmail : ( ) => Promise . resolve ( ) ,
sendMail : ( ) => { }
}
reconfigureServer ( {
appName : 'emailVerifyToken' ,
verifyUserEmails : true ,
emailAdapter : emailAdapter ,
emailVerifyTokenValidityDuration : 5 , // 5 seconds
publicServerURL : "http://localhost:8378/1"
} )
. then ( ( ) => {
user . setUsername ( "unsets_email_verify_token_expires_at" ) ;
user . setPassword ( "expiringToken" ) ;
user . set ( 'email' , 'user@parse.com' ) ;
return user . signUp ( ) ;
} )
. then ( ( ) => {
request . get ( sendEmailOptions . link , {
2016-11-24 15:47:41 -05:00
followRedirect : false ,
} , ( error , response ) => {
2016-07-19 01:10:36 -05:00
expect ( response . statusCode ) . toEqual ( 302 ) ;
2016-08-15 16:48:39 -04:00
let config = new Config ( 'test' ) ;
2016-11-24 15:47:41 -05:00
return config . database . find ( '_User' , { username : 'unsets_email_verify_token_expires_at' } ) . then ( ( results ) => {
2016-08-15 16:48:39 -04:00
expect ( results . length ) . toBe ( 1 ) ;
return results [ 0 ] ;
2016-07-19 01:10:36 -05:00
} )
. then ( user => {
expect ( typeof user ) . toBe ( 'object' ) ;
expect ( user . emailVerified ) . toEqual ( true ) ;
expect ( typeof user . _email _verify _token ) . toBe ( 'undefined' ) ;
expect ( typeof user . _email _verify _token _expires _at ) . toBe ( 'undefined' ) ;
done ( ) ;
} )
. catch ( error => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
2016-07-19 01:10:36 -05:00
done ( ) ;
} ) ;
} ) ;
} )
. catch ( error => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
2016-07-19 01:10:36 -05:00
done ( ) ;
} ) ;
} ) ;
2016-08-15 16:48:39 -04:00
it ( 'clicking on the email verify link by an email VERIFIED user that was setup before enabling the expire email verify token should show an invalid link' , done => {
2016-07-19 01:10:36 -05:00
var user = new Parse . User ( ) ;
var sendEmailOptions ;
var emailAdapter = {
sendVerificationEmail : options => {
sendEmailOptions = options ;
} ,
sendPasswordResetEmail : ( ) => Promise . resolve ( ) ,
sendMail : ( ) => { }
}
var serverConfig = {
appName : 'emailVerifyToken' ,
verifyUserEmails : true ,
emailAdapter : emailAdapter ,
publicServerURL : "http://localhost:8378/1"
} ;
// setup server WITHOUT enabling the expire email verify token flag
reconfigureServer ( serverConfig )
. then ( ( ) => {
user . setUsername ( "testEmailVerifyTokenValidity" ) ;
user . setPassword ( "expiringToken" ) ;
user . set ( 'email' , 'user@parse.com' ) ;
return user . signUp ( ) ;
} )
. then ( ( ) => {
return new Promise ( ( resolve , reject ) => {
request . get ( sendEmailOptions . link , { followRedirect : false , } )
. on ( 'error' , error => reject ( error ) )
. on ( 'response' , ( response ) => {
expect ( response . statusCode ) . toEqual ( 302 ) ;
resolve ( user . fetch ( ) ) ;
} ) ;
} ) ;
} )
. then ( ( ) => {
expect ( user . get ( 'emailVerified' ) ) . toEqual ( true ) ;
// RECONFIGURE the server i.e., ENABLE the expire email verify token flag
serverConfig . emailVerifyTokenValidityDuration = 5 ; // 5 seconds
return reconfigureServer ( serverConfig ) ;
} )
. then ( ( ) => {
request . get ( sendEmailOptions . link , {
2016-11-24 15:47:41 -05:00
followRedirect : false ,
} , ( error , response ) => {
2016-07-19 01:10:36 -05:00
expect ( response . statusCode ) . toEqual ( 302 ) ;
expect ( response . body ) . toEqual ( 'Found. Redirecting to http://localhost:8378/1/apps/invalid_link.html' ) ;
done ( ) ;
} ) ;
} )
2016-11-24 15:47:41 -05:00
. catch ( ( error ) => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
2016-07-19 01:10:36 -05:00
done ( ) ;
} ) ;
} ) ;
2016-08-15 16:48:39 -04:00
it ( 'clicking on the email verify link by an email UNVERIFIED user that was setup before enabling the expire email verify token should show an invalid link' , done => {
2016-07-19 01:10:36 -05:00
var user = new Parse . User ( ) ;
var sendEmailOptions ;
var emailAdapter = {
sendVerificationEmail : options => {
sendEmailOptions = options ;
} ,
sendPasswordResetEmail : ( ) => Promise . resolve ( ) ,
sendMail : ( ) => { }
}
var serverConfig = {
appName : 'emailVerifyToken' ,
verifyUserEmails : true ,
emailAdapter : emailAdapter ,
publicServerURL : "http://localhost:8378/1"
} ;
// setup server WITHOUT enabling the expire email verify token flag
reconfigureServer ( serverConfig )
. then ( ( ) => {
user . setUsername ( "testEmailVerifyTokenValidity" ) ;
user . setPassword ( "expiringToken" ) ;
user . set ( 'email' , 'user@parse.com' ) ;
return user . signUp ( ) ;
} )
. then ( ( ) => {
// just get the user again - DO NOT email verify the user
return user . fetch ( ) ;
} )
. then ( ( ) => {
expect ( user . get ( 'emailVerified' ) ) . toEqual ( false ) ;
// RECONFIGURE the server i.e., ENABLE the expire email verify token flag
serverConfig . emailVerifyTokenValidityDuration = 5 ; // 5 seconds
return reconfigureServer ( serverConfig ) ;
} )
. then ( ( ) => {
request . get ( sendEmailOptions . link , {
2016-11-24 15:47:41 -05:00
followRedirect : false ,
} , ( error , response ) => {
2016-07-19 01:10:36 -05:00
expect ( response . statusCode ) . toEqual ( 302 ) ;
expect ( response . body ) . toEqual ( 'Found. Redirecting to http://localhost:8378/1/apps/invalid_link.html' ) ;
done ( ) ;
} ) ;
} )
2016-11-24 15:47:41 -05:00
. catch ( ( error ) => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
2016-07-19 01:10:36 -05:00
done ( ) ;
} ) ;
} ) ;
2016-08-15 16:48:39 -04:00
it ( 'setting the email on the user should set a new email verification token and new expiration date for the token when expire email verify token flag is set' , done => {
2016-07-19 01:10:36 -05:00
let user = new Parse . User ( ) ;
let userBeforeEmailReset ;
let sendEmailOptions ;
let emailAdapter = {
sendVerificationEmail : options => {
sendEmailOptions = options ;
} ,
sendPasswordResetEmail : ( ) => Promise . resolve ( ) ,
sendMail : ( ) => { }
} ;
let serverConfig = {
appName : 'emailVerifyToken' ,
verifyUserEmails : true ,
emailAdapter : emailAdapter ,
emailVerifyTokenValidityDuration : 5 , // 5 seconds
publicServerURL : "http://localhost:8378/1"
} ;
reconfigureServer ( serverConfig )
. then ( ( ) => {
user . setUsername ( "newEmailVerifyTokenOnEmailReset" ) ;
user . setPassword ( "expiringToken" ) ;
user . set ( 'email' , 'user@parse.com' ) ;
return user . signUp ( ) ;
} )
. then ( ( ) => {
2016-08-15 16:48:39 -04:00
let config = new Config ( 'test' ) ;
2016-11-24 15:47:41 -05:00
return config . database . find ( '_User' , { username : 'newEmailVerifyTokenOnEmailReset' } ) . then ( ( results ) => {
2016-08-15 16:48:39 -04:00
return results [ 0 ] ;
} ) ;
2016-07-19 01:10:36 -05:00
} )
. then ( userFromDb => {
expect ( typeof userFromDb ) . toBe ( 'object' ) ;
userBeforeEmailReset = userFromDb ;
// trigger another token generation by setting the email
user . set ( 'email' , 'user@parse.com' ) ;
2016-11-24 15:47:41 -05:00
return new Promise ( ( resolve ) => {
2016-07-19 01:10:36 -05:00
// wait for half a sec to get a new expiration time
setTimeout ( ( ) => resolve ( user . save ( ) ) , 500 ) ;
} ) ;
} )
. then ( ( ) => {
2016-08-15 16:48:39 -04:00
let config = new Config ( 'test' ) ;
2016-11-24 15:47:41 -05:00
return config . database . find ( '_User' , { username : 'newEmailVerifyTokenOnEmailReset' } ) . then ( ( results ) => {
2016-08-15 16:48:39 -04:00
return results [ 0 ] ;
} ) ;
2016-07-19 01:10:36 -05:00
} )
. then ( userAfterEmailReset => {
expect ( typeof userAfterEmailReset ) . toBe ( 'object' ) ;
expect ( userBeforeEmailReset . _email _verify _token ) . not . toEqual ( userAfterEmailReset . _email _verify _token ) ;
expect ( userBeforeEmailReset . _email _verify _token _expires _at ) . not . toEqual ( userAfterEmailReset . _ _email _verify _token _expires _at ) ;
2016-11-24 15:47:41 -05:00
expect ( sendEmailOptions ) . toBeDefined ( ) ;
2016-07-19 01:10:36 -05:00
done ( ) ;
} )
2016-11-24 15:47:41 -05:00
. catch ( ( error ) => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
2016-07-19 01:10:36 -05:00
done ( ) ;
} ) ;
} ) ;
2016-08-15 16:48:39 -04:00
it ( 'client should not see the _email_verify_token_expires_at field' , done => {
2016-07-19 01:10:36 -05:00
var user = new Parse . User ( ) ;
var sendEmailOptions ;
var emailAdapter = {
sendVerificationEmail : options => {
sendEmailOptions = options ;
} ,
sendPasswordResetEmail : ( ) => Promise . resolve ( ) ,
sendMail : ( ) => { }
}
reconfigureServer ( {
appName : 'emailVerifyToken' ,
verifyUserEmails : true ,
emailAdapter : emailAdapter ,
emailVerifyTokenValidityDuration : 5 , // 5 seconds
publicServerURL : "http://localhost:8378/1"
} )
. then ( ( ) => {
user . setUsername ( "testEmailVerifyTokenValidity" ) ;
user . setPassword ( "expiringToken" ) ;
user . set ( 'email' , 'user@parse.com' ) ;
return user . signUp ( ) ;
} )
. then ( ( ) => {
user . fetch ( )
. then ( ( ) => {
expect ( user . get ( 'emailVerified' ) ) . toEqual ( false ) ;
expect ( typeof user . get ( '_email_verify_token_expires_at' ) ) . toBe ( 'undefined' ) ;
2016-11-24 15:47:41 -05:00
expect ( sendEmailOptions ) . toBeDefined ( ) ;
2016-07-19 01:10:36 -05:00
done ( ) ;
} )
. catch ( error => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
2016-07-19 01:10:36 -05:00
done ( ) ;
} ) ;
2016-11-24 15:47:41 -05:00
} ) . catch ( ( error ) => {
2016-08-15 16:48:39 -04:00
jfail ( error ) ;
done ( ) ;
2016-07-19 01:10:36 -05:00
} ) ;
} ) ;
} )