update
This commit is contained in:
134
.paul/codebase/testing.md
Normal file
134
.paul/codebase/testing.md
Normal file
@@ -0,0 +1,134 @@
|
||||
# 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/<module>/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
|
||||
<phpunit bootstrap="tests/autoload.php">
|
||||
<testsuites>
|
||||
<testsuite name="Unit tests"><directory>tests/unit/</directory></testsuite>
|
||||
<testsuite name="Functional tests"><directory>tests/functional/</directory></testsuite>
|
||||
</testsuites>
|
||||
<logging>
|
||||
<log type="coverage-clover" target="build/clover.xml"/>
|
||||
</logging>
|
||||
</phpunit>
|
||||
```
|
||||
|
||||
## 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/<module>/tests/phpstan/phpstan.neon`:
|
||||
```neon
|
||||
includes:
|
||||
- %currentWorkingDirectory%/vendor/prestashop/php-dev-tools/phpstan/ps-module-extension.neon
|
||||
parameters:
|
||||
paths:
|
||||
- ../../<module>.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*
|
||||
Reference in New Issue
Block a user