feat: formulaire de suggestions créant un ticket Gitea
CI - Intégration continue / quality-and-tests (push) Successful in 3m56s
CD - Déploiement continu / deploy (push) Successful in 3m6s

Les utilisateurs connectés peuvent proposer une modification / un ajout /
une correction via un formulaire. La soumission crée automatiquement une
issue dans le dépôt Gitea via son API (GiteaIssueService), avec le titre
préfixé par le type et l'auteur dans le corps.

- config/services.php + .env.example : GITEA_URL/TOKEN/REPO (token secret)
- SuggestionController (create/store) + validation
- vue suggestions/create + lien dans le header (utilisateurs connectés)
- tests: auth requise, création OK, validation, échec API

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-07 20:00:12 +02:00
parent 54f2c0e9ab
commit dede70f70f
8 changed files with 336 additions and 0 deletions
+95
View File
@@ -0,0 +1,95 @@
<?php
namespace Tests\Feature;
use App\Models\Role;
use App\Models\Utilisateur;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Http;
use Tests\TestCase;
class SuggestionTest extends TestCase
{
use RefreshDatabase;
private function utilisateur(): Utilisateur
{
$role = Role::create(['Nom' => 'Utilisateur']);
return Utilisateur::create([
'Pseudo' => 'JeanTest',
'Email' => 'jean.test@example.com',
'MotDePasse' => Hash::make('motdepasse123'),
'ID_Role' => $role->ID_Role,
'Statut' => 'Actif',
]);
}
private function configurerGitea(): void
{
config([
'services.gitea.url' => 'https://gitea.test',
'services.gitea.token' => 'fake-token',
'services.gitea.repo' => 'Groupe1/Ressources-relationnel',
]);
}
public function test_le_formulaire_de_suggestion_exige_une_authentification(): void
{
$this->get('/suggestions/nouveau')->assertRedirect('/login');
}
public function test_une_suggestion_valide_cree_un_ticket_gitea(): void
{
$this->configurerGitea();
Http::fake([
'*/api/v1/repos/*/issues' => Http::response(['number' => 42], 201),
]);
$response = $this->actingAs($this->utilisateur())->post('/suggestions', [
'type' => 'Correction',
'titre' => 'Faute dans une ressource',
'description' => 'Il y a une faute à corriger sur la page des ressources.',
]);
$response->assertRedirect(route('suggestions.create'));
$response->assertSessionHas('success');
Http::assertSent(function ($request) {
return str_contains($request->url(), '/api/v1/repos/Groupe1/Ressources-relationnel/issues')
&& $request['title'] === '[Correction] Faute dans une ressource'
&& str_contains($request['body'], 'JeanTest');
});
}
public function test_une_suggestion_invalide_est_rejetee(): void
{
Http::fake();
$response = $this->actingAs($this->utilisateur())->post('/suggestions', [
'type' => 'Inconnu',
'titre' => 'x',
'description' => 'court',
]);
$response->assertSessionHasErrors(['type', 'titre', 'description']);
Http::assertNothingSent();
}
public function test_un_echec_gitea_affiche_une_erreur(): void
{
$this->configurerGitea();
Http::fake([
'*/api/v1/repos/*/issues' => Http::response(['message' => 'nope'], 500),
]);
$response = $this->actingAs($this->utilisateur())->post('/suggestions', [
'type' => 'Ajout',
'titre' => 'Nouvelle fonctionnalité utile',
'description' => 'Ce serait bien d\'ajouter un filtre par thème.',
]);
$response->assertSessionHasErrors('gitea');
}
}