Skip to content

Magento traps ​

Failures that look like an extension's fault and are not. Each one was found the expensive way; most are now caught by doctor or repaired by init.

Nearly all present identically: PHPUnit executed 0 tests, which reads as "this extension ships no tests".

The integration install ​

A declared service that is not running. The install-config declared an AMQP broker at 127.0.0.1:5672 on cells that run none. setup:install validates the connection and aborts. doctor's test services check now tries every <service>-host the config names.

mysqldump without --skip-ssl. The framework writes its own --defaults-file with only user and password. A MariaDB client requires TLS by default and these servers offer none, so storeDbDump() dies before any test runs. --defaults-file suppresses ~/.my.cnf, so the flag must go in the file the framework generates.

A shared search namespace. Every cell's integration install used the default magento2_* prefix on one OpenSearch, so cells running in parallel overwrote each other's indices. Search tests then failed differently on every run.

A reused sandbox. The framework builds a sandbox and reuses it. Under a different module set, its compiled DI describes classes the sandbox does not have.

PHPUnit ​

The major must match the platform. Magento ≤2.4.7 implements PHPUnit\Framework\TestListener, removed in PHPUnit 10 — installing 10.x there dies in bootstrap. 2.4.8 and 2.4.9 want 10.x, MageOS 3.4 wants 12.x. Read it off Adobe's metapackage rather than assuming: composer show magento/project-community-edition <version> --all.

exclude-from-classmap: **/Test/**. Magento's blanket pattern also matches PHPUnit's own src/Event/Events/Test/, so PHPUnit 10+ cannot autoload its event system. MageOS ships a narrower list; Magento does not.

A phpunit.xml extension that is not installed. Magento registers an Allure extension. PHPUnit 9 treats a missing extension class as fatal; PHPUnit 10 only warns — which is why the same suite ran on one cell and not another.

One path argument. PHPUnit 9 reads a single path and silently ignores the rest. Passing five suite directories tested one of them and reported a clean pass.

The cell ​

Two-factor auth. Magento 2.4 enables Magento_TwoFactorAuth by default, and an admin login lands on "You need to configure Two-Factor Authorization" — blocking every admin browser test. Disabling the modules on the cell alone breaks the integration install, because the framework's sandbox installs with all modules enabled and the cell's compiled DI has no preference for the interfaces. Both sides must agree: disable them on the cell and pass disable-modules in the integration install-config.

Production mode left behind. An interrupted production gate leaves the cell in production mode. With pub/static/deployed_version.txt missing, every page becomes "There has been an error processing your request" — which the render checks report as zero products.

Maintenance mode is a file. var/.maintenance.flag survives every database restore. A run killed during deploy:mode:set leaves it, and every page answers "Unable to proceed".

Stray modules in app/code. Two cells carried 26 of Magento's own test-fixture modules copied from dev/tests/integration/_files. One declares a di.xml preference for a class it does not contain, so setup:di:compile failed on those cells and no others — after a clean install and upgrade.

cache:flush is not enough. Remove var/cache and var/page_cache outright.

Installing by composer ​

Package names are lowercase. A Vendor/Name in install.packages is a schema error, not a case-insensitive match; composer itself lowercases on the way in.

A path repository's options.versions overrides the declared version. Furnace relies on it to give unversioned modules a version for one run without writing to the extension.

A path repository whose URL is gone breaks every composer command. The staged copy is removed only after the golden composer.json is back, never before.

The cell's platform_check.php refuses the wrong PHP. A cell's vendor is built for its own PHP; m248 requires 8.4 and refuses furnace's 8.3 outright. Every tool run against installed packages (PHPUnit, PHPStan, PHPCS) uses the cell's binary.

Rector skipped the whole harness. Its skip list excluded */vendor/* globally, which is exactly where a harness's modules live, and it reported "Rector is done!" in under a second. Skips are now per module path (<path>/vendor/*), and a test plants PHP 8.3 syntax in a vendor-path module to prove it is scanned.

Fresh install ​

setup:install exits zero on failed parameter validation. It has done so with no env.php to show for it. The gate passes only when the files exist and the database has tables.

Shared OpenSearch. A fresh install with the cell's own index prefix could overwrite the golden's indices. The gate installs with <cell>_fresh.

A cell without env.php vanishes. Discovery requires it, so an interrupted fresh install would hide the cell from the very commands that recover it. Discovery falls back to the golden copy of env.php when the live one is missing.

Credentials ​

A stale global auth.json can break a healthy cell. The first credential sync preferred the global file and replaced a working cell token with a rejected one within a minute. The sync now replaces a cell credential only when the registry refuses it and accepts the global one; a refused global credential is reported as stale and never copied. Furnace stores no credentials of its own.

The environment ​

PHP-FPM does not return after a reboot. magebox installs no boot-time unit. nginx answers, nothing is behind it, every cell renders zero products. magebox start --all.

libxml 2.12.10 rejects Magento ≤2.4.7's esconfig.xsd (Unique Particle Attribution). It breaks catalogsearch silently.

Furnace 1.0.0-alpha · internal tooling · qoliber.com