api-platformmake-test
Génère des tests fonctionnels API Platform (PHPUnit/ApiTestCase) pour une resource
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Génère des tests fonctionnels API Platform (PHPUnit/ApiTestCase) pour une resource
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | api-platform:make-test |
| description | Génère des tests fonctionnels API Platform (PHPUnit/ApiTestCase) pour une resource |
| argument-hint | <nom-resource> |
| model | sonnet |
| allowed-tools | ["AskUserQuestion","Bash","Read","Write","Edit","Grep","Glob"] |
| version | 1.0.0 |
| license | MIT |
Génère des tests fonctionnels pour une resource API Platform en utilisant ApiTestCase de API Platform et PHPUnit.
tests/Api/{ResourceName}Test.phpIMPORTANT : Exécute ce workflow étape par étape :
$ARGUMENTS est fourni, utiliser comme nom de la resourceQuestion: "Pour quelle resource générer les tests ?"
Header: "Resource"
src/Entity/{ResourceName}.php ou src/ApiResource/{ResourceName}.php)ApiTestCase est disponible (chercher api-platform/core dans composer.json)src/Factory/{ResourceName}Factory.php)composer.json (autoload-dev)composer.json avec Readautoload.psr-4Créer tests/Api/{ResourceName}Test.php :
<?php
declare(strict_types=1);
namespace {namespace}\Tests\Api;
use ApiPlatform\Symfony\Bundle\Test\ApiTestCase;
use {namespace}\Entity\{ResourceName};
use Symfony\Component\HttpFoundation\Response;
final class {ResourceName}Test extends ApiTestCase
{
public function testGetCollection(): void
{
$response = static::createClient()->request('GET', '/api/{resource_names}');
self::assertResponseIsSuccessful();
self::assertResponseHeaderSame('content-type', 'application/ld+json; charset=utf-8');
self::assertJsonContains([
'@context' => '/api/contexts/{ResourceName}',
'@type' => 'Collection',
]);
}
public function testGetItem(): void
{
// Créer un item de test (adapter selon factory/fixtures)
$iri = $this->findIriBy({ResourceName}::class, [/* critères */]);
$response = static::createClient()->request('GET', $iri);
self::assertResponseIsSuccessful();
self::assertJsonContains([
'@type' => '{ResourceName}',
]);
}
public function testCreateItem(): void
{
$response = static::createClient()->request('POST', '/api/{resource_names}', [
'json' => [
// Propriétés requises
],
'headers' => [
'Content-Type' => 'application/ld+json',
],
]);
self::assertResponseStatusCodeSame(Response::HTTP_CREATED);
self::assertJsonContains([
'@type' => '{ResourceName}',
// Vérifier les propriétés retournées
]);
}
public function testCreateItemValidation(): void
{
$response = static::createClient()->request('POST', '/api/{resource_names}', [
'json' => [
// Données invalides
],
'headers' => [
'Content-Type' => 'application/ld+json',
],
]);
self::assertResponseStatusCodeSame(Response::HTTP_UNPROCESSABLE_ENTITY);
}
public function testUpdateItem(): void
{
$iri = $this->findIriBy({ResourceName}::class, [/* critères */]);
$response = static::createClient()->request('PATCH', $iri, [
'json' => [
// Propriétés à modifier
],
'headers' => [
'Content-Type' => 'application/merge-patch+json',
],
]);
self::assertResponseIsSuccessful();
self::assertJsonContains([
// Vérifier les propriétés mises à jour
]);
}
public function testDeleteItem(): void
{
$iri = $this->findIriBy({ResourceName}::class, [/* critères */]);
static::createClient()->request('DELETE', $iri);
self::assertResponseStatusCodeSame(Response::HTTP_NO_CONTENT);
}
public function testGetItemNotFound(): void
{
static::createClient()->request('GET', '/api/{resource_names}/99999');
self::assertResponseStatusCodeSame(Response::HTTP_NOT_FOUND);
}
}
public function testFilterByName(): void
{
$response = static::createClient()->request('GET', '/api/{resource_names}?name=test');
self::assertResponseIsSuccessful();
// Vérifier que les résultats sont filtrés
}
public function testOrderBy(): void
{
$response = static::createClient()->request('GET', '/api/{resource_names}?order[name]=asc');
self::assertResponseIsSuccessful();
}
public function testAccessDeniedWithoutAuth(): void
{
static::createClient()->request('POST', '/api/{resource_names}', [
'json' => [/* données */],
]);
self::assertResponseStatusCodeSame(Response::HTTP_UNAUTHORIZED);
}
public function testAccessGrantedWithAuth(): void
{
$client = static::createClient();
// Configurer l'authentification (JWT, session, etc.)
$client->request('GET', '/api/{resource_names}');
self::assertResponseIsSuccessful();
}
public function testPagination(): void
{
$response = static::createClient()->request('GET', '/api/{resource_names}?page=1');
self::assertResponseIsSuccessful();
self::assertJsonContains([
'totalItems' => self::greaterThanOrEqual(0),
]);
}
Tests générés pour {ResourceName}
Fichier créé :
- tests/Api/{ResourceName}Test.php
Tests inclus :
- testGetCollection — Liste des resources
- testGetItem — Récupération d'un item
- testCreateItem — Création
- testCreateItemValidation — Validation des données
- testUpdateItem — Mise à jour (PATCH)
- testDeleteItem — Suppression
- testGetItemNotFound — 404
- testFilterBy... — Tests de filtres (si configurés)
- testAccessDenied... — Tests de sécurité (si configurée)
Exécution :
php bin/phpunit tests/Api/{ResourceName}Test.php
Prochaines étapes :
- Adapter les données de test (factories, fixtures)
- Compléter les assertions sur les propriétés
- Ajouter les tests de cas limites
ApiTestCase pour les assertions spécialiséesassertJsonContains pour les assertions partiellesapplication/ld+json pour les requêtes JSON-LDapplication/merge-patch+json pour PATCHfindIriBy() pour obtenir l'IRI d'un item existantApiTestCase étend KernelTestCase de Symfony