Skip to content

Commit

Permalink
Add e2e tests for consecutive changing runs
Browse files Browse the repository at this point in the history
  • Loading branch information
yguedidi committed Apr 23, 2023
1 parent dc57cff commit 99f2408
Show file tree
Hide file tree
Showing 8 changed files with 189 additions and 0 deletions.
52 changes: 52 additions & 0 deletions .github/workflows/e2e_consecutive_changes.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# This workflow runs system tests: Use the Rector application from the source
# checkout to process "fixture" projects in e2e/ directory
# to see if those can be processed successfully
name: End to End tests with consecutive changes

on:
pull_request:
branches:
- main
push:
branches:
- main

env:
# see https://github.com/composer/composer/issues/9368#issuecomment-718112361
COMPOSER_ROOT_VERSION: "dev-main"

jobs:
end_to_end:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
php_version: ['8.1']
directory:
- 'e2e/consecutive-changes-with-cache'

name: End to end test - ${{ matrix.directory }}

steps:
- uses: actions/checkout@v3

- uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php_version }}
coverage: none

# run in root rector-src
- run: composer install --ansi

# run in e2e subdir
-
run: composer install --ansi
working-directory: ${{ matrix.directory }}

# run e2e test
- run: php ../e2eTestChangingRunnerWithCache.php -o expected-output-1.diff
working-directory: ${{ matrix.directory }}

# this tests that a 2nd run with cache and consecutive changes works, see https://github.com/rectorphp/rector-src/pull/3614#issuecomment-1507742338
- run: php ../e2eTestChangingRunnerWithCache.php -o expected-output-2.diff
working-directory: ${{ matrix.directory }}
1 change: 1 addition & 0 deletions e2e/consecutive-changes-with-cache/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/vendor
7 changes: 7 additions & 0 deletions e2e/consecutive-changes-with-cache/composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"require": {
"php": "^8.1"
},
"minimum-stability": "dev",
"prefer-stable": true
}
27 changes: 27 additions & 0 deletions e2e/consecutive-changes-with-cache/expected-output-1.diff
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
1 file with changes
===================

1) src/Source.php:1

---------- begin diff ----------
@@ @@

$a = true;
$b = true;
-
-if ($a && $b) {
- return true;
+if (!$a) {
+ return;
}
+if (!$b) {
+ return;
+}
+return true;
----------- end diff -----------

Applied rules:
* ChangeAndIfToEarlyReturnRector


[OK] 1 file has been changed by Rector
23 changes: 23 additions & 0 deletions e2e/consecutive-changes-with-cache/expected-output-2.diff
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
1 file with changes
===================

1) src/Source.php:4

---------- begin diff ----------
@@ @@
if (!$a) {
return;
}
+
if (!$b) {
return;
}
+
return true;
----------- end diff -----------

Applied rules:
* NewlineAfterStatementRector


[OK] 1 file has been changed by Rector
19 changes: 19 additions & 0 deletions e2e/consecutive-changes-with-cache/rector.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

declare(strict_types=1);

use Rector\Caching\ValueObject\Storage\FileCacheStorage;
use Rector\CodingStyle\Rector\Stmt\NewlineAfterStatementRector;
use Rector\Config\RectorConfig;
use Rector\EarlyReturn\Rector\If_\ChangeAndIfToEarlyReturnRector;

return static function (RectorConfig $rectorConfig): void {
$rectorConfig->cacheClass(FileCacheStorage::class);

$rectorConfig->paths([
__DIR__ . '/src',
]);

$rectorConfig->rule(ChangeAndIfToEarlyReturnRector::class);
$rectorConfig->rule(NewlineAfterStatementRector::class);
};
8 changes: 8 additions & 0 deletions e2e/consecutive-changes-with-cache/src/Source.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

$a = true;
$b = true;

if ($a && $b) {
return true;
}
52 changes: 52 additions & 0 deletions e2e/e2eTestChangingRunnerWithCache.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#!/usr/bin/env php
<?php

// runs a rector e2e test.
// checks whether we expect a certain output, or alternatively that rector just processed everything without errors

use Rector\Core\Console\Formatter\ColorConsoleDiffFormatter;
use Rector\Core\Console\Formatter\ConsoleDiffer;
use Rector\Core\Console\Style\SymfonyStyleFactory;
use Rector\Core\Util\Reflection\PrivatesAccessor;
use Symfony\Component\Console\Command\Command;

$projectRoot = __DIR__ .'/..';
$rectorBin = $projectRoot . '/bin/rector';
$autoloadFile = $projectRoot . '/vendor/autoload.php';

// so we can use helper classes here
require_once __DIR__ . '/../vendor/autoload.php';

$e2eCommand = 'php '. $rectorBin .' process --no-ansi -a '. $autoloadFile;

if (isset($argv[1]) && $argv[1] === '-o') {
$expectedDiff = $argv[2];
} else {
$expectedDiff = 'expected-output.diff';
}

exec($e2eCommand, $output, $exitCode);
$output = trim(implode("\n", $output));
$output = str_replace(__DIR__, '.', $output);

if (!file_exists($expectedDiff)) {
echo $output;
exit($exitCode);
}

$symfonyStyleFactory = new SymfonyStyleFactory(new PrivatesAccessor());
$symfonyStyle = $symfonyStyleFactory->create();

$matchedExpectedOutput = false;
$expectedOutput = trim(file_get_contents($expectedDiff));
if ($output === $expectedOutput) {
$symfonyStyle->success('End-to-end test successfully completed');
exit(Command::SUCCESS);
}

// print color diff, to make easy find the differences
$consoleDiffer = new ConsoleDiffer(new ColorConsoleDiffFormatter());
$diff = $consoleDiffer->diff($output, $expectedOutput);
$symfonyStyle->writeln($diff);

exit(Command::FAILURE);

0 comments on commit 99f2408

Please sign in to comment.