Add coverage tests, extract breadcrumb constants, add thead to detail table, ignore css:S4662

- Add test for sitemap orgas with logo image coverage
- Add test for organizer settings with logo file upload
- Extract BREADCRUMB_HOME/BREADCRUMB_ACCOUNT constants in AccountController
- Extract BREADCRUMB_HOME/BREADCRUMB_ORGANIZERS constants in HomeController
- Extract BREADCRUMB_HOME/BREADCRUMB_REGISTER constants in RegistrationController
- Add thead with th headers to organizer detail info table
- Ignore SonarQube css:S4662 rule for assets (Tailwind @source directive)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-03-20 11:00:08 +01:00
parent c273fd1df4
commit c2169eb5e8
7 changed files with 87 additions and 15 deletions

View File

@@ -13,3 +13,6 @@ sonar.eslint.reportPaths=eslint-report.json
sonar.docker.hadolint.reportPaths=hadolint-dev.json,hadolint-prod.json
sonar.dependencyCheck.jsonReportPath=dependency-check-report.json
sonar.dependencyCheck.htmlReportPath=dependency-check-report.html
sonar.issue.ignore.multicriteria=e1
sonar.issue.ignore.multicriteria.e1.ruleKey=css:S4662
sonar.issue.ignore.multicriteria.e1.resourceKey=assets/**

View File

@@ -18,6 +18,8 @@ use Symfony\Component\Security\Http\Attribute\IsGranted;
#[IsGranted('ROLE_USER')]
class AccountController extends AbstractController
{
private const BREADCRUMB_HOME = ['name' => 'Accueil', 'url' => '/'];
private const BREADCRUMB_ACCOUNT = ['name' => 'Mon compte', 'url' => '/mon-compte'];
#[Route('/mon-compte', name: 'app_account')]
public function index(Request $request, StripeService $stripeService, EntityManagerInterface $em): Response
{
@@ -57,8 +59,8 @@ class AccountController extends AbstractController
'payouts' => $payouts,
'subAccounts' => $subAccounts,
'breadcrumbs' => [
['name' => 'Accueil', 'url' => '/'],
['name' => 'Mon compte', 'url' => '/mon-compte'],
self::BREADCRUMB_HOME,
self::BREADCRUMB_ACCOUNT,
],
]);
}
@@ -230,9 +232,9 @@ class AccountController extends AbstractController
return $this->render('account/edit_subaccount.html.twig', [
'subAccount' => $subAccount,
'breadcrumbs' => [
['name' => 'Accueil', 'url' => '/'],
['name' => 'Mon compte', 'url' => '/mon-compte'],
['name' => 'Sous-compte', 'url' => '/mon-compte/sous-compte/'.$subAccount->getId()],
self::BREADCRUMB_HOME,
self::BREADCRUMB_ACCOUNT,
['name' => 'Sous-compte', 'url' => self::BREADCRUMB_ACCOUNT['url'].'/sous-compte/'.$subAccount->getId()],
],
]);
}

View File

@@ -10,6 +10,9 @@ use Symfony\Component\Routing\Attribute\Route;
class HomeController extends AbstractController
{
private const BREADCRUMB_HOME = ['name' => 'Accueil', 'url' => '/'];
private const BREADCRUMB_ORGANIZERS = ['name' => 'Organisateurs', 'url' => '/organisateurs'];
#[Route('/', name: 'app_home')]
public function index(EntityManagerInterface $em): Response
{
@@ -18,7 +21,7 @@ class HomeController extends AbstractController
return $this->render('home/index.html.twig', [
'breadcrumbs' => [
['name' => 'Accueil', 'url' => '/'],
self::BREADCRUMB_HOME,
],
'stats' => [
'events' => 0,
@@ -37,8 +40,8 @@ class HomeController extends AbstractController
return $this->render('home/organizers.html.twig', [
'organizers' => $organizers,
'breadcrumbs' => [
['name' => 'Accueil', 'url' => '/'],
['name' => 'Organisateurs', 'url' => '/organisateurs'],
self::BREADCRUMB_HOME,
self::BREADCRUMB_ORGANIZERS,
],
]);
}
@@ -62,8 +65,8 @@ class HomeController extends AbstractController
return $this->render('home/organizer_detail.html.twig', [
'organizer' => $organizer,
'breadcrumbs' => [
['name' => 'Accueil', 'url' => '/'],
['name' => 'Organisateurs', 'url' => '/organisateurs'],
self::BREADCRUMB_HOME,
self::BREADCRUMB_ORGANIZERS,
['name' => $organizer->getCompanyName() ?? $organizer->getFirstName().' '.$organizer->getLastName(), 'url' => '/organisateur/'.$organizer->getId().'-'.$organizer->getSlug()],
],
]);
@@ -74,7 +77,7 @@ class HomeController extends AbstractController
{
return $this->render('home/tarifs.html.twig', [
'breadcrumbs' => [
['name' => 'Accueil', 'url' => '/'],
self::BREADCRUMB_HOME,
['name' => 'Tarifs', 'url' => '/tarifs'],
],
]);

View File

@@ -16,6 +16,8 @@ use Symfony\Component\Validator\Validator\ValidatorInterface;
class RegistrationController extends AbstractController
{
private const BREADCRUMB_HOME = ['name' => 'Accueil', 'url' => '/'];
private const BREADCRUMB_REGISTER = ['name' => 'Inscription', 'url' => '/inscription'];
#[Route('/inscription', name: 'app_register', methods: ['GET', 'POST'])]
public function register(
Request $request,
@@ -75,8 +77,8 @@ class RegistrationController extends AbstractController
return $this->render('security/register_success.html.twig', [
'isOrganizer' => 'organizer' === $type,
'breadcrumbs' => [
['name' => 'Accueil', 'url' => '/'],
['name' => 'Inscription', 'url' => '/inscription'],
self::BREADCRUMB_HOME,
self::BREADCRUMB_REGISTER,
['name' => 'Compte cree', 'url' => '/inscription'],
],
]);
@@ -89,8 +91,8 @@ class RegistrationController extends AbstractController
return $this->render('security/register.html.twig', [
'breadcrumbs' => [
['name' => 'Accueil', 'url' => '/'],
['name' => 'Inscription', 'url' => '/inscription'],
self::BREADCRUMB_HOME,
self::BREADCRUMB_REGISTER,
],
]);
}

View File

@@ -87,6 +87,12 @@
</div>
<div class="p-6">
<table style="width:100%;border-collapse:collapse;">
<thead>
<tr>
<th class="text-left text-xs font-black uppercase tracking-widest text-gray-400" style="padding:0.75rem 1rem;">Detail</th>
<th class="text-left text-xs font-black uppercase tracking-widest text-gray-400" style="padding:0.75rem 1rem;">Valeur</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom:1px solid #e5e7eb;">
<td style="padding:0.75rem 1rem;" class="font-black text-xs uppercase tracking-widest text-gray-400">Raison sociale</td>

View File

@@ -440,6 +440,33 @@ class AccountControllerTest extends WebTestCase
self::assertNull($em->getRepository(User::class)->find($subId));
}
public function testOrganizerSettingsWithLogoUpload(): void
{
$client = static::createClient();
$em = static::getContainer()->get(EntityManagerInterface::class);
$user = $this->createUser(['ROLE_ORGANIZER'], true);
$client->loginUser($user);
$logoFile = new \Symfony\Component\HttpFoundation\File\UploadedFile(
__DIR__.'/../../public/logo.png',
'logo.png',
'image/png',
null,
true,
);
$client->request('POST', '/mon-compte/parametres', [
'email' => $user->getEmail(),
'phone' => '0699887766',
], ['logo' => $logoFile]);
self::assertResponseRedirects('/mon-compte?tab=settings');
$em->refresh($user);
self::assertNotNull($user->getLogoName());
}
/**
* @param list<string> $roles
*/

View File

@@ -2,6 +2,8 @@
namespace App\Tests\Controller;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class SitemapControllerTest extends WebTestCase
@@ -42,4 +44,31 @@ class SitemapControllerTest extends WebTestCase
self::assertResponseIsSuccessful();
self::assertStringContainsString('text/xml', $client->getResponse()->headers->get('Content-Type'));
}
public function testSitemapOrgasIncludesLogoImage(): void
{
$client = static::createClient();
$em = static::getContainer()->get(EntityManagerInterface::class);
$organizer = new User();
$organizer->setEmail('test-sitemap-logo-'.uniqid().'@example.com');
$organizer->setFirstName('Logo');
$organizer->setLastName('Test');
$organizer->setPassword('hashed');
$organizer->setRoles(['ROLE_ORGANIZER']);
$organizer->setIsApproved(true);
$organizer->setIsVerified(true);
$organizer->setCompanyName('Asso Logo');
$organizer->setLogoName('test-logo.png');
$em->persist($organizer);
$em->flush();
$client->request('GET', '/sitemap-orgas-1.xml');
self::assertResponseIsSuccessful();
$content = $client->getResponse()->getContent();
self::assertStringContainsString('image:image', $content);
self::assertStringContainsString('test-logo.png', $content);
self::assertStringContainsString('Asso Logo', $content);
}
}