dede70f70f
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>
96 lines
2.9 KiB
PHP
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');
|
|
}
|
|
}
|