From 3d3eff787f6c2d8eaab1d2bea02d83f1ebadface Mon Sep 17 00:00:00 2001
From: "yash.rode" <yash.rode@3685174.no-reply.drupal.org>
Date: Thu, 24 Nov 2022 01:08:15 +0000
Subject: [PATCH] Issue #3322203 by yash.rode, tedbow, Wim Leers: Make sure
 packages in our fake-site fixture match in both installed.json and
 installed.php

---
 .../fake_site/vendor/composer/installed.php   | 11 +++
 .../tests/src/Kernel/FakeSiteFixtureTest.php  | 77 +++++++++++++++++++
 .../src/Kernel/FixtureUtilityTraitTest.php    | 22 ++++++
 3 files changed, 110 insertions(+)

diff --git a/package_manager/tests/fixtures/fake_site/vendor/composer/installed.php b/package_manager/tests/fixtures/fake_site/vendor/composer/installed.php
index df34477937..bd4f9d5cc1 100644
--- a/package_manager/tests/fixtures/fake_site/vendor/composer/installed.php
+++ b/package_manager/tests/fixtures/fake_site/vendor/composer/installed.php
@@ -9,6 +9,17 @@ return [
   'versions' => [
     'drupal/core' => [
       'name' => 'drupal/core',
+      'version' => '9.8.0',
+      'type' => 'drupal-core',
+    ],
+    'drupal/core-recommended' => [
+      'name' => 'drupal/core-recommended',
+      'version' => '9.8.0',
+      'type' => 'drupal-core',
+    ],
+    'drupal/core-dev' => [
+      'name' => 'drupal/core-dev',
+      'version' => '9.8.0',
       'type' => 'drupal-core',
     ],
   ],
diff --git a/package_manager/tests/src/Kernel/FakeSiteFixtureTest.php b/package_manager/tests/src/Kernel/FakeSiteFixtureTest.php
index e8a2dd6921..88ee622c4d 100644
--- a/package_manager/tests/src/Kernel/FakeSiteFixtureTest.php
+++ b/package_manager/tests/src/Kernel/FakeSiteFixtureTest.php
@@ -37,4 +37,81 @@ class FakeSiteFixtureTest extends PackageManagerKernelTestBase {
     $this->assertNull($composer_utility->getPackageForProject('drupal/any_random_name'));
   }
 
+  /**
+   * Tests if `modifyPackage` can be called on all packages in the fixture.
+   *
+   * @see \Drupal\Tests\package_manager\Traits\FixtureUtilityTrait::modifyPackage()
+   */
+  public function testCallToModifyPackage(): void {
+    $project_root = $this->container->get('package_manager.path_locator')->getProjectRoot();
+    $stage = $this->createStage();
+    $installed_packages = $stage->getActiveComposer()->getInstalledPackages();
+    foreach (self::getExpectedFakeSitePackages() as $package_name) {
+      $this->assertArrayHasKey($package_name, $installed_packages);
+      $this->assertSame('9.8.0', $installed_packages[$package_name]->getPrettyVersion());
+      $this->modifyPackage(
+        $project_root,
+        $package_name,
+        ['version' => '11.1.0']
+      );
+    }
+  }
+
+  /**
+   * Tests if `removePackage` can be called on all packages in the fixture.
+   *
+   * @covers \Drupal\Tests\package_manager\Traits\FixtureUtilityTrait::removePackage()
+   */
+  public function testCallToRemovePackage(): void {
+    $expected_packages = self::getExpectedFakeSitePackages();
+    $project_root = $this->container->get('package_manager.path_locator')->getProjectRoot();
+    $stage = $this->createStage();
+    $actual_packages = array_keys($stage->getActiveComposer()->getInstalledPackages());
+    sort($actual_packages);
+    $this->assertSame($expected_packages, $actual_packages);
+    foreach (self::getExpectedFakeSitePackages() as $package_name) {
+      $this->removePackage(
+        $project_root,
+        $package_name,
+      );
+    }
+  }
+
+  /**
+   * Check which packages are installed in each file.
+   */
+  public function testExpectedPackages(): void {
+    $expected_packages = $this->getExpectedFakeSitePackages();
+    $active_dir = $this->container->get('package_manager.path_locator')->getProjectRoot();
+    $stage = $this->createStage();
+    $original_installed_php = $stage->getActiveComposer()->getInstalledPackages();
+    $installed_php_packages = array_keys($original_installed_php);
+    sort($installed_php_packages);
+    $installed_json = json_decode(file_get_contents($active_dir . '/vendor/composer/installed.json'), TRUE, 512, JSON_THROW_ON_ERROR);
+    $installed_json_packages = [];
+    foreach ($installed_json['packages'] as $package) {
+      $installed_json_packages[] = $package['name'];
+    }
+    sort($installed_json_packages);
+    $this->assertSame($expected_packages, $installed_json_packages);
+    // Assert same packages are present in both installed.json and installed.php.
+    $this->assertSame($installed_json_packages, $installed_php_packages);
+  }
+
+  /**
+   * Gets the expected packages in the `fake_site` fixture.
+   *
+   * @return string[]
+   *   The package names.
+   */
+  private static function getExpectedFakeSitePackages(): array {
+    $packages = [
+      'drupal/core',
+      'drupal/core-recommended',
+      'drupal/core-dev',
+    ];
+    sort($packages);
+    return $packages;
+  }
+
 }
diff --git a/package_manager/tests/src/Kernel/FixtureUtilityTraitTest.php b/package_manager/tests/src/Kernel/FixtureUtilityTraitTest.php
index 6d933c42d6..7b1ff0f0bf 100644
--- a/package_manager/tests/src/Kernel/FixtureUtilityTraitTest.php
+++ b/package_manager/tests/src/Kernel/FixtureUtilityTraitTest.php
@@ -117,6 +117,17 @@ class FixtureUtilityTraitTest extends PackageManagerKernelTestBase {
     $installed_php_expected_packages = [
       'drupal/core' => [
         'name' => 'drupal/core',
+        'version' => '9.8.0',
+        'type' => 'drupal-core',
+      ],
+      'drupal/core-recommended' => [
+        'name' => 'drupal/core-recommended',
+        'version' => '9.8.0',
+        'type' => 'drupal-core',
+      ],
+      'drupal/core-dev' => [
+        'name' => 'drupal/core-dev',
+        'version' => '9.8.0',
         'type' => 'drupal-core',
       ],
     ] + $installed_php_expected_packages;
@@ -209,6 +220,17 @@ class FixtureUtilityTraitTest extends PackageManagerKernelTestBase {
     $installed_php_expected_packages = [
       'drupal/core' => [
         'name' => 'drupal/core',
+        'version' => '9.8.0',
+        'type' => 'drupal-core',
+      ],
+      'drupal/core-recommended' => [
+        'name' => 'drupal/core-recommended',
+        'version' => '9.8.0',
+        'type' => 'drupal-core',
+      ],
+      'drupal/core-dev' => [
+        'name' => 'drupal/core-dev',
+        'version' => '9.8.0',
         'type' => 'drupal-core',
       ],
     ] + $installed_php_expected_packages;
-- 
GitLab