# Testing Patterns **Analysis Date:** 2026-05-10 ## Test Framework **Runner:** - PHPUnit (~5.7) — present only in select PrestaShop-shipped modules, NOT at project root - Mockery — used by `modules/ps_facetedsearch/` **Assertion Library:** - PHPUnit built-in assertions - Mockery for mocks: `Mockery::mock(Configuration::class)` **Run Commands:** - **No project-level test command exists.** Custom modules (`modules/crosssellpro/`, `modules/caraty/`) have no test suites. - For modules that ship tests: ```bash cd modules/ps_facetedsearch && php vendor/bin/phpunit -c tests/php/phpunit.xml cd modules/gamification && php vendor/bin/phpunit ``` ## Test File Organization **Location:** - Per-module: `modules//tests/` - No root-level `tests/` directory - No collocated tests **Examples (third-party PrestaShop modules):** - `modules/ps_facetedsearch/tests/php/FacetedSearch/Filters/BlockTest.php` - `modules/gamification/tests/unit/AdviceTest.php` - `modules/gamification/tests/functional/` **Naming:** - `*Test.php` suffix - PSR-4 namespace under `Tests\` **Custom modules in this project:** - `modules/crosssellpro/` — **NO tests directory** - `modules/caraty/` — **NO tests directory** ## Test Structure Example from `modules/ps_facetedsearch/tests/php/FacetedSearch/Filters/BlockTest.php`: ```php namespace PrestaShop\Module\FacetedSearch\Tests\Filters; use Mockery; use Mockery\Adapter\Phpunit\MockeryTestCase; class BlockTest extends MockeryTestCase { protected function setUp() { $mock = Mockery::mock(Configuration::class); $mock->shouldReceive('get')->andReturnUsing(function ($arg) { /* … */ }); } } ``` PHPUnit config example (`modules/gamification/phpunit.xml`): ```xml tests/unit/ tests/functional/ ``` ## Mocking **Framework:** - Mockery (in modules that test, e.g. `ps_facetedsearch`) **Pattern:** ```php $mock = Mockery::mock(Configuration::class); $mock->shouldReceive('get')->andReturn('value'); ``` ## Static Analysis **PHPStan:** - Configured in 40+ PrestaShop modules via `prestashop/php-dev-tools` - Standard config — `modules//tests/phpstan/phpstan.neon`: ```neon includes: - %currentWorkingDirectory%/vendor/prestashop/php-dev-tools/phpstan/ps-module-extension.neon parameters: paths: - ../../.php level: 5 ``` - **No project-root PHPStan config.** **PHP-CS-Fixer:** - Some module `composer.json` scripts reference it: `"lint": ["php-cs-fixer fix --no-interaction --dry-run --diff"]` - **No project-root config.** ## Coverage - No project-wide coverage target - `modules/gamification/phpunit.xml` writes Clover output to `build/clover.xml` - No CI enforcement detected ## Test Types **Unit tests:** Present in some PS modules (`modules/gamification/tests/unit/`). **Functional tests:** Present in `modules/gamification/tests/functional/`, `modules/ps_facetedsearch/tests/php/`. **E2E:** None detected. ## Inferred Testing Strategy for This Project Custom code (`modules/crosssellpro/`, `modules/caraty/`, `import-product.php`, `buy-by-phone.php`) is tested **manually** in browser: - Verify cross-sell carousel renders on cart page (`/cart`) and checkout summary - Verify "add to cart" works for products without combinations - Verify products with combinations link to product detail page - Smoke-test admin via `iadmin/` - No regression suite — every change is risk **If adding tests in the future:** - Use PrestaShop's `prestashop/php-dev-tools` package per-module pattern - Place under `modules/crosssellpro/tests/` mirroring PS conventions - Mock `Db`, `Context`, `Module` core dependencies via Mockery --- *Testing analysis: 2026-05-10* *Update when test patterns change*