Files
Ressources-relationnel/tests/Feature/SuggestionTest.php
T
sam dede70f70f
CI - Intégration continue / quality-and-tests (push) Successful in 3m56s
CD - Déploiement continu / deploy (push) Successful in 3m6s
feat: formulaire de suggestions créant un ticket Gitea
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>
2026-07-07 20:00:12 +02:00

96 lines
2.9 KiB
PHP

<?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');
}
}