mirror of https://github.com/Chocobozzz/PeerTube
				
				
				
			
		
			
				
	
	
		
			184 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
| /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
 | |
| 
 | |
| import * as chai from 'chai'
 | |
| import 'mocha'
 | |
| import {
 | |
|   cleanupTests,
 | |
|   flushAndRunServer,
 | |
|   getMyUserInformation,
 | |
|   getUserInformation,
 | |
|   login,
 | |
|   registerUser,
 | |
|   ServerInfo,
 | |
|   updateCustomSubConfig,
 | |
|   updateMyUser,
 | |
|   userLogin,
 | |
|   verifyEmail
 | |
| } from '../../../../shared/extra-utils'
 | |
| import { setAccessTokensToServers } from '../../../../shared/extra-utils/users/login'
 | |
| import { MockSmtpServer } from '../../../../shared/extra-utils/miscs/email'
 | |
| import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
 | |
| import { User } from '../../../../shared/models/users'
 | |
| 
 | |
| const expect = chai.expect
 | |
| 
 | |
| describe('Test users account verification', function () {
 | |
|   let server: ServerInfo
 | |
|   let userId: number
 | |
|   let userAccessToken: string
 | |
|   let verificationString: string
 | |
|   let expectedEmailsLength = 0
 | |
|   const user1 = {
 | |
|     username: 'user_1',
 | |
|     password: 'super password'
 | |
|   }
 | |
|   const user2 = {
 | |
|     username: 'user_2',
 | |
|     password: 'super password'
 | |
|   }
 | |
|   const emails: object[] = []
 | |
| 
 | |
|   before(async function () {
 | |
|     this.timeout(30000)
 | |
| 
 | |
|     const port = await MockSmtpServer.Instance.collectEmails(emails)
 | |
| 
 | |
|     const overrideConfig = {
 | |
|       smtp: {
 | |
|         hostname: 'localhost',
 | |
|         port
 | |
|       }
 | |
|     }
 | |
|     server = await flushAndRunServer(1, overrideConfig)
 | |
| 
 | |
|     await setAccessTokensToServers([ server ])
 | |
|   })
 | |
| 
 | |
|   it('Should register user and send verification email if verification required', async function () {
 | |
|     this.timeout(5000)
 | |
|     await updateCustomSubConfig(server.url, server.accessToken, {
 | |
|       signup: {
 | |
|         enabled: true,
 | |
|         requiresEmailVerification: true,
 | |
|         limit: 10
 | |
|       }
 | |
|     })
 | |
| 
 | |
|     await registerUser(server.url, user1.username, user1.password)
 | |
| 
 | |
|     await waitJobs(server)
 | |
|     expectedEmailsLength++
 | |
|     expect(emails).to.have.lengthOf(expectedEmailsLength)
 | |
| 
 | |
|     const email = emails[expectedEmailsLength - 1]
 | |
| 
 | |
|     const verificationStringMatches = /verificationString=([a-z0-9]+)/.exec(email['text'])
 | |
|     expect(verificationStringMatches).not.to.be.null
 | |
| 
 | |
|     verificationString = verificationStringMatches[1]
 | |
|     expect(verificationString).to.have.length.above(2)
 | |
| 
 | |
|     const userIdMatches = /userId=([0-9]+)/.exec(email['text'])
 | |
|     expect(userIdMatches).not.to.be.null
 | |
| 
 | |
|     userId = parseInt(userIdMatches[1], 10)
 | |
| 
 | |
|     const resUserInfo = await getUserInformation(server.url, server.accessToken, userId)
 | |
|     expect(resUserInfo.body.emailVerified).to.be.false
 | |
|   })
 | |
| 
 | |
|   it('Should not allow login for user with unverified email', async function () {
 | |
|     const resLogin = await login(server.url, server.client, user1, 400)
 | |
|     expect(resLogin.body.error).to.contain('User email is not verified.')
 | |
|   })
 | |
| 
 | |
|   it('Should verify the user via email and allow login', async function () {
 | |
|     await verifyEmail(server.url, userId, verificationString)
 | |
| 
 | |
|     const res = await login(server.url, server.client, user1)
 | |
|     userAccessToken = res.body.access_token
 | |
| 
 | |
|     const resUserVerified = await getUserInformation(server.url, server.accessToken, userId)
 | |
|     expect(resUserVerified.body.emailVerified).to.be.true
 | |
|   })
 | |
| 
 | |
|   it('Should be able to change the user email', async function () {
 | |
|     let updateVerificationString: string
 | |
| 
 | |
|     {
 | |
|       await updateMyUser({
 | |
|         url: server.url,
 | |
|         accessToken: userAccessToken,
 | |
|         email: 'updated@example.com',
 | |
|         currentPassword: user1.password
 | |
|       })
 | |
| 
 | |
|       await waitJobs(server)
 | |
|       expectedEmailsLength++
 | |
|       expect(emails).to.have.lengthOf(expectedEmailsLength)
 | |
| 
 | |
|       const email = emails[expectedEmailsLength - 1]
 | |
| 
 | |
|       const verificationStringMatches = /verificationString=([a-z0-9]+)/.exec(email['text'])
 | |
|       updateVerificationString = verificationStringMatches[1]
 | |
|     }
 | |
| 
 | |
|     {
 | |
|       const res = await getMyUserInformation(server.url, userAccessToken)
 | |
|       const me: User = res.body
 | |
| 
 | |
|       expect(me.email).to.equal('user_1@example.com')
 | |
|       expect(me.pendingEmail).to.equal('updated@example.com')
 | |
|     }
 | |
| 
 | |
|     {
 | |
|       await verifyEmail(server.url, userId, updateVerificationString, true)
 | |
| 
 | |
|       const res = await getMyUserInformation(server.url, userAccessToken)
 | |
|       const me: User = res.body
 | |
| 
 | |
|       expect(me.email).to.equal('updated@example.com')
 | |
|       expect(me.pendingEmail).to.be.null
 | |
|     }
 | |
|   })
 | |
| 
 | |
|   it('Should register user not requiring email verification if setting not enabled', async function () {
 | |
|     this.timeout(5000)
 | |
|     await updateCustomSubConfig(server.url, server.accessToken, {
 | |
|       signup: {
 | |
|         enabled: true,
 | |
|         requiresEmailVerification: false,
 | |
|         limit: 10
 | |
|       }
 | |
|     })
 | |
| 
 | |
|     await registerUser(server.url, user2.username, user2.password)
 | |
| 
 | |
|     await waitJobs(server)
 | |
|     expect(emails).to.have.lengthOf(expectedEmailsLength)
 | |
| 
 | |
|     const accessToken = await userLogin(server, user2)
 | |
| 
 | |
|     const resMyUserInfo = await getMyUserInformation(server.url, accessToken)
 | |
|     expect(resMyUserInfo.body.emailVerified).to.be.null
 | |
|   })
 | |
| 
 | |
|   it('Should allow login for user with unverified email when setting later enabled', async function () {
 | |
|     await updateCustomSubConfig(server.url, server.accessToken, {
 | |
|       signup: {
 | |
|         enabled: true,
 | |
|         requiresEmailVerification: true,
 | |
|         limit: 10
 | |
|       }
 | |
|     })
 | |
| 
 | |
|     await userLogin(server, user2)
 | |
|   })
 | |
| 
 | |
|   after(async function () {
 | |
|     MockSmtpServer.Instance.kill()
 | |
| 
 | |
|     await cleanupTests([ server ])
 | |
|   })
 | |
| })
 |