Skip to content

[Feature] PHPUnit: каркас + 2–3 unit-теста на чистые функции #395

Description

@Ibochkarev

Описание функции

После CI-гейта (#337 / #394) следующий шаг по покрытию: подключить PHPUnit (или Pest) в core/components/minishop3 и перенести/добавить 2–3 unit-теста на чистые функции без MODX/MySQL. Smoke-скрипты в tests/*Test.php остаются; PHPUnit — параллельный слой с нормальными assertions и автодискавери.

Проблема, которую решает

  • Standalone smoke-скрипты дублируют $fail / assertSame и плохо масштабируются.
  • Горячие пути (Cart/Order/auth/ImportCSV) почти без покрытия; сразу PHPUnit «на всё» дорого.
  • В [Feature] CI: lint + smoke-тесты на PR (PHP / vueManager) #337 уже заложено: «Позже (отдельным PR): PHPUnit/Pest + пара unit-тестов на чистые функции».

Предлагаемое решение

Минимальный каркас (отдельный PR, без e2e MODX):

  1. Dev-зависимость PHPUnit 10+/11+ в core/components/minishop3/composer.json (+ phpunit.xml.dist).
  2. Каталог tests/Unit/ (или tests/unit/) с PSR-4 autoload-dev.
  3. Первые тесты (выбрать 2–3 из списка; остальное — follow-up):
    • Utils::parseImportedOptionValue — уже есть smoke; перенести кейсы в PHPUnit.
    • ms3PhinxExtractDsnCharset / ms3PhinxNormalizeMysqlCharset / ms3PhinxDefaultMysqlCollation — чистые функции в phinx.php (сейчас косвенно через full require).
    • EmailVerificationService::buildDefaultVerifyRequestUrl — уже есть smoke; перенести.
  4. CI: job/step composer test / vendor/bin/phpunit рядом с composer ci:php (или внутри ci:php).
  5. Не трогать Cart/Order/ImportCSV в этом PR.

Альтернативные варианты

  • Pest вместо PHPUnit — ок, если команде удобнее; критерий тот же (F.I.R.S.T., без MODX).
  • Только обернуть smoke в PHPUnit без новых кейсов — слабее, но разблокирует каркас.
  • Сразу интеграционные тесты с MySQL — нет; отдельный трек.

Примеры использования

cd core/components/minishop3
composer install
vendor/bin/phpunit
# или
composer test

Критерии приёмки

  • PHPUnit (или Pest) ставится через Composer, конфиг в репо.
  • ≥2 unit-теста на чистые функции; проходят без MODX/MySQL.
  • CI падает при падении PHPUnit.
  • Документирован локальный запуск (PR template / комментарий в composer.json scripts).
  • Существующие smoke (composer test:smoke / ci:php) не ломаются; план миграции smoke→Unit можно описать в PR, не обязан завершиться в первом PR.

Дополнительный контекст

Связь: follow-up к #337. Дальше расширять список: парсеры CSV, filter keys, затем сервисы с тонкими стабами (не полный e2e).

F.I.R.S.T.: Fast / Independent / Repeatable / Self-validating / Timely.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestpriority: mediumСредний приоритетtech-debtMaintainability / refactor / architecture debt

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions