diff --git a/src/Exception/Bundle/IncorrectBundleNameException.php b/src/Exception/Bundle/IncorrectBundleNameException.php new file mode 100644 index 0000000..1686967 --- /dev/null +++ b/src/Exception/Bundle/IncorrectBundleNameException.php @@ -0,0 +1,34 @@ + + * @copyright Meritoo.pl + */ +class IncorrectBundleNameException extends Exception +{ + /** + * Class constructor + * + * @param string $bundleName Incorrect name of bundle + */ + public function __construct($bundleName) + { + $template = 'Name of bundle \'%s\' is incorrect. It should start with big letter and end with "Bundle". Is' + . ' there everything ok?'; + + $message = sprintf($template, $bundleName); + parent::__construct($message); + } +} diff --git a/src/Utilities/Bundle.php b/src/Utilities/Bundle.php index ce0a5fc..2fa3206 100644 --- a/src/Utilities/Bundle.php +++ b/src/Utilities/Bundle.php @@ -8,6 +8,8 @@ namespace Meritoo\Common\Utilities; +use Meritoo\Common\Exception\Bundle\IncorrectBundleNameException; + /** * Useful methods for bundle * @@ -17,12 +19,14 @@ namespace Meritoo\Common\Utilities; class Bundle { /** - * Returns path to view / template of given bundle + * Returns path of given bundle to view / template with given extension * * @param string $viewPath Path of the view / template, e.g. "MyDirectory/my-template" * @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle" * @param string $extension (optional) Extension of the view / template * @return string|null + * + * @throws IncorrectBundleNameException */ public static function getBundleViewPath($viewPath, $bundleName, $extension = 'html.twig') { @@ -34,6 +38,13 @@ class Bundle return null; } + /* + * Given name of bundle is invalid? + */ + if (!Regex::isValidBundleName($bundleName)) { + throw new IncorrectBundleNameException($bundleName); + } + /* * Path of the view / template doesn't end with given extension? */ diff --git a/tests/Utilities/BundleTest.php b/tests/Utilities/BundleTest.php index fa7555b..909810c 100644 --- a/tests/Utilities/BundleTest.php +++ b/tests/Utilities/BundleTest.php @@ -9,6 +9,7 @@ namespace Meritoo\Common\Test\Utilities; use Generator; +use Meritoo\Common\Exception\Bundle\IncorrectBundleNameException; use Meritoo\Common\Test\Base\BaseTestCase; use Meritoo\Common\Utilities\Bundle; @@ -29,6 +30,7 @@ class BundleTest extends BaseTestCase * @param string $viewPath Path of the view / template, e.g. "MyDirectory/my-template" * @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle" * + * @throws IncorrectBundleNameException * @dataProvider provideEmptyViewPathAndBundle */ public function testGetBundleViewPathUsingEmptyPathAndBundle($viewPath, $bundleName) @@ -36,11 +38,30 @@ class BundleTest extends BaseTestCase self::assertNull(Bundle::getBundleViewPath($viewPath, $bundleName)); } + /** + * @param string $viewPath Path of the view / template, e.g. "MyDirectory/my-template" + * @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle" + * + * @throws IncorrectBundleNameException + * @dataProvider provideViewPathAndIncorrectBundleName + */ + public function testGetBundleViewPathUsingIncorrectBundleName($viewPath, $bundleName) + { + $template = 'Name of bundle \'%s\' is incorrect. It should start with big letter and end with "Bundle". Is' + . ' there everything ok?'; + + $message = sprintf($template, $bundleName); + $this->setExpectedException(IncorrectBundleNameException::class, $message); + + Bundle::getBundleViewPath($viewPath, $bundleName); + } + /** * @param string $viewPath Path of the view / template, e.g. "MyDirectory/my-template" * @param string $bundleName Full name of the bundle, e.g. "MyExtraBundle" * @param string $expected Expected path to view / template * + * @throws IncorrectBundleNameException * @dataProvider provideViewPathAndBundle */ public function testGetBundleViewPathUsingDefaultExtension($viewPath, $bundleName, $expected) @@ -54,6 +75,7 @@ class BundleTest extends BaseTestCase * @param string $extension (optional) Extension of the view / template * @param string $expected Expected path to view / template * + * @throws IncorrectBundleNameException * @dataProvider provideViewPathAndBundleAndExtension */ public function testGetBundleViewPathUsingCustomExtension($viewPath, $bundleName, $extension, $expected) @@ -84,6 +106,29 @@ class BundleTest extends BaseTestCase ]; } + /** + * Provides path of the view / template and incorrect name of bundle + * + * @return Generator + */ + public function provideViewPathAndIncorrectBundleName() + { + yield[ + 'User:Active', + 'myExtra', + ]; + + yield[ + 'User:Active', + 'MyExtra', + ]; + + yield[ + 'User:Active', + 'MySuperExtraGorgeous', + ]; + } + /** * Provides path of the view / template and name of bundle * @@ -92,15 +137,21 @@ class BundleTest extends BaseTestCase public function provideViewPathAndBundle() { yield[ - 'Ipsum', - 'Lorem', - 'Lorem:Ipsum.html.twig', + ':User', + 'MyExtraBundle', + 'MyExtraBundle::User.html.twig', ]; yield[ - 'FusceElementum', - 'LobortisTincidunt', - 'LobortisTincidunt:FusceElementum.html.twig', + 'User:Active', + 'MyExtraBundle', + 'MyExtraBundle:User:Active.html.twig', + ]; + + yield[ + 'User:Active', + 'MySuperExtraGorgeousBundle', + 'MySuperExtraGorgeousBundle:User:Active.html.twig', ]; } @@ -112,17 +163,17 @@ class BundleTest extends BaseTestCase public function provideViewPathAndBundleAndExtension() { yield[ - 'Ipsum', - 'Lorem', + 'User:Active', + 'MyExtraBundle', '', null, ]; yield[ - 'Ipsum', - 'Lorem', + 'User:Active', + 'MyExtraBundle', 'js.twig', - 'Lorem:Ipsum.js.twig', + 'MyExtraBundle:User:Active.js.twig', ]; } }