Commit 1a114bdf authored by Cédric Girardot's avatar Cédric Girardot

Tests : Ajoute tests Cypress sur les mails

Change-Id: I82bf94aa05aa6d546c89eb2d010f1d5cf6cbc927
parent 4161f4ff
...@@ -48,6 +48,8 @@ build-test: ...@@ -48,6 +48,8 @@ build-test:
cd $ADU_CI_COMPOSER_PROJECT_DIR cd $ADU_CI_COMPOSER_PROJECT_DIR
cp .env.dist .env cp .env.dist .env
sed -i "s#DATABASE_URL=\"mysqli://notaires:password@127.0.0.1:3306/notaires\"#DATABASE_URL=\"mysqli://root:password@mariadb:3306/notaires\"#" .env sed -i "s#DATABASE_URL=\"mysqli://notaires:password@127.0.0.1:3306/notaires\"#DATABASE_URL=\"mysqli://root:password@mariadb:3306/notaires\"#" .env
sed -i "s#MAILER_DSN=smtp://localhost:25#MAILER_DSN=smtp://mail:1025#" .env
sed -i "s#MAILER_SENDER=#MAILER_SENDER=sender@notaire.fr#" .env
sed -i "s#mysqli://notaires:password@database:3306/notaires#mysqli://root:password@mariadb:3306/notaires#" phpunit.xml.dist sed -i "s#mysqli://notaires:password@database:3306/notaires#mysqli://root:password@mariadb:3306/notaires#" phpunit.xml.dist
composer install $ADU_CI_COMPOSER_CLI_OPTIONS composer install $ADU_CI_COMPOSER_CLI_OPTIONS
yarn install --frozen-lockfile yarn install --frozen-lockfile
...@@ -103,12 +105,14 @@ e2e-test: ...@@ -103,12 +105,14 @@ e2e-test:
- build-test - build-test
services: services:
- mariadb:10.1 - mariadb:10.1
- docker:19-dind - name: mailhog/mailhog:latest
alias: mail
variables: variables:
MYSQL_DATABASE: notaires MYSQL_DATABASE: notaires
MYSQL_ROOT_PASSWORD: password MYSQL_ROOT_PASSWORD: password
ADU_CI_COMPOSER_PROJECT_DIR: "$CI_PROJECT_DIR/appli_sf" ADU_CI_COMPOSER_PROJECT_DIR: "$CI_PROJECT_DIR/appli_sf"
CYPRESS_BASE_URL: "http://localhost:8000" CYPRESS_BASE_URL: "http://localhost:8000"
CYPRESS_mailhogUrl: "http://mail:8025"
artifacts: artifacts:
expire_in: 1 day expire_in: 1 day
when: on_failure when: on_failure
...@@ -120,7 +124,7 @@ e2e-test: ...@@ -120,7 +124,7 @@ e2e-test:
cd $ADU_CI_COMPOSER_PROJECT_DIR cd $ADU_CI_COMPOSER_PROJECT_DIR
bin/console doctrine:schema:update --force bin/console doctrine:schema:update --force
bin/console cache:clear bin/console cache:clear
bin/console user:add --username=admin --password=P@ssword12345 --email=test@deptnot.test --name=Administrateur --role=ROLE_ADMIN --no-interaction bin/console user:add --username=admin --password=P@ssword12345 --email=admin@notaires.test --name=Administrateur --role=ROLE_ADMIN --no-interaction
symfony server:start -d symfony server:start -d
cd tests/E2E cd tests/E2E
yarn yarn
......
#!/usr/bin/env groovy #!/usr/bin/env groovy
def hostIp(container) {
sh "docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${container.id} > hostIp"
readFile('hostIp').trim()
}
pipeline { pipeline {
agent any agent any
stages { stages {
...@@ -9,7 +14,7 @@ pipeline { ...@@ -9,7 +14,7 @@ pipeline {
filename 'Dockerfile' filename 'Dockerfile'
dir './docker/lamp' dir './docker/lamp'
additionalBuildArgs '--build-arg PHP_VERSION=7.2' additionalBuildArgs '--build-arg PHP_VERSION=7.2'
args '-u root --privileged -v "/var/lib/jenkins/composer/auth.json:/home/.composer/auth.json"' args '-u root --privileged -e TZ="Europe/Paris" -v "/var/lib/jenkins/composer/auth.json:/home/.composer/auth.json" -v "/var/run/docker.sock:/var/run/docker.sock"'
} }
} }
stages { stages {
...@@ -27,6 +32,7 @@ pipeline { ...@@ -27,6 +32,7 @@ pipeline {
sh 'sed -i "s/127.0.0.1.*/127.0.0.1 localhost database/" ~/hosts.new' sh 'sed -i "s/127.0.0.1.*/127.0.0.1 localhost database/" ~/hosts.new'
sh 'cp -f ~/hosts.new /etc/hosts' sh 'cp -f ~/hosts.new /etc/hosts'
sh 'cp .env.dist .env' sh 'cp .env.dist .env'
sh 'sed -i "s#MAILER_SENDER=#MAILER_SENDER=sender@notaire.fr#" .env'
sh "composer config cache-dir '${env.WORKSPACE}/.cache/.composer'" sh "composer config cache-dir '${env.WORKSPACE}/.cache/.composer'"
sh 'composer install --no-progress --no-suggest --no-interaction --no-scripts' sh 'composer install --no-progress --no-suggest --no-interaction --no-scripts'
sh 'yarn && yarn run build' sh 'yarn && yarn run build'
...@@ -90,18 +96,23 @@ pipeline { ...@@ -90,18 +96,23 @@ pipeline {
CYPRESS_BASE_URL = "http://localhost" CYPRESS_BASE_URL = "http://localhost"
} }
steps { steps {
dir('appli_sf') { script {
sh 'bin/console doctrine:schema:drop --force' docker.image('mailhog/mailhog:latest').withRun('-p 8025:8025 -p 1025:1025') { mail ->
sh 'bin/console doctrine:schema:update --force' dir('appli_sf') {
sh 'bin/console cache:clear' sh "sed -i \"s#MAILER_DSN=smtp://localhost:25#MAILER_DSN=smtp://${hostIp(mail)}:1025#\" .env"
sh 'bin/console user:add --username=admin --password=P@ssword12345 --email=test@deptnot.test --name=Administrateur --role=ROLE_ADMIN --no-interaction' sh 'bin/console doctrine:schema:drop --force'
dir('tests/E2E') { sh 'bin/console doctrine:schema:update --force'
sh 'yarn' sh 'bin/console cache:clear'
sh 'cypress run --spec "cypress/integration/1-login.spec.js,cypress/integration/2-params.spec.js,cypress/integration/3-search-empty-db.spec.js"' sh 'bin/console user:add --username=admin --password=P@ssword12345 --email=admin@notaires.test --name=Administrateur --role=ROLE_ADMIN --no-interaction'
} dir('tests/E2E') {
sh 'bin/console import:individus imports/individus.csv --no-interaction --quiet' sh 'yarn'
dir('tests/E2E') { sh 'cypress run --spec "cypress/integration/1-login.spec.js,cypress/integration/2-params.spec.js,cypress/integration/3-search-empty-db.spec.js"'
sh 'cypress run --spec "cypress/integration/4-search.spec.js,cypress/integration/5-create-users.spec.js,cypress/integration/6-create-instructors.spec.js,cypress/integration/7-stats.spec.js"' }
sh 'bin/console import:individus imports/individus.csv --no-interaction --quiet'
dir('tests/E2E') {
sh "CYPRESS_mailhogUrl=\"http://${hostIp(mail)}:8025\" cypress run --spec \"cypress/integration/4-search.spec.js,cypress/integration/5-create-users.spec.js,cypress/integration/6-create-instructors.spec.js,cypress/integration/7-stats.spec.js\""
}
}
} }
} }
} }
......
{ {
"username": "admin", "username": "admin",
"password": "P@ssword12345" "password": "P@ssword12345",
"email": "admin@notaires.test"
} }
...@@ -11,13 +11,14 @@ describe('Recherche', () => { ...@@ -11,13 +11,14 @@ describe('Recherche', () => {
this.userAdmin = user this.userAdmin = user
}) })
Cypress.Cookies.preserveOnce('PHPSESSID') Cypress.Cookies.preserveOnce('PHPSESSID')
cy.deleteAllMails()
}) })
it('Login', function () { it('Login', function () {
cy.login(this.userAdmin.username, this.userAdmin.password) cy.login(this.userAdmin.username, this.userAdmin.password)
}) })
it('Personne connue, aide récupérable', () => { it('Personne connue, aide récupérable', function () {
cy.visit('/search') cy.visit('/search')
cy.fillSearch({ cy.fillSearch({
deathDate: '10/02/2020', deathDate: '10/02/2020',
...@@ -29,9 +30,10 @@ describe('Recherche', () => { ...@@ -29,9 +30,10 @@ describe('Recherche', () => {
}) })
cy.contains('Cette personne est connue de nos services') cy.contains('Cette personne est connue de nos services')
cy.checkMailContent(this.userAdmin.email, "connue").should('be.true')
}) })
it('Personne connue, aide non récupérable', () => { it('Personne connue, aide non récupérable', function () {
cy.visit('/search') cy.visit('/search')
cy.fillSearch({ cy.fillSearch({
deathDate: '10/02/2020', deathDate: '10/02/2020',
...@@ -43,9 +45,10 @@ describe('Recherche', () => { ...@@ -43,9 +45,10 @@ describe('Recherche', () => {
}) })
cy.contains('Cette personne est connue de nos services') cy.contains('Cette personne est connue de nos services')
cy.checkMailContent(this.userAdmin.email, "connue").should('be.true')
}) })
it('Personne inconnue', () => { it('Personne inconnue', function () {
cy.visit('/search') cy.visit('/search')
cy.fillSearch({ cy.fillSearch({
deathDate: '10/02/2020', deathDate: '10/02/2020',
...@@ -57,9 +60,10 @@ describe('Recherche', () => { ...@@ -57,9 +60,10 @@ describe('Recherche', () => {
}) })
cy.contains('Cette personne est inconnue de nos services') cy.contains('Cette personne est inconnue de nos services')
cy.checkMailContent(this.userAdmin.email, "<strong>inconnue</strong>").should('be.true')
}) })
it('Personne inconnue, demande en cours d\'instruction', () => { it('Personne inconnue, demande en cours d\'instruction', function () {
cy.visit('/search') cy.visit('/search')
cy.fillSearch({ cy.fillSearch({
deathDate: '10/02/2020', deathDate: '10/02/2020',
...@@ -71,9 +75,10 @@ describe('Recherche', () => { ...@@ -71,9 +75,10 @@ describe('Recherche', () => {
}) })
cy.contains('Cette personne est inconnue de nos services') cy.contains('Cette personne est inconnue de nos services')
cy.checkMailContent(this.userAdmin.email, "il existe une demande en cours").should('be.true')
}) })
it('Resultat ambigu', () => { it('Resultat ambigu', function () {
cy.visit('/search') cy.visit('/search')
cy.fillSearch({ cy.fillSearch({
deathDate: '10/02/2020', deathDate: '10/02/2020',
...@@ -85,6 +90,7 @@ describe('Recherche', () => { ...@@ -85,6 +90,7 @@ describe('Recherche', () => {
}) })
cy.contains('Les éléments que vous avez saisis ne permettent pas d\'établir avec certitude l\'identité') cy.contains('Les éléments que vous avez saisis ne permettent pas d\'établir avec certitude l\'identité')
cy.checkMailContent(this.userAdmin.email, "avec certitude").should('be.true')
}) })
it('Déconnexion', () => { it('Déconnexion', () => {
......
...@@ -11,6 +11,7 @@ describe('Recherche', () => { ...@@ -11,6 +11,7 @@ describe('Recherche', () => {
this.userAdmin = user this.userAdmin = user
}) })
Cypress.Cookies.preserveOnce('PHPSESSID') Cypress.Cookies.preserveOnce('PHPSESSID')
cy.deleteAllMails()
}) })
it('Login', function () { it('Login', function () {
...@@ -48,6 +49,7 @@ describe('Recherche', () => { ...@@ -48,6 +49,7 @@ describe('Recherche', () => {
}) })
cy.get('body').should('not.contain', 'Nous n\'avons pas trouvé d\'instructeur associé à votre requête') cy.get('body').should('not.contain', 'Nous n\'avons pas trouvé d\'instructeur associé à votre requête')
cy.checkMailReceiver('instructeur1@notaire.fr').should('be.true')
}) })
it('Création d\'un second instructeur', () => { it('Création d\'un second instructeur', () => {
...@@ -81,6 +83,7 @@ describe('Recherche', () => { ...@@ -81,6 +83,7 @@ describe('Recherche', () => {
}) })
cy.get('body').should('not.contain', 'Nous n\'avons pas trouvé d\'instructeur associé à votre requête') cy.get('body').should('not.contain', 'Nous n\'avons pas trouvé d\'instructeur associé à votre requête')
cy.checkMailReceiver('instructeur2@notaire.fr').should('be.true')
}) })
it('Création d\'un instructeur multi-réponses et initiales communes avec un autre instructeur', () => { it('Création d\'un instructeur multi-réponses et initiales communes avec un autre instructeur', () => {
...@@ -115,6 +118,8 @@ describe('Recherche', () => { ...@@ -115,6 +118,8 @@ describe('Recherche', () => {
}) })
cy.get('body').should('not.contain', 'Nous n\'avons pas trouvé d\'instructeur associé à votre requête') cy.get('body').should('not.contain', 'Nous n\'avons pas trouvé d\'instructeur associé à votre requête')
cy.checkMailReceiver('instructeur1@notaire.fr').should('be.true')
cy.checkMailReceiver('instructeur3@notaire.fr').should('be.false')
}) })
it('Déconnexion', () => { it('Déconnexion', () => {
......
...@@ -108,3 +108,64 @@ Cypress.Commands.add('fillInstructor', (values) => { ...@@ -108,3 +108,64 @@ Cypress.Commands.add('fillInstructor', (values) => {
cy.get('form[name=instructor]').submit() cy.get('form[name=instructor]').submit()
}) })
// Vérifie qu'un mail a bien été envoyé à un destinataire donné (le mail doit être envoyé qu'une fois)
Cypress.Commands.add('checkMailReceiver', email => {
cy.request({
method: 'GET',
url: Cypress.env('mailhogUrl') + '/api/v2/search',
headers: {
'content-type': 'application/json',
},
qs: {
kind: 'to',
query: decodeURIComponent(email)
},
json: true,
}).then((response) => {
const items = response.body.items
return items.length === 1;
})
});
Cypress.Commands.add('deleteAllMails', email => {
cy.request({
method: 'DELETE',
url: Cypress.env('mailhogUrl') + '/api/v1/messages',
headers: {
'content-type': 'application/json',
},
json: true,
}).then((response) => {
assert.equal(response.status, 200)
})
});
Cypress.Commands.add('checkMailContent', (email, content) => {
cy.request({
method: 'GET',
url: Cypress.env('mailhogUrl') + '/api/v2/search',
headers: {
'content-type': 'application/json',
},
qs: {
kind: 'to',
query: decodeURIComponent(email)
},
json: true,
}).then((response) => {
const items = response.body.items
if (items.length === 1) {
let mail = items[0]
let regExpContent = new RegExp(content, "g");
assert.match(mail.Content.Body, regExpContent)
return true;
}
return false;
})
});
...@@ -81,9 +81,10 @@ services: ...@@ -81,9 +81,10 @@ services:
- database - database
- mail - mail
environment: environment:
TZ: ${TIMEZONE} TZ: ${TIMEZONE}
CYPRESS_baseUrl: http://${HTTP_HOSTNAME} DISPLAY: unix$DISPLAY
DISPLAY: unix$DISPLAY CYPRESS_baseUrl: http://${HTTP_HOSTNAME}
CYPRESS_mailhogUrl: http://mail:${MAILER_CLIENT_PORT:-8025}
working_dir: /e2e working_dir: /e2e
volumes: volumes:
- ./appli_sf/tests/E2E/:/e2e - ./appli_sf/tests/E2E/:/e2e
......
...@@ -89,6 +89,13 @@ ENV PHP_VERSION 7.2 ...@@ -89,6 +89,13 @@ ENV PHP_VERSION 7.2
# Install Cypress # Install Cypress
RUN yarn global add --pure-lockfile cypress@4.11.0; RUN yarn global add --pure-lockfile cypress@4.11.0;
# Docker
RUN curl -fsSLO https://get.docker.com/builds/Linux/x86_64/docker-17.04.0-ce.tgz && \
tar xzvf docker-17.04.0-ce.tgz && \
mv docker/docker /usr/local/bin && \
rm -r docker docker-17.04.0-ce.tgz && \
export DOCKER_HOST=unix:///var/run/docker.sock
WORKDIR /app WORKDIR /app
CMD ["/run.sh"] CMD ["/run.sh"]
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment