Skip to content

Commit

Permalink
Detect public properties only used in tests (#81)
Browse files Browse the repository at this point in the history
  • Loading branch information
staabm committed Jul 28, 2023
1 parent 338b243 commit 3fe8f69
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 1 deletion.
10 changes: 9 additions & 1 deletion src/Collectors/PublicPropertyFetchCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
use PhpParser\Node\Identifier;
use PHPStan\Analyser\Scope;
use PHPStan\Collectors\Collector;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Type\TypeWithClassName;
use TomasVotruba\UnusedPublic\ClassTypeDetector;
use TomasVotruba\UnusedPublic\Configuration;

/**
Expand All @@ -19,7 +21,8 @@
final class PublicPropertyFetchCollector implements Collector
{
public function __construct(
private readonly Configuration $configuration
private readonly Configuration $configuration,
private readonly ClassTypeDetector $classTypeDetector,
) {
}

Expand Down Expand Up @@ -55,6 +58,11 @@ public function processNode(Node $node, Scope $scope): ?array
return null;
}

$classReflection = $scope->getClassReflection();
if ($classReflection instanceof ClassReflection && $this->classTypeDetector->isTestClass($classReflection)) {
return null;
}

$className = $propertyFetcherType->getClassName();
$propertyName = $node->name->toString();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

declare(strict_types=1);

namespace TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicPropertyRule\Fixture;

final class UsedInTestCaseOnly
{
public $property = 'public';
}
10 changes: 10 additions & 0 deletions tests/Rules/UnusedPublicPropertyRule/Fixture/plain.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

declare(strict_types=1);

namespace TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicPropertyRule\Fixture;

use TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicPropertyRule\Source\PublicPropertyClass;

$o = new PublicPropertyClass();
$o->property = 'a value';
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

declare(strict_types=1);

namespace TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicPropertyRule\Source;

class PublicPropertyClass
{
public $property = 'public';
}
17 changes: 17 additions & 0 deletions tests/Rules/UnusedPublicPropertyRule/Source/TestCaseUser.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

declare(strict_types=1);

namespace TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicPropertyRule\Source;

use PHPUnit\Framework\TestCase;
use TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicPropertyRule\Fixture\UsedInTestCaseOnly;

final class TestCaseUser extends TestCase
{
private function go()
{
$o = new UsedInTestCaseOnly();
$o->property = 'a value';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
use TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicPropertyRule\Fixture\LocallyUsedStaticProperty;
use TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicPropertyRule\Fixture\LocallyUsedStaticPropertyViaStatic;
use TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicPropertyRule\Fixture\LocalyUsedPublicProperty;
use TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicPropertyRule\Fixture\UsedInTestCaseOnly;
use TomasVotruba\UnusedPublic\Tests\Rules\UnusedPublicPropertyRule\Source\TestCaseUser;

final class UnusedPublicPropertyRuleTest extends RuleTestCase
{
Expand Down Expand Up @@ -95,6 +97,18 @@ public static function provideData(): Iterator
[__DIR__ . '/Fixture/IgnoresPrivateApiProperty.php'],
[[$errorMessage, 9, RuleTips::SOLUTION_MESSAGE]],
];

$errorMessage1 = sprintf(
UnusedPublicPropertyRule::ERROR_MESSAGE,
UsedInTestCaseOnly::class,
'property'
);
yield [
[__DIR__ . '/Fixture/UsedInTestCaseOnly.php', __DIR__ . '/Source/TestCaseUser.php'],
[[$errorMessage1, 7, RuleTips::SOLUTION_MESSAGE]],
];

yield [[__DIR__ . '/Fixture/plain.php', __DIR__ .'/Source/PublicPropertyClass.php'], []];
}

/**
Expand Down

0 comments on commit 3fe8f69

Please sign in to comment.