Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/TestCollector.php → src/Analysis/TestCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

declare(strict_types=1);

namespace Boundwize\Pyrameter;
namespace Boundwize\Pyrameter\Analysis;

use Boundwize\Pyrameter\TestKind;
use Boundwize\Pyrameter\ValueObject\PyramidSummary;
use Boundwize\Pyrameter\ValueObject\TestRecord;

Expand Down
3 changes: 2 additions & 1 deletion src/UsageClassifier.php → src/Analysis/UsageClassifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

declare(strict_types=1);

namespace Boundwize\Pyrameter;
namespace Boundwize\Pyrameter\Analysis;

use Boundwize\Pyrameter\Rule\UsageRule;
use Boundwize\Pyrameter\Rule\UsageType;
use Boundwize\Pyrameter\TestKind;

use function array_keys;
use function ltrim;
Expand Down
4 changes: 2 additions & 2 deletions src/Event/CollectTestResultSubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

namespace Boundwize\Pyrameter\Event;

use Boundwize\Pyrameter\Analysis\TestCollector;
use Boundwize\Pyrameter\Analysis\UsageClassifier;
use Boundwize\Pyrameter\Detection\TestUsageScanner;
use Boundwize\Pyrameter\TestCollector;
use Boundwize\Pyrameter\TestKind;
use Boundwize\Pyrameter\UsageClassifier;
use Boundwize\Pyrameter\ValueObject\TestRecord;
use PHPUnit\Event\Test\Finished;
use PHPUnit\Event\Test\FinishedSubscriber;
Expand Down
2 changes: 1 addition & 1 deletion src/Event/PrintReportSubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

namespace Boundwize\Pyrameter\Event;

use Boundwize\Pyrameter\Analysis\TestCollector;
use Boundwize\Pyrameter\Report\PyramidReporter;
use Boundwize\Pyrameter\Report\SuiteShapeResolver;
use Boundwize\Pyrameter\Target\TargetEvaluator;
use Boundwize\Pyrameter\TestCollector;
use Closure;
use PHPUnit\Event\TestRunner\ExecutionFinished;
use PHPUnit\Event\TestRunner\ExecutionFinishedSubscriber;
Expand Down
2 changes: 2 additions & 0 deletions src/Extension.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

namespace Boundwize\Pyrameter;

use Boundwize\Pyrameter\Analysis\TestCollector;
use Boundwize\Pyrameter\Analysis\UsageClassifier;
use Boundwize\Pyrameter\Config\PyrameterConfigLoader;
use Boundwize\Pyrameter\Detection\TestUsageScanner;
use Boundwize\Pyrameter\Event\CollectTestResultSubscriber;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

declare(strict_types=1);

namespace Boundwize\Pyrameter\Tests;
namespace Boundwize\Pyrameter\Tests\Analysis;

use Boundwize\Pyrameter\TestCollector;
use Boundwize\Pyrameter\Analysis\TestCollector;
use Boundwize\Pyrameter\TestKind;
use Boundwize\Pyrameter\ValueObject\TestRecord;
use PHPUnit\Framework\TestCase;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,120 @@

declare(strict_types=1);

namespace Boundwize\Pyrameter\Tests;
namespace Boundwize\Pyrameter\Tests\Analysis;

use Boundwize\Pyrameter\Analysis\UsageClassifier;
use Boundwize\Pyrameter\Config\PyrameterConfig;
use Boundwize\Pyrameter\Rule\UsageRule;
use Boundwize\Pyrameter\Rule\UsageType;
use Boundwize\Pyrameter\TestKind;
use Boundwize\Pyrameter\UsageClassifier;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;

final class UsageClassifierTest extends TestCase
{
/**
* @param non-empty-string $className
*/
#[DataProvider('phpRedisGlobalClassCases')]
public function testDefaultRulesClassifyPhpRedisGlobalClassesAsIntegration(string $className): void
{
$pyrameterConfig = PyrameterConfig::defaults();
$usageClassifier = new UsageClassifier($pyrameterConfig->usageRules());

$this->assertSame(TestKind::Integration, $usageClassifier->classify([$className]));
}

/**
* @return iterable<string, array{non-empty-string}>
*/
public static function phpRedisGlobalClassCases(): iterable
{
yield 'Redis client' => ['Redis'];
yield 'Redis cluster client' => ['RedisCluster'];
yield 'Redis sentinel client' => ['RedisSentinel'];
}

/**
* @param non-empty-string $functionName
*/
#[DataProvider('fileOperationFunctionCases')]
public function testDefaultRulesClassifyFileOperationFunctionsAsIntegration(string $functionName): void
{
$pyrameterConfig = PyrameterConfig::defaults();
$usageClassifier = new UsageClassifier($pyrameterConfig->usageRules());

$this->assertSame(TestKind::Integration, $usageClassifier->classify(['function:' . $functionName]));
}

/**
* @return iterable<string, array{non-empty-string}>
*/
public static function fileOperationFunctionCases(): iterable
{
yield 'file_get_contents' => ['file_get_contents'];
yield 'file_put_contents' => ['file_put_contents'];
yield 'fopen' => ['fopen'];
yield 'fread' => ['fread'];
yield 'fwrite' => ['fwrite'];
yield 'fgets' => ['fgets'];
yield 'fgetc' => ['fgetc'];
yield 'fclose' => ['fclose'];
yield 'feof' => ['feof'];
yield 'rewind' => ['rewind'];
yield 'fseek' => ['fseek'];
yield 'ftell' => ['ftell'];
yield 'fflush' => ['fflush'];
yield 'ftruncate' => ['ftruncate'];
yield 'file_exists' => ['file_exists'];
yield 'is_file' => ['is_file'];
yield 'is_dir' => ['is_dir'];
yield 'is_readable' => ['is_readable'];
yield 'is_writable' => ['is_writable'];
yield 'is_executable' => ['is_executable'];
yield 'filesize' => ['filesize'];
yield 'filemtime' => ['filemtime'];
yield 'filectime' => ['filectime'];
yield 'fileatime' => ['fileatime'];
yield 'fileperms' => ['fileperms'];
yield 'fileowner' => ['fileowner'];
yield 'filegroup' => ['filegroup'];
yield 'filetype' => ['filetype'];
yield 'stat' => ['stat'];
yield 'lstat' => ['lstat'];
yield 'touch' => ['touch'];
yield 'copy' => ['copy'];
yield 'rename' => ['rename'];
yield 'unlink' => ['unlink'];
yield 'mkdir' => ['mkdir'];
yield 'rmdir' => ['rmdir'];
yield 'opendir' => ['opendir'];
yield 'readdir' => ['readdir'];
yield 'closedir' => ['closedir'];
yield 'rewinddir' => ['rewinddir'];
yield 'scandir' => ['scandir'];
yield 'glob' => ['glob'];
yield 'chdir' => ['chdir'];
yield 'getcwd' => ['getcwd'];
yield 'realpath' => ['realpath'];
yield 'chmod' => ['chmod'];
yield 'chown' => ['chown'];
yield 'chgrp' => ['chgrp'];
yield 'umask' => ['umask'];
yield 'link' => ['link'];
yield 'symlink' => ['symlink'];
yield 'readlink' => ['readlink'];
yield 'is_link' => ['is_link'];
yield 'tmpfile' => ['tmpfile'];
yield 'tempnam' => ['tempnam'];
yield 'flock' => ['flock'];
yield 'is_uploaded_file' => ['is_uploaded_file'];
yield 'move_uploaded_file' => ['move_uploaded_file'];
yield 'fgetcsv' => ['fgetcsv'];
yield 'fputcsv' => ['fputcsv'];
yield 'parse_ini_file' => ['parse_ini_file'];
}

public function testNamespaceRulesMatchOnlyConfiguredPrefixCaseInsensitively(): void
{
$usageClassifier = new UsageClassifier([
Expand Down
2 changes: 1 addition & 1 deletion tests/Config/PyrameterConfigTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

namespace Boundwize\Pyrameter\Tests\Config;

use Boundwize\Pyrameter\Analysis\UsageClassifier;
use Boundwize\Pyrameter\Config\PyrameterConfig;
use Boundwize\Pyrameter\TestKind;
use Boundwize\Pyrameter\UsageClassifier;
use InvalidArgumentException;
use PDO;
use PHPUnit\Framework\TestCase;
Expand Down
18 changes: 18 additions & 0 deletions tests/Detection/TestUsageScannerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace Boundwize\Pyrameter\Tests\Detection;

use Boundwize\Pyrameter\Detection\TestUsageScanner;
use Boundwize\Pyrameter\Tests\Fixtures\MockedHeavyFixture;
use PHPUnit\Framework\TestCase;
use ReflectionClass;
use stdClass;
Expand All @@ -21,6 +22,23 @@

final class TestUsageScannerTest extends TestCase
{
public function testItRemovesMockTargetsFromConsumedUsages(): void
{
$scanResult = (new TestUsageScanner())->scan(MockedHeavyFixture::class);

$this->assertTrue($scanResult->inspectable);
$this->assertNotContains('class:PDO', $scanResult->consumedUsages);
}

public function testItReturnsNoConsumedUsagesForAnUninspectableClass(): void
{
$scanResult = (new TestUsageScanner())->scan('Boundwize\Pyrameter\Tests\Fixtures\MissingFixture');

$this->assertFalse($scanResult->inspectable);
$this->assertSame([], $scanResult->consumedUsages);
$this->assertNotNull($scanResult->errorMessage);
}

public function testItReportsUninspectableResultForInternalClassesWithoutSourceFiles(): void
{
$scanResult = (new TestUsageScanner())->scan(stdClass::class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

declare(strict_types=1);

namespace Boundwize\Pyrameter\Tests;
namespace Boundwize\Pyrameter\Tests\Detection;

use Boundwize\Pyrameter\Analysis\UsageClassifier;
use Boundwize\Pyrameter\Config\PyrameterConfig;
use Boundwize\Pyrameter\Detection\ConsumedUsageExtractor;
use Boundwize\Pyrameter\Detection\TestUsageScanner;
Expand All @@ -23,7 +24,6 @@
use Boundwize\Pyrameter\Tests\Fixtures\SimpleUnitFixture;
use Boundwize\Pyrameter\Tests\Fixtures\SymfonyFunctionalFixture;
use Boundwize\Pyrameter\Tests\Fixtures\WebDriverE2EFixture;
use Boundwize\Pyrameter\UsageClassifier;
use PhpParser\ParserFactory;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\TestCase;
Expand Down Expand Up @@ -78,125 +78,6 @@ public static function classificationCases(): iterable
yield 'integration plus e2e chooses e2e' => [IntegrationAndE2EFixture::class, TestKind::E2E];
}

public function testMockTargetsAreRemovedFromConsumedClasses(): void
{
$scanResult = (new TestUsageScanner())->scan(MockedHeavyFixture::class);

$this->assertTrue($scanResult->inspectable);
$this->assertNotContains('class:PDO', $scanResult->consumedUsages);
}

/**
* @param non-empty-string $className
*/
#[DataProvider('phpRedisGlobalClassCases')]
public function testDefaultRulesClassifyPhpRedisGlobalClassesAsIntegration(string $className): void
{
$pyrameterConfig = PyrameterConfig::defaults();
$usageClassifier = new UsageClassifier($pyrameterConfig->usageRules());

$this->assertSame(TestKind::Integration, $usageClassifier->classify([$className]));
}

/**
* @return iterable<string, array{non-empty-string}>
*/
public static function phpRedisGlobalClassCases(): iterable
{
yield 'Redis client' => ['Redis'];
yield 'Redis cluster client' => ['RedisCluster'];
yield 'Redis sentinel client' => ['RedisSentinel'];
}

/**
* @param non-empty-string $functionName
*/
#[DataProvider('fileOperationFunctionCases')]
public function testDefaultRulesClassifyFileOperationFunctionsAsIntegration(string $functionName): void
{
$pyrameterConfig = PyrameterConfig::defaults();
$usageClassifier = new UsageClassifier($pyrameterConfig->usageRules());

$this->assertSame(TestKind::Integration, $usageClassifier->classify(['function:' . $functionName]));
}

/**
* @return iterable<string, array{non-empty-string}>
*/
public static function fileOperationFunctionCases(): iterable
{
yield 'file_get_contents' => ['file_get_contents'];
yield 'file_put_contents' => ['file_put_contents'];
yield 'fopen' => ['fopen'];
yield 'fread' => ['fread'];
yield 'fwrite' => ['fwrite'];
yield 'fgets' => ['fgets'];
yield 'fgetc' => ['fgetc'];
yield 'fclose' => ['fclose'];
yield 'feof' => ['feof'];
yield 'rewind' => ['rewind'];
yield 'fseek' => ['fseek'];
yield 'ftell' => ['ftell'];
yield 'fflush' => ['fflush'];
yield 'ftruncate' => ['ftruncate'];
yield 'file_exists' => ['file_exists'];
yield 'is_file' => ['is_file'];
yield 'is_dir' => ['is_dir'];
yield 'is_readable' => ['is_readable'];
yield 'is_writable' => ['is_writable'];
yield 'is_executable' => ['is_executable'];
yield 'filesize' => ['filesize'];
yield 'filemtime' => ['filemtime'];
yield 'filectime' => ['filectime'];
yield 'fileatime' => ['fileatime'];
yield 'fileperms' => ['fileperms'];
yield 'fileowner' => ['fileowner'];
yield 'filegroup' => ['filegroup'];
yield 'filetype' => ['filetype'];
yield 'stat' => ['stat'];
yield 'lstat' => ['lstat'];
yield 'touch' => ['touch'];
yield 'copy' => ['copy'];
yield 'rename' => ['rename'];
yield 'unlink' => ['unlink'];
yield 'mkdir' => ['mkdir'];
yield 'rmdir' => ['rmdir'];
yield 'opendir' => ['opendir'];
yield 'readdir' => ['readdir'];
yield 'closedir' => ['closedir'];
yield 'rewinddir' => ['rewinddir'];
yield 'scandir' => ['scandir'];
yield 'glob' => ['glob'];
yield 'chdir' => ['chdir'];
yield 'getcwd' => ['getcwd'];
yield 'realpath' => ['realpath'];
yield 'chmod' => ['chmod'];
yield 'chown' => ['chown'];
yield 'chgrp' => ['chgrp'];
yield 'umask' => ['umask'];
yield 'link' => ['link'];
yield 'symlink' => ['symlink'];
yield 'readlink' => ['readlink'];
yield 'is_link' => ['is_link'];
yield 'tmpfile' => ['tmpfile'];
yield 'tempnam' => ['tempnam'];
yield 'flock' => ['flock'];
yield 'is_uploaded_file' => ['is_uploaded_file'];
yield 'move_uploaded_file' => ['move_uploaded_file'];
yield 'fgetcsv' => ['fgetcsv'];
yield 'fputcsv' => ['fputcsv'];
yield 'parse_ini_file' => ['parse_ini_file'];
}

public function testUninspectableTestHasNoConsumedClasses(): void
{
$scanResult = (new TestUsageScanner())->scan('Boundwize\Pyrameter\Tests\Fixtures\MissingFixture');

$this->assertFalse($scanResult->inspectable);
$this->assertSame([], $scanResult->consumedUsages);
$this->assertNotNull($scanResult->errorMessage);
}

public function testClassNamedLikeFileOperationFunctionStaysUnit(): void
{
$parser = (new ParserFactory())->createForNewestSupportedVersion();
Expand Down
4 changes: 2 additions & 2 deletions tests/Event/CollectTestResultSubscriberTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@

namespace Boundwize\Pyrameter\Tests\Event;

use Boundwize\Pyrameter\Analysis\TestCollector;
use Boundwize\Pyrameter\Analysis\UsageClassifier;
use Boundwize\Pyrameter\Config\PyrameterConfig;
use Boundwize\Pyrameter\Detection\TestUsageScanner;
use Boundwize\Pyrameter\Event\CollectTestResultSubscriber;
use Boundwize\Pyrameter\TestCollector;
use Boundwize\Pyrameter\TestKind;
use Boundwize\Pyrameter\Tests\Fixtures\SimpleUnitFixture;
use Boundwize\Pyrameter\Tests\Fixtures\TelemetryInfoFactory;
use Boundwize\Pyrameter\UsageClassifier;
use PHPUnit\Event\Code\Phpt;
use PHPUnit\Event\Code\TestDox;
use PHPUnit\Event\Code\TestMethod;
Expand Down
Loading
Loading