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
16 changes: 15 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,21 @@ return PyrameterConfig::create()
| `MakesHttpRequests` | `functional` |
| Both traits | `functional` |

The optional `unless` argument is also available on `usesNamespace()` and `usesFunction()`.
The optional `unless` argument is also available on `usesNamespace()` and `usesFunction()`. Its values always identify classes or traits, regardless of the rule type. For example, a filesystem function rule can be suppressed when a test uses a virtual-filesystem trait:

```php
use App\Tests\Concerns\UsesVirtualFilesystem;

return PyrameterConfig::create()
->usesFunction(
'file_put_contents',
TestKind::Integration,
unless: [UsesVirtualFilesystem::class],
)
->usesClass(UsesVirtualFilesystem::class, TestKind::Functional);
```

A test that calls `file_put_contents()` and uses `UsesVirtualFilesystem` is classified as `functional`.

The equivalent CodeIgniter exception is already included in `defaults()`:

Expand Down
2 changes: 1 addition & 1 deletion src/Rule/UsageRule.php
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public function normalizedUnlessKeys(): array
$normalizedUnlessKeys = [];

foreach ($this->unless as $unlessUsage) {
$normalizedUnlessKeys[] = $this->usageKey($this->usageType, $this->normalize($unlessUsage));
$normalizedUnlessKeys[] = $this->usageKey(UsageType::ClassLike, $this->normalize($unlessUsage));
}

return $normalizedUnlessKeys;
Expand Down
20 changes: 20 additions & 0 deletions tests/Analysis/UsageClassifierTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,26 @@ public function testRuleCanBeSuppressedByAnotherConsumedUsage(): void
$this->assertSame(TestKind::Integration, $usageClassifier->classify(['Framework\DatabaseTrait']));
}

public function testFunctionRuleCanBeSuppressedByClassLikeUsage(): void
{
$pyrameterConfig = PyrameterConfig::create()
->usesFunction(
'file_put_contents',
TestKind::Integration,
unless: [self::class],
)
->usesClass(self::class, TestKind::Functional);
$usageClassifier = new UsageClassifier($pyrameterConfig->usageRules());

$this->assertSame(
TestKind::Functional,
$usageClassifier->classify([
'function:file_put_contents',
'class:' . self::class,
]),
);
}

public function testHeaviestMatchingRuleWinsAfterRulesArePrecompiled(): void
{
$usageClassifier = new UsageClassifier([
Expand Down
12 changes: 12 additions & 0 deletions tests/Rule/UsageRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,16 @@ public function testItNormalizesUnlessUsages(): void

$this->assertSame(['class:framework\controllertrait'], $usageRule->normalizedUnlessKeys());
}

public function testItNormalizesFunctionRuleUnlessUsagesAsClassLike(): void
{
$usageRule = new UsageRule(
'file_put_contents',
TestKind::Integration,
UsageType::Function,
unless: ['\APP\Tests\UsesVirtualFilesystem'],
);

$this->assertSame(['class:app\tests\usesvirtualfilesystem'], $usageRule->normalizedUnlessKeys());
}
}
Loading