@edugouvfr/ngx-dsfr
Version:
NgxDsfr est un portage Angular des éléments d'interface du Système de Design de l'État Français (DSFR).
130 lines (125 loc) • 5.77 kB
JavaScript
import { expect } from '@playwright/test';
class BasePageObjectModel {
constructor(page, componentName, componentType) {
this.page = page;
this.sbFrame = this.frame;
this.componentName = componentName;
this.componentType = componentType;
}
get frame() {
return this.page.frameLocator('#storybook-preview-iframe');
}
async goToPage(variant = 'default', waitUntil = 'commit') {
return this.page.goto(`?path=/story/${this.componentType}-${this.componentName}--${variant}`, {
waitUntil,
});
}
/**
* Permet de passer en mode plein écran afin d'éviter que le menu ne nuise à la pertinence des tests.
*/
async goToFullScreen() {
await this.page.getByLabel('Go full screen').click();
}
/**
* Test par comparaison de screenshot. Permet de prévenir les régressions visuelles sur un composant.
*
* @param screenshotName Nom du screenshot (souvent le nom du composant)
* @param options Options possibles de la méthode toHaveScreenshot
*/
async testSnapshot(screenshotName, options) {
await expect(this.frame.locator('.sb-show-main')).toBeVisible();
await expect(this.page).toHaveScreenshot(screenshotName + '.png', options);
}
/**
* Permet de vérifier le bon chargement d'un svg via la reponse de sa requête http.
*
* @param name Nom du svg (sans l'extension '.svg'). Vérifie le chargement de n'importe quel svg si non renseigné
* @returns La Requête reçue correspondant au chargement du svg
*/
async waitForSvg(name = '') {
return this.page.waitForResponse((response) => response.url().includes(`${name}.svg`));
}
/**
* Test le bon chargement du svg correspondant après avoir effectué une action spécifique afin d'assurer
* la cohérence graphique d'une page en cas de tests screenshot
*
* @param action Promise correspondant à l'action censé déclencher le chargement du nouveau svg
* @param svgName Nom du svg sensé être chargé (sans l'extension '.svg'). Vérifie le chargement de n'importe quel svg si non renseigné
* @returns Une Promise contenant un tableau avec en index 0 le retour de l'action effectuée et en index 1 la reponse
* de la requête d'appel du svg
*/
async doActionAndCheckSvg(action, svgName = '') {
return Promise.all([action, this.waitForSvg(svgName)]);
}
}
/**
* Permet de charger la story faisant l'objet des tests.
*
* @param componentName Le nom canonique du composant tel qu'il est défini dans les métadonnées
* (en minuscules et espaces remplacés par des tirets du milieu)
*
* @param page La référence à une page Playwright (c'est à dire à un onglet unique du navigateur)
*
* @param variant Le nom canonique de la story (en minuscules et espaces remplacés par des tirets du milieu)
*
* @returns une promesse sur la réponse HTTP reçue par l'onglet du navigateur
*/
async function goToComponentPage(componentName, page, variant = 'default') {
return page.goto(`?path=/story/components-${componentName}--${variant}`);
}
/**
* Permet de charger la story faisant l'objet des tests.
*
* @param componentName Le nom canonique du composant tel qu'il est défini dans les métadonnées
* (en minuscules et espaces remplacés par des tirets du milieu)
*
* @param page La référence à une page Playwright (c'est à dire à un onglet unique du navigateur)
*
* @param variant Le nom canonique de la story (en minuscules et espaces remplacés par des tirets du milieu)
*
* @returns une promesse sur la réponse HTTP reçue par l'onglet du navigateur
*/
async function goToFormsPage(componentName, page, variant = 'default') {
return page.goto(`?path=/story/forms-${componentName}--${variant}`);
}
/**
* Permet de récupérer l'iframe générée par Storybook pour charger la story.
*
* @param page La référence à une page Playwright (c'est à dire à un onglet unique du navigateur)
*
* @returns un locator sur l'iframe dont l'attribut id est égal à "storybook-preview-iframe"
*/
function getSbFrame(page) {
return page.frameLocator('#storybook-preview-iframe');
}
/**
* Actionne la combinaison clavier spécifiée et assure que le focus est positionné sur le bon élément en séquence.
*
* @param tabNavigationSequence Décrit la séquence de navigation attendue.
* @param keyPressContext Fournit le locator pointant vers l'élément qui doit être actionné.
* @param withShift
*/
async function testTabNavigation(tabNavigationSequence, keyPressContext, withShift = false) {
const keyToPress = withShift ? 'Shift+Tab' : 'Tab';
for (let navigationStepIndex in tabNavigationSequence) {
await keyPressContext.press(keyToPress);
await expect(tabNavigationSequence[navigationStepIndex]).toBeFocused();
}
}
/**
* Test par comparaison de screenshot. Permet de prévenir les régressions visuelles sur un composant.
*
* @param page La référence à une page Playwright (c'est à dire à un onglet unique du navigateur)
* @param screenshotName Nom du screenshot (souvent le nom du composant)
*/
async function testSnapshot(page, screenshotName) {
// Permet de passer en mode plein écran afin d'éviter que le menu ne nuise à la pertinence des tests.
await page.press('body', 'Alt+F');
await expect(page).toHaveScreenshot(screenshotName + '.png');
}
/* Public API Surface of @edugouvfr/ngx-dsfr/sdk */
/**
* Generated bundle index. Do not edit.
*/
export { BasePageObjectModel, getSbFrame, goToComponentPage, goToFormsPage, testSnapshot, testTabNavigation };
//# sourceMappingURL=edugouvfr-ngx-dsfr-sdk.mjs.map