| name | sonar-compliance-testing |
| description | Règles de conformité SonarQube pour le code et les tests TypeScript/React (assertions, complexité, ternaires) — à affecter aux phases de tests frontend |
🛡️ Bonnes pratiques Sonar pour éviter les issues
1. Tests - Règles obligatoires
it('should do something', () => {
render(<Component />);
});
it('should do something', () => {
render(<Component />);
expect(screen.getByText('Expected')).toBeInTheDocument();
});
2. Ternaires imbriquées (S3358)
const result = a ? (b ? 'x' : 'y') : 'z';
const getResult = () => {
if (!a) return 'z';
return b ? 'x' : 'y';
};
3. Complexité cognitive (S3776)
function complexFunction() {
if (a) {
if (b) {
if (c) {
}
}
}
}
function complexFunction() {
if (!a) return handleNotA();
if (!b) return handleNotB();
return handleC(c);
}
4. Optional chaining (S6582)
const value = obj && obj.prop && obj.prop.value;
const value = obj?.prop?.value;
5. Promise dans contexte void (S6544)
<button onClick={async () => await fetchData()}>
<button onClick={() => { void fetchData(); }}>
// ou
<button onClick={() => { fetchData().catch(console.error); }}>
6. Index comme clé React (S6479)
{items.map((item, index) => <Item key={index} />)}
{items.map(item => <Item key={item.id} />)}
{items.map(item => <Item key={`${item.name}-${item.type}`} />)}
7. Props en lecture seule (S6759)
interface Props {
value: string;
}
interface Props {
readonly value: string;
}
type Props = Readonly<{
value: string;
}>;
8. Fragment redondant (S6749)
return <>{content}</>;
return content;
9. Mémoïsation du Context value (S6481)
<Context.Provider value={{ user, setUser }}>
const value = useMemo(() => ({ user, setUser }), [user, setUser]);
<Context.Provider value={value}>
10. Type alias redondant (S6564)
type UUID = string;
type UUID = string & { readonly __brand: unique symbol };
📋 Checklist de validation avant commit