WIP - worflow éditorial avec Anaïs

This commit is contained in:
Agate 2022-11-22 09:58:57 +01:00
parent 8219098f67
commit 6d8d5dcb7a
3 changed files with 121 additions and 9 deletions

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,64 @@ async function getCurrentUser(driver) {
return username
}
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);
});
Given("je visite 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));
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 () {
When('je valide (le formulaire)', async function () {
let currentField = await driver.switchTo().activeElement();
await currentField.sendKeys(Key.RETURN)
});
@ -73,6 +122,10 @@ 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)
});
Then('je ne dois pas être connecté(e)', async function () {
await driver.findElement(By.className('login-link'));
@ -82,6 +135,18 @@ Then('la page doit afficher {string}', async function (text) {
let element = await driver.findElement(By.xpath(`//*[contains(text(), "${text}")]`));
});
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) {
let homeUrl = getUrlFromPage('Portail Agent')
let username = process.env[`PUBLIK_${role}_USERNAME`] || role
@ -92,6 +157,10 @@ Given("je suis connectée en tant que {string}", async function (role) {
expect(await getCurrentUser(driver)).to.not.be.empty
});
After(async function(){
await sleep(2000)
});
AfterAll(async function(){
await driver.quit();
});

View File

@ -1,5 +1,48 @@
Fonctionnalité: Gestion de contenu éditorial
Contexte:
Sachant que je suis connectée en tant que "Agente"
Sachant que je suis connectée en tant que "Contributeur"
Scénario: Ajout d'une fiche
Lorsque je suis sur la page "Portail Agent"
Sachant que je suis sur la page "Portail Agent - Fiches"
Et 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"
Quand je sélectionne "Contributeur" dans le champ "Contributeur"
Quand je saisis "Pour inscrire son enfant" dans le champ "Contenu"
Quand je sélectionne "Famille" dans le champ "Catégorie(s)"
Quand je saisis "lien vers la FAQ" dans le champ "Type du lien 1"
# préremplissage
Quand je saisis "https://fiche.example/faq" dans le champ "URL"
Quand je sélectionne "Quels sont les délais ?" dans le champ "Question 1"
Quand 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
Alors la fiche doit être dans le statut "Brouillon"
# Scénario: Modification de fiche
# Sachant que je suis connectée en tant que "Contributeur"
# Je visite la fiche
# Je peux cliquer sur "Modifier la fiche"
# Je peux changer le contenu
# Je valide "enregistrer les changements"
# La demande est toujours en statut "Brouillon"
# Je peux demander la relecture
# Scénario: Demande de relecture
# Je demande la relecture
# Scénario: Publication
# Sachant que je suis connectée en tant que "Éditeur"
# Je visite la fiche
# Elle est en statut en attente de relecture
# Je peux cliquer sur publier la fiche pratique
# La fiche est dans le statut Publié
# Scénario: Affichage
# Je visite la page "Portail Agent" /accueil-avec-recherche-fiche-pour-test sur
# Je recherche "Inscription"
# Le lien "Comment inscrire son enfant" apparait
# Je clique dessus
# Je vois le contenu de la fiche