diff --git a/automatic_updates_extensions/src/Form/UpdaterForm.php b/automatic_updates_extensions/src/Form/UpdaterForm.php index d7e6545d2e0aec0e2498c4b2c446b05264beffea..a4111421ed1b4065b636922a0a014c2047345a6e 100644 --- a/automatic_updates_extensions/src/Form/UpdaterForm.php +++ b/automatic_updates_extensions/src/Form/UpdaterForm.php @@ -13,6 +13,7 @@ use Drupal\Core\State\StateInterface; use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\Render\RendererInterface; use Drupal\Core\Url; +use Drupal\package_manager\ProjectInfo; use Drupal\system\SystemManager; use Drupal\update\UpdateManagerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -241,22 +242,24 @@ final class UpdaterForm extends FormBase { return []; } - $project_data = update_calculate_project_data($available_updates); + $all_projects_data = update_calculate_project_data($available_updates); $outdated_modules = []; $installed_packages = array_keys($this->extensionUpdater->getActiveComposer()->getInstalledPackages()); $non_supported_update_statuses = []; - foreach ($project_data as $project_name => $project_info) { - if (in_array($project_info['project_type'], $supported_project_types, TRUE)) { - if ($project_info['status'] !== UpdateManagerInterface::CURRENT) { + foreach ($all_projects_data as $project_name => $project_data) { + if (in_array($project_data['project_type'], $supported_project_types, TRUE)) { + if ($project_data['status'] !== UpdateManagerInterface::CURRENT) { if (!in_array("drupal/$project_name", $installed_packages, TRUE)) { - $non_supported_update_statuses[] = $project_info['status']; + $non_supported_update_statuses[] = $project_data['status']; continue; } - if (!empty($project_info['recommended'])) { - $outdated_modules[$project_name] = $project_info; + $project_information = new ProjectInfo($project_name); + $installable_versions = array_keys($project_information->getInstallableReleases()); + if (!empty($project_data['recommended']) && in_array($project_data['recommended'], $installable_versions, TRUE)) { + $outdated_modules[$project_name] = $project_data; } else { - $non_supported_update_statuses[] = $project_info['status']; + $non_supported_update_statuses[] = $project_data['status']; } } } @@ -287,7 +290,6 @@ final class UpdaterForm extends FormBase { $message_status ); } - } return $outdated_modules; } diff --git a/automatic_updates_extensions/tests/modules/automatic_updates_extensions_test/automatic_updates_extensions_test.info.yml b/automatic_updates_extensions/tests/modules/automatic_updates_extensions_test/automatic_updates_extensions_test.info.yml new file mode 100644 index 0000000000000000000000000000000000000000..a0c7a2a93a25a76cbb074987247658a11a68862a --- /dev/null +++ b/automatic_updates_extensions/tests/modules/automatic_updates_extensions_test/automatic_updates_extensions_test.info.yml @@ -0,0 +1,6 @@ +name: 'Automatic Updates Extensions Tests' +description: 'Provides functional tests for recommended versions' +type: module +package: Testing +dependencies: + - automatic_updates:automatic_updates_extensions diff --git a/automatic_updates_extensions/tests/modules/automatic_updates_extensions_test/automatic_updates_extensions_test.module b/automatic_updates_extensions/tests/modules/automatic_updates_extensions_test/automatic_updates_extensions_test.module new file mode 100644 index 0000000000000000000000000000000000000000..887cc4f2a4385f9349f51a8467e04e08332d55dd --- /dev/null +++ b/automatic_updates_extensions/tests/modules/automatic_updates_extensions_test/automatic_updates_extensions_test.module @@ -0,0 +1,15 @@ +<?php + +/** + * @file + * Contains hook implementation for Automatic Updates Extensions Test. + */ + +/** + * Implements hook_update_status_alter(). + */ +function automatic_updates_extensions_test_update_status_alter(&$projects) { + if (\Drupal::state()->get('testUninstallableRelease') && !empty($projects['semver_test'])) { + $projects['semver_test']['recommended'] = $projects['semver_test']['existing_version']; + } +} diff --git a/automatic_updates_extensions/tests/src/Functional/UpdaterFormTest.php b/automatic_updates_extensions/tests/src/Functional/UpdaterFormTest.php index d8c3a98bd7e77ee921efecf7738633ad1af37f3d..56d5e880a5cc1632f8062ff0bb393295d25701cf 100644 --- a/automatic_updates_extensions/tests/src/Functional/UpdaterFormTest.php +++ b/automatic_updates_extensions/tests/src/Functional/UpdaterFormTest.php @@ -38,6 +38,7 @@ class UpdaterFormTest extends AutomaticUpdatesFunctionalTestBase { 'block', 'semver_test', 'aaa_update_test', + 'automatic_updates_extensions_test', ]; /** @@ -416,4 +417,19 @@ class UpdaterFormTest extends AutomaticUpdatesFunctionalTestBase { $assert->buttonExists('Update'); } + /** + * Tests the form when an uninstallable module requires an update. + */ + public function testUninstallableRelease(): void { + $this->container->get('state')->set('testUninstallableRelease', TRUE); + $this->setReleaseMetadata(__DIR__ . '/../../fixtures/release-history/semver_test.1.1.xml'); + $assert = $this->assertSession(); + $this->setProjectInstalledVersion(['semver_test' => '8.1.0']); + $user = $this->createUser(['administer software updates', 'administer site configuration']); + $this->drupalLogin($user); + $this->drupalGet('admin/reports/updates/automatic-update-extensions'); + $this->checkForUpdates(); + $this->assertNoUpdates(); + } + }