Skip to content

Commit 6bb32bd

Browse files
committed
Continued improving tests and testability.
1 parent 8077aa3 commit 6bb32bd

19 files changed

+411
-22
lines changed

phpunit.xml.dist

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,10 @@
77
<include>
88
<directory suffix=".php">src</directory>
99
</include>
10+
<exclude>
11+
<directory suffix=".php">src/polyfills</directory>
12+
<directory suffix=".php">src/Factory</directory>
13+
<file>src/Proxy/MimeDeterminer.php</file>
14+
</exclude>
1015
</coverage>
1116
</phpunit>

src/Command/WhyBlockCommand/CsvOutputHandler.php

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,21 @@
99
namespace Navarr\Depends\Command\WhyBlockCommand;
1010

1111
use Navarr\Depends\Data\DeclaredDependency;
12+
use Navarr\Depends\Proxy\StdOutWriter;
13+
use RuntimeException;
1214

1315
class CsvOutputHandler implements OutputHandlerInterface
1416
{
1517
/** @var bool */
1618
private $includeHeader;
1719

18-
public function __construct(bool $includeHeader = true)
20+
/** @var StdOutWriter */
21+
private $writer;
22+
23+
public function __construct(StdOutWriter $writer, bool $includeHeader = true)
1924
{
2025
$this->includeHeader = $includeHeader;
26+
$this->writer = $writer;
2127
}
2228

2329
/**
@@ -28,18 +34,16 @@ public function __construct(bool $includeHeader = true)
2834
*/
2935
public function output(array $dependencies, string $packageToSearchFor, string $versionToCompareTo): int
3036
{
31-
$resource = STDIN;
3237
if ($this->includeHeader) {
33-
fputcsv($resource, ['File', 'Line #', 'Constraint Specified', 'Reasoning']);
38+
$this->writer->writeCsv(['File', 'Line #', 'Constraint Specified', 'Reasoning']);
3439
}
3540
foreach ($dependencies as $dependency) {
36-
fputcsv(
37-
$resource,
41+
$this->writer->writeCsv(
3842
[
39-
$dependency->getFile(),
40-
$dependency->getLine(),
41-
$dependency->getConstraint(),
42-
$dependency->getReason(),
43+
$dependency->getFile() ?: '',
44+
$dependency->getLine() ?: '',
45+
$dependency->getConstraint() ?: '',
46+
$dependency->getReason() ?: '',
4347
]
4448
);
4549
}

src/Parser/AstParser.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use Navarr\Depends\IssueHandler\IssueHandlerInterface;
1717
use PhpParser\Node;
1818
use PhpParser\Node\Attribute;
19-
use PhpParser\NodeTraverser;
2019
use PhpParser\NodeVisitor\NameResolver;
2120
use PhpParser\ParserFactory;
2221

src/Proxy/MimeDeterminer.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
/**
4+
* @copyright 2021 Navarr Barnier. All Rights Reserved.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Navarr\Depends\Proxy;
10+
11+
use JetBrains\PhpStorm\Pure;
12+
use Navarr\Attribute\Dependency;
13+
14+
class MimeDeterminer
15+
{
16+
/**
17+
* @return false|string
18+
*/
19+
#[Pure]
20+
#[Dependency('ext-fileinfo', required: false, reason: 'Usage of mime_content_type if available')]
21+
public function getMimeType(string $path)
22+
{
23+
if (function_exists('get_mime_type')) {
24+
return mime_content_type($path);
25+
} else {
26+
return false;
27+
}
28+
}
29+
}

src/Proxy/StdOutWriter.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
/**
4+
* @copyright 2021 Navarr Barnier. All Rights Reserved.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Navarr\Depends\Proxy;
10+
11+
class StdOutWriter
12+
{
13+
/** @var false|resource */
14+
private $resource;
15+
16+
/**
17+
* @param false|resource $resource
18+
*/
19+
public function __construct($resource = STDIN)
20+
{
21+
$this->resource = $resource;
22+
}
23+
24+
public function canWrite(): bool
25+
{
26+
return $this->resource !== false;
27+
}
28+
29+
public function write(string $data): void
30+
{
31+
if ($this->resource) {
32+
fputs($this->resource, $data);
33+
}
34+
}
35+
36+
/**
37+
* @param string[] $data
38+
*/
39+
public function writeCsv(array $data): void
40+
{
41+
if ($this->resource) {
42+
fputcsv($this->resource, $data);
43+
}
44+
}
45+
}

src/ScopeDeterminer/PhpFileDeterminer.php

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
namespace Navarr\Depends\ScopeDeterminer;
1010

1111
use JetBrains\PhpStorm\Pure;
12-
use Navarr\Attribute\Dependency;
12+
use Navarr\Depends\Proxy\MimeDeterminer;
1313

1414
class PhpFileDeterminer
1515
{
@@ -30,14 +30,22 @@ class PhpFileDeterminer
3030
'php8',
3131
];
3232

33+
/** @var MimeDeterminer */
34+
private $mimeDeterminer;
35+
36+
public function __construct(MimeDeterminer $mimeDeterminer)
37+
{
38+
$this->mimeDeterminer = $mimeDeterminer;
39+
}
40+
3341
#[Pure]
34-
#[Dependency('ext-fileinfo', required: false, reason: 'Usage of mime_content_type if available')]
3542
public function isPhp(
3643
string $file
3744
): bool {
3845
// There are so many approaches we could take here, but we're going with this one:
3946

40-
if (function_exists('mime_content_type') && in_array(mime_content_type($file), static::PHP_MIME_TYPES)) {
47+
$mimeType = $this->mimeDeterminer->getMimeType($file);
48+
if ($mimeType && in_array($mimeType, static::PHP_MIME_TYPES)) {
4149
// Mime type is PHP. That's good enough for me
4250
return true;
4351
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
/**
3+
* @copyright 2021 Navarr Barnier. All Rights Reserved.
4+
*/
5+
6+
namespace Navarr\Depends\Test\Controller\Composer;
7+
8+
use Composer\Plugin\Capability\CommandProvider;
9+
use Navarr\Depends\Controller\Composer\ComposerCommand;
10+
use Navarr\Depends\Controller\Composer\ComposerPlugin;
11+
use PHPUnit\Framework\TestCase;
12+
13+
class ComposerPluginTest extends TestCase
14+
{
15+
16+
public function testCommandProviderIsPartOfPlugin()
17+
{
18+
$plugin = new ComposerPlugin();
19+
$capabilities = $plugin->getCapabilities();
20+
$this->assertArrayHasKey(CommandProvider::class, $capabilities);
21+
$this->assertEquals(ComposerPlugin::class, $capabilities[CommandProvider::class]);
22+
}
23+
24+
public function testContainsOnlyComposerCommands()
25+
{
26+
$plugin = new ComposerPlugin();
27+
$commands = $plugin->getCommands();
28+
29+
$this->assertIsArray($commands);
30+
$this->assertCount(1, $commands);
31+
$command = end($commands);
32+
$this->assertInstanceOf(ComposerCommand::class, $command);
33+
}
34+
}

tests/data/DeclaredDependencyTest.php renamed to tests/Data/DeclaredDependencyTest.php

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
class DeclaredDependencyTest extends TestCase
1414
{
15-
public function testDataTransferObject()
15+
public function testNonDefaultValues()
1616
{
1717
$file = uniqid();
1818
$line = uniqid();
@@ -27,7 +27,8 @@ public function testDataTransferObject()
2727
$reference,
2828
$package,
2929
$version,
30-
$reason
30+
$reason,
31+
false
3132
);
3233

3334
$this->assertEquals($file, $dependency->getFile());
@@ -36,9 +37,10 @@ public function testDataTransferObject()
3637
$this->assertEquals($package, $dependency->getPackage());
3738
$this->assertEquals($version, $dependency->getConstraint());
3839
$this->assertEquals($reason, $dependency->getReason());
40+
$this->assertFalse($dependency->isRequired());
3941
}
4042

41-
public function testDataTransferObjectReturnsNull()
43+
public function testDefaultValues()
4244
{
4345
$dependency = new DeclaredDependency();
4446

@@ -48,5 +50,15 @@ public function testDataTransferObjectReturnsNull()
4850
$this->assertNull($dependency->getPackage());
4951
$this->assertNull($dependency->getConstraint());
5052
$this->assertNull($dependency->getReason());
53+
$this->assertTrue($dependency->isRequired());
54+
}
55+
56+
public function testRequiredAttributeReturnsProvidedValue()
57+
{
58+
$dependency = new DeclaredDependency(required: true);
59+
$this->assertTrue($dependency->isRequired());
60+
61+
$dependency = new DeclaredDependency(required: false);
62+
$this->assertFalse($dependency->isRequired());
5163
}
5264
}

tests/Data/ReferenceAdderTest.php

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
3+
/**
4+
* @copyright 2021 Navarr Barnier. All Rights Reserved.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Navarr\Depends\Test\Data;
10+
11+
use Navarr\Depends\Data\DeclaredDependency;
12+
use Navarr\Depends\Data\ReferenceAdder;
13+
use PHPUnit\Framework\TestCase;
14+
15+
class ReferenceAdderTest extends TestCase
16+
{
17+
public function testAdd()
18+
{
19+
$file = uniqid();
20+
$line = uniqid();
21+
$package = uniqid();
22+
$constraint = uniqid();
23+
$reason = uniqid();
24+
25+
$dependency = new DeclaredDependency(
26+
line: $line,
27+
package: $package,
28+
constraint: $constraint,
29+
reason: $reason
30+
);
31+
32+
$this->assertEquals($package, $dependency->getPackage());
33+
$this->assertEquals($constraint, $dependency->getConstraint());
34+
$this->assertEquals($reason, $dependency->getReason());
35+
$this->assertEquals($line, $dependency->getLine());
36+
$this->assertNull($dependency->getFile());
37+
$this->assertNull($dependency->getReference());
38+
39+
$referenceAdder = new ReferenceAdder();
40+
$dependency2 = $referenceAdder->add(
41+
$dependency,
42+
$file
43+
);
44+
45+
// Ensure original hasn't changed
46+
$this->assertEquals($package, $dependency->getPackage());
47+
$this->assertEquals($constraint, $dependency->getConstraint());
48+
$this->assertEquals($reason, $dependency->getReason());
49+
$this->assertEquals($line, $dependency->getLine());
50+
$this->assertNull($dependency->getFile());
51+
$this->assertNull($dependency->getReference());
52+
53+
// Check new
54+
$this->assertEquals($package, $dependency2->getPackage());
55+
$this->assertEquals($constraint, $dependency2->getConstraint());
56+
$this->assertEquals($reason, $dependency2->getReason());
57+
$this->assertEquals($line, $dependency2->getLine());
58+
$this->assertEquals($file, $dependency2->getFile());
59+
$this->assertEquals("{$file}:{$line}", $dependency2->getReference());
60+
}
61+
}

tests/Parser/AstParserTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515

1616
class AstParserTest extends TestCase
1717
{
18-
private const EMPTY_FILE = '../data/emptyFile.php';
19-
private const FILE_ATTRIBUTE_USAGE = '../data/attributeUsage.php';
20-
private const FILE_INVALID = '../data/invalidAttributeUsage.php';
18+
private const EMPTY_FILE = '../_data/emptyFile.php';
19+
private const FILE_ATTRIBUTE_USAGE = '../_data/attributeUsage.php';
20+
private const FILE_INVALID = '../_data/invalidAttributeUsage.php';
2121
private const ATTRIBUTE_USAGE_ATTRIBUTE_COUNT = 10;
2222

2323
private function buildAstParser(array $args = []): AstParser
@@ -144,7 +144,7 @@ public function testParserReturnsEmptyResultsOnInvalidFile()
144144

145145
public function testParserGracefullyHandlesBadAttributeSyntax()
146146
{
147-
$file = __DIR__ . '/' . '../data/incorrectAttributeUsage.php';
147+
$file = __DIR__ . '/../_data/invalidAttributeUsage.php';
148148
$contents = file_get_contents($file);
149149

150150
$parser = $this->buildAstParser();

0 commit comments

Comments
 (0)