WIP - worflow éditorial avec Anaïs

This commit is contained in:
Agate 2022-11-22 09:58:57 +01:00
parent 8219098f67
commit 842a4ef696
4 changed files with 173 additions and 22 deletions

View File

@ -1,3 +1,3 @@
module.exports = {
default: `--publish-quiet --format-options '{"snippetInterface": "synchronous"}'`
default: `--fail-fast --publish-quiet --format-options '{"snippetInterface": "synchronous"}'`
}

View File

@ -1,4 +1,4 @@
Fonctionnalité: Authentik
Fonctionnalité: Authentic
Scénario: Connexion valide
Sachant que je suis sur la page "Portail Usager"
Et que je clique sur "Connexion"

View File

@ -1,21 +1,23 @@
const { Given, When, Then, After, AfterAll, setDefaultTimeout} = require('@cucumber/cucumber');
const { By, Key } = require('selenium-webdriver');
const { By, Key, Select } = require('selenium-webdriver');
const { getDriver } = require('../../src/driver');
const { expect } = require('chai');
// setup
setDefaultTimeout(5 * 1000);
setDefaultTimeout(30 * 1000);
const driver = getDriver()
driver.manage().window().maximize()
const PUBLIK_URL = process.env.PUBLIK_URL || 'https://{}.dev.publik.love'
const PUBLIK_IS_DEV_INSTANCE = (process.env.PUBLIK_IS_DEV_INSTANCE || 'false') === 'true'
const PUBLIK_URL = PUBLIK_IS_DEV_INSTANCE ? 'https://{}.dev.publik.love' : (process.env.PUBLIK_URL || 'https://{}.dev.publik.love')
const PUBLIK_PORTAIL_USAGER = PUBLIK_IS_DEV_INSTANCE ? 'combo' : process.env.PUBLIK_PORTAIL_USAGER
const PUBLIK_PORTAIL_AGENT = PUBLIK_IS_DEV_INSTANCE ? 'noop' : process.env.PUBLIK_PORTAIL_AGENT
const PUBLIK_PORTAIL_AGENT = PUBLIK_IS_DEV_INSTANCE ? 'agent-combo' : process.env.PUBLIK_PORTAIL_AGENT
const PUBLIK_DEMARCHES = PUBLIK_IS_DEV_INSTANCE ? 'wcs' : process.env.PUBLIK_PORTAIL_AGENT
const PAGES = {
'Portail Usager': PUBLIK_URL.replace('{}', PUBLIK_PORTAIL_USAGER || 'portail'),
'Portail Agent': PUBLIK_URL.replace('{}', PUBLIK_PORTAIL_AGENT || 'agents'),
'Portail Agent - Fiches': PUBLIK_URL.replace('{}', PUBLIK_DEMARCHES || 'demarches') + '/backoffice/data',
}
console.log('Available pages:', PAGES)
console.log('Launching tests...')
@ -48,17 +50,88 @@ async function getCurrentUser(driver) {
return username
}
async function connect (driver, role) {
let homeUrl = getUrlFromPage('Portail Agent')
let username = process.env[`PUBLIK_${role}_USERNAME`] || role
let password = process.env[`PUBLIK_${role}_PASSWORD`] || 'password'
await driver.get(homeUrl)
await (await driver.findElement(By.name('username'))).sendKeys(username)
await (await driver.findElement(By.name('password'))).sendKeys(password, Key.RETURN)
expect(await getCurrentUser(driver)).to.not.be.empty
}
async function disconnect(driver) {
let disconnectLink
disconnectLink = await driver.findElement(By.className('ui-logout'));
disconnectLink = await disconnectLink.findElement(By.xpath('./a'))
await disconnectLink.sendKeys(Key.RETURN)
await driver.manage().deleteAllCookies()
await driver.navigate().refresh()
}
async function getFieldByNameOrLabel(driver, nameOrLabel) {
try {
// easiest case, there is a field with the same name on the page
return await driver.findElement(By.name(nameOrLabel));
} catch (e) {
if(e.name === 'NoSuchElementError') {
// We try to find a <label> tag with the corresponding
// content
let expression = `//label[text()="${nameOrLabel}"]`
let label = await driver.findElement(By.xpath(expression));
let fieldId = await label.getAttribute("for")
return await driver.findElement(By.id(fieldId));
} else {
throw e
}
}
}
Given("je suis sur la page {string}", async function (pageName) {
let url = getUrlFromPage(pageName)
await driver.get(url);
});
When('je saisis {string} dans le champ {string}', async function (text, field) {
let element = await driver.findElement(By.name(field));
await element.sendKeys(text)
Given("je visite la page {string}", async function (pageName) {
let url = getUrlFromPage(pageName)
await driver.get(url);
});
When('je valide le formulaire', async function () {
Given("je visite la page {string} sur {string}", async function (path, site) {
let siteUrl = getUrlFromPage(site)
await driver.get(siteUrl + path);
});
When('je saisis {string} dans le champ {string}', async function (text, field) {
let element = await getFieldByNameOrLabel(driver, field)
if (await element.getAttribute("data-godo-schema")) {
// this is a godo editor, we need to target the contenteditable
// div, not the hidden textarea
element = await element.findElement(By.xpath('./following-sibling::*'));
element = await element.findElement(By.xpath('.//*[@contenteditable="true"]'));
}
await element.sendKeys(text)
});
When('je sélectionne {string} dans le champ {string}', async function (value, field) {
let element = await getFieldByNameOrLabel(driver, field)
if (await element.getAttribute("class") === 'select2-search__field') {
// This is a select2 multiple input with autocomplete, we cannot rely on
// built-in browser mechanisms to select a value
// so we use the autocomplete feature of the input to type the value
// and select it with Enter
await input.sendKeys(value, Key.RETURN)
} else {
let select = new Select(element)
await select.selectByVisibleText(value)
}
});
// When('je visite {string}', async function (url) {
// if (url.startsWith('/')) {
// let currentUrl = new URL(await driver.getCurrentUrl())
// url = `${currentUrl.protocol}//${currentUrl.hostname}${url}`
// }
// return await driver.navigate().to(url)
// });
When('je valide (le formulaire)', async function () {
let currentField = await driver.switchTo().activeElement();
await currentField.sendKeys(Key.RETURN)
});
@ -73,6 +146,15 @@ When('je clique sur {string}', async function (text) {
await element.sendKeys(Key.RETURN);
});
When('j\'attends {float} seconde(s)', async function (duration) {
await sleep(duration * 1000)
});
When('je clique sur la ligne {int} du tableau de listing', async function (i) {
let link = await driver.findElement(By.xpath(`//table[@id="listing"]//tr[${i}]//a`));
await link.click()
});
Then('je ne dois pas être connecté(e)', async function () {
await driver.findElement(By.className('login-link'));
@ -82,14 +164,29 @@ Then('la page doit afficher {string}', async function (text) {
let element = await driver.findElement(By.xpath(`//*[contains(text(), "${text}")]`));
});
Given("je suis connectée en tant que {string}", async function (role) {
let homeUrl = getUrlFromPage('Portail Agent')
let username = process.env[`PUBLIK_${role}_USERNAME`] || role
let password = process.env[`PUBLIK_${role}_PASSWORD`] || 'password'
await driver.get(homeUrl)
await (await driver.findElement(By.name('username'))).sendKeys(username)
await (await driver.findElement(By.name('password'))).sendKeys(password, Key.RETURN)
expect(await getCurrentUser(driver)).to.not.be.empty
Then('je dois être redirigé vers la page de la fiche', async function () {
let currentUrl = new URL(await driver.getCurrentUrl())
let path = currentUrl.pathname
expect(path.match(/\/backoffice\/data\/fiche\/(\d+)\//)).to.not.be.null
});
Then('la fiche doit être dans le statut {string}', async function (status) {
let element = await driver.findElement(By.className('current-status'));
let match = (await element.getText()).endsWith(status)
expect(match).to.be.true
});
Given("je suis connecté(e) en tant que {string}", async function (role) {
await connect(driver, role)
});
Given("je me reconnecte en tant que {string}", async function (role) {
await disconnect(driver)
await connect(driver, role)
});
After(async function(){
await sleep(5000)
});
AfterAll(async function(){

View File

@ -1,5 +1,59 @@
Fonctionnalité: Gestion de contenu éditorial
Contexte:
Sachant que je suis connectée en tant que "Agente"
Scénario: Connexion en tant que contributeur
Sachant que je suis connectée en tant que "Contributeur"
Et que je suis sur la page "Portail Agent - Fiches"
Scénario: Ajout d'une fiche
Lorsque je suis sur la page "Portail Agent"
Sachant que je clique sur "Fiches pratiques"
Et que je clique sur "Ajouter"
Quand je saisis "Comment inscrire son enfant à la restauration scolaire" dans le champ "Titre"
Et que je sélectionne "Contributeur" dans le champ "Contributeur"
Et que je saisis "Pour inscrire son enfant" dans le champ "Contenu"
Et que je sélectionne "Famille" dans le champ "Catégorie(s)"
Et que je saisis "lien vers la FAQ" dans le champ "Type du lien 1"
# préremplissage
Et que je saisis "https://fiche.example/faq" dans le champ "URL"
Et que je sélectionne "Quels sont les délais ?" dans le champ "Question 1"
Et que je saisis "Les délais sont de 2 semaines en moyenne." dans le champ "Réponse 1"
# Si j'envoie le fichier "banner.png" dans le champ ""
# Libellé du fichier
Et que je clique sur "Valider"
Alors je dois être redirigé vers la page de la fiche
Et la page doit afficher "Pour inscrire son enfant"
Et la fiche doit être dans le statut "Brouillon"
Scénario: Modification de fiche
Quand je clique sur "Modifier la fiche"
Quand je saisis "Pour inscrire son enfant, il faut nous appeler." dans le champ "Contenu"
Et que je clique sur "Enregistrer les changements"
Alors je dois être redirigé vers la page de la fiche
Et la fiche doit être dans le statut "Brouillon"
Et la page doit afficher "Pour inscrire son enfant, il faut nous appeler."
Scénario: Demande de relecture
Quand je clique sur "Demander la relecture"
Alors je dois être redirigé vers la page de la fiche
Et la page doit afficher "En attente de relecture"
Scénario: Connexion en tant qu'éditeur
Sachant que je me reconnecte en tant que "Editeur"
Et que je suis sur la page "Portail Agent - Fiches"
Scénario: Publication
Lorsque je clique sur "Fiches pratiques"
Et que je clique sur la ligne 1 du tableau de listing
Alors la page doit afficher "En attente de relecture"
Lorsque je clique sur "Publié"
Alors je dois être redirigé vers la page de la fiche
Et la page doit afficher "Publié"
Scénario: Recherche et affichage
Sachant que je visite la page "/accueil-avec-recherche-fiche-pour-test" sur "Portail Usager"
Et que je saisis "Inscrire" dans le champ "q"
Et que j'attends 2 secondes
Alors la page doit afficher "Comment inscrire son enfant à la restauration scolaire"
Lorsque je clique sur "Comment inscrire son enfant à la restauration scolaire"
Et que j'attends 2 secondes
Alors la page doit afficher "Lien vers la FAQ"
Et la page doit afficher "Quels sont les délais ?"