La fiche empilait tout sur une page, en lecture seule. Le dossier personnel existait pourtant en base — date et lieu de naissance, nationalité, adresse, contact d'urgence, NIR et IBAN chiffrés — sans qu'aucun écran ne l'écrive : un salarié créé restait un dossier vide que rien ne permettait de remplir. Cinq onglets, cinq routes : une fiche s'envoie par lien et se rouvre au même endroit. Le bandeau porte ce qui ne change pas d'un onglet à l'autre, et le gabarit le tient une fois pour toutes. Deux points d'écriture et non un seul. L'état civil et les coordonnées demandent `members.edit` ; le NIR, l'IBAN et le BIC exigent en plus de pouvoir les lire. Fondus dans un même formulaire, un profil habilité à modifier mais pas à lire aurait renvoyé des champs vides — et effacé ce qui ne lui avait jamais été montré. Le journal retient qu'ils ont été renseignés, jamais leur valeur. Les parcours qui déposaient une pièce ou ouvraient un accès passent désormais par l'onglet qui les porte. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
91 lines
3.5 KiB
TypeScript
91 lines
3.5 KiB
TypeScript
import { expect, test, type Page } from '@playwright/test';
|
|
|
|
/**
|
|
* Fiche salarié — onglets et saisie du dossier.
|
|
*
|
|
* Le dossier personnel est la première chose qu'on remplit après une embauche,
|
|
* et la dernière qu'on relit avant une déclaration. Ce parcours éprouve donc ce
|
|
* que voit un gestionnaire : les onglets tiennent leur route, et ce qui est
|
|
* saisi est encore là au rechargement.
|
|
*/
|
|
|
|
async function createEmployee(page: Page) {
|
|
const suffix = `${Date.now()}-fiche`;
|
|
const lastName = `Fiche${suffix}`;
|
|
|
|
await page.goto('/equipe');
|
|
const form = page.locator('form').filter({ hasText: 'Ajouter' });
|
|
await form.getByLabel('Prénom').fill('Awa');
|
|
await form.getByLabel('Nom', { exact: true }).fill(lastName);
|
|
await form.getByLabel('Matricule').fill(`FIC${suffix}`);
|
|
await form.getByRole('button', { name: 'Ajouter' }).click();
|
|
await expect(page.getByText('Salarié ajouté.')).toBeVisible();
|
|
|
|
await page.getByRole('link', { name: new RegExp(lastName) }).click();
|
|
await expect(
|
|
page.getByRole('heading', { name: new RegExp(lastName) }),
|
|
).toBeVisible();
|
|
|
|
return { lastName, url: page.url() };
|
|
}
|
|
|
|
test('les onglets de la fiche sont des routes', async ({ page }) => {
|
|
const employee = await createEmployee(page);
|
|
|
|
// Le bandeau ne bouge pas d'un onglet à l'autre : c'est ce qui dit de qui on
|
|
// parle pendant qu'on navigue.
|
|
for (const [label, segment] of [
|
|
['Contrats', '/contrats'],
|
|
['Planification et accès', '/planification'],
|
|
['Congés et Absences', '/absences'],
|
|
['Documents', '/documents'],
|
|
] as const) {
|
|
await page.getByRole('link', { name: label, exact: true }).click();
|
|
await expect(page).toHaveURL(new RegExp(`${segment}$`));
|
|
await expect(
|
|
page.getByRole('heading', { name: new RegExp(employee.lastName) }),
|
|
).toBeVisible();
|
|
}
|
|
|
|
// Rouvrir l'onglet directement par son adresse doit donner le même écran :
|
|
// une fiche s'envoie par lien.
|
|
await page.goto(`${employee.url}/contrats`);
|
|
await expect(page.getByText('Tous les contrats et avenants')).toBeVisible();
|
|
});
|
|
|
|
test('le dossier personnel se saisit et se conserve', async ({ page }) => {
|
|
const employee = await createEmployee(page);
|
|
|
|
await expect(page.getByText('Non renseigné').first()).toBeVisible();
|
|
await page
|
|
.getByRole('button', { name: 'Modifier les informations personnelles' })
|
|
.click();
|
|
|
|
await page.getByLabel('Date de naissance').fill('1988-03-12');
|
|
await page.getByLabel('Lieu de naissance').fill('Nancy');
|
|
await page.getByLabel('Nationalité').fill('France');
|
|
await page.getByLabel('Téléphone mobile').fill('+33 6 12 34 56 78');
|
|
await page.getByLabel('Ville').fill('Frouard');
|
|
await page.getByRole('button', { name: 'Enregistrer les modifications' }).click();
|
|
|
|
await expect(page.getByText('Nancy')).toBeVisible();
|
|
|
|
// Le rechargement est la seule preuve qui vaille : un écran qui affiche ce
|
|
// qu'on vient de taper ne dit rien de ce qui a été écrit.
|
|
await page.goto(employee.url);
|
|
await expect(page.getByText('Nancy')).toBeVisible();
|
|
await expect(page.getByText('Frouard')).toBeVisible();
|
|
});
|
|
|
|
test('une date de naissance à venir est refusée', async ({ page }) => {
|
|
await createEmployee(page);
|
|
|
|
await page
|
|
.getByRole('button', { name: 'Modifier les informations personnelles' })
|
|
.click();
|
|
await page.getByLabel('Date de naissance').fill('2999-01-01');
|
|
await page.getByRole('button', { name: 'Enregistrer les modifications' }).click();
|
|
|
|
await expect(page.getByText('Date de naissance invalide.')).toBeVisible();
|
|
});
|