Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(test): test a11y sur toutes les pages n'ayant pas de problemes d'a11y #1654

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/docs/architecture/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -142,4 +142,4 @@ Les fichiers sont découpés selon leur destination et suffixés en conséquence
* `*.util.ts` : fonctions utilitaires nécessaires dans le module courant.
* `*.repository.ts` : dans un domaine, interface d'un repository. Côté infra, implémentation de l'interface.
* `*.mapper`
* `*.<interface>.service.ts` : Implémentation de l'interface `<interface>`. Ex : `tarteAuCitron.cookies.service.ts` est une implémentation de l'interface dans `cookies.service.ts`.
* `*.<interface>.service.ts` : Implémentation de l'interface `<interface>`. Ex : `tarteAuCitron.cookies.service.ts` est une implémentation de l'interface dans `cookies.service.ts`.
133 changes: 133 additions & 0 deletions src/pages/accessibilite/index.page.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
/**
* @jest-environment jsdom
*/

import '~/test-utils';

import { render } from '@testing-library/react';

import { DependenciesProvider } from '~/client/context/dependenciesContainer.context';
import { anAnalyticsService } from '~/client/services/analytics/analytics.service.fixture';
import Accessibilite from '~/pages/accessibilite/index.page';

describe('<Accessibilite />', () => {
it('n‘a pas de défaut d‘accessibilité', async () => {
const titre = 'Accessibilité';
const contenu = `# Déclaration d'accessibilité
06/10/2022

1 jeune 1 solution s’engage à rendre ses sites internet accessibles conformément à l’article 47 de la loi n°2005-102 du 11 février 2005.
Cette déclaration d'accessibilité s'applique à [1 jeune 1 solution](www.1jeune1solution.gouv.fr).

## État de conformité
Le site [1 jeune 1 solution](www.1jeune1solution.gouv.fr) est en conformité partielle avec le référentiel général d’amélioration de l’accessibilité (RGAA), version 4.1 en raison des non-conformités et des dérogations énumérées ci-dessous.

### Résultats des tests
L’audit de conformité réalisé par Urbilog révèle que **61 %** des critères du RGAA version 4.1 sont respectés.
Le taux moyen de conformité du site s’élève à **75 %**.

Vous pouvez consulter le rapport d'audit détaillé au format PDF.

On compte 54 critères applicables sur 106 parmi lesquels :
- 33 critères conformes
- 21 critères non-conformes

### Contenus non-accessibles
Les contenus listés ci-dessous ne sont pas accessibles pour les raisons suivantes :

#### Non conformité

- Présence d’alternatives non vide sur des images décoratives.
- Des alternatives textuelles non pertinente sur des image informatives.
- Un titre de cadre non pertinent.
- Des liens non pertinents
- Des éléments non compatibles avec les technologies d’assistance
- Des éléments non compatibles avec la navigation au clavier
- Des changements de contexte non renseignés
- Des messages de statut qui ne sont pas restitués.

8. éléments obligatoires
Un titre de la page n’est pas présent.
Des éléments HTML utilisés à des fins de présentation.

9. structuration de l'information
Plan de titrage absent ou ne respectant pas la hiérarchie des titres.
Structure du document non cohérente.
Énumération à coder comme une liste.

10. présentation de l'information
Lien non visible par rapport au texte environnant.
Prise de focus non perceptible.
Prise de focus pas assez perceptible.

11. formulaires
Champ de saisie sans étiquette.
Intitulé incomplet sur les boutons.

12. navigation
Absence de deux systèmes de navigation.
Lien d'accès rapide non fonctionnel
Ordre de tabulation non cohérent

13. consultation

### Dérogation pour charge disproportionnée
●\tRAS

### Contenus non-soumis à l'obligation d'accessibilité
●\tSolution externe de gestion des offres emploi, de stage et d’alternance

### Établissement de cette déclaration d'accessibilité
Cette déclaration d'accessibilité a été établie le 06.10.2022
Technologies utilisées pour la réalisation du site du ministère des Solidarités et de la Santé - [1 jeune 1 solution](www.1jeune1solution.gouv.fr)
●\tHTML 5
●\tCSS
●\tJavascript

### Environnement de test
Les vérifications de restitution de contenus ont été réalisées sur la base de la combinaison fournie par la base de référence du RGAA 4.1, avec les versions suivantes :
●\tNVDA 2019.2.1 et Firefox
●\tJAWS 2018 et Internet Edge
●\tVoiceOver Mac OS 10.14 et Safari : 13.0.3

### Outils pour évaluer l'accessibilité
●\tContrast Color Analyser
●\tAssistant RGAA V4.1
●\tWeb Developer toolbar
●\tInspecteur du navigateur

### Pages du site ayant fait l'objet de la vérification de conformité

Accueil : https://www.1jeune1solution.gouv.fr ;
Mentions légales : https://www.1jeune1solution.gouv.fr/mentions-legales ;
Accessibilité : https://www.1jeune1solution.gouv.fr/accessibilite ;
Emplois : https://www.1jeune1solution.gouv.fr/emplois ;
Offre (redirection vers le détail de l’offre au clic sur une offre) ;
Formation : https://www.1jeune1solution.gouv.fr/formations ;
Contrat d’engagement jeune : https://www.1jeune1solution.gouv.fr/contrat-engagement-jeune ;
Les entreprises s'engagent : https://www.1jeune1solution.gouv.fr/les-entreprises-s-engagent ;
Mes aides : https://www.1jeune1solution.gouv.fr/mes-aides ;
Les mesures jeunes : https://www.1jeune1solution.gouv.fr/espace-jeune ;
Article : (redirection vers les différents articles au clic sur « En savoir plus ») ;
Stage : https://www.1jeune1solution.gouv.fr/stages ;
Alternance : https://www.1jeune1solution.gouv.fr/apprentissage.

### Retour d'information et contact
Si vous n’arrivez pas à accéder à un contenu ou à un service, vous pouvez contacter 1 jeunes 1 pour être orienté vers une alternative accessible ou obtenir le contenu sous une autre forme.
Envoyez un message à [email protected].

### Voies de recours
Cette procédure est à utiliser dans le cas suivant. Vous avez signalé au responsable du site internet un défaut d’accessibilité qui vous empêche d’accéder à un contenu ou à un des services du portail et vous n’avez pas obtenu de réponse satisfaisante.

- Écrire un message au Défenseur des droits - [https://formulaire.defenseurdesdroits.fr/]
- Contacter le délégué du Défenseur des droits dans votre région - [https://www.defenseurdesdroits.fr/saisir/delegues]
- Envoyer un courrier par la poste (gratuit, ne pas mettre de timbre) : Défenseur des droits Libre réponse 71120 75342 Paris`;

const { container } = render(
<DependenciesProvider analyticsService={anAnalyticsService()}>
<Accessibilite titre={titre} contenu={contenu}/>);
</DependenciesProvider>);

expect(container).toBeAccessible();
});
});
31 changes: 30 additions & 1 deletion src/pages/apprentissage-entreprises/index.page.test.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
/**
* @jest-environment jsdom
*/

import '~/test-utils';

import { render,screen } from '@testing-library/react';
import * as process from 'process';

import { mockUseRouter } from '~/client/components/useRouter.mock';
import { mockSmallScreen } from '~/client/components/window.mock';
import { DependenciesProvider } from '~/client/context/dependenciesContainer.context';
import { anAnalyticsService } from '~/client/services/analytics/analytics.service.fixture';
import { aVideoService } from '~/client/services/video/video.service.fixture';
import { aVideoCampagneApprentissageList } from '~/server/cms/domain/videoCampagneApprentissage.fixture';
import { createFailure, createSuccess } from '~/server/errors/either';
import { ErreurMétier } from '~/server/errors/erreurMétier.types';
import { dependencies } from '~/server/start';

import { getServerSideProps } from './index.page';
import ApprentissageEntreprises, { getServerSideProps } from './index.page';

jest.mock('~/server/start', () => ({
dependencies: {
Expand All @@ -18,6 +30,23 @@ jest.mock('~/server/start', () => ({
}));

describe('<ApprentissageEntreprises />', () => {
it('n‘a pas de défaut d‘accessibilité', async () => {
mockSmallScreen();
mockUseRouter({ query: { page: '1' } });
const videos = aVideoCampagneApprentissageList();

const { container } = render(
<DependenciesProvider
analyticsService={anAnalyticsService()}
youtubeService={aVideoService()}
>
<ApprentissageEntreprises videos={videos} />);
</DependenciesProvider>);

await screen.findByText('5 bonnes raisons de choisir l’apprentissage :');

expect(container).toBeAccessible();
});

describe('getServerSideProps', () => {

Expand Down
5 changes: 3 additions & 2 deletions src/pages/apprentissage/[id].page.test.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
/**
* @jest-environment jsdom
*/
import '~/test-utils';

import { render, screen } from '@testing-library/react';
import React from 'react';

Expand All @@ -10,7 +12,6 @@ import { DependenciesProvider } from '~/client/context/dependenciesContainer.con
import { anAnalyticsService } from '~/client/services/analytics/analytics.service.fixture';
import AnnonceAlternancePage, { AlternanceSerialized } from '~/pages/apprentissage/[id].page';
import { Alternance } from '~/server/alternances/domain/alternance';
import { checkA11y } from '~/test-utils';

const alternanceSerialized: AlternanceSerialized = {
compétences: ['savoir faire'],
Expand Down Expand Up @@ -45,7 +46,7 @@ describe('<AnnonceAlternancePage />', () => {
<AnnonceAlternancePage alternanceSerialized={alternanceSerialized} />
</DependenciesProvider>);

await checkA11y(container); //TODO FIX + verifier CSS
expect(container).toBeAccessible();
});

it('ajoute le nom de l’annonce au titre du document', async () => {
Expand Down
5 changes: 3 additions & 2 deletions src/pages/apprentissage/deposer-offre/index.page.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@
* @jest-environment jsdom
*/

import '~/test-utils';

import { render, screen } from '@testing-library/react';

import { DependenciesProvider } from '~/client/context/dependenciesContainer.context';
import { anAnalyticsService } from '~/client/services/analytics/analytics.service.fixture';
import DeposerOffrePage from '~/pages/apprentissage/deposer-offre/index.page';
import { checkA11y } from '~/test-utils';


describe('deposer-offre', () => {
Expand All @@ -21,7 +22,7 @@ describe('deposer-offre', () => {
</DependenciesProvider>,
);

await checkA11y(container);
expect(container).toBeAccessible();
});
it('contient un titre', () => {
const analyticsService = anAnalyticsService();
Expand Down
5 changes: 3 additions & 2 deletions src/pages/apprentissage/entreprise/[id].page.test.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
/**
* @jest-environment jsdom
*/
import '~/test-utils';

import { render, screen } from '@testing-library/react';
import React from 'react';
import ReactDOM from 'react-dom';
Expand All @@ -9,7 +11,6 @@ import { mockUseRouter } from '~/client/components/useRouter.mock';
import { DependenciesProvider } from '~/client/context/dependenciesContainer.context';
import { anAnalyticsService } from '~/client/services/analytics/analytics.service.fixture';
import AnnonceAlternanceEntreprisePage from '~/pages/apprentissage/entreprise/[id].page';
import { checkA11y } from '~/test-utils';

const siret = '123';

Expand All @@ -32,7 +33,7 @@ describe('<AnnonceAlternanceEntreprisePage />', () => {
</DependenciesProvider>,
);

await checkA11y(container);
expect(container).toBeAccessible();
});

it('le titre du document est correct', async () => {
Expand Down
8 changes: 6 additions & 2 deletions src/pages/apprentissage/index.page.test.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
/**
* @jest-environment jsdom
*/
import '~/test-utils';

import { render, screen } from '@testing-library/react';

import { mockUseRouter } from '~/client/components/useRouter.mock';
Expand All @@ -11,7 +13,6 @@ import { anAnalyticsService } from '~/client/services/analytics/analytics.servic
import { aLocalisationService } from '~/client/services/localisation/localisationService.fixture';
import { aMétierService } from '~/client/services/métiers/métier.fixture';
import RechercherAlternancePage from '~/pages/apprentissage/index.page';
import { checkA11y } from '~/test-utils';

describe('Page rechercher une alternance', () => {
beforeEach(() => {
Expand Down Expand Up @@ -70,7 +71,10 @@ describe('Page rechercher une alternance', () => {
<RechercherAlternancePage/>
</DependenciesProvider>,
);
await checkA11y(container);

await screen.findByRole('heading', { level: 1 });

expect(container).toBeAccessible();
});

it('affiche le titre propre à la bonne alternance', async () => {
Expand Down
5 changes: 3 additions & 2 deletions src/pages/apprentissage/simulation/index.page.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
* @jest-environment jsdom
*/

import '~/test-utils';

import { render, screen } from '@testing-library/react';

import { mockUseRouter } from '~/client/components/useRouter.mock';
import { mockSmallScreen } from '~/client/components/window.mock';
import { checkA11y } from '~/test-utils';

import SimulateurOffreAlternant from './index.page';

Expand All @@ -19,7 +20,7 @@ describe('Apprentissage / Simulateur de rémunération en apprentissage', () =>
it('n‘a pas de défaut d‘accessibilité', async () => {
const { container } = render(<SimulateurOffreAlternant />);

await checkA11y(container);
expect(container).toBeAccessible();
});

it('affiche un sous-titre de page', () => {
Expand Down
42 changes: 42 additions & 0 deletions src/pages/articles/[id].page.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/**
* @jest-environment jsdom
*/

import '~/test-utils';

import { render } from '@testing-library/react';

import { mockUseRouter } from '~/client/components/useRouter.mock';
import { mockSmallScreen } from '~/client/components/window.mock';
import { DependenciesProvider } from '~/client/context/dependenciesContainer.context';
import { anAnalyticsService } from '~/client/services/analytics/analytics.service.fixture';
import ConsulterArticlePage from '~/pages/articles/[id].page';

describe('<ConsulterArticlePage />', () => {
it('n‘a pas de défaut d‘accessibilité', async () => {
const article = {
bannière: {
alt: 'alt',
src: 'url',
},
contenu: 'Retrouvez ici une liste d\'interviews qui pourraient vous intéresser ! \n' +
'\n' +
'Interview Engie : [https://recette.1jeune1solution.gouv.fr/articles/interview-engie-par-canaljob](https://recette.1jeune1solution.gouv.fr/articles/interview-engie-par-canaljob)\n' +
'\n' +
'Interview test : [https://recette.1jeune1solution.gouv.fr/articles/test-canal-job](https://recette.1jeune1solution.gouv.fr/articles/test-canal-job)',
slug: 'plein-d-interviews-pour-presenter-des-entreprises',
titre: 'Plein d\'interviews pour présenter des entreprises',
};
mockUseRouter({});
mockSmallScreen();

const { container } = render(
<DependenciesProvider
analyticsService={anAnalyticsService()}
>
<ConsulterArticlePage article={article} />);
</DependenciesProvider>);

expect(container).toBeAccessible();
});
});
Loading