class ScaffoldUpgradeTest
Same name in other branches
- 9 core/tests/Drupal/Tests/Composer/Plugin/Scaffold/Functional/ScaffoldUpgradeTest.php \Drupal\Tests\Composer\Plugin\Scaffold\Functional\ScaffoldUpgradeTest
- 8.9.x core/tests/Drupal/Tests/Composer/Plugin/Scaffold/Functional/ScaffoldUpgradeTest.php \Drupal\Tests\Composer\Plugin\Scaffold\Functional\ScaffoldUpgradeTest
- 10 core/tests/Drupal/Tests/Composer/Plugin/Scaffold/Functional/ScaffoldUpgradeTest.php \Drupal\Tests\Composer\Plugin\Scaffold\Functional\ScaffoldUpgradeTest
Tests Upgrading the Composer Scaffold plugin.
Upgrading a Composer plugin can be a dangerous operation. If the plugin instantiates any classes during the activate method, and the plugin code is subsequently modified by a `composer update` operation, then any post-update hook (& etc.) may run with inconsistent code, leading to runtime errors. This test ensures that it is possible to upgrade from the last available stable 8.8.x tag to the current Scaffold plugin code (e.g. in the current patch-under-test).
@group Scaffold
Hierarchy
- class \Drupal\Tests\Composer\Plugin\Scaffold\Functional\ScaffoldUpgradeTest extends \PHPUnit\Framework\TestCase uses \Drupal\Tests\Composer\Plugin\Scaffold\AssertUtilsTrait, \Drupal\Tests\Composer\Plugin\Scaffold\ExecTrait
Expanded class hierarchy of ScaffoldUpgradeTest
File
-
core/
tests/ Drupal/ Tests/ Composer/ Plugin/ Scaffold/ Functional/ ScaffoldUpgradeTest.php, line 26
Namespace
Drupal\Tests\Composer\Plugin\Scaffold\FunctionalView source
class ScaffoldUpgradeTest extends TestCase {
use AssertUtilsTrait;
use ExecTrait;
/**
* The Fixtures object.
*
* @var \Drupal\Tests\Composer\Plugin\Scaffold\Fixtures
*/
protected $fixtures;
/**
* The Fixtures directory.
*
* @var string
*/
protected string $fixturesDir;
/**
* {@inheritdoc}
*/
protected function setUp() : void {
$this->fixtures = new Fixtures();
$this->fixtures
->createIsolatedComposerCacheDir();
}
/**
* Tests upgrading the Composer Scaffold plugin.
*/
public function testScaffoldUpgrade() : void {
$composerVersionLine = exec('composer --version');
if (str_contains($composerVersionLine, 'Composer version 2')) {
$this->markTestSkipped('We cannot run the scaffold upgrade test with Composer 2 until we have a stable version of drupal/core-composer-scaffold to start from that we can install with Composer 2.x.');
}
$this->fixturesDir = $this->fixtures
->tmpDir($this->name());
$replacements = [
'SYMLINK' => 'false',
'PROJECT_ROOT' => $this->fixtures
->projectRoot(),
];
$this->fixtures
->cloneFixtureProjects($this->fixturesDir, $replacements);
$topLevelProjectDir = 'drupal-drupal';
$sut = $this->fixturesDir . '/' . $topLevelProjectDir;
// First step: set up the Scaffold plug in. Ensure that scaffold operation
// ran. This is more of a control than a test.
$this->mustExec("composer install --no-ansi", $sut);
$this->assertScaffoldedFile($sut . '/sites/default/default.settings.php', FALSE, 'A settings.php fixture file scaffolded from the scaffold-override-fixture');
// Next, bring back packagist.org and install core-composer-scaffold:8.8.0.
// Packagist is disabled in the fixture; we bring it back by removing the
// line that disables it.
$this->mustExec("composer config --unset repositories.packagist.org", $sut);
$stdout = $this->mustExec("composer require --no-ansi drupal/core-composer-scaffold:8.8.0 --no-plugins 2>&1", $sut);
$this->assertStringContainsString(" - Installing drupal/core-composer-scaffold (8.8.0):", $stdout);
// We can't force the path repo to re-install over the stable version
// without removing it, and removing it masks the bugs we are testing for.
// We will therefore make a git repo so that we can tag an explicit version
// to require.
$testVersion = '99.99.99';
$scaffoldPluginTmpRepo = $this->createTmpRepo($this->fixtures
->projectRoot(), $this->fixturesDir, $testVersion);
// Disable packagist.org and upgrade back to the Scaffold plugin under test.
// This puts the `"packagist.org": false` config line back in composer.json
// so that Packagist will no longer be used.
$this->mustExec("composer config repositories.packagist.org false", $sut);
$this->mustExec("composer config repositories.composer-scaffold vcs 'file:///{$scaffoldPluginTmpRepo}'", $sut);
// Using 'mustExec' was giving a strange binary string here.
$output = $this->mustExec("composer require --no-ansi drupal/core-composer-scaffold:{$testVersion} 2>&1", $sut);
$this->assertStringContainsString("Installing drupal/core-composer-scaffold ({$testVersion})", $output);
// Remove a scaffold file and run the scaffold command again to prove that
// scaffolding is still working.
unlink("{$sut}/index.php");
$stdout = $this->mustExec("composer scaffold", $sut);
$this->assertStringContainsString("Scaffolding files for", $stdout);
$this->assertFileExists("{$sut}/index.php");
}
/**
* Copy the provided source directory and create a temporary git repository.
*
* @param string $source
* Path to directory to copy.
* @param string $destParent
* Path to location to create git repository.
* @param string $version
* Version to tag the repository with.
*
* @return string
* Path to temporary git repository.
*/
protected function createTmpRepo($source, $destParent, $version) : string {
$target = $destParent . '/' . basename($source);
$filesystem = new Filesystem();
$filesystem->copy($source, $target);
$this->mustExec("git init", $target);
$this->mustExec('git config user.email "scaffoldtest@example.com"', $target);
$this->mustExec('git config user.name "Scaffold Test"', $target);
$this->mustExec("git add .", $target);
$this->mustExec("git commit -m 'Initial commit'", $target);
$this->mustExec("git tag {$version}", $target);
return $target;
}
}
Members
Title Sort descending | Modifiers | Object type | Summary |
---|---|---|---|
AssertUtilsTrait::assertScaffoldedFile | protected | function | Asserts that a given file exists and is/is not a symlink. |
AssertUtilsTrait::assertScaffoldedFileDoesNotContain | protected | function | Asserts that a file does not exist or exists and does not contain a value. |
ExecTrait::mustExec | protected | function | Runs an arbitrary command. |
ScaffoldUpgradeTest::$fixtures | protected | property | The Fixtures object. |
ScaffoldUpgradeTest::$fixturesDir | protected | property | The Fixtures directory. |
ScaffoldUpgradeTest::createTmpRepo | protected | function | Copy the provided source directory and create a temporary git repository. |
ScaffoldUpgradeTest::setUp | protected | function | |
ScaffoldUpgradeTest::testScaffoldUpgrade | public | function | Tests upgrading the Composer Scaffold plugin. |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.