From 2969b3f174ea1aef419a496ed371f9db1a92e951 Mon Sep 17 00:00:00 2001
From: catch <catch@35733.no-reply.drupal.org>
Date: Thu, 4 Apr 2024 07:09:17 +0100
Subject: [PATCH] Issue #3099825 by quietone, kunal.sachdev, smustgrave,
 tedbow: Test available updates when the current major and next major of core
 are supported

---
 .../release-history/drupal.8.0.0-9.0.0.xml    | 74 +++++++++++++++++++
 .../semver_test.8.0.0-9.0.0.xml               | 74 +++++++++++++++++++
 .../UpdateSemverTestBaselineTrait.php         | 61 +++++++++++----
 3 files changed, 194 insertions(+), 15 deletions(-)
 create mode 100644 core/modules/update/tests/fixtures/release-history/drupal.8.0.0-9.0.0.xml
 create mode 100644 core/modules/update/tests/fixtures/release-history/semver_test.8.0.0-9.0.0.xml

diff --git a/core/modules/update/tests/fixtures/release-history/drupal.8.0.0-9.0.0.xml b/core/modules/update/tests/fixtures/release-history/drupal.8.0.0-9.0.0.xml
new file mode 100644
index 000000000000..ff364f19429a
--- /dev/null
+++ b/core/modules/update/tests/fixtures/release-history/drupal.8.0.0-9.0.0.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Drupal</title>
+<short_name>drupal</short_name>
+<dc:creator>Drupal</dc:creator>
+<supported_branches>8.0.,8.1.,9.0.</supported_branches>
+<project_status>published</project_status>
+<link>http://example.com/project/drupal</link>
+  <terms>
+   <term><name>Projects</name><value>Drupal project</value></term>
+  </terms>
+<releases>
+ <release>
+   <name>Drupal 9.0.0</name>
+   <version>9.0.0</version>
+   <status>published</status>
+   <release_link>http://example.com/drupal-9-0-0-release</release_link>
+   <download_link>http://example.com/drupal-9-0-0.tar.gz</download_link>
+   <date>1250424521</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+  <release>
+    <name>Drupal 8.1.1</name>
+    <version>8.1.1</version>
+    <status>published</status>
+    <release_link>http://example.com/drupal-8-1-1-release</release_link>
+    <download_link>http://example.com/drupal-8-1-1.tar.gz</download_link>
+    <date>1250424581</date>
+    <terms>
+      <term><name>Release type</name><value>New features</value></term>
+      <term><name>Release type</name><value>Bug fixes</value></term>
+    </terms>
+  </release>
+  <release>
+    <name>Drupal 8.1.0</name>
+    <version>8.1.0</version>
+    <status>published</status>
+    <release_link>http://example.com/drupal-8-1-0-release</release_link>
+    <download_link>http://example.com/drupal-8-1-0.tar.gz</download_link>
+    <date>1250424581</date>
+    <terms>
+      <term><name>Release type</name><value>New features</value></term>
+      <term><name>Release type</name><value>Bug fixes</value></term>
+    </terms>
+  </release>
+  <release>
+    <name>Drupal 8.0.1</name>
+    <version>8.0.1</version>
+    <status>published</status>
+    <release_link>http://example.com/drupal-8-0-1-release</release_link>
+    <download_link>http://example.com/drupal-8-0-1.tar.gz</download_link>
+    <date>1250424581</date>
+    <terms>
+      <term><name>Release type</name><value>New features</value></term>
+      <term><name>Release type</name><value>Bug fixes</value></term>
+    </terms>
+  </release>
+  <release>
+    <name>Drupal 8.0.0</name>
+    <version>8.0.0</version>
+    <status>published</status>
+    <release_link>http://example.com/drupal-8-0-0-release</release_link>
+    <download_link>http://example.com/drupal-8-0-0.tar.gz</download_link>
+    <date>1250424521</date>
+    <terms>
+      <term><name>Release type</name><value>New features</value></term>
+      <term><name>Release type</name><value>Bug fixes</value></term>
+    </terms>
+  </release>
+</releases>
+</project>
diff --git a/core/modules/update/tests/fixtures/release-history/semver_test.8.0.0-9.0.0.xml b/core/modules/update/tests/fixtures/release-history/semver_test.8.0.0-9.0.0.xml
new file mode 100644
index 000000000000..10909e9e41fb
--- /dev/null
+++ b/core/modules/update/tests/fixtures/release-history/semver_test.8.0.0-9.0.0.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+<title>Semver Test</title>
+<short_name>semver_test</short_name>
+<dc:creator>Semver Test</dc:creator>
+<supported_branches>8.0.,8.1.,9.0.</supported_branches>
+<project_status>published</project_status>
+<link>http://example.com/project/semver_test</link>
+  <terms>
+   <term><name>Projects</name><value>Semver Test project</value></term>
+  </terms>
+<releases>
+ <release>
+   <name>Semver Test 9.0.0</name>
+   <version>9.0.0</version>
+   <status>published</status>
+   <release_link>http://example.com/semver_test-9-0-0-release</release_link>
+   <download_link>http://example.com/semver_test-9-0-0.tar.gz</download_link>
+   <date>1250424521</date>
+   <terms>
+     <term><name>Release type</name><value>New features</value></term>
+     <term><name>Release type</name><value>Bug fixes</value></term>
+   </terms>
+ </release>
+  <release>
+    <name>Semver Test 8.1.1</name>
+    <version>8.1.1</version>
+    <status>published</status>
+    <release_link>http://example.com/semver_test-8-1-1-release</release_link>
+    <download_link>http://example.com/semver_test-8-1-1.tar.gz</download_link>
+    <date>1250424581</date>
+    <terms>
+      <term><name>Release type</name><value>New features</value></term>
+      <term><name>Release type</name><value>Bug fixes</value></term>
+    </terms>
+  </release>
+  <release>
+    <name>Semver Test 8.1.0</name>
+    <version>8.1.0</version>
+    <status>published</status>
+    <release_link>http://example.com/semver_test-8-1-0-release</release_link>
+    <download_link>http://example.com/semver_test-8-1-0.tar.gz</download_link>
+    <date>1250424581</date>
+    <terms>
+      <term><name>Release type</name><value>New features</value></term>
+      <term><name>Release type</name><value>Bug fixes</value></term>
+    </terms>
+  </release>
+  <release>
+    <name>Semver Test 8.0.1</name>
+    <version>8.0.1</version>
+    <status>published</status>
+    <release_link>http://example.com/semver_test-8-0-1-release</release_link>
+    <download_link>http://example.com/semver_test-8-0-1.tar.gz</download_link>
+    <date>1250424581</date>
+    <terms>
+      <term><name>Release type</name><value>New features</value></term>
+      <term><name>Release type</name><value>Bug fixes</value></term>
+    </terms>
+  </release>
+  <release>
+    <name>Semver Test 8.0.0</name>
+    <version>8.0.0</version>
+    <status>published</status>
+    <release_link>http://example.com/semver_test-8-0-0-release</release_link>
+    <download_link>http://example.com/semver_test-8-0-0.tar.gz</download_link>
+    <date>1250424521</date>
+    <terms>
+      <term><name>Release type</name><value>New features</value></term>
+      <term><name>Release type</name><value>Bug fixes</value></term>
+    </terms>
+  </release>
+</releases>
+</project>
diff --git a/core/modules/update/tests/src/Functional/UpdateSemverTestBaselineTrait.php b/core/modules/update/tests/src/Functional/UpdateSemverTestBaselineTrait.php
index 722df46bd9e9..d2e8f2a56412 100644
--- a/core/modules/update/tests/src/Functional/UpdateSemverTestBaselineTrait.php
+++ b/core/modules/update/tests/src/Functional/UpdateSemverTestBaselineTrait.php
@@ -113,23 +113,54 @@ public function testNormalUpdateAvailable() {
   }
 
   /**
-   * Tests the Update Manager module when a major update is available.
+   * Tests the Update Manager module when major updates are available.
+   *
+   * This includes testing when the next major is available as well as when both
+   * the current major version and the next major version are supported. There
+   * are two release history files to support this.
+   * - drupal.9.xml and semver_test.9.xml: These declare one major release
+   *   supported, 9.
+   * - drupal.current.xml and semver_test.current.xml: These declare major
+   *   releases supported, 8 and 9.
    */
   public function testMajorUpdateAvailable() {
-    foreach ([0, 1] as $minor_version) {
-      foreach ([0, 1] as $patch_version) {
-        foreach (['-alpha1', '-beta1', ''] as $extra_version) {
-          $this->setProjectInstalledVersion("8.$minor_version.$patch_version" . $extra_version);
-          $this->refreshUpdateStatus([$this->updateProject => '9']);
-          $this->standardTests();
-          $this->assertUpdateTableTextNotContains('Security update required!');
-          $this->assertUpdateTableElementContains((string) Link::fromTextAndUrl('9.0.0', Url::fromUri("http://example.com/{$this->updateProject}-9-0-0-release"))->toString());
-          $this->assertUpdateTableElementContains((string) Link::fromTextAndUrl('Release notes', Url::fromUri("http://example.com/{$this->updateProject}-9-0-0-release"))->toString());
-          $this->assertUpdateTableTextNotContains('Up to date');
-          $this->assertUpdateTableTextContains('Not supported!');
-          $this->assertUpdateTableTextContains('Recommended version:');
-          $this->assertUpdateTableTextNotContains('Latest version:');
-          $this->assertUpdateTableElementContains('error.svg');
+    foreach (['9', '8.0.0-9.0.0'] as $release_history) {
+      foreach ([0, 1] as $minor_version) {
+        foreach ([0, 1] as $patch_version) {
+          foreach (['-alpha1', '-beta1', ''] as $extra_version) {
+            $installed_version = "8.$minor_version.$patch_version$extra_version";
+            $this->setProjectInstalledVersion($installed_version);
+            $this->refreshUpdateStatus([$this->updateProject => $release_history]);
+            $this->standardTests();
+            $this->drupalGet('admin/reports/updates');
+            $this->clickLink('Check manually');
+            $this->checkForMetaRefresh();
+            $this->assertUpdateTableTextNotContains('Security update required!');
+            $this->assertUpdateTableElementContains((string) Link::fromTextAndUrl('9.0.0', Url::fromUri("http://example.com/{$this->updateProject}-9-0-0-release"))
+              ->toString());
+            $this->assertUpdateTableElementContains((string) Link::fromTextAndUrl('Release notes', Url::fromUri("http://example.com/{$this->updateProject}-9-0-0-release"))
+              ->toString());
+            $this->assertUpdateTableTextNotContains('Latest version:');
+
+            if ($release_history === '9') {
+              $this->assertUpdateTableTextNotContains('Up to date');
+              $this->assertUpdateTableTextContains('Not supported!');
+              $this->assertVersionUpdateLinks('Recommended version:', '9.0.0');
+              $this->assertUpdateTableElementContains('error.svg');
+            }
+            else {
+              if ($installed_version === '8.1.1') {
+                $this->assertUpdateTableTextContains('Up to date');
+              }
+              else {
+                $this->assertUpdateTableTextNotContains('Up to date');
+                $this->assertVersionUpdateLinks('Recommended version:', '8.1.1');
+              }
+              $this->assertUpdateTableTextNotContains('Not supported!');
+              $this->assertVersionUpdateLinks('Also available:', '9.0.0');
+              $this->assertUpdateTableElementNotContains('error.svg');
+            }
+          }
         }
       }
     }
-- 
GitLab