diff --git a/core/modules/update/tests/fixtures/release-history/drupal.project_status.insecure.0.2.xml b/core/modules/update/tests/fixtures/release-history/drupal.project_status.insecure.0.2.xml new file mode 100644 index 0000000000000000000000000000000000000000..16e28e76bb70ad01c46bf0a3777cb5cdd973d2e5 --- /dev/null +++ b/core/modules/update/tests/fixtures/release-history/drupal.project_status.insecure.0.2.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +This fixture is used by Drupal\Tests\update\Kernel\UpdateCalculateProjectDataTest. This fixture has project +that has been labeled insecure by the Drupal security team. + +It contains 2 releases: +- 8.0.2: An available update. +- 8.0.1: The currently installed version in the test scenarios. +--> +<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.</supported_branches> +<project_status>insecure</project_status> +<link>http://example.com/project/drupal</link> + <terms> + <term><name>Projects</name><value>Drupal project</value></term> + </terms> +<releases> + <release> + <name>Drupal 8.0.2</name> + <version>8.0.2</version> + <status>published</status> + <release_link>http://example.com/drupal-8-0-2-release</release_link> + <download_link>http://example.com/drupal-8-0-2.tar.gz</download_link> + <date>1250424641</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> +</releases> +</project> diff --git a/core/modules/update/tests/fixtures/release-history/drupal.project_status.revoked.0.2.xml b/core/modules/update/tests/fixtures/release-history/drupal.project_status.revoked.0.2.xml new file mode 100644 index 0000000000000000000000000000000000000000..f89e4ba303efe1a3a30db625eefbda5dd7b5059d --- /dev/null +++ b/core/modules/update/tests/fixtures/release-history/drupal.project_status.revoked.0.2.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +This fixture is used by Drupal\Tests\update\Kernel\UpdateCalculateProjectDataTest. This fixture has project +that has been revoked. + +It contains 2 releases: +- 8.0.2: An available update. +- 8.0.1: The currently installed version in the test scenarios. +--> +<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.</supported_branches> +<project_status>revoked</project_status> +<link>http://example.com/project/drupal</link> + <terms> + <term><name>Projects</name><value>Drupal project</value></term> + </terms> +<releases> + <release> + <name>Drupal 8.0.2</name> + <version>8.0.2</version> + <status>published</status> + <release_link>http://example.com/drupal-8-0-2-release</release_link> + <download_link>http://example.com/drupal-8-0-2.tar.gz</download_link> + <date>1250424641</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> +</releases> +</project> diff --git a/core/modules/update/tests/fixtures/release-history/drupal.project_status.unsupported.0.2.xml b/core/modules/update/tests/fixtures/release-history/drupal.project_status.unsupported.0.2.xml new file mode 100644 index 0000000000000000000000000000000000000000..4f5c6720725573cdfa01aee0631ed0908a079e41 --- /dev/null +++ b/core/modules/update/tests/fixtures/release-history/drupal.project_status.unsupported.0.2.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +This fixture is used by Drupal\Tests\update\Kernel\UpdateCalculateProjectDataTest. This fixture has project +that is no longer supported. + +It contains 2 releases: +- 8.0.2: An available update. +- 8.0.1: The currently installed version in the test scenarios. +--> +<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.</supported_branches> +<project_status>unsupported</project_status> +<link>http://example.com/project/drupal</link> + <terms> + <term><name>Projects</name><value>Drupal project</value></term> + </terms> +<releases> + <release> + <name>Drupal 8.0.2</name> + <version>8.0.2</version> + <status>published</status> + <release_link>http://example.com/drupal-8-0-2-release</release_link> + <download_link>http://example.com/drupal-8-0-2.tar.gz</download_link> + <date>1250424641</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> +</releases> +</project> diff --git a/core/modules/update/tests/src/Kernel/UpdateCalculateProjectDataTest.php b/core/modules/update/tests/src/Kernel/UpdateCalculateProjectDataTest.php new file mode 100644 index 0000000000000000000000000000000000000000..e80dc469060e51665335be4398a40d01ef04b9d4 --- /dev/null +++ b/core/modules/update/tests/src/Kernel/UpdateCalculateProjectDataTest.php @@ -0,0 +1,132 @@ +<?php + +declare(strict_types=1); + +namespace Drupal\Tests\update\Kernel; + +use Drupal\KernelTests\KernelTestBase; +use Drupal\update\UpdateManagerInterface; +use GuzzleHttp\Client; +use GuzzleHttp\Handler\MockHandler; +use GuzzleHttp\HandlerStack; +use GuzzleHttp\Psr7\Response; +use GuzzleHttp\Psr7\Utils; + +/** + * Test the values set in update_calculate_project_data(). + * + * @group update + */ +class UpdateCalculateProjectDataTest extends KernelTestBase { + + /** + * The Guzzle HTTP client. + * + * @var \GuzzleHttp\Client + */ + protected $client; + + /** + * {@inheritdoc} + */ + protected static $modules = ['system', 'update', 'update_test']; + + /** + * {@inheritdoc} + */ + protected function setUp(): void { + parent::setUp(); + + // The Update module's default configuration must be installed for our + // fake release metadata to be fetched. + $this->installConfig('update'); + $this->installConfig('update_test'); + $this->setCoreVersion('8.0.1'); + + } + + /** + * Sets the installed version of core, as known to the Update module. + * + * @param string $version + * The core version. + * + * @see update_test_system_info_alter() + */ + protected function setCoreVersion(string $version): void { + $this->config('update_test.settings') + ->set('system_info.#all.version', $version) + ->save(); + } + + /** + * Sets the release metadata file to use when fetching available updates. + * + * @param string $file + * The path of the XML metadata file to use. + */ + protected function setReleaseMetadata(string $file): void { + $metadata = Utils::tryFopen($file, 'r'); + $response = new Response(200, [], Utils::streamFor($metadata)); + $handler = new MockHandler([$response]); + $this->client = new Client([ + 'handler' => HandlerStack::create($handler), + ]); + $this->container->set('http_client', $this->client); + } + + /** + * Data provider for testProjectStatus(). + * + * The test cases rely on the following fixtures: + * - drupal.project_status.revoked.0.2.xml: Project_status is 'revoked'. + * - drupal.project_status.insecure.0.2.xml: Project_status is 'insecure'. + * - drupal.project_status.unsupported.0.2.xml: Project_status is + * 'unsupported'. + * + * @return array[] + * Test data. + */ + public function providerProjectStatus(): array { + return [ + 'revoked' => [ + 'fixture' => '/../../fixtures/release-history/drupal.project_status.revoked.0.2.xml', + 'status' => UpdateManagerInterface::REVOKED, + 'label' => 'Project revoked', + 'expected_error_message' => 'This project has been revoked, and is no longer available for download. Uninstalling everything included by this project is strongly recommended!', + ], + 'insecure' => [ + 'fixture' => '/../../fixtures/release-history/drupal.project_status.insecure.0.2.xml', + 'status' => UpdateManagerInterface::NOT_SECURE, + 'label' => 'Project not secure', + 'expected_error_message' => 'This project has been labeled insecure by the Drupal security team, and is no longer available for download. Immediately uninstalling everything included by this project is strongly recommended!', + ], + 'unsupported' => [ + 'fixture' => '/../../fixtures/release-history/drupal.project_status.unsupported.0.2.xml', + 'status' => UpdateManagerInterface::NOT_SUPPORTED, + 'label' => 'Project not supported', + 'expected_error_message' => 'This project is no longer supported, and is no longer available for download. Uninstalling everything included by this project is strongly recommended!', + ], + ]; + } + + /** + * Tests the project_status of the project. + * + * @dataProvider providerProjectStatus + * + * @covers update_calculate_project_update_status + */ + public function testProjectStatus(string $fixture, int $status, string $label, string $expected_error_message): void { + update_storage_clear(); + $this->setReleaseMetadata(__DIR__ . $fixture); + $available = update_get_available(TRUE); + $project_data = update_calculate_project_data($available); + $this->assertArrayHasKey('status', $project_data['drupal']); + $this->assertEquals($status, $project_data['drupal']['status']); + $this->assertArrayHasKey('extra', $project_data['drupal']); + $this->assertEquals($label, $project_data['drupal']['extra']['0']['label']); + $this->assertEquals($expected_error_message, $project_data['drupal']['extra']['0']['data']); + } + +}