function ComposerProjectTemplatesTest::testMinimumStabilityStrictness

Same name in other branches
  1. 9 core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php \Drupal\BuildTests\Composer\Template\ComposerProjectTemplatesTest::testMinimumStabilityStrictness()
  2. 11.x core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php \Drupal\BuildTests\Composer\Template\ComposerProjectTemplatesTest::testMinimumStabilityStrictness()

Make sure that static::MINIMUM_STABILITY is sufficiently strict.

File

core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php, line 88

Class

ComposerProjectTemplatesTest
Demonstrate that Composer project templates can be built as patched.

Namespace

Drupal\BuildTests\Composer\Template

Code

public function testMinimumStabilityStrictness() : void {
    // Ensure that static::MINIMUM_STABILITY is not less stable than the
    // current core stability. For example, if we've already released a beta on
    // the branch, ensure that we no longer allow alpha dependencies.
    $this->assertGreaterThanOrEqual(array_search($this->getCoreStability(), static::STABILITY_ORDER), array_search(static::MINIMUM_STABILITY, static::STABILITY_ORDER));
    // Ensure that static::MINIMUM_STABILITY is the same as the least stable
    // dependency.
    // - We can't set it stricter than our least stable dependency.
    // - We don't want to set it looser than we need to, because we don't want
    //   to in the future accidentally commit a dependency that regresses our
    //   actual stability requirement without us explicitly changing this
    //   constant.
    $root = $this->getDrupalRoot();
    $process = $this->executeCommand("composer --working-dir={$root} info --format=json");
    $this->assertCommandSuccessful();
    $installed = json_decode($process->getOutput(), TRUE);
    // A lookup of the numerical position of each of the stability terms.
    $stability_order_indexes = array_flip(static::STABILITY_ORDER);
    $minimum_stability_order_index = $stability_order_indexes[static::MINIMUM_STABILITY];
    $exclude = [
        'drupal/core',
        'drupal/core-project-message',
        'drupal/core-vendor-hardening',
    ];
    foreach ($installed['installed'] as $project) {
        // Exclude dependencies that are required with "self.version", since
        // those stabilities will automatically match the corresponding Drupal
        // release.
        if (in_array($project['name'], $exclude, TRUE)) {
            continue;
        }
        // VersionParser::parseStability doesn't play nice with (mostly dev-)
        // versions ending with the first seven characters of the commit ID as
        // returned by "composer info". Let's strip those suffixes here.
        $version = preg_replace('/ [0-9a-f]{7}$/i', '', $project['version']);
        $project_stability = VersionParser::parseStability($version);
        $project_stability_order_index = $stability_order_indexes[$project_stability];
        $project_stabilities[$project['name']] = $project_stability;
        $this->assertGreaterThanOrEqual($minimum_stability_order_index, $project_stability_order_index, sprintf("Dependency %s with stability %s does not meet minimum stability %s.", $project['name'], $project_stability, static::MINIMUM_STABILITY));
    }
    // At least one project should be at the minimum stability.
    $this->assertContains(static::MINIMUM_STABILITY, $project_stabilities);
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.