A Functional Test Generator.
composer require benblub/ftg "dev-main"
There is no autoconfig yet..
add to config/bundles.php
Benblub\Ftg\BenblubFtgBundle::class => ['dev' => true], add to services.yaml
Benblub\Ftg\Bundle\Maker\MakeFunctionalTest: tags: ['maker.command'] This Generator make use of Foundry Factories. For every Testclass we generate we need to have a Factory too. Create your Factory php bin/console make:factory User --test and set defaults. The defaults are at least all required fields from your Entity.
Add Method myDefaults to your Factories
publicstaticfunctionmyDefaults(): array{$class = newself(); return$class->getDefaults()}Your Test classes extend any class which extends ApiTestCase from ApiPlatform. To use Auth you need to implement the AuthHelperInterface like shown in the examble. also needs config set "custom_auth: true" (config is not implemented yet)
else you can use the defaults from AuthHelper (use id as identifier)
<?phpnamespaceApp\Test; useApiPlatform\Core\Bridge\Symfony\Bundle\Test\ApiTestCase; useApiPlatform\Core\Bridge\Symfony\Bundle\Test\Client; class AuthHelper extends ApiTestCase implements AuthHelperInterface{protectedClient$client; protectedarray$identifier; // can be id, email or whatever is used as identifierpublicfunctionsetUp(): void{$this->client = self::createClient()} publicfunctionsetIdentifier(array$identifier){$this->identifier = $identifier} /** * Set here whatever your config is from lexik_jwt_authentication.yaml <user_identity_field> * user_identity_field: email|username|id (your Provider must support it eg loadUserBy..) * * After Create a User in a test call this Method and make requests with this User authenticated */publicfunctionsetAuthenticationHeader(){$arrayKey = array_key_first($this->identifier); $token = $this->getUserToken($this->client, $this->identifier[$arrayKey]); $this->client->setDefaultOptions([ 'headers' => [ 'Authorization' => 'Bearer ' . $token, ], ])} /** * Generate our Bearer Token */publicfunctiongetUserToken(Client$client, string$identifier): string{$data = $this->identifier; return$client ->getContainer() ->get('lexik_jwt_authentication.encoder') ->encode($data)} }Allow CRUD Test php bin/console make:ftg
Deny CRUD as anymous Test php bin/console make:ftg --deny=deny
Deny CRUD as %role% for other User php bin/console make:ftg --deny=deny --other=Other
interactive Questions
Question: role for the auth User eg user, admin or whatever
Type with which ROLE this test should be created. user for ROLE_USER, admin for ROLE_ADMIN or all other roles. any means not auth header will be set.
Question Entity class to create a FunctionalTest for
chose the entity which you want test
Create Functional CRUD tests is mostly same for all Entities and over different Projetcs. With use of a Generator there are various Benefits.
- Tests looks same
- no boring write of always same code
- speedup writing tests and focus on tests which test the individual App parts
- Easy way to Replace tests if new Version/improvements available