diff --git a/.travis.yml b/.travis.yml index d1d764e13..3b773c7ff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,46 +3,64 @@ php: - 5.6 - 7.0 - 7.1 + - 7.2 env: - PHP_BIN=php - PHP_BIN=php-cgi -matrix: - include: - - php: 5.6 - env: dependencies="--prefer-lowest --prefer-stable" PHP_BIN=php - - php: 7.0 - env: coverage=on +before_install: + # turn off XDebug + - phpenv config-rm xdebug.ini || return 0 - allow_failures: - - php: 7.0 - env: coverage=on +install: + - travis_retry composer install --no-progress --prefer-dist script: - - vendor/bin/tester -p $PHP_BIN tests -s $coverageArgs - - php temp/code-checker/src/code-checker.php --short-arrays + - vendor/bin/tester -p $PHP_BIN tests -s after_failure: # Print *.actual content - for i in $(find tests -name \*.actual); do echo "--- $i"; cat $i; echo; echo; done -before_script: - # Install Nette Tester & Code Checker - - travis_retry composer update --no-interaction --prefer-dist $dependencies - - travis_retry composer create-project nette/code-checker temp/code-checker ~2.5 --no-interaction - - if [ "$coverage" == "on" ]; then PHP_BIN=phpdbg; coverageArgs="--coverage ./coverage.xml --coverage-src ./src"; fi +jobs: + include: + - env: title="Lowest Dependencies" PHP_BIN=php + install: + - travis_retry composer update --no-progress --prefer-dist --prefer-lowest --prefer-stable + + + - stage: Code Standard Checker + php: 7.1 + install: + # Install Nette Code Checker + - travis_retry composer create-project nette/code-checker temp/code-checker ~2 --no-progress + # Install Nette Coding Standard + - travis_retry composer create-project nette/coding-standard temp/coding-standard --no-progress + + script: + - php temp/code-checker/src/code-checker.php --short-arrays + - php temp/coding-standard/ecs check src tests --config temp/coding-standard/coding-standard-php56.neon + + + - stage: Code Coverage + php: 7.1 + script: + - vendor/bin/tester -p phpdbg tests -s --coverage ./coverage.xml --coverage-src ./src + after_script: + - wget https://github.com/satooshi/php-coveralls/releases/download/v1.0.1/coveralls.phar + - php coveralls.phar --verbose --config tests/.coveralls.yml + + + allow_failures: + - stage: Code Coverage -after_script: - # Report Code Coverage - - > - if [ "$coverage" == "on" ]; then - wget https://github.com/satooshi/php-coveralls/releases/download/v1.0.1/coveralls.phar - && php coveralls.phar --verbose --config tests/.coveralls.yml - || true; fi sudo: false cache: directories: - $HOME/.composer/cache + +notifications: + email: false diff --git a/composer.json b/composer.json index 3e99552bf..905dfab75 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,7 @@ { "name": "nette/application", - "description": "Nette Application MVC Component", + "description": "🏆 Nette Application: a full-stack component-based MVC kernel for PHP that helps you write powerful and modern web applications. Write less, have cleaner code and your work will bring you joy.", + "keywords": ["nette", "mvc", "framework", "component-based", "routing", "seo", "mvp", "presenter", "control", "forms"], "homepage": "https://nette.org", "license": ["BSD-3-Clause", "GPL-2.0", "GPL-3.0"], "authors": [ diff --git a/src/Application/Routers/Route.php b/src/Application/Routers/Route.php index 037cb1b13..3b7fbdefa 100644 --- a/src/Application/Routers/Route.php +++ b/src/Application/Routers/Route.php @@ -313,13 +313,11 @@ public function constructUrl(Application\Request $appRequest, Nette\Http\Url $re continue; // retains null values } - if (isset($meta['fixity'])) { - if ($params[$name] === false) { - $params[$name] = '0'; - } elseif (is_scalar($params[$name])) { - $params[$name] = (string) $params[$name]; - } + if (is_scalar($params[$name])) { + $params[$name] = $params[$name] === false ? '0' : (string) $params[$name]; + } + if (isset($meta['fixity'])) { if ($params[$name] === $meta[self::VALUE]) { // remove default values; null values are retain unset($params[$name]); continue; @@ -462,7 +460,7 @@ private function setMask($mask, array $metadata) if (array_key_exists(self::VALUE, $meta)) { if (is_scalar($meta[self::VALUE])) { - $metadata[$name][self::VALUE] = (string) $meta[self::VALUE]; + $metadata[$name][self::VALUE] = $meta[self::VALUE] === false ? '0' : (string) $meta[self::VALUE]; } $metadata[$name]['fixity'] = self::CONSTANT; } @@ -598,11 +596,10 @@ private function setMask($mask, array $metadata) } $meta['fixity'] = self::PATH_OPTIONAL; - } elseif (!$autoOptional) { - unset($meta['fixity']); - - } elseif (isset($meta['fixity'])) { // auto-optional - $re = '(?:' . $re . ')?'; + } elseif (isset($meta['fixity'])) { + if ($autoOptional) { + $re = '(?:' . $re . ')?'; + } $meta['fixity'] = self::PATH_OPTIONAL; } else { diff --git a/src/Application/UI/Component.php b/src/Application/UI/Component.php index cd384b841..0e7786a67 100644 --- a/src/Application/UI/Component.php +++ b/src/Application/UI/Component.php @@ -150,42 +150,11 @@ public function loadState(array $params) /** * Saves state informations for next request. - * @param array - * @param ComponentReflection (internal, used by Presenter) * @return void */ - public function saveState(array &$params, $reflection = null) + public function saveState(array &$params) { - $reflection = $reflection === null ? $this->getReflection() : $reflection; - foreach ($reflection->getPersistentParams() as $name => $meta) { - if (isset($params[$name])) { - // injected value - - } elseif (array_key_exists($name, $params)) { // nulls are skipped - continue; - - } elseif ((!isset($meta['since']) || $this instanceof $meta['since']) && isset($this->$name)) { - $params[$name] = $this->$name; // object property value - - } else { - continue; // ignored parameter - } - - $type = gettype($meta['def']); - if (!ComponentReflection::convertType($params[$name], $type)) { - throw new InvalidLinkException(sprintf( - "Value passed to persistent parameter '%s' in %s must be %s, %s given.", - $name, - $this instanceof Presenter ? 'presenter ' . $this->getName() : "component '{$this->getUniqueId()}'", - $type === 'NULL' ? 'scalar' : $type, - is_object($params[$name]) ? get_class($params[$name]) : gettype($params[$name]) - )); - } - - if ($params[$name] === $meta['def'] || ($meta['def'] === null && $params[$name] === '')) { - $params[$name] = null; // value transmit is unnecessary - } - } + $this->getReflection()->saveState($this, $params); } diff --git a/src/Application/UI/ComponentReflection.php b/src/Application/UI/ComponentReflection.php index 7aabbc0ae..31145bfa2 100644 --- a/src/Application/UI/ComponentReflection.php +++ b/src/Application/UI/ComponentReflection.php @@ -45,6 +45,7 @@ public function getPersistentParams($class = null) } $params = []; if (is_subclass_of($class, Component::class)) { + $isPresenter = is_subclass_of($class, Presenter::class); $defaults = get_class_vars($class); foreach ($class::getPersistentParams() as $name => $default) { if (is_int($name)) { @@ -53,7 +54,7 @@ public function getPersistentParams($class = null) } $params[$name] = [ 'def' => $default, - 'since' => $class, + 'since' => $isPresenter ? $class : null, ]; } foreach ($this->getPersistentParams(get_parent_class($class)) as $name => $param) { @@ -94,6 +95,43 @@ public function getPersistentComponents($class = null) } + /** + * Saves state informations for next request. + */ + public function saveState(Component $component, array &$params) + { + foreach ($this->getPersistentParams() as $name => $meta) { + if (isset($params[$name])) { + // injected value + + } elseif (array_key_exists($name, $params) // nulls are skipped + || (isset($meta['since']) && !$component instanceof $meta['since']) // not related + || !isset($component->$name) + ) { + continue; + + } else { + $params[$name] = $component->$name; // object property value + } + + $type = gettype($meta['def']); + if (!self::convertType($params[$name], $type)) { + throw new InvalidLinkException(sprintf( + "Value passed to persistent parameter '%s' in %s must be %s, %s given.", + $name, + $component instanceof Presenter ? 'presenter ' . $component->getName() : "component '{$component->getUniqueId()}'", + $type === 'NULL' ? 'scalar' : $type, + is_object($params[$name]) ? get_class($params[$name]) : gettype($params[$name]) + )); + } + + if ($params[$name] === $meta['def'] || ($meta['def'] === null && $params[$name] === '')) { + $params[$name] = null; // value transmit is unnecessary + } + } + } + + /** * Is a method callable? It means class is instantiable and method has * public visibility, is non-static and non-abstract. diff --git a/src/Application/UI/Control.php b/src/Application/UI/Control.php index 57c811160..0c789949c 100644 --- a/src/Application/UI/Control.php +++ b/src/Application/UI/Control.php @@ -13,7 +13,7 @@ /** * Control is renderable Presenter component. * - * @property-read ITemplate $template + * @property-read ITemplate|Nette\Bridges\ApplicationLatte\Template|\stdClass $template */ abstract class Control extends Component implements IRenderable { diff --git a/src/Application/UI/Presenter.php b/src/Application/UI/Presenter.php index 531c0eaac..0203fcea8 100644 --- a/src/Application/UI/Presenter.php +++ b/src/Application/UI/Presenter.php @@ -634,7 +634,7 @@ public function sendResponse(Application\IResponse $response) */ public function terminate() { - throw new Application\AbortException(); + throw new Application\AbortException; } @@ -1210,6 +1210,16 @@ protected function getGlobalState($forClass = null) } + /** + * Saves state informations for next request. + */ + public function saveState(array &$params, ComponentReflection $reflection = null) + { + $reflection = $reflection ?: $this->getReflection(); + $reflection->saveState($this, $params); + } + + /** * Permanently saves state information for all subcomponents to $this->globalState. * @return void diff --git a/src/Bridges/ApplicationDI/ApplicationExtension.php b/src/Bridges/ApplicationDI/ApplicationExtension.php index dd01d3318..934f37c0c 100644 --- a/src/Bridges/ApplicationDI/ApplicationExtension.php +++ b/src/Bridges/ApplicationDI/ApplicationExtension.php @@ -61,7 +61,7 @@ public function loadConfiguration() : UI\Presenter::INVALID_LINK_WARNING; $application = $builder->addDefinition($this->prefix('application')) - ->setClass(Nette\Application\Application::class) + ->setFactory(Nette\Application\Application::class) ->addSetup('$catchExceptions', [$config['catchExceptions']]) ->addSetup('$errorPresenter', [$config['errorPresenter']]); diff --git a/src/Bridges/ApplicationDI/LatteExtension.php b/src/Bridges/ApplicationDI/LatteExtension.php index 74960db44..a529f1cc2 100644 --- a/src/Bridges/ApplicationDI/LatteExtension.php +++ b/src/Bridges/ApplicationDI/LatteExtension.php @@ -46,7 +46,7 @@ public function loadConfiguration() $builder = $this->getContainerBuilder(); $builder->addDefinition($this->prefix('latteFactory')) - ->setClass(Latte\Engine::class) + ->setFactory(Latte\Engine::class) ->addSetup('setTempDirectory', [$this->tempDir]) ->addSetup('setAutoRefresh', [$this->debugMode]) ->addSetup('setContentType', [$config['xhtml'] ? Latte\Compiler::CONTENT_XHTML : Latte\Compiler::CONTENT_HTML]) diff --git a/tests/Application/MicroPresenter.response.phpt b/tests/Application/MicroPresenter.response.phpt index 1666aee01..a1411f613 100644 --- a/tests/Application/MicroPresenter.response.phpt +++ b/tests/Application/MicroPresenter.response.phpt @@ -16,7 +16,7 @@ function renderResponse(Nette\Application\Responses\TextResponse $response) { ob_start(); try { - $response->send(new Http\Request(new Http\UrlScript()), new Http\Response(null)); + $response->send(new Http\Request(new Http\UrlScript), new Http\Response(null)); return ob_get_clean(); } catch (\Exception $e) { ob_end_clean(); @@ -117,7 +117,7 @@ test(function () { $template = $presenter->createTemplate(null, function () { return new Latte\Engine; }); - $template->getLatte()->setLoader(new Latte\Loaders\FileLoader()); + $template->getLatte()->setLoader(new Latte\Loaders\FileLoader); $template->setFile(new SplFileInfo(Tester\FileMock::create('{$param}'))); $template->setParameters(['param' => 'test']); @@ -140,7 +140,7 @@ test(function () { $template = $presenter->createTemplate(null, function () { return new Latte\Engine; }); - $template->getLatte()->setLoader(new Latte\Loaders\FileLoader()); + $template->getLatte()->setLoader(new Latte\Loaders\FileLoader); $template->setFile($filename); $template->setParameters(['param' => 'test']); diff --git a/tests/Bridges.DI/ApplicationExtension.basic.phpt b/tests/Bridges.DI/ApplicationExtension.basic.phpt index 9e37b1a14..07f1cefa1 100644 --- a/tests/Bridges.DI/ApplicationExtension.basic.phpt +++ b/tests/Bridges.DI/ApplicationExtension.basic.phpt @@ -17,9 +17,9 @@ test(function () { $compiler->addExtension('application', new ApplicationExtension(false)); $builder = $compiler->getContainerBuilder(); - $builder->addDefinition('myRouter')->setClass(Nette\Application\Routers\SimpleRouter::class); + $builder->addDefinition('myRouter')->setFactory(Nette\Application\Routers\SimpleRouter::class); $builder->addDefinition('myHttpRequest')->setFactory(Nette\Http\Request::class, [new DI\Statement(Nette\Http\UrlScript::class)]); - $builder->addDefinition('myHttpResponse')->setClass(Nette\Http\Response::class); + $builder->addDefinition('myHttpResponse')->setFactory(Nette\Http\Response::class); $code = $compiler->setClassName('Container1')->compile(); eval($code); diff --git a/tests/Bridges.DI/ApplicationExtension.invalidLink.phpt b/tests/Bridges.DI/ApplicationExtension.invalidLink.phpt index 8cd8a6a3b..8bbf937a4 100644 --- a/tests/Bridges.DI/ApplicationExtension.invalidLink.phpt +++ b/tests/Bridges.DI/ApplicationExtension.invalidLink.phpt @@ -19,9 +19,9 @@ function createCompiler($config) $compiler = new DI\Compiler; $compiler->loadConfig(Tester\FileMock::create($config, 'neon')); $builder = $compiler->getContainerBuilder(); - $builder->addDefinition('myRouter')->setClass(Nette\Application\Routers\SimpleRouter::class); + $builder->addDefinition('myRouter')->setFactory(Nette\Application\Routers\SimpleRouter::class); $builder->addDefinition('myHttpRequest')->setFactory(Nette\Http\Request::class, [new DI\Statement(Nette\Http\UrlScript::class)]); - $builder->addDefinition('myHttpResponse')->setClass(Nette\Http\Response::class); + $builder->addDefinition('myHttpResponse')->setFactory(Nette\Http\Response::class); return $compiler; } diff --git a/tests/Bridges.DI/ApplicationExtension.scan.phpt b/tests/Bridges.DI/ApplicationExtension.scan.phpt index e8bca158d..9bc49942d 100644 --- a/tests/Bridges.DI/ApplicationExtension.scan.phpt +++ b/tests/Bridges.DI/ApplicationExtension.scan.phpt @@ -18,9 +18,9 @@ test(function () { $compiler->addExtension('application', new ApplicationExtension); $builder = $compiler->getContainerBuilder(); - $builder->addDefinition('myRouter')->setClass(Nette\Application\Routers\SimpleRouter::class); + $builder->addDefinition('myRouter')->setFactory(Nette\Application\Routers\SimpleRouter::class); $builder->addDefinition('myHttpRequest')->setFactory(Nette\Http\Request::class, [new DI\Statement(Nette\Http\UrlScript::class)]); - $builder->addDefinition('myHttpResponse')->setClass(Nette\Http\Response::class); + $builder->addDefinition('myHttpResponse')->setFactory(Nette\Http\Response::class); $code = $compiler->setClassName('Container1')->compile(); eval($code); @@ -37,9 +37,9 @@ test(function () { $compiler->addExtension('application', new ApplicationExtension); $builder = $compiler->getContainerBuilder(); - $builder->addDefinition('myRouter')->setClass(Nette\Application\Routers\SimpleRouter::class); + $builder->addDefinition('myRouter')->setFactory(Nette\Application\Routers\SimpleRouter::class); $builder->addDefinition('myHttpRequest')->setFactory(Nette\Http\Request::class, [new DI\Statement(Nette\Http\UrlScript::class)]); - $builder->addDefinition('myHttpResponse')->setClass(Nette\Http\Response::class); + $builder->addDefinition('myHttpResponse')->setFactory(Nette\Http\Response::class); $code = $compiler->addConfig([ 'application' => [ 'scanDirs' => [__DIR__ . '/files'], @@ -60,9 +60,9 @@ test(function () { $compiler->addExtension('application', new ApplicationExtension(false, [__DIR__ . '/files'])); $builder = $compiler->getContainerBuilder(); - $builder->addDefinition('myRouter')->setClass(Nette\Application\Routers\SimpleRouter::class); + $builder->addDefinition('myRouter')->setFactory(Nette\Application\Routers\SimpleRouter::class); $builder->addDefinition('myHttpRequest')->setFactory(Nette\Http\Request::class, [new DI\Statement(Nette\Http\UrlScript::class)]); - $builder->addDefinition('myHttpResponse')->setClass(Nette\Http\Response::class); + $builder->addDefinition('myHttpResponse')->setFactory(Nette\Http\Response::class); $loader = new DI\Config\Loader; $config = $loader->load(Tester\FileMock::create(' services: diff --git a/tests/Bridges.Latte/TemplateFactory.customTemplate.phpt b/tests/Bridges.Latte/TemplateFactory.customTemplate.phpt index a0b417402..3e3c9e2f4 100644 --- a/tests/Bridges.Latte/TemplateFactory.customTemplate.phpt +++ b/tests/Bridges.Latte/TemplateFactory.customTemplate.phpt @@ -19,7 +19,7 @@ class TemplateMock extends Template private $file = 'ko'; - public function render() + public function render($file = null, array $params = []) { return strrev($this->file); } diff --git a/tests/Bridges.Latte/UIMacros.renderSnippets.phpt b/tests/Bridges.Latte/UIMacros.renderSnippets.phpt index 3ee27b29c..07827ad03 100644 --- a/tests/Bridges.Latte/UIMacros.renderSnippets.phpt +++ b/tests/Bridges.Latte/UIMacros.renderSnippets.phpt @@ -30,7 +30,7 @@ class TestPresenter extends Nette\Application\UI\Presenter public function createComponentMulti() { return new Nette\Application\UI\Multiplier(function () { - $control = new InnerControl(); + $control = new InnerControl; $control->redrawControl(); return $control; }); diff --git a/tests/Bridges.Latte/UIMacros.renderSnippets2.phpt b/tests/Bridges.Latte/UIMacros.renderSnippets2.phpt index 7868566cd..30a673e63 100644 --- a/tests/Bridges.Latte/UIMacros.renderSnippets2.phpt +++ b/tests/Bridges.Latte/UIMacros.renderSnippets2.phpt @@ -52,7 +52,7 @@ class TestPresenter extends Nette\Application\UI\Presenter public function createComponentMulti() { return new Nette\Application\UI\Multiplier(function () { - return new InnerControl(); + return new InnerControl; }); } diff --git a/tests/Routers/CliRouter.invalid.phpt b/tests/Routers/CliRouter.invalid.phpt index 313a5a7f9..0aebd6063 100644 --- a/tests/Routers/CliRouter.invalid.phpt +++ b/tests/Routers/CliRouter.invalid.phpt @@ -13,7 +13,7 @@ require __DIR__ . '/../bootstrap.php'; $_SERVER['argv'] = 1; -$httpRequest = new Http\Request(new Http\UrlScript()); +$httpRequest = new Http\Request(new Http\UrlScript); $router = new CliRouter; Assert::null($router->match($httpRequest)); diff --git a/tests/Routers/CliRouter.phpt b/tests/Routers/CliRouter.phpt index 17b32ef58..5df57f7fb 100644 --- a/tests/Routers/CliRouter.phpt +++ b/tests/Routers/CliRouter.phpt @@ -24,7 +24,7 @@ $_SERVER['argv'] = [ '/wait', ]; -$httpRequest = new Http\Request(new Http\UrlScript()); +$httpRequest = new Http\Request(new Http\UrlScript); $router = new CliRouter([ 'id' => 12, diff --git a/tests/Routers/Route.optional.autooptional3.phpt b/tests/Routers/Route.optional.autooptional3.phpt new file mode 100644 index 000000000..dc863ebfa --- /dev/null +++ b/tests/Routers/Route.optional.autooptional3.phpt @@ -0,0 +1,43 @@ +//', [ + 'action' => 'default', +]); + +testRouteIn($route, '/presenter/'); +testRouteIn($route, '/presenter/abc'); +testRouteIn($route, '/presenter/abc/'); + +testRouteIn($route, '/presenter/abc/xyy', 'Presenter', [ + 'default' => 'abc', + 'action' => 'default', + 'test' => 'testvalue', + 'required' => 'xyy', +], '/presenter/abc/xyy?test=testvalue'); + + +Assert::null(testRouteOut($route, 'Homepage')); +Assert::null(testRouteOut($route, 'Homepage', ['default' => 'abc'])); + +Assert::same( + 'http://example.com/homepage/123/xyz', + testRouteOut($route, 'Homepage', ['required' => 'xyz']) +); + +Assert::same( + 'http://example.com/homepage/abc/xyz', + testRouteOut($route, 'Homepage', ['required' => 'xyz', 'default' => 'abc']) +); diff --git a/tests/Routers/Route.scalarParams.phpt b/tests/Routers/Route.scalarParams.phpt new file mode 100644 index 000000000..47f4b2fa7 --- /dev/null +++ b/tests/Routers/Route.scalarParams.phpt @@ -0,0 +1,212 @@ +/', [ + ]); + + Assert::same( + 'http://example.com/homepage/12', + testRouteOut($route, 'Homepage', ['param' => 12]) + ); + + Assert::same( + 'http://example.com/homepage/12.1', + testRouteOut($route, 'Homepage', ['param' => 12.1]) + ); + + Assert::same( + 'http://example.com/homepage/0', + testRouteOut($route, 'Homepage', ['param' => false]) + ); + + Assert::same( + 'http://example.com/homepage/1', + testRouteOut($route, 'Homepage', ['param' => true]) + ); + + Assert::null(testRouteOut($route, 'Homepage', ['param' => null])); + Assert::null(testRouteOut($route, 'Homepage', ['param' => ''])); +}); + + +test(function () { + $route = new Route('/', [ + 'param' => 12, + ]); + + Assert::same( + 'http://example.com/homepage/', + testRouteOut($route, 'Homepage', ['param' => 12]) + ); + + Assert::same( + 'http://example.com/homepage/12.1', + testRouteOut($route, 'Homepage', ['param' => 12.1]) + ); + + Assert::same( + 'http://example.com/homepage/0', + testRouteOut($route, 'Homepage', ['param' => false]) + ); + + Assert::same( + 'http://example.com/homepage/1', + testRouteOut($route, 'Homepage', ['param' => true]) + ); + + Assert::same( + 'http://example.com/homepage/', + testRouteOut($route, 'Homepage', ['param' => null]) + ); + + Assert::null(testRouteOut($route, 'Homepage', ['param' => ''])); +}); + + +test(function () { + $route = new Route('/', [ + 'param' => 12.1, + ]); + + Assert::same( + 'http://example.com/homepage/12', + testRouteOut($route, 'Homepage', ['param' => 12]) + ); + + Assert::same( + 'http://example.com/homepage/', + testRouteOut($route, 'Homepage', ['param' => 12.1]) + ); + + Assert::same( + 'http://example.com/homepage/0', + testRouteOut($route, 'Homepage', ['param' => false]) + ); + + Assert::same( + 'http://example.com/homepage/1', + testRouteOut($route, 'Homepage', ['param' => true]) + ); + + Assert::same( + 'http://example.com/homepage/', + testRouteOut($route, 'Homepage', ['param' => null]) + ); + + Assert::null(testRouteOut($route, 'Homepage', ['param' => ''])); +}); + + +test(function () { + $route = new Route('/', [ + 'param' => true, + ]); + + Assert::same( + 'http://example.com/homepage/12', + testRouteOut($route, 'Homepage', ['param' => 12]) + ); + + Assert::same( + 'http://example.com/homepage/12.1', + testRouteOut($route, 'Homepage', ['param' => 12.1]) + ); + + Assert::same( + 'http://example.com/homepage/0', + testRouteOut($route, 'Homepage', ['param' => false]) + ); + + Assert::same( + 'http://example.com/homepage/', + testRouteOut($route, 'Homepage', ['param' => true]) + ); + + Assert::same( + 'http://example.com/homepage/', + testRouteOut($route, 'Homepage', ['param' => null]) + ); + + Assert::null(testRouteOut($route, 'Homepage', ['param' => ''])); +}); + + +test(function () { + $route = new Route('/', [ + 'param' => false, + ]); + + Assert::same( + 'http://example.com/homepage/12', + testRouteOut($route, 'Homepage', ['param' => 12]) + ); + + Assert::same( + 'http://example.com/homepage/12.1', + testRouteOut($route, 'Homepage', ['param' => 12.1]) + ); + + Assert::same( + 'http://example.com/homepage/', + testRouteOut($route, 'Homepage', ['param' => false]) + ); + + Assert::same( + 'http://example.com/homepage/1', + testRouteOut($route, 'Homepage', ['param' => true]) + ); + + Assert::same( + 'http://example.com/homepage/', + testRouteOut($route, 'Homepage', ['param' => null]) + ); + + Assert::null(testRouteOut($route, 'Homepage', ['param' => ''])); +}); + + +test(function () { + $route = new Route('/', [ + 'param' => null, + ]); + + Assert::same( + 'http://example.com/homepage/12', + testRouteOut($route, 'Homepage', ['param' => 12]) + ); + + Assert::same( + 'http://example.com/homepage/12.1', + testRouteOut($route, 'Homepage', ['param' => 12.1]) + ); + + Assert::same( + 'http://example.com/homepage/0', + testRouteOut($route, 'Homepage', ['param' => false]) + ); + + Assert::same( + 'http://example.com/homepage/1', + testRouteOut($route, 'Homepage', ['param' => true]) + ); + + Assert::same( + 'http://example.com/homepage/', + testRouteOut($route, 'Homepage', ['param' => null]) + ); + + Assert::null(testRouteOut($route, 'Homepage', ['param' => ''])); +}); diff --git a/tests/Routers/RouteList.basic.phpt b/tests/Routers/RouteList.basic.phpt index 55958ed2a..e8be616a3 100644 --- a/tests/Routers/RouteList.basic.phpt +++ b/tests/Routers/RouteList.basic.phpt @@ -14,7 +14,7 @@ require __DIR__ . '/../bootstrap.php'; require __DIR__ . '/Route.php'; -$list = new RouteList(); +$list = new RouteList; $list[] = new Route('admin///', ['module' => 'Admin']); $list[] = new Route('//', ['module' => 'Front']); diff --git a/tests/Routers/SimpleRouter.invalid.phpt b/tests/Routers/SimpleRouter.invalid.phpt index 544000eec..2cc6f3f33 100644 --- a/tests/Routers/SimpleRouter.invalid.phpt +++ b/tests/Routers/SimpleRouter.invalid.phpt @@ -15,7 +15,7 @@ require __DIR__ . '/../bootstrap.php'; test(function () { - $router = new SimpleRouter(); + $router = new SimpleRouter; $url = new Http\UrlScript('http://nette.org?presenter[]=foo'); $httpRequest = new Http\Request($url); $req = $router->match($httpRequest); @@ -24,7 +24,7 @@ test(function () { }); test(function () { - $router = new SimpleRouter(); + $router = new SimpleRouter; $url = new Http\UrlScript('http://nette.org'); $httpRequest = new Http\Request($url); $req = $router->match($httpRequest); diff --git a/tests/UI/Control.isControlInvalid.phpt b/tests/UI/Control.isControlInvalid.phpt index 3c368ae79..1e8d2c149 100644 --- a/tests/UI/Control.isControlInvalid.phpt +++ b/tests/UI/Control.isControlInvalid.phpt @@ -17,8 +17,8 @@ class TestControl extends UI\Control test(function () { - $control = new TestControl(); - $child = new TestControl(); + $control = new TestControl; + $child = new TestControl; $control->addComponent($child, 'foo'); Assert::false($control->isControlInvalid()); @@ -28,9 +28,9 @@ test(function () { test(function () { - $control = new TestControl(); - $child = new Nette\ComponentModel\Container(); - $grandChild = new TestControl(); + $control = new TestControl; + $child = new Nette\ComponentModel\Container; + $grandChild = new TestControl; $control->addComponent($child, 'foo'); $child->addComponent($grandChild, 'bar'); diff --git a/tests/UI/Presenter.link().persistent.phpt b/tests/UI/Presenter.link().persistent.phpt new file mode 100644 index 000000000..3bf27d11d --- /dev/null +++ b/tests/UI/Presenter.link().persistent.phpt @@ -0,0 +1,118 @@ +p1 = 1; + $this->p2 = 2; + $this->t1 = 3; + $this->t2 = 4; + Assert::same('/index.php?p2=2&p1=1&t1=3&t2=4&action=default&presenter=Test', $this->link('this')); + Assert::same('/index.php?p1=1&t1=3&action=default&presenter=Second', $this->link('Second:')); + Assert::same('/index.php?p1=1&t1=3&action=default&presenter=Third', $this->link('Third:')); + + $this->p1 = 20; + Assert::same('/index.php?t1=3&action=default&presenter=Second', $this->link('Second:')); + + $this->p1 = null; // means default + Assert::same('/index.php?t1=3&action=default&presenter=Second', $this->link('Second:')); + + $this->terminate(); + } +} + + +class SecondPresenter extends BasePresenter +{ + use PersistentParam3; + + /** @persistent */ + public $p1 = 20; + + /** @persistent */ + public $p3; +} + + +class ThirdPresenter extends BasePresenter +{ + use PersistentParam2A; +} + + +$url = new Http\UrlScript('http://localhost/index.php'); +$url->setScriptPath('/index.php'); + +$presenterFactory = Mockery::mock(Nette\Application\IPresenterFactory::class); +$presenterFactory->shouldReceive('getPresenterClass') + ->andReturnUsing(function ($presenter) { + return $presenter . 'Presenter'; + }); + +$presenter = new TestPresenter; +$presenter->injectPrimary( + null, + $presenterFactory, + new Application\Routers\SimpleRouter, + new Http\Request($url), + new Http\Response +); + +$presenter->invalidLinkMode = TestPresenter::INVALID_LINK_WARNING; +$presenter->autoCanonicalize = false; + +$request = new Application\Request('Test', Http\Request::GET, []); +$presenter->run($request); diff --git a/tests/UI/Presenter.link().php71.phpt b/tests/UI/Presenter.link().php71.phpt index 17848a83c..64e765341 100644 --- a/tests/UI/Presenter.link().php71.phpt +++ b/tests/UI/Presenter.link().php71.phpt @@ -93,10 +93,10 @@ class TestPresenter extends Application\UI\Presenter // absolute Assert::same('http://localhost/index.php?x=1&y=2&action=product&presenter=Test#fragment', $this->link('//product?x=1&y=2#fragment')); - $this->absoluteUrls = TRUE; + $this->absoluteUrls = true; Assert::same('http://localhost/index.php?x=1&y=2&action=product&presenter=Test#fragment', $this->link('product?x=1&y=2#fragment')); Assert::same('http://localhost/index.php?x=1&y=2&action=product&presenter=Test#fragment', $this->link('//product?x=1&y=2#fragment')); - $this->absoluteUrls = FALSE; + $this->absoluteUrls = false; // persistent params Assert::same('/index.php?action=params&presenter=Test', $this->link('params', ['pint' => $this->pint, 'p' => ''])); @@ -273,7 +273,10 @@ $url = new Http\UrlScript('http://localhost/index.php'); $url->setScriptPath('/index.php'); $presenterFactory = Mockery::mock(Nette\Application\IPresenterFactory::class); -$presenterFactory->shouldReceive('getPresenterClass'); +$presenterFactory->shouldReceive('getPresenterClass') + ->andReturnUsing(function ($presenter) { + return $presenter . 'Presenter'; + }); $presenter = new TestPresenter; $presenter->injectPrimary( diff --git a/tests/UI/Presenter.link().phpt b/tests/UI/Presenter.link().phpt index 86654707e..6aa3546bd 100644 --- a/tests/UI/Presenter.link().phpt +++ b/tests/UI/Presenter.link().phpt @@ -92,10 +92,10 @@ class TestPresenter extends Application\UI\Presenter // absolute Assert::same('http://localhost/index.php?x=1&y=2&action=product&presenter=Test#fragment', $this->link('//product?x=1&y=2#fragment')); - $this->absoluteUrls = TRUE; + $this->absoluteUrls = true; Assert::same('http://localhost/index.php?x=1&y=2&action=product&presenter=Test#fragment', $this->link('product?x=1&y=2#fragment')); Assert::same('http://localhost/index.php?x=1&y=2&action=product&presenter=Test#fragment', $this->link('//product?x=1&y=2#fragment')); - $this->absoluteUrls = FALSE; + $this->absoluteUrls = false; // persistent params Assert::same('/index.php?action=params&presenter=Test', $this->link('params', ['pint' => $this->pint, 'p' => ''])); @@ -220,7 +220,10 @@ $url = new Http\UrlScript('http://localhost/index.php'); $url->setScriptPath('/index.php'); $presenterFactory = Mockery::mock(Nette\Application\IPresenterFactory::class); -$presenterFactory->shouldReceive('getPresenterClass'); +$presenterFactory->shouldReceive('getPresenterClass') + ->andReturnUsing(function ($presenter) { + return $presenter . 'Presenter'; + }); $presenter = new TestPresenter; $presenter->injectPrimary( diff --git a/tests/UI/Presenter.paramChecking.phpt b/tests/UI/Presenter.paramChecking.phpt index af7e811f8..5847f0e70 100644 --- a/tests/UI/Presenter.paramChecking.phpt +++ b/tests/UI/Presenter.paramChecking.phpt @@ -10,21 +10,10 @@ use Tester\Assert; require __DIR__ . '/../bootstrap.php'; +require __DIR__ . '/fixtures/ParamPresenter.php'; -class TestPresenter extends Application\UI\Presenter -{ - /** @persistent */ - public $bool = true; - - - public function actionDefault($a, $b = null, array $c, array $d = null, $e = 1, $f = 1.0, $g = false) - { - } -} - - -$presenter = new TestPresenter; +$presenter = new ParamPresenter; $presenter->injectPrimary( null, null, @@ -49,49 +38,49 @@ Assert::exception(function () use ($presenter) { Assert::exception(function () use ($presenter) { $request = new Application\Request('Test', Http\Request::GET, ['a' => []]); $presenter->run($request); -}, Nette\Application\BadRequestException::class, 'Argument $a passed to TestPresenter::actionDefault() must be scalar, array given.'); +}, Nette\Application\BadRequestException::class, 'Argument $a passed to ParamPresenter::actionDefault() must be scalar, array given.'); Assert::exception(function () use ($presenter) { $request = new Application\Request('Test', Http\Request::GET, ['b' => []]); $presenter->run($request); -}, Nette\Application\BadRequestException::class, 'Argument $b passed to TestPresenter::actionDefault() must be scalar, array given.'); +}, Nette\Application\BadRequestException::class, 'Argument $b passed to ParamPresenter::actionDefault() must be scalar, array given.'); Assert::exception(function () use ($presenter) { $request = new Application\Request('Test', Http\Request::GET, ['c' => 1]); $presenter->run($request); -}, Nette\Application\BadRequestException::class, 'Argument $c passed to TestPresenter::actionDefault() must be array, integer given.'); +}, Nette\Application\BadRequestException::class, 'Argument $c passed to ParamPresenter::actionDefault() must be array, integer given.'); Assert::exception(function () use ($presenter) { $request = new Application\Request('Test', Http\Request::GET, ['d' => 1]); $presenter->run($request); -}, Nette\Application\BadRequestException::class, 'Argument $d passed to TestPresenter::actionDefault() must be array, integer given.'); +}, Nette\Application\BadRequestException::class, 'Argument $d passed to ParamPresenter::actionDefault() must be array, integer given.'); Assert::exception(function () use ($presenter) { $request = new Application\Request('Test', Http\Request::GET, ['e' => 1.1]); $presenter->run($request); -}, Nette\Application\BadRequestException::class, 'Argument $e passed to TestPresenter::actionDefault() must be integer, double given.'); +}, Nette\Application\BadRequestException::class, 'Argument $e passed to ParamPresenter::actionDefault() must be integer, double given.'); Assert::exception(function () use ($presenter) { $request = new Application\Request('Test', Http\Request::GET, ['e' => '1 ']); $presenter->run($request); -}, Nette\Application\BadRequestException::class, 'Argument $e passed to TestPresenter::actionDefault() must be integer, string given.'); +}, Nette\Application\BadRequestException::class, 'Argument $e passed to ParamPresenter::actionDefault() must be integer, string given.'); Assert::exception(function () use ($presenter) { $request = new Application\Request('Test', Http\Request::GET, ['f' => '1 ']); $presenter->run($request); -}, Nette\Application\BadRequestException::class, 'Argument $f passed to TestPresenter::actionDefault() must be double, string given.'); +}, Nette\Application\BadRequestException::class, 'Argument $f passed to ParamPresenter::actionDefault() must be double, string given.'); Assert::exception(function () use ($presenter) { $request = new Application\Request('Test', Http\Request::GET, ['g' => '']); $presenter->run($request); -}, Nette\Application\BadRequestException::class, 'Argument $g passed to TestPresenter::actionDefault() must be boolean, string given.'); +}, Nette\Application\BadRequestException::class, 'Argument $g passed to ParamPresenter::actionDefault() must be boolean, string given.'); Assert::exception(function () use ($presenter) { $request = new Application\Request('Test', Http\Request::GET, ['bool' => []]); diff --git a/tests/UI/Presenter.parameters.phpt b/tests/UI/Presenter.parameters.phpt index 7008ae8c9..4e3155836 100644 --- a/tests/UI/Presenter.parameters.phpt +++ b/tests/UI/Presenter.parameters.phpt @@ -26,15 +26,15 @@ class TestPresenter extends Application\UI\Presenter protected function startup() { parent::startup(); - throw new Application\AbortException(); + throw new Application\AbortException; } } function createPresenter() { - $presenter = new TestPresenter(); - $presenter->injectPrimary(null, null, null, new Http\Request(new Http\UrlScript()), new Http\Response()); + $presenter = new TestPresenter; + $presenter->injectPrimary(null, null, null, new Http\Request(new Http\UrlScript), new Http\Response); $presenter->autoCanonicalize = false; return $presenter; } diff --git a/tests/UI/Presenter.storeRequest().phpt b/tests/UI/Presenter.storeRequest().phpt index b0ba4bebe..900f55433 100644 --- a/tests/UI/Presenter.storeRequest().phpt +++ b/tests/UI/Presenter.storeRequest().phpt @@ -102,7 +102,7 @@ class MockUser extends Security\User } test(function () { - $presenter = new TestPresenter(); + $presenter = new TestPresenter; $presenter->injectPrimary( null, null, @@ -129,7 +129,7 @@ test(function () { }); test(function () { - $presenter = new TestPresenter(); + $presenter = new TestPresenter; $presenter->injectPrimary( null, null, diff --git a/tests/UI/fixtures/ParamPresenter.php b/tests/UI/fixtures/ParamPresenter.php new file mode 100644 index 000000000..ba5b6a27f --- /dev/null +++ b/tests/UI/fixtures/ParamPresenter.php @@ -0,0 +1,12 @@ +