Skip to content

Commit

Permalink
allowing the user to choose a controller class for make:crud
Browse files Browse the repository at this point in the history
  • Loading branch information
weaverryan committed Mar 19, 2021
1 parent af91f01 commit 8bb6788
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/Maker/MakeCrud.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ final class MakeCrud extends AbstractMaker

private $inflector;

private $controllerClassName;

public function __construct(DoctrineHelper $doctrineHelper, FormTypeRenderer $formTypeRenderer)
{
$this->doctrineHelper = $doctrineHelper;
Expand Down Expand Up @@ -91,6 +93,13 @@ public function interact(InputInterface $input, ConsoleStyle $io, Command $comma

$input->setArgument('entity-class', $value);
}

$defaultControllerClass = Str::asClassName(sprintf('%s Controller', $input->getArgument('entity-class')));

$this->controllerClassName = $io->ask(
sprintf('Choose a name for your controller class (e.g. <fg=yellow>%s</>)', $defaultControllerClass),
$defaultControllerClass
);
}

public function generate(InputInterface $input, ConsoleStyle $io, Generator $generator)
Expand Down Expand Up @@ -119,7 +128,7 @@ public function generate(InputInterface $input, ConsoleStyle $io, Generator $gen
}

$controllerClassDetails = $generator->createClassNameDetails(
$entityClassDetails->getRelativeNameWithoutSuffix().'Controller',
$this->controllerClassName,
'Controller\\',
'Controller'
);
Expand Down
22 changes: 22 additions & 0 deletions tests/Maker/MakeCrudTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public function getTestDetails()
[
// entity class name
'SweetFood',
'', // default controller
])
->setFixtureFilesPath(__DIR__.'/../fixtures/MakeCrud')
// need for crud web tests
Expand All @@ -36,11 +37,30 @@ public function getTestDetails()
->setRequiredPhpVersion(70200),
];

yield 'crud_basic_custom_controller' => [MakerTestDetails::createTest(
$this->getMakerInstance(MakeCrud::class),
[
// entity class name
'SweetFood',
'SweetFoodAdminController', // default controller
])
->setFixtureFilesPath(__DIR__.'/../fixtures/MakeCrudCustomController')
// need for crud web tests
->configureDatabase()
->assert(function (string $output, string $directory) {
$this->assertStringContainsString('created: src/Controller/SweetFoodAdminController.php', $output);
$this->assertStringContainsString('created: src/Form/SweetFoodType.php', $output);
})
// workaround for segfault in PHP 7.1 CI :/
->setRequiredPhpVersion(70200),
];

yield 'crud_basic_in_custom_root_namespace' => [MakerTestDetails::createTest(
$this->getMakerInstance(MakeCrud::class),
[
// entity class name
'SweetFood',
'', // default controller
])
->setFixtureFilesPath(__DIR__.'/../fixtures/MakeCrudInCustomRootNamespace')
->changeRootNamespace('Custom')
Expand All @@ -59,6 +79,7 @@ public function getTestDetails()
[
// entity class name
'SweetFood',
'', // default controller
])
->setFixtureFilesPath(__DIR__.'/../fixtures/MakeCrudRepository')
// need for crud web tests
Expand All @@ -76,6 +97,7 @@ public function getTestDetails()
[
// entity class name
'SweetFood',
'', // default controller
])
->setFixtureFilesPath(__DIR__.'/../fixtures/MakeCrud')
// need for crud web tests
Expand Down
44 changes: 44 additions & 0 deletions tests/fixtures/MakeCrudCustomController/src/Entity/SweetFood.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity()
*/
class SweetFood
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;

public function getId()
{
return $this->id;
}

/**
* @return mixed
*/
public function getTitle()
{
return $this->title;
}

/**
* @param mixed $title
*/
public function setTitle($title)
{
$this->title = $title;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
<?php

namespace App\Tests;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class GeneratedCrudControllerTest extends WebTestCase
{
public function testIndexAction()
{
$client = self::createClient();
$crawler = $client->request('GET', '/sweet/food/admin/');
$this->assertTrue($client->getResponse()->isSuccessful());
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
$this->assertStringContainsString('SweetFood index', $client->getResponse()->getContent());

$newLink = $crawler->filter('a:contains("Create new")')->eq(0)->link();

$crawler = $client->click($newLink);
$this->assertTrue($client->getResponse()->isSuccessful());
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
$this->assertStringContainsString('New SweetFood', $client->getResponse()->getContent());

$newForm = $crawler->selectButton('Save')->form();
$client->submit($newForm, ['sweet_food[title]' => 'Candy']);
$this->assertTrue($client->getResponse()->isRedirect());

$crawler = $client->followRedirect();
$this->assertTrue($client->getResponse()->isSuccessful());
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
$this->assertStringContainsString('SweetFood index', $client->getResponse()->getContent());
$this->assertStringContainsString('<td>Candy</td>', $client->getResponse()->getContent());

$editLink = $crawler->filter('a:contains("edit")')->eq(0)->link();
$crawler = $client->click($editLink);
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
$this->assertStringContainsString('Edit SweetFood', $client->getResponse()->getContent());
$this->assertGreaterThan(0, $crawler->filter('input[type=text]')->count());

$editForm = $crawler->selectButton('Update')->form();
$client->submit($editForm, ['sweet_food[title]' => 'Candy edited']);
$this->assertTrue($client->getResponse()->isRedirect());

$crawler = $client->followRedirect();
$this->assertTrue($client->getResponse()->isSuccessful());
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
$this->assertStringContainsString('SweetFood index', $client->getResponse()->getContent());
$this->assertStringContainsString('Candy edited', $client->getResponse()->getContent());

$showLink = $crawler->filter('a:contains("show")')->eq(0)->link();

$crawler = $client->click($showLink);
$this->assertTrue($client->getResponse()->isSuccessful());
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
$this->assertStringContainsString('SweetFood', $client->getResponse()->getContent());
$this->assertStringContainsString('Candy edited', $client->getResponse()->getContent());

$deleteForm = $crawler->selectButton('Delete')->form();
$client->submit($deleteForm);
$this->assertTrue($client->getResponse()->isRedirect());

$client->followRedirect();
$this->assertTrue($client->getResponse()->isSuccessful());
$this->assertStringContainsString('<!DOCTYPE html>', $client->getResponse()->getContent());
$this->assertStringContainsString('SweetFood index', $client->getResponse()->getContent());
$this->assertStringContainsString('no records found', $client->getResponse()->getContent());
}
}

0 comments on commit 8bb6788

Please sign in to comment.