Merge pull request #2753 from gradido/2421-feature-user-story-finish-up-register

feat(other): e2e test user story user registration
This commit is contained in:
Hannes Heine 2023-03-02 15:27:38 +01:00 committed by GitHub
commit d8c5f889d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 53 additions and 35 deletions

View File

@ -550,7 +550,7 @@ jobs:
run: | run: |
cd e2e-tests/ cd e2e-tests/
yarn yarn
yarn run cypress run --spec cypress/e2e/User.Authentication.feature,cypress/e2e/User.Authentication.ResetPassword.feature yarn run cypress run --spec cypress/e2e/User.Authentication.feature,cypress/e2e/User.Authentication.ResetPassword.feature,cypress/e2e/User.Registration.feature
- name: End-to-end tests | if tests failed, upload screenshots - name: End-to-end tests | if tests failed, upload screenshots
if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }} if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }}
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3

View File

@ -2,7 +2,7 @@ import { defineConfig } from 'cypress'
import { addCucumberPreprocessorPlugin } from '@badeball/cypress-cucumber-preprocessor' import { addCucumberPreprocessorPlugin } from '@badeball/cypress-cucumber-preprocessor'
import browserify from '@badeball/cypress-cucumber-preprocessor/browserify' import browserify from '@badeball/cypress-cucumber-preprocessor/browserify'
let resetPasswordLink: string let emailLink: string
async function setupNodeEvents( async function setupNodeEvents(
on: Cypress.PluginEvents, on: Cypress.PluginEvents,
@ -18,11 +18,11 @@ async function setupNodeEvents(
) )
on('task', { on('task', {
setResetPasswordLink: (val) => { setEmailLink: (link: string) => {
return (resetPasswordLink = val) return (emailLink = link)
}, },
getResetPasswordLink: () => { getEmailLink: () => {
return resetPasswordLink return emailLink
}, },
}) })

View File

@ -13,8 +13,8 @@ Feature: User Authentication - reset password
And the user navigates to the forgot password page And the user navigates to the forgot password page
When the user enters the e-mail address "bibi@bloxberg.de" When the user enters the e-mail address "bibi@bloxberg.de"
And the user submits the e-mail form And the user submits the e-mail form
Then the user receives an e-mail containing the password reset link Then the user receives an e-mail containing the "password reset" link
When the user opens the password reset link in the browser When the user opens the "password reset" link in the browser
And the user enters the password "12345Aa_" And the user enters the password "12345Aa_"
And the user repeats the password "12345Aa_" And the user repeats the password "12345Aa_"
And the user submits the password form And the user submits the password form

View File

@ -2,12 +2,16 @@ Feature: User registration
As a user As a user
I want to register to create an account I want to register to create an account
@skip
Scenario: Register successfully Scenario: Register successfully
Given the user navigates to page "/register" Given the user navigates to page "/register"
When the user fills name and email "Regina" "Register" "regina@register.com" When the user fills name and email "Regina" "Register" "regina@register.com"
And the user agrees to the privacy policy And the user agrees to the privacy policy
And the user submits the registration form And the user submits the registration form
Then the user can use a provided activation link Then the user receives an e-mail containing the "activation" link
And the user can set a password "Aa12345_" When the user opens the "activation" link in the browser
And the user can login with the credentials "regina@register.com" "Aa12345_" And the user enters the password "12345Aa_"
And the user repeats the password "12345Aa_"
And the user submits the password form
And the user clicks the sign in button
Then the user submits the credentials "regina@register.com" "12345Aa_"
And the user is logged in with username "Regina Register"

View File

@ -4,7 +4,7 @@ export class RegistrationPage {
// selectors // selectors
firstnameInput = '#registerFirstname' firstnameInput = '#registerFirstname'
lastnameInput = '#registerLastname' lastnameInput = '#registerLastname'
emailInput = '#Email-input-field' emailInput = 'input[type=email]'
checkbox = '#registerCheckbox' checkbox = '#registerCheckbox'
submitBtn = '[type=submit]' submitBtn = '[type=submit]'
@ -35,7 +35,7 @@ export class RegistrationPage {
cy.get(this.checkbox).click({ force: true }) cy.get(this.checkbox).click({ force: true })
} }
submitRegistrationPage() { submitRegistrationForm() {
cy.get(this.submitBtn).should('be.enabled') cy.get(this.submitBtn).should('be.enabled')
cy.get(this.submitBtn).click() cy.get(this.submitBtn).click()
} }

View File

@ -2,19 +2,19 @@
export class ResetPasswordPage { export class ResetPasswordPage {
// selectors // selectors
newPasswordBlock = '#new-password-input-field' newPasswordInput = '#new-password-input-field'
newPasswordRepeatBlock = '#repeat-new-password-input-field' newPasswordRepeatInput = '#repeat-new-password-input-field'
resetPasswordBtn = 'button[type=submit]' resetPasswordBtn = 'button[type=submit]'
resetPasswordMessageBlock = '[data-test="reset-password-message"]' resetPasswordMessageBlock = '[data-test="reset-password-message"]'
signinBtn = '.btn.test-message-button' signinBtn = '.btn.test-message-button'
enterNewPassword(password: string) { enterNewPassword(password: string) {
cy.get(this.newPasswordBlock).find('input[type=password]').type(password) cy.get(this.newPasswordInput).find('input[type=password]').type(password)
return this return this
} }
repeatNewPassword(password: string) { repeatNewPassword(password: string) {
cy.get(this.newPasswordRepeatBlock) cy.get(this.newPasswordRepeatInput)
.find('input[type=password]') .find('input[type=password]')
.type(password) .type(password)
return this return this

View File

@ -5,41 +5,55 @@ import { UserEMailSite } from '../../e2e/models/UserEMailSite'
const userEMailSite = new UserEMailSite() const userEMailSite = new UserEMailSite()
const resetPasswordPage = new ResetPasswordPage() const resetPasswordPage = new ResetPasswordPage()
Then('the user receives an e-mail containing the password reset link', () => { Then('the user receives an e-mail containing the {string} link', (linkName: string) => {
let emailSubject: string
let linkPattern: RegExp
switch (linkName) {
case 'activation':
emailSubject = 'Email Verification'
linkPattern = /\/checkEmail\/[0-9]+\d/
break
case 'password reset':
emailSubject = 'asswor'
linkPattern = /\/reset-password\/[0-9]+\d/
break
default:
throw new Error(`Error in "Then the user receives an e-mail containing the {string} link" step: incorrect linkname string "${linkName}"`)
}
cy.origin( cy.origin(
Cypress.env('mailserverURL'), Cypress.env('mailserverURL'),
{ args: userEMailSite }, { args: { emailSubject, linkPattern, userEMailSite } },
(userEMailSite) => { ({ emailSubject, linkPattern, userEMailSite }) => {
const linkPattern = /\/reset-password\/[0-9]+\d/ cy.visit('/') // navigate to user's e-mail site (on fake mail server)
cy.visit('/') // navigate to user's e-maile site (on fake mail server)
cy.get(userEMailSite.emailInbox).should('be.visible') cy.get(userEMailSite.emailInbox).should('be.visible')
cy.get(userEMailSite.emailList) cy.get(userEMailSite.emailList)
.find('.email-item') .find('.email-item')
.filter(':contains(asswor)') .filter(`:contains(${emailSubject})`)
.first() .first()
.click() .click()
cy.get(userEMailSite.emailMeta) cy.get(userEMailSite.emailMeta)
.find(userEMailSite.emailSubject) .find(userEMailSite.emailSubject)
.contains('asswor') .contains(emailSubject)
cy.get('.email-content') cy.get('.email-content', { timeout: 2000})
.find('.plain-text') .find('.plain-text')
.contains(linkPattern) .contains(linkPattern)
.invoke('text') .invoke('text')
.then((text) => { .then((text) => {
const resetPasswordLink = text.match(linkPattern)[0] const emailLink = text.match(linkPattern)[0]
cy.task('setResetPasswordLink', resetPasswordLink) cy.task('setEmailLink', emailLink)
}) })
} }
) )
}) })
When('the user opens the password reset link in the browser', () => { When('the user opens the {string} link in the browser', (linkName: string) => {
cy.task('getResetPasswordLink').then((passwordResetLink) => { cy.task('getEmailLink').then((emailLink) => {
cy.visit(passwordResetLink) cy.visit(emailLink)
}) })
cy.get(resetPasswordPage.newPasswordRepeatBlock).should('be.visible') cy.get(resetPasswordPage.newPasswordInput).should('be.visible')
}) })

View File

@ -18,7 +18,7 @@ And('the user agrees to the privacy policy', () => {
}) })
And('the user submits the registration form', () => { And('the user submits the registration form', () => {
registrationPage.submitRegistrationPage() registrationPage.submitRegistrationForm()
cy.get(registrationPage.RegistrationThanxHeadline).should('be.visible') cy.get(registrationPage.RegistrationThanxHeadline).should('be.visible')
cy.get(registrationPage.RegistrationThanxText).should('be.visible') cy.get(registrationPage.RegistrationThanxText).should('be.visible')
}) })

View File

@ -22,7 +22,7 @@
"@cypress/browserify-preprocessor": "^3.0.2", "@cypress/browserify-preprocessor": "^3.0.2",
"@typescript-eslint/eslint-plugin": "^5.38.0", "@typescript-eslint/eslint-plugin": "^5.38.0",
"@typescript-eslint/parser": "^5.38.0", "@typescript-eslint/parser": "^5.38.0",
"cypress": "^10.4.0", "cypress": "^12.7.0",
"eslint": "^8.23.1", "eslint": "^8.23.1",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-config-standard": "^16.0.3", "eslint-config-standard": "^16.0.3",