Problem/Motivation
orchestra declares ^11.3 || ^12 since 1.0.0-alpha14, and the next-major lane is green. That green rests on 12 test classes skipping themselves through DependencyWithoutDrupal12Trait, which proves nothing about those classes on Drupal 12. Seven of them boot webform, and they hold 34 of the 57 test methods gated this way.
The lenient composer plugin gets a project past composer and the module installer. It cannot make its code run, so skipping was the only honest option available at the time. It leaves the seven classes that cover the webform interaction unexercised against a core version this module now claims to support.
Proposed resolution
Do for webform what #3618662: Test the Drupal 12 lane against patched dependencies instead of skipping eighteen classes did for pdv: patch it on the next-major lane only, through _COMPOSER_PATCHES_FILE scoped to the composer (next major) job, so the current lane keeps installing released dependencies untouched. Most of the setup is already here. orchestra opts into the lane, already lists webform in _LENIENT_ALLOW_LIST, and already carries the phpunit (next major) block that unsets SYMFONY_DEPRECATIONS_HELPER. What is missing is the patches file and that one job override.
Seven upstream changes are needed, each already filed with a merge request, so every entry points at the diff rather than carrying a copy of it:
- #3618362: Align definitions of getSortedDefinitions and getGroupedDefinitions with core and its !928, for the
CategorizingPluginManagerTraitsignature core 12 tightened. Three of webform's plugin managers overridegetGroupedDefinitions()without the added argument (Handler, Variant and Element), so all three have to be covered: fixing only the one the fatal names moves the fatal to the next manager to load. - #3618665: webform_submission.exporter injects plugin.manager.archiver, which Drupal 12 removes and its !929, for the
plugin.manager.archiverservice core 12 removes. - #3618674: The removed $entity->original magic property is still used in five places, breaking Drupal 12 and its !930, for the
$entity->originalmagic property core 12 removes. - #3537314: file_get_content_headers() is deprecated in 11.2.0 and its !658, for the
file_get_content_headers()function core 12 removes. - #3618696: Commit transactions explicitly instead of letting them go out of scope and its !931, for committing a Transaction by letting it go out of scope, deprecated in 11.5 and removed in 13.0. That is a 13.0 removal rather than a 12.0 one, so it never affected the Drupal 12 claim on its own.
- #3585813: Replace calls to deprecated method get() of class Symfony\Component\HttpFoundation\Request and its !862, for
Request::get(), which Symfony 8 removes.WebformAjaxFormTrait::isDialog()calls it on every handler form, so without this one, configuring the orchestra handler answers 500 and every later assertion in those classes fails on a page that never rendered. - #3618889: Drupal 12 removes theme hook includes, so webform's preprocess functions never run and a webform renders empty and its !932, filed from this work, for the theme hook
includesmechanism core 12 removes. webform attachesfileto every theme hook, so on Drupal 12 none of its 31template_preprocess_*()functions is loaded or run and every webform renders as an empty form element, with nothing logged to say why.
pdv runs this exact set today: its phpunit (next major) job reports 436 passing with 0 errors and 0 skips against core 12.x-dev. Measured on orchestra's own lane, before and after: phpunit (next major) goes from 980 passing with 9 failures and 12 fully-skipped classes, to 989 passing with 0 failures, 0 errors and 0 skips across 227 classes.
Then the seven skipWithoutDrupal12('webform') calls come out, along with the webform entry in the trait. The trait itself stays: five classes still skip on views_bulk_operations, easy_email, simple_oauth and bpmn_io.
Each patch entry stops working when its upstream change lands in a release, because the patch then no longer applies and composer (next major) fails. COMPOSER_EXIT_ON_PATCH_FAILURE is what makes that moment loud: composer-patches otherwise writes "Could not apply patch! Skipping." and lets composer succeed, which would surface as a phpunit fatal and read as a new bug. When webform ships a release carrying these fixes, the follow-up is to drop the entries and raise the webform floor in composer.json, not to restore the skip.
Three of webform's own deprecation families also had to be ignored on the lane, because core's run-tests.sh adds --fail-on-deprecation and its Functional classes raise around 220 each: the native-return-type family, which was already ignored for the other contributed dependencies and only needed webform adding to the list, plus its annotation-based plugins and two smaller families. None of it is orchestra's to fix, and each line goes as webform converts.
Remaining tasks
The other four projects have no upstream fix to point at; every open merge request in all four queues was checked. views_bulk_operations (2 classes) breaks on ViewsBulkOperationsEventSubscriber::getSubscribedEvents() against the Symfony 8 interface, which looks like the smallest of the four and is the natural next one. easy_email (1 class) delivers an empty mail body, a symptom with no diagnosed cause yet. bpmn_io (1 class) never mounts its modeler, and ships no FunctionalJavascript tests at all, so nothing upstream has ever run it against core 12. simple_oauth (1 class) ends the test child process during site install, and is worth re-testing before anything is filed: pdv boots simple_oauth in three Kernel classes on a green Drupal 12 lane with no patch at all, though those classes install no site.
User interface changes
None.
API changes
None. CI configuration and test gating only.
AI-Generated: Yes (Claude Code was used to help draft this issue summary and to write the change on the merge request, including the webform fix filed as #3618889: Drupal 12 removes theme hook includes, so webform's preprocess functions never run and a webform renders empty. I reviewed the work. The counts above are read off the two next-major job logs.)
Issue fork orchestra-3618872
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #3
mably commentedComment #4
mably commentedComment #6
mably commented