Skip to content

Commit 90075fd

Browse files
committed
Add test for detectors
1 parent 8ef465e commit 90075fd

9 files changed

+310
-8
lines changed

src/Detectors/FileDetector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ public function detect(): string|false
1818
/**
1919
* @return array<string, string>
2020
*/
21-
abstract protected function getPathMapping(): array;
21+
abstract public function getPathMapping(): array;
2222
}

src/Detectors/NodeBuildToolDetector.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66

77
class NodeBuildToolDetector extends FileDetector
88
{
9-
protected function getPathMapping(): array
9+
public function getPathMapping(): array
1010
{
1111
return [
1212
base_path('vite.config.js') => NodeBuildTool::VITE,
13+
base_path('vite.config.ts') => NodeBuildTool::VITE,
1314
base_path('webpack.mix.js') => NodeBuildTool::MIX,
1415
];
1516
}

src/Detectors/NodePackageManagerDetector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
class NodePackageManagerDetector extends FileDetector
88
{
9-
protected function getPathMapping(): array
9+
public function getPathMapping(): array
1010
{
1111
return [
1212
base_path('package-lock.json') => NodePackageManager::NPM,

src/Detectors/PhpVersionDetector.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,19 @@ class PhpVersionDetector implements DetectorContract
1111
{
1212
public function detect(): string|false
1313
{
14-
$composer = file_get_contents(base_path('composer.json'));
15-
if (! $composer) {
14+
$composer = $this->getComposerFileContents();
15+
if ($composer === false) {
1616
return false;
1717
}
1818

1919
$composer = json_decode($composer);
2020
$php = data_get($composer, 'require.php');
21-
2221
if (! is_string($php)) {
2322
return false;
2423
}
2524

26-
$parser = new VersionParser();
27-
$php = $parser->parseConstraints($php)
25+
$php = app(VersionParser::class)
26+
->parseConstraints($php)
2827
->getLowerBound()
2928
->getVersion();
3029

@@ -34,4 +33,9 @@ public function detect(): string|false
3433
default: false,
3534
);
3635
}
36+
37+
public function getComposerFileContents(): string|false
38+
{
39+
return file_get_contents(base_path('composer.json'));
40+
}
3741
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?php
2+
3+
namespace BlameButton\LaravelDockerBuilder\Tests\Unit\Detectors;
4+
5+
use BlameButton\LaravelDockerBuilder\Detectors\CiPlatformDetector;
6+
use BlameButton\LaravelDockerBuilder\Tests\TestCase;
7+
8+
/**
9+
* @uses \BlameButton\LaravelDockerBuilder\DockerServiceProvider
10+
*
11+
* @covers \BlameButton\LaravelDockerBuilder\Detectors\CiPlatformDetector
12+
*/
13+
class CiPlatformDetectorTest extends TestCase
14+
{
15+
protected function setUp(): void
16+
{
17+
parent::setUp();
18+
19+
if (! is_dir($path = base_path('.git'))) {
20+
mkdir($path);
21+
}
22+
23+
if (file_exists($path = base_path('.git/config'))) {
24+
unlink($path);
25+
}
26+
}
27+
28+
protected function tearDown(): void
29+
{
30+
parent::tearDown();
31+
32+
if (file_exists($path = base_path('.git/config'))) {
33+
unlink($path);
34+
}
35+
36+
if (is_dir($path = base_path('.git'))) {
37+
rmdir($path);
38+
}
39+
}
40+
41+
public function testItDetectsGitHub(): void
42+
{
43+
file_put_contents(
44+
filename: base_path('.git/config'),
45+
data: "[remote \"origin\"]\n\turl = git@github.com:blamebutton/laravel-docker-builder.git",
46+
);
47+
48+
$detected = app(CiPlatformDetector::class)->detect();
49+
50+
self::assertEquals('github', $detected);
51+
}
52+
53+
public function testItDetectsGitLab(): void
54+
{
55+
file_put_contents(
56+
filename: base_path('.git/config'),
57+
data: "[remote \"origin\"]\n\turl = git@gitlab.com:blamebutton/laravel-docker-builder.git",
58+
);
59+
60+
$detected = app(CiPlatformDetector::class)->detect();
61+
62+
self::assertEquals('gitlab', $detected);
63+
}
64+
65+
public function testItReturnsFalseWithNoMatches(): void
66+
{
67+
file_put_contents(
68+
filename: base_path('.git/config'),
69+
data: "[remote \"origin\"]\n\turl = git@bitbucket.com:blamebutton/laravel-docker-builder.git",
70+
);
71+
72+
$detected = app(CiPlatformDetector::class)->detect();
73+
74+
self::assertFalse($detected);
75+
}
76+
77+
public function testItReturnsFalseWithMissingGitConfig(): void
78+
{
79+
$detected = app(CiPlatformDetector::class)->detect();
80+
81+
self::assertFalse($detected);
82+
}
83+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
namespace BlameButton\LaravelDockerBuilder\Tests\Unit\Detectors;
4+
5+
use BlameButton\LaravelDockerBuilder\Detectors\FileDetector;
6+
use BlameButton\LaravelDockerBuilder\Tests\TestCase;
7+
use Mockery\MockInterface;
8+
9+
/**
10+
* @uses \BlameButton\LaravelDockerBuilder\DockerServiceProvider
11+
*
12+
* @covers \BlameButton\LaravelDockerBuilder\Detectors\FileDetector
13+
*/
14+
class FileDetectorTest extends TestCase
15+
{
16+
protected function setUp(): void
17+
{
18+
parent::setUp();
19+
20+
if (file_exists($path = base_path('test-file'))) {
21+
unlink($path);
22+
}
23+
24+
$this->mock(FileDetector::class, function (MockInterface $mock) {
25+
$mock->shouldReceive('detect')
26+
->passthru();
27+
$mock->shouldReceive('getPathMapping')
28+
->once()
29+
->andReturn([
30+
base_path('test-file') => 'test',
31+
]);
32+
});
33+
}
34+
35+
public function testItDetectsFileWhenPresent(): void
36+
{
37+
touch(base_path('test-file'));
38+
39+
$detected = app(FileDetector::class)->detect();
40+
41+
self::assertEquals('test', $detected);
42+
}
43+
44+
public function testItReturnsFalseWhenFileMissing(): void
45+
{
46+
$detected = app(FileDetector::class)->detect();
47+
48+
self::assertFalse($detected);
49+
}
50+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace BlameButton\LaravelDockerBuilder\Tests\Unit\Detectors;
4+
5+
use BlameButton\LaravelDockerBuilder\Detectors\NodeBuildToolDetector;
6+
use BlameButton\LaravelDockerBuilder\Tests\TestCase;
7+
8+
/**
9+
* @uses \BlameButton\LaravelDockerBuilder\DockerServiceProvider
10+
* @uses \BlameButton\LaravelDockerBuilder\Detectors\FileDetector
11+
*
12+
* @covers \BlameButton\LaravelDockerBuilder\Detectors\NodeBuildToolDetector
13+
*/
14+
class NodeBuildToolDetectorTest extends TestCase
15+
{
16+
protected function setUp(): void
17+
{
18+
parent::setUp();
19+
20+
collect(['vite.config.js', 'vite.config.ts', 'webpack.mix.js'])
21+
->map(fn ($file) => base_path($file))
22+
->filter(fn ($file) => file_exists($file))
23+
->each(fn ($file) => unlink($file));
24+
}
25+
26+
public function providePathMappings(): array
27+
{
28+
return [
29+
'vite js' => ['vite', 'vite.config.js'],
30+
'vite ts' => ['vite', 'vite.config.ts'],
31+
'mix' => ['mix', 'webpack.mix.js'],
32+
'unsupported' => [false, 'unsupported'],
33+
];
34+
}
35+
36+
/** @dataProvider providePathMappings */
37+
public function testItDetectsPaths(string|bool $expected, string $filename): void
38+
{
39+
touch(base_path($filename));
40+
41+
$detected = app(NodeBuildToolDetector::class)->detect();
42+
43+
self::assertEquals($expected, $detected);
44+
}
45+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace BlameButton\LaravelDockerBuilder\Tests\Unit\Detectors;
4+
5+
use BlameButton\LaravelDockerBuilder\Detectors\NodePackageManagerDetector;
6+
use BlameButton\LaravelDockerBuilder\Tests\TestCase;
7+
8+
/**
9+
* @uses \BlameButton\LaravelDockerBuilder\DockerServiceProvider
10+
* @uses \BlameButton\LaravelDockerBuilder\Detectors\FileDetector
11+
*
12+
* @covers \BlameButton\LaravelDockerBuilder\Detectors\NodePackageManagerDetector
13+
*/
14+
class NodePackageManagerTest extends TestCase
15+
{
16+
protected function setUp(): void
17+
{
18+
parent::setUp();
19+
20+
collect(['package-lock.json', 'yarn.lock'])
21+
->map(fn ($file) => base_path($file))
22+
->filter(fn ($file) => file_exists($file))
23+
->each(fn ($file) => unlink($file));
24+
}
25+
26+
public function providePathMappings(): array
27+
{
28+
return [
29+
'npm' => ['npm', 'package-lock.json'],
30+
'yarn' => ['yarn', 'yarn.lock'],
31+
];
32+
}
33+
34+
/** @dataProvider providePathMappings */
35+
public function testItDetectsPaths(string|bool $expected, string $filename): void
36+
{
37+
touch(base_path($filename));
38+
39+
$detected = app(NodePackageManagerDetector::class)->detect();
40+
41+
self::assertEquals($expected, $detected);
42+
}
43+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
namespace BlameButton\LaravelDockerBuilder\Tests\Unit\Detectors;
4+
5+
use BlameButton\LaravelDockerBuilder\Detectors\PhpVersionDetector;
6+
use BlameButton\LaravelDockerBuilder\Tests\TestCase;
7+
use Composer\Semver\VersionParser;
8+
use Mockery\MockInterface;
9+
10+
/**
11+
* @uses \BlameButton\LaravelDockerBuilder\DockerServiceProvider
12+
* @uses \BlameButton\LaravelDockerBuilder\Commands\GenerateQuestions\Choices\PhpVersion
13+
*
14+
* @covers \BlameButton\LaravelDockerBuilder\Detectors\PhpVersionDetector
15+
*/
16+
class PhpVersionDetectorTest extends TestCase
17+
{
18+
public function testItReturnsFalseWhenNoComposerFileWasFound(): void
19+
{
20+
$this->partialMock(PhpVersionDetector::class, function (MockInterface $mock) {
21+
$mock->shouldReceive('getComposerFileContents')
22+
->once()
23+
->andReturn(false);
24+
});
25+
26+
$detected = app(PhpVersionDetector::class)->detect();
27+
28+
self::assertFalse($detected);
29+
}
30+
31+
public function testItReturnsFalseWhenNoPhpVersionWasFound(): void
32+
{
33+
$this->partialMock(PhpVersionDetector::class, function (MockInterface $mock) {
34+
$mock->shouldReceive('getComposerFileContents')
35+
->once()
36+
->andReturn('{ "require": {} }');
37+
});
38+
39+
$detected = app(PhpVersionDetector::class)->detect();
40+
41+
self::assertFalse($detected);
42+
}
43+
44+
public function provideVersions(): array
45+
{
46+
return [
47+
['8.2', '^8.2'],
48+
['8.2', '>=8.2'],
49+
['8.1', '~8.1'],
50+
['8.1', '8.1.*'],
51+
['8.0', '^8.0.2'],
52+
['8.0', '8.0.24'],
53+
];
54+
}
55+
56+
/** @dataProvider provideVersions */
57+
public function testItParsesJsonVersion($expected, string $version): void
58+
{
59+
$this->partialMock(PhpVersionDetector::class, function (MockInterface $mock) use ($version) {
60+
$mock->shouldReceive('getComposerFileContents')
61+
->once()
62+
->andReturn(sprintf('{ "require": { "php": "%s" } }', $version));
63+
});
64+
65+
$this->partialMock(VersionParser::class, function (MockInterface $mock) use ($version) {
66+
$mock->shouldReceive('parseConstraints')
67+
->with($version)
68+
->once()
69+
->passthru();
70+
});
71+
72+
$detected = app(PhpVersionDetector::class)->detect();
73+
74+
self::assertEquals($expected, $detected);
75+
}
76+
}

0 commit comments

Comments
 (0)