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 职业分类
Audite un projet API Platform existant et produit un rapport de bonnes pratiques, performances et sécurité
Génère des DTOs (input/output) API Platform avec mapping vers les entités
Génère des filtres API Platform (search, date, range, order, boolean, exists, custom)
Génère un State Processor API Platform pour personnaliser la persistence des données
Génère un State Provider API Platform pour personnaliser la récupération de données
Génère une API Resource complète avec attribut
| 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