From dbeceb0cadad3d7bccc8932577f064001d44ae8f Mon Sep 17 00:00:00 2001 From: Contributte AI Date: Sat, 7 Feb 2026 20:39:31 +0000 Subject: [PATCH 1/5] CI: use PHP 8.2 for QA, add PHP 8.4 and 8.5 tests --- .github/.kodiak.toml | 10 ---------- .github/workflows/tests.yml | 22 ++++++++++++++-------- 2 files changed, 14 insertions(+), 18 deletions(-) delete mode 100644 .github/.kodiak.toml diff --git a/.github/.kodiak.toml b/.github/.kodiak.toml deleted file mode 100644 index 60c34b6..0000000 --- a/.github/.kodiak.toml +++ /dev/null @@ -1,10 +0,0 @@ -version = 1 - -[merge] -automerge_label = "automerge" -blacklist_title_regex = "^WIP.*" -blacklist_labels = ["WIP"] -method = "rebase" -delete_branch_on_merge = true -notify_on_conflict = true -optimistic_updates = false diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a574bd1..7d85dd5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -5,33 +5,39 @@ on: workflow_dispatch: push: - branches: [ "*" ] + branches: ["*"] schedule: - cron: "0 8 * * 1" jobs: - test83: + test85: name: "Nette Tester" uses: contributte/.github/.github/workflows/nette-tester.yml@master with: - php: "8.3" + php: "8.5" - test82: + test84: name: "Nette Tester" uses: contributte/.github/.github/workflows/nette-tester.yml@master with: - php: "8.2" + php: "8.4" - test81: + test83: name: "Nette Tester" uses: contributte/.github/.github/workflows/nette-tester.yml@master with: - php: "8.1" + php: "8.3" + + test82: + name: "Nette Tester" + uses: contributte/.github/.github/workflows/nette-tester.yml@master + with: + php: "8.2" testlower: name: "Nette Tester" uses: contributte/.github/.github/workflows/nette-tester.yml@master with: - php: "8.1" + php: "8.2" composer: "composer update --no-interaction --no-progress --prefer-dist --prefer-stable --prefer-lowest" From 9450c67795be161a866df27e79e8a9875a37c37f Mon Sep 17 00:00:00 2001 From: Contributte AI Date: Sat, 7 Feb 2026 20:39:39 +0000 Subject: [PATCH 2/5] Tests: use .phpt extension, convert to Toolkit::test() --- tests/Cases/WizardTest.php | 428 ------------------------------------ tests/Cases/WizardTest.phpt | 421 +++++++++++++++++++++++++++++++++++ 2 files changed, 421 insertions(+), 428 deletions(-) delete mode 100644 tests/Cases/WizardTest.php create mode 100644 tests/Cases/WizardTest.phpt diff --git a/tests/Cases/WizardTest.php b/tests/Cases/WizardTest.php deleted file mode 100644 index 367c86f..0000000 --- a/tests/Cases/WizardTest.php +++ /dev/null @@ -1,428 +0,0 @@ -start(); - - $wizard = new DummyWizard($session); - $form = $wizard->create(); - - Assert::type(NetteForms::class, $form); - Assert::same('step1', $form->getName()); - - Assert::same(1, $wizard->getCurrentStep()); - Assert::same(1, $wizard->getLastStep()); - - $wizard->setStep(2); - Assert::same(1, $wizard->getCurrentStep()); - - $wizard->setStep(-1); - Assert::same(1, $wizard->getCurrentStep()); - } - - public function testInvalidSubmit(): void - { - $presenter = $this->createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step1-submit', - DummyWizard::NEXT_SUBMIT_NAME => 'true', - ] - ) - ); - - /** @var TextResponse $response */ - $response = $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); - - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - $dom = DomQuery::fromHtml((string) $response->getSource()); - Assert::true($dom->has('#frm-wizard-step1')); - - Assert::same(1, $wizard->getCurrentStep()); - Assert::same(0, DummyWizard::$called); - Assert::same($wizard->create('1'), $wizard->create()); - Assert::same(1, $wizard->getLastStep()); - } - - public function testSubmit(): void - { - $presenter = $this->createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step1-submit', - DummyWizard::NEXT_SUBMIT_NAME => 'true', - 'name' => 'foo', - ] - ) - ); - - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - /** @var TextResponse $response */ - $response = $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); - - $dom = DomQuery::fromHtml((string) $response->getSource()); - Assert::true($dom->has('#frm-wizard-step2')); - - Assert::false($wizard->isSuccess()); - Assert::same(2, $wizard->getCurrentStep()); - Assert::same($wizard->create('2'), $wizard->create()); - Assert::same(2, $wizard->getLastStep()); - Assert::same(0, DummyWizard::$called); - Assert::same([ - 'name' => 'foo', - 'skip' => false, - ], $wizard->getValues(true)); - } - - public function testSubmitBack(): void - { - $presenter = $this->createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - ) - ); - - /** @var TextResponse $response */ - $response = $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: [ - '_do' => 'wizard-step2-submit', - DummyWizard::PREV_SUBMIT_NAME => 'true', - ] - )); - - $dom = DomQuery::fromHtml((string) $response->getSource()); - Assert::true($dom->has('#frm-wizard-step1')); - } - - public function testReset(): void - { - $presenter = $this->createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step1-submit', - 'name' => 'Name', - 'skip' => '0', - DummyWizard::NEXT_SUBMIT_NAME => 'submit', - ] - ) - ); - - $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - Assert::false($wizard->isSuccess()); - Assert::same(0, DummyWizard::$called); - Assert::same([ - 'name' => 'Name', - 'skip' => false, - ], $wizard->getValues(true)); - Assert::same(2, $wizard->getCurrentStep()); - Assert::same(2, $wizard->getLastStep()); - - // Reset wizard - $wizard->reset(); - - Assert::false($wizard->isSuccess()); - Assert::same(0, DummyWizard::$called); - Assert::same([], $wizard->getValues(true)); - Assert::same([], DummyWizard::$values); - Assert::same(1, $wizard->getCurrentStep()); - Assert::same(1, $wizard->getLastStep()); - }; - - $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); - } - - public function testFinish(): void - { - $presenter = $this->createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step3-submit', - 'skip' => 'false', - 'email' => 'email', - DummyWizard::FINISH_SUBMIT_NAME => 'submit', - ] - ) - ); - - $presenter->onStartup[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - /** @var Form $step1 */ - $step1 = $wizard->getComponent('step1'); - $step1->setValues(['name' => 'Name']); - $step1->setSubmittedBy($step1['next']); - $step1->fireEvents(); - - /** @var Form $step2 */ - $step2 = $wizard->getComponent('step2'); - $step2->setValues(['optional' => 'Optional']); - $step2->setSubmittedBy($step2['next']); - $step2->fireEvents(); - }; - - $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - Assert::true($wizard->isSuccess()); - Assert::same(1, DummyWizard::$called); - Assert::same([ - 'name' => 'Name', - 'skip' => false, - 'optional' => 'Optional', - 'email' => 'email', - ], $wizard->getValues(true)); - Assert::same([ - 'name' => 'Name', - 'skip' => false, - 'optional' => 'Optional', - 'email' => 'email', - ], DummyWizard::$values); - Assert::same(1, $wizard->getCurrentStep()); - Assert::same(1, $wizard->getLastStep()); - }; - - /** @var TextResponse $response */ - $response = $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); - - $dom = DomQuery::fromHtml((string) $response->getSource()); - Assert::true($dom->has('#success')); - } - - public function testOptionalStep(): void - { - $presenter = $this->createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step3-submit', - 'skip' => 'false', - 'email' => 'email', - DummyWizard::FINISH_SUBMIT_NAME => 'submit', - ] - ) - ); - - $presenter->onStartup[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - /** @var Form $step1 */ - $step1 = $wizard->getComponent('step1'); - $step1->setValues([ - 'name' => 'Name', - 'skip' => '1', - ]); - $step1->setSubmittedBy($step1['next']); - $step1->fireEvents(); - }; - - $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - Assert::true($wizard->isSuccess()); - Assert::same(1, DummyWizard::$called); - Assert::same([ - 'name' => 'Name', - 'skip' => true, - 'email' => 'email', - ], $wizard->getValues(true)); - Assert::same([ - 'name' => 'Name', - 'skip' => true, - 'email' => 'email', - ], DummyWizard::$values); - Assert::same(1, $wizard->getCurrentStep()); - Assert::same(1, $wizard->getLastStep()); - }; - - /** @var TextResponse $response */ - $response = $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); - - $dom = DomQuery::fromHtml((string) $response->getSource()); - Assert::true($dom->has('#success')); - } - - public function testSkipAll(): void - { - $presenter = $this->createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step3-submit', - 'void' => 'void', - 'email' => 'email', - DummyWizard::FINISH_SUBMIT_NAME => 'submit', - ] - ) - ); - - $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - Assert::false($wizard->isSuccess()); - }; - - /** @var TextResponse $response */ - $response = $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); - - $dom = DomQuery::fromHtml((string) $response->getSource()); - Assert::true(!$dom->has('#success')); - } - - public function testDefaultValues(): void - { - $presenter = $this->createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step1-submit', - 'name' => 'This is default name', - 'skip' => '0', - DummyWizard::NEXT_SUBMIT_NAME => 'submit', - ] - ) - ); - - $presenter->onStartup[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - $defaultValues = $wizard->create()->getValues('array'); - Assert::same([ - 'name' => 'This is default name', - 'skip' => false, - ], $defaultValues); - }; - - $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - Assert::false($wizard->isSuccess()); - - Assert::same(0, DummyWizard::$called); - Assert::same([ - 'name' => 'This is default name', - 'skip' => false, - ], $wizard->getValues(true)); - Assert::same(2, $wizard->getCurrentStep()); - Assert::same(2, $wizard->getLastStep()); - }; - - $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); - } - - private function createPresenter( - ?HttpRequest $httpRequest = null, - ): DummyWizardPresenter - { - $httpRequest ??= new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST' - ); - $httpResponse = new HttpResponse(); - - $templateFactory = new TemplateFactory( - new DummyLatteFactory() - ); - - $presenter = new DummyWizardPresenter(); - $presenter->injectPrimary( - $httpRequest, - $httpResponse, - Mockery::mock(IPresenterFactory::class), - Mockery::mock(Router::class), - null, - null, - $templateFactory - ); - - return $presenter; - } - -} - -(new WizardTest())->run(); diff --git a/tests/Cases/WizardTest.phpt b/tests/Cases/WizardTest.phpt new file mode 100644 index 0000000..ed006a8 --- /dev/null +++ b/tests/Cases/WizardTest.phpt @@ -0,0 +1,421 @@ +injectPrimary( + $httpRequest, + $httpResponse, + Mockery::mock(IPresenterFactory::class), + Mockery::mock(Router::class), + null, + null, + $templateFactory + ); + + return $presenter; +} + +// testSteps +Toolkit::test(function (): void { + $session = new Session( + new HttpRequest(new UrlScript()), + new HttpResponse() + ); + $session->start(); + + $wizard = new DummyWizard($session); + $form = $wizard->create(); + + Assert::type(NetteForms::class, $form); + Assert::same('step1', $form->getName()); + + Assert::same(1, $wizard->getCurrentStep()); + Assert::same(1, $wizard->getLastStep()); + + $wizard->setStep(2); + Assert::same(1, $wizard->getCurrentStep()); + + $wizard->setStep(-1); + Assert::same(1, $wizard->getCurrentStep()); +}); + +// testInvalidSubmit +Toolkit::test(function (): void { + $presenter = createPresenter( + httpRequest: new HttpRequest( + url: new UrlScript('http://localhost'), + method: 'POST', + post: [ + '_do' => 'wizard-step1-submit', + DummyWizard::NEXT_SUBMIT_NAME => 'true', + ] + ) + ); + + /** @var TextResponse $response */ + $response = $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); + + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + $dom = DomQuery::fromHtml((string) $response->getSource()); + Assert::true($dom->has('#frm-wizard-step1')); + + Assert::same(1, $wizard->getCurrentStep()); + Assert::same(0, DummyWizard::$called); + Assert::same($wizard->create('1'), $wizard->create()); + Assert::same(1, $wizard->getLastStep()); +}); + +// testSubmit +Toolkit::test(function (): void { + $presenter = createPresenter( + httpRequest: new HttpRequest( + url: new UrlScript('http://localhost'), + method: 'POST', + post: [ + '_do' => 'wizard-step1-submit', + DummyWizard::NEXT_SUBMIT_NAME => 'true', + 'name' => 'foo', + ] + ) + ); + + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + /** @var TextResponse $response */ + $response = $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); + + $dom = DomQuery::fromHtml((string) $response->getSource()); + Assert::true($dom->has('#frm-wizard-step2')); + + Assert::false($wizard->isSuccess()); + Assert::same(2, $wizard->getCurrentStep()); + Assert::same($wizard->create('2'), $wizard->create()); + Assert::same(2, $wizard->getLastStep()); + Assert::same(0, DummyWizard::$called); + Assert::same([ + 'name' => 'foo', + 'skip' => false, + ], $wizard->getValues(true)); +}); + +// testSubmitBack +Toolkit::test(function (): void { + $presenter = createPresenter( + httpRequest: new HttpRequest( + url: new UrlScript('http://localhost'), + method: 'POST', + ) + ); + + /** @var TextResponse $response */ + $response = $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: [ + '_do' => 'wizard-step2-submit', + DummyWizard::PREV_SUBMIT_NAME => 'true', + ] + )); + + $dom = DomQuery::fromHtml((string) $response->getSource()); + Assert::true($dom->has('#frm-wizard-step1')); +}); + +// testReset +Toolkit::test(function (): void { + $presenter = createPresenter( + httpRequest: new HttpRequest( + url: new UrlScript('http://localhost'), + method: 'POST', + post: [ + '_do' => 'wizard-step1-submit', + 'name' => 'Name', + 'skip' => '0', + DummyWizard::NEXT_SUBMIT_NAME => 'submit', + ] + ) + ); + + $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + Assert::false($wizard->isSuccess()); + Assert::same(0, DummyWizard::$called); + Assert::same([ + 'name' => 'Name', + 'skip' => false, + ], $wizard->getValues(true)); + Assert::same(2, $wizard->getCurrentStep()); + Assert::same(2, $wizard->getLastStep()); + + // Reset wizard + $wizard->reset(); + + Assert::false($wizard->isSuccess()); + Assert::same(0, DummyWizard::$called); + Assert::same([], $wizard->getValues(true)); + Assert::same([], DummyWizard::$values); + Assert::same(1, $wizard->getCurrentStep()); + Assert::same(1, $wizard->getLastStep()); + }; + + $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); +}); + +// testFinish +Toolkit::test(function (): void { + $presenter = createPresenter( + httpRequest: new HttpRequest( + url: new UrlScript('http://localhost'), + method: 'POST', + post: [ + '_do' => 'wizard-step3-submit', + 'skip' => 'false', + 'email' => 'email', + DummyWizard::FINISH_SUBMIT_NAME => 'submit', + ] + ) + ); + + $presenter->onStartup[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + /** @var Form $step1 */ + $step1 = $wizard->getComponent('step1'); + $step1->setValues(['name' => 'Name']); + $step1->setSubmittedBy($step1['next']); + $step1->fireEvents(); + + /** @var Form $step2 */ + $step2 = $wizard->getComponent('step2'); + $step2->setValues(['optional' => 'Optional']); + $step2->setSubmittedBy($step2['next']); + $step2->fireEvents(); + }; + + $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + Assert::true($wizard->isSuccess()); + Assert::same(1, DummyWizard::$called); + Assert::same([ + 'name' => 'Name', + 'skip' => false, + 'optional' => 'Optional', + 'email' => 'email', + ], $wizard->getValues(true)); + Assert::same([ + 'name' => 'Name', + 'skip' => false, + 'optional' => 'Optional', + 'email' => 'email', + ], DummyWizard::$values); + Assert::same(1, $wizard->getCurrentStep()); + Assert::same(1, $wizard->getLastStep()); + }; + + /** @var TextResponse $response */ + $response = $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); + + $dom = DomQuery::fromHtml((string) $response->getSource()); + Assert::true($dom->has('#success')); +}); + +// testOptionalStep +Toolkit::test(function (): void { + $presenter = createPresenter( + httpRequest: new HttpRequest( + url: new UrlScript('http://localhost'), + method: 'POST', + post: [ + '_do' => 'wizard-step3-submit', + 'skip' => 'false', + 'email' => 'email', + DummyWizard::FINISH_SUBMIT_NAME => 'submit', + ] + ) + ); + + $presenter->onStartup[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + /** @var Form $step1 */ + $step1 = $wizard->getComponent('step1'); + $step1->setValues([ + 'name' => 'Name', + 'skip' => '1', + ]); + $step1->setSubmittedBy($step1['next']); + $step1->fireEvents(); + }; + + $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + Assert::true($wizard->isSuccess()); + Assert::same(1, DummyWizard::$called); + Assert::same([ + 'name' => 'Name', + 'skip' => true, + 'email' => 'email', + ], $wizard->getValues(true)); + Assert::same([ + 'name' => 'Name', + 'skip' => true, + 'email' => 'email', + ], DummyWizard::$values); + Assert::same(1, $wizard->getCurrentStep()); + Assert::same(1, $wizard->getLastStep()); + }; + + /** @var TextResponse $response */ + $response = $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); + + $dom = DomQuery::fromHtml((string) $response->getSource()); + Assert::true($dom->has('#success')); +}); + +// testSkipAll +Toolkit::test(function (): void { + $presenter = createPresenter( + httpRequest: new HttpRequest( + url: new UrlScript('http://localhost'), + method: 'POST', + post: [ + '_do' => 'wizard-step3-submit', + 'void' => 'void', + 'email' => 'email', + DummyWizard::FINISH_SUBMIT_NAME => 'submit', + ] + ) + ); + + $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + Assert::false($wizard->isSuccess()); + }; + + /** @var TextResponse $response */ + $response = $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); + + $dom = DomQuery::fromHtml((string) $response->getSource()); + Assert::true(!$dom->has('#success')); +}); + +// testDefaultValues +Toolkit::test(function (): void { + $presenter = createPresenter( + httpRequest: new HttpRequest( + url: new UrlScript('http://localhost'), + method: 'POST', + post: [ + '_do' => 'wizard-step1-submit', + 'name' => 'This is default name', + 'skip' => '0', + DummyWizard::NEXT_SUBMIT_NAME => 'submit', + ] + ) + ); + + $presenter->onStartup[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + $defaultValues = $wizard->create()->getValues('array'); + Assert::same([ + 'name' => 'This is default name', + 'skip' => false, + ], $defaultValues); + }; + + $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + Assert::false($wizard->isSuccess()); + + Assert::same(0, DummyWizard::$called); + Assert::same([ + 'name' => 'This is default name', + 'skip' => false, + ], $wizard->getValues(true)); + Assert::same(2, $wizard->getCurrentStep()); + Assert::same(2, $wizard->getLastStep()); + }; + + $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); +}); From 3181f7a289eaa2c5e6dbcc069eb616e046e7bffc Mon Sep 17 00:00:00 2001 From: Contributte AI Date: Sat, 7 Feb 2026 20:39:47 +0000 Subject: [PATCH 3/5] Config: use PHP 8.2 base, remove obsolete codeception.yml --- codeception.yml | 22 ---------------------- phpstan.neon | 7 +------ ruleset.xml | 2 +- 3 files changed, 2 insertions(+), 29 deletions(-) delete mode 100644 codeception.yml diff --git a/codeception.yml b/codeception.yml deleted file mode 100644 index 6582112..0000000 --- a/codeception.yml +++ /dev/null @@ -1,22 +0,0 @@ -actor: Tester -paths: - tests: tests - output: tests/_output - data: tests/_data - support: tests/Support - envs: tests/_envs -bootstrap: _bootstrap.php -settings: - colors: false - memory_limit: 1024M - reset: true -extensions: - enabled: - - Codeception\Extension\RunFailed -modules: - config: - Db: - dsn: '' - user: '' - password: '' - dump: tests/_data/dump.sql diff --git a/phpstan.neon b/phpstan.neon index 361f176..a8d2236 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -3,7 +3,7 @@ includes: parameters: level: 8 - phpVersion: 80100 + phpVersion: 80200 scanDirectories: - src @@ -14,8 +14,3 @@ parameters: paths: - src - .docs - - ignoreErrors: - - excludePaths: - - src/Latte/WizardMacros.php diff --git a/ruleset.xml b/ruleset.xml index 378cdda..19072cd 100644 --- a/ruleset.xml +++ b/ruleset.xml @@ -1,7 +1,7 @@ - + From 0a9cc19daf8fa22d3fd953606e591099568c6212 Mon Sep 17 00:00:00 2001 From: Contributte AI Date: Sat, 7 Feb 2026 20:39:53 +0000 Subject: [PATCH 4/5] Composer: require PHP 8.2, use full version format --- composer.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index afedebb..08c6d2a 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ } ], "require": { - "php": ">=8.1", + "php": ">=8.2", "nette/forms": "^3.1.14", "nette/http": "^3.2.3" }, @@ -25,9 +25,9 @@ "latte/latte": "^3.0.12", "nette/application": "^3.2.0", "nette/di": "^3.1.8", - "contributte/qa": "^0.4", - "contributte/tester": "^0.3", - "contributte/phpstan": "^0.1", + "contributte/qa": "~0.4.0", + "contributte/tester": "~0.3.0", + "contributte/phpstan": "~0.1.0", "mockery/mockery": "^1.6.7" }, "conflict": { From 578b8f77e945d5d8b52233348c645e76593249e4 Mon Sep 17 00:00:00 2001 From: Contributte AI Date: Sun, 8 Feb 2026 15:36:06 +0000 Subject: [PATCH 5/5] Tests: split WizardTest into individual test files --- tests/Cases/WizardTest.DefaultValues.phpt | 61 ++++ tests/Cases/WizardTest.Finish.phpt | 81 +++++ tests/Cases/WizardTest.InvalidSubmit.phpt | 46 +++ tests/Cases/WizardTest.OptionalStep.phpt | 76 ++++ tests/Cases/WizardTest.Reset.phpt | 59 +++ tests/Cases/WizardTest.SkipAll.phpt | 48 +++ tests/Cases/WizardTest.Steps.phpt | 37 ++ tests/Cases/WizardTest.Submit.phpt | 52 +++ tests/Cases/WizardTest.SubmitBack.phpt | 37 ++ tests/Cases/WizardTest.phpt | 421 ---------------------- tests/Fixtures/WizardPresenterFactory.php | 44 +++ 11 files changed, 541 insertions(+), 421 deletions(-) create mode 100644 tests/Cases/WizardTest.DefaultValues.phpt create mode 100644 tests/Cases/WizardTest.Finish.phpt create mode 100644 tests/Cases/WizardTest.InvalidSubmit.phpt create mode 100644 tests/Cases/WizardTest.OptionalStep.phpt create mode 100644 tests/Cases/WizardTest.Reset.phpt create mode 100644 tests/Cases/WizardTest.SkipAll.phpt create mode 100644 tests/Cases/WizardTest.Steps.phpt create mode 100644 tests/Cases/WizardTest.Submit.phpt create mode 100644 tests/Cases/WizardTest.SubmitBack.phpt delete mode 100644 tests/Cases/WizardTest.phpt create mode 100644 tests/Fixtures/WizardPresenterFactory.php diff --git a/tests/Cases/WizardTest.DefaultValues.phpt b/tests/Cases/WizardTest.DefaultValues.phpt new file mode 100644 index 0000000..50653ee --- /dev/null +++ b/tests/Cases/WizardTest.DefaultValues.phpt @@ -0,0 +1,61 @@ + 'wizard-step1-submit', + 'name' => 'This is default name', + 'skip' => '0', + DummyWizard::NEXT_SUBMIT_NAME => 'submit', + ] + ) + ); + + $presenter->onStartup[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + $defaultValues = $wizard->create()->getValues('array'); + Assert::same([ + 'name' => 'This is default name', + 'skip' => false, + ], $defaultValues); + }; + + $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + Assert::false($wizard->isSuccess()); + + Assert::same(0, DummyWizard::$called); + Assert::same([ + 'name' => 'This is default name', + 'skip' => false, + ], $wizard->getValues(true)); + Assert::same(2, $wizard->getCurrentStep()); + Assert::same(2, $wizard->getLastStep()); + }; + + $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); +}); diff --git a/tests/Cases/WizardTest.Finish.phpt b/tests/Cases/WizardTest.Finish.phpt new file mode 100644 index 0000000..fba5a18 --- /dev/null +++ b/tests/Cases/WizardTest.Finish.phpt @@ -0,0 +1,81 @@ + 'wizard-step3-submit', + 'skip' => 'false', + 'email' => 'email', + DummyWizard::FINISH_SUBMIT_NAME => 'submit', + ] + ) + ); + + $presenter->onStartup[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + /** @var Form $step1 */ + $step1 = $wizard->getComponent('step1'); + $step1->setValues(['name' => 'Name']); + $step1->setSubmittedBy($step1['next']); + $step1->fireEvents(); + + /** @var Form $step2 */ + $step2 = $wizard->getComponent('step2'); + $step2->setValues(['optional' => 'Optional']); + $step2->setSubmittedBy($step2['next']); + $step2->fireEvents(); + }; + + $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + Assert::true($wizard->isSuccess()); + Assert::same(1, DummyWizard::$called); + Assert::same([ + 'name' => 'Name', + 'skip' => false, + 'optional' => 'Optional', + 'email' => 'email', + ], $wizard->getValues(true)); + Assert::same([ + 'name' => 'Name', + 'skip' => false, + 'optional' => 'Optional', + 'email' => 'email', + ], DummyWizard::$values); + Assert::same(1, $wizard->getCurrentStep()); + Assert::same(1, $wizard->getLastStep()); + }; + + /** @var TextResponse $response */ + $response = $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); + + $dom = DomQuery::fromHtml((string) $response->getSource()); + Assert::true($dom->has('#success')); +}); diff --git a/tests/Cases/WizardTest.InvalidSubmit.phpt b/tests/Cases/WizardTest.InvalidSubmit.phpt new file mode 100644 index 0000000..7e4ccfb --- /dev/null +++ b/tests/Cases/WizardTest.InvalidSubmit.phpt @@ -0,0 +1,46 @@ + 'wizard-step1-submit', + DummyWizard::NEXT_SUBMIT_NAME => 'true', + ] + ) + ); + + /** @var TextResponse $response */ + $response = $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); + + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + $dom = DomQuery::fromHtml((string) $response->getSource()); + Assert::true($dom->has('#frm-wizard-step1')); + + Assert::same(1, $wizard->getCurrentStep()); + Assert::same(0, DummyWizard::$called); + Assert::same($wizard->create('1'), $wizard->create()); + Assert::same(1, $wizard->getLastStep()); +}); diff --git a/tests/Cases/WizardTest.OptionalStep.phpt b/tests/Cases/WizardTest.OptionalStep.phpt new file mode 100644 index 0000000..42f1570 --- /dev/null +++ b/tests/Cases/WizardTest.OptionalStep.phpt @@ -0,0 +1,76 @@ + 'wizard-step3-submit', + 'skip' => 'false', + 'email' => 'email', + DummyWizard::FINISH_SUBMIT_NAME => 'submit', + ] + ) + ); + + $presenter->onStartup[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + /** @var Form $step1 */ + $step1 = $wizard->getComponent('step1'); + $step1->setValues([ + 'name' => 'Name', + 'skip' => '1', + ]); + $step1->setSubmittedBy($step1['next']); + $step1->fireEvents(); + }; + + $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + Assert::true($wizard->isSuccess()); + Assert::same(1, DummyWizard::$called); + Assert::same([ + 'name' => 'Name', + 'skip' => true, + 'email' => 'email', + ], $wizard->getValues(true)); + Assert::same([ + 'name' => 'Name', + 'skip' => true, + 'email' => 'email', + ], DummyWizard::$values); + Assert::same(1, $wizard->getCurrentStep()); + Assert::same(1, $wizard->getLastStep()); + }; + + /** @var TextResponse $response */ + $response = $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); + + $dom = DomQuery::fromHtml((string) $response->getSource()); + Assert::true($dom->has('#success')); +}); diff --git a/tests/Cases/WizardTest.Reset.phpt b/tests/Cases/WizardTest.Reset.phpt new file mode 100644 index 0000000..af2326d --- /dev/null +++ b/tests/Cases/WizardTest.Reset.phpt @@ -0,0 +1,59 @@ + 'wizard-step1-submit', + 'name' => 'Name', + 'skip' => '0', + DummyWizard::NEXT_SUBMIT_NAME => 'submit', + ] + ) + ); + + $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + Assert::false($wizard->isSuccess()); + Assert::same(0, DummyWizard::$called); + Assert::same([ + 'name' => 'Name', + 'skip' => false, + ], $wizard->getValues(true)); + Assert::same(2, $wizard->getCurrentStep()); + Assert::same(2, $wizard->getLastStep()); + + // Reset wizard + $wizard->reset(); + + Assert::false($wizard->isSuccess()); + Assert::same(0, DummyWizard::$called); + Assert::same([], $wizard->getValues(true)); + Assert::same([], DummyWizard::$values); + Assert::same(1, $wizard->getCurrentStep()); + Assert::same(1, $wizard->getLastStep()); + }; + + $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); +}); diff --git a/tests/Cases/WizardTest.SkipAll.phpt b/tests/Cases/WizardTest.SkipAll.phpt new file mode 100644 index 0000000..6a88089 --- /dev/null +++ b/tests/Cases/WizardTest.SkipAll.phpt @@ -0,0 +1,48 @@ + 'wizard-step3-submit', + 'void' => 'void', + 'email' => 'email', + DummyWizard::FINISH_SUBMIT_NAME => 'submit', + ] + ) + ); + + $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + Assert::false($wizard->isSuccess()); + }; + + /** @var TextResponse $response */ + $response = $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); + + $dom = DomQuery::fromHtml((string) $response->getSource()); + Assert::true(!$dom->has('#success')); +}); diff --git a/tests/Cases/WizardTest.Steps.phpt b/tests/Cases/WizardTest.Steps.phpt new file mode 100644 index 0000000..6d13e3e --- /dev/null +++ b/tests/Cases/WizardTest.Steps.phpt @@ -0,0 +1,37 @@ +start(); + + $wizard = new DummyWizard($session); + $form = $wizard->create(); + + Assert::type(NetteForms::class, $form); + Assert::same('step1', $form->getName()); + + Assert::same(1, $wizard->getCurrentStep()); + Assert::same(1, $wizard->getLastStep()); + + $wizard->setStep(2); + Assert::same(1, $wizard->getCurrentStep()); + + $wizard->setStep(-1); + Assert::same(1, $wizard->getCurrentStep()); +}); diff --git a/tests/Cases/WizardTest.Submit.phpt b/tests/Cases/WizardTest.Submit.phpt new file mode 100644 index 0000000..5c5101d --- /dev/null +++ b/tests/Cases/WizardTest.Submit.phpt @@ -0,0 +1,52 @@ + 'wizard-step1-submit', + DummyWizard::NEXT_SUBMIT_NAME => 'true', + 'name' => 'foo', + ] + ) + ); + + /** @var DummyWizard $wizard */ + $wizard = $presenter->getComponent('wizard'); + + /** @var TextResponse $response */ + $response = $presenter->run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: $presenter->getHttpRequest()->getPost(), + )); + + $dom = DomQuery::fromHtml((string) $response->getSource()); + Assert::true($dom->has('#frm-wizard-step2')); + + Assert::false($wizard->isSuccess()); + Assert::same(2, $wizard->getCurrentStep()); + Assert::same($wizard->create('2'), $wizard->create()); + Assert::same(2, $wizard->getLastStep()); + Assert::same(0, DummyWizard::$called); + Assert::same([ + 'name' => 'foo', + 'skip' => false, + ], $wizard->getValues(true)); +}); diff --git a/tests/Cases/WizardTest.SubmitBack.phpt b/tests/Cases/WizardTest.SubmitBack.phpt new file mode 100644 index 0000000..ffd58aa --- /dev/null +++ b/tests/Cases/WizardTest.SubmitBack.phpt @@ -0,0 +1,37 @@ +run(new AppRequest( + name: 'test', + method: $presenter->getHttpRequest()->getMethod(), + post: [ + '_do' => 'wizard-step2-submit', + DummyWizard::PREV_SUBMIT_NAME => 'true', + ] + )); + + $dom = DomQuery::fromHtml((string) $response->getSource()); + Assert::true($dom->has('#frm-wizard-step1')); +}); diff --git a/tests/Cases/WizardTest.phpt b/tests/Cases/WizardTest.phpt deleted file mode 100644 index ed006a8..0000000 --- a/tests/Cases/WizardTest.phpt +++ /dev/null @@ -1,421 +0,0 @@ -injectPrimary( - $httpRequest, - $httpResponse, - Mockery::mock(IPresenterFactory::class), - Mockery::mock(Router::class), - null, - null, - $templateFactory - ); - - return $presenter; -} - -// testSteps -Toolkit::test(function (): void { - $session = new Session( - new HttpRequest(new UrlScript()), - new HttpResponse() - ); - $session->start(); - - $wizard = new DummyWizard($session); - $form = $wizard->create(); - - Assert::type(NetteForms::class, $form); - Assert::same('step1', $form->getName()); - - Assert::same(1, $wizard->getCurrentStep()); - Assert::same(1, $wizard->getLastStep()); - - $wizard->setStep(2); - Assert::same(1, $wizard->getCurrentStep()); - - $wizard->setStep(-1); - Assert::same(1, $wizard->getCurrentStep()); -}); - -// testInvalidSubmit -Toolkit::test(function (): void { - $presenter = createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step1-submit', - DummyWizard::NEXT_SUBMIT_NAME => 'true', - ] - ) - ); - - /** @var TextResponse $response */ - $response = $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); - - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - $dom = DomQuery::fromHtml((string) $response->getSource()); - Assert::true($dom->has('#frm-wizard-step1')); - - Assert::same(1, $wizard->getCurrentStep()); - Assert::same(0, DummyWizard::$called); - Assert::same($wizard->create('1'), $wizard->create()); - Assert::same(1, $wizard->getLastStep()); -}); - -// testSubmit -Toolkit::test(function (): void { - $presenter = createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step1-submit', - DummyWizard::NEXT_SUBMIT_NAME => 'true', - 'name' => 'foo', - ] - ) - ); - - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - /** @var TextResponse $response */ - $response = $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); - - $dom = DomQuery::fromHtml((string) $response->getSource()); - Assert::true($dom->has('#frm-wizard-step2')); - - Assert::false($wizard->isSuccess()); - Assert::same(2, $wizard->getCurrentStep()); - Assert::same($wizard->create('2'), $wizard->create()); - Assert::same(2, $wizard->getLastStep()); - Assert::same(0, DummyWizard::$called); - Assert::same([ - 'name' => 'foo', - 'skip' => false, - ], $wizard->getValues(true)); -}); - -// testSubmitBack -Toolkit::test(function (): void { - $presenter = createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - ) - ); - - /** @var TextResponse $response */ - $response = $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: [ - '_do' => 'wizard-step2-submit', - DummyWizard::PREV_SUBMIT_NAME => 'true', - ] - )); - - $dom = DomQuery::fromHtml((string) $response->getSource()); - Assert::true($dom->has('#frm-wizard-step1')); -}); - -// testReset -Toolkit::test(function (): void { - $presenter = createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step1-submit', - 'name' => 'Name', - 'skip' => '0', - DummyWizard::NEXT_SUBMIT_NAME => 'submit', - ] - ) - ); - - $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - Assert::false($wizard->isSuccess()); - Assert::same(0, DummyWizard::$called); - Assert::same([ - 'name' => 'Name', - 'skip' => false, - ], $wizard->getValues(true)); - Assert::same(2, $wizard->getCurrentStep()); - Assert::same(2, $wizard->getLastStep()); - - // Reset wizard - $wizard->reset(); - - Assert::false($wizard->isSuccess()); - Assert::same(0, DummyWizard::$called); - Assert::same([], $wizard->getValues(true)); - Assert::same([], DummyWizard::$values); - Assert::same(1, $wizard->getCurrentStep()); - Assert::same(1, $wizard->getLastStep()); - }; - - $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); -}); - -// testFinish -Toolkit::test(function (): void { - $presenter = createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step3-submit', - 'skip' => 'false', - 'email' => 'email', - DummyWizard::FINISH_SUBMIT_NAME => 'submit', - ] - ) - ); - - $presenter->onStartup[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - /** @var Form $step1 */ - $step1 = $wizard->getComponent('step1'); - $step1->setValues(['name' => 'Name']); - $step1->setSubmittedBy($step1['next']); - $step1->fireEvents(); - - /** @var Form $step2 */ - $step2 = $wizard->getComponent('step2'); - $step2->setValues(['optional' => 'Optional']); - $step2->setSubmittedBy($step2['next']); - $step2->fireEvents(); - }; - - $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - Assert::true($wizard->isSuccess()); - Assert::same(1, DummyWizard::$called); - Assert::same([ - 'name' => 'Name', - 'skip' => false, - 'optional' => 'Optional', - 'email' => 'email', - ], $wizard->getValues(true)); - Assert::same([ - 'name' => 'Name', - 'skip' => false, - 'optional' => 'Optional', - 'email' => 'email', - ], DummyWizard::$values); - Assert::same(1, $wizard->getCurrentStep()); - Assert::same(1, $wizard->getLastStep()); - }; - - /** @var TextResponse $response */ - $response = $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); - - $dom = DomQuery::fromHtml((string) $response->getSource()); - Assert::true($dom->has('#success')); -}); - -// testOptionalStep -Toolkit::test(function (): void { - $presenter = createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step3-submit', - 'skip' => 'false', - 'email' => 'email', - DummyWizard::FINISH_SUBMIT_NAME => 'submit', - ] - ) - ); - - $presenter->onStartup[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - /** @var Form $step1 */ - $step1 = $wizard->getComponent('step1'); - $step1->setValues([ - 'name' => 'Name', - 'skip' => '1', - ]); - $step1->setSubmittedBy($step1['next']); - $step1->fireEvents(); - }; - - $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - Assert::true($wizard->isSuccess()); - Assert::same(1, DummyWizard::$called); - Assert::same([ - 'name' => 'Name', - 'skip' => true, - 'email' => 'email', - ], $wizard->getValues(true)); - Assert::same([ - 'name' => 'Name', - 'skip' => true, - 'email' => 'email', - ], DummyWizard::$values); - Assert::same(1, $wizard->getCurrentStep()); - Assert::same(1, $wizard->getLastStep()); - }; - - /** @var TextResponse $response */ - $response = $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); - - $dom = DomQuery::fromHtml((string) $response->getSource()); - Assert::true($dom->has('#success')); -}); - -// testSkipAll -Toolkit::test(function (): void { - $presenter = createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step3-submit', - 'void' => 'void', - 'email' => 'email', - DummyWizard::FINISH_SUBMIT_NAME => 'submit', - ] - ) - ); - - $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - Assert::false($wizard->isSuccess()); - }; - - /** @var TextResponse $response */ - $response = $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); - - $dom = DomQuery::fromHtml((string) $response->getSource()); - Assert::true(!$dom->has('#success')); -}); - -// testDefaultValues -Toolkit::test(function (): void { - $presenter = createPresenter( - httpRequest: new HttpRequest( - url: new UrlScript('http://localhost'), - method: 'POST', - post: [ - '_do' => 'wizard-step1-submit', - 'name' => 'This is default name', - 'skip' => '0', - DummyWizard::NEXT_SUBMIT_NAME => 'submit', - ] - ) - ); - - $presenter->onStartup[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - $defaultValues = $wizard->create()->getValues('array'); - Assert::same([ - 'name' => 'This is default name', - 'skip' => false, - ], $defaultValues); - }; - - $presenter->onShutdown[] = function (DummyWizardPresenter $presenter): void { - /** @var DummyWizard $wizard */ - $wizard = $presenter->getComponent('wizard'); - - Assert::false($wizard->isSuccess()); - - Assert::same(0, DummyWizard::$called); - Assert::same([ - 'name' => 'This is default name', - 'skip' => false, - ], $wizard->getValues(true)); - Assert::same(2, $wizard->getCurrentStep()); - Assert::same(2, $wizard->getLastStep()); - }; - - $presenter->run(new AppRequest( - name: 'test', - method: $presenter->getHttpRequest()->getMethod(), - post: $presenter->getHttpRequest()->getPost(), - )); -}); diff --git a/tests/Fixtures/WizardPresenterFactory.php b/tests/Fixtures/WizardPresenterFactory.php new file mode 100644 index 0000000..2e39de5 --- /dev/null +++ b/tests/Fixtures/WizardPresenterFactory.php @@ -0,0 +1,44 @@ +injectPrimary( + $httpRequest, + $httpResponse, + Mockery::mock(IPresenterFactory::class), + Mockery::mock(Router::class), + null, + null, + $templateFactory + ); + + return $presenter; + } + +}