BuilderTest   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 179
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 110
dl 0
loc 179
rs 10
c 1
b 0
f 0
wmc 8

8 Methods

Rating   Name   Duplication   Size   Complexity  
A testBuildInvalidVendor() 0 12 1
A testBuildDockerTemplateWithoutBootstrapFromPHAR() 0 29 1
A testBuildLocalTemplateWithoutBootstrapFromPHAR() 0 15 1
A testBuildDockerTemplateWithBinaryOutsideRepo() 0 27 1
A testBuildWSLTemplate() 0 15 1
A testBuildBootstrapNotFound() 0 17 1
A testBuildLocalTemplate() 0 15 1
A testBuildDockerTemplate() 0 30 1
1
<?php
2
3
/**
4
 * This file is part of CaptainHook
5
 *
6
 * (c) Sebastian Feldmann <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
declare(strict_types=1);
13
14
namespace CaptainHook\App\Hook\Template;
15
16
use CaptainHook\App\Config\Mockery as ConfigMockery;
17
use CaptainHook\App\Config\Run;
18
use CaptainHook\App\Git\DummyRepo;
19
use CaptainHook\App\Mockery as AppMockery;
20
use Exception;
21
use PHPUnit\Framework\TestCase;
22
23
class BuilderTest extends TestCase
24
{
25
    use AppMockery;
26
    use ConfigMockery;
27
28
    public function testBuildDockerTemplate(): void
29
    {
30
        $repo = new DummyRepo(
31
            [],
32
            [
33
                'captainhook.json' => '{}',
34
                'vendor' => [
35
                    'autoload.php' => '',
36
                    'bin' => [
37
                        'captainhook' => ''
38
                    ]
39
                ]
40
            ]
41
        );
42
43
        $resolver   = $this->createResolverMock($repo->getRoot() . '/vendor/bin/captainhook', false);
44
        $repository = $this->createRepositoryMock($repo->getRoot());
45
        $config     = $this->createConfigMock(true, $repo->getRoot() . '/captainhook.json');
46
        $runConfig  = new Run(['mode' => 'docker', 'exec' => 'docker exec captain-container', 'path' => '']);
47
        $config->method('getRunConfig')->willReturn($runConfig);
48
        $config->method('getBootstrap')->willReturn('vendor/autoload.php');
49
50
        $template = Builder::build($config, $repository, $resolver);
51
        $this->assertInstanceOf(Docker::class, $template);
52
53
        $code = $template->getCode('pre-commit');
54
        $this->assertStringContainsString('pre-commit', $code);
55
        $this->assertStringContainsString('docker exec -i captain-container', $code);
56
        $this->assertStringContainsString('vendor/bin/captainhook', $code);
57
        $this->assertStringContainsString('--bootstrap=vendor/autoload.php', $code);
58
    }
59
60
    public function testBuildDockerTemplateWithoutBootstrapFromPHAR(): void
61
    {
62
        $repo = new DummyRepo(
63
            [],
64
            [
65
                'captainhook.json' => '{}',
66
                'vendor' => [
67
                    'autoload.php' => '',
68
                    'bin' => [
69
                        'captainhook' => ''
70
                    ]
71
                ]
72
            ]
73
        );
74
75
        $resolver   = $this->createResolverMock($repo->getRoot() . '/vendor/bin/captainhook', true);
76
        $repository = $this->createRepositoryMock($repo->getRoot());
77
        $config     = $this->createConfigMock(true, $repo->getRoot() . '/captainhook.json');
78
        $runConfig  = new Run(['mode' => 'docker', 'exec' => 'docker exec captain-container', 'path' => '']);
79
        $config->method('getRunConfig')->willReturn($runConfig);
80
        $config->method('getBootstrap')->willReturn('');
81
82
        $template = Builder::build($config, $repository, $resolver);
83
        $this->assertInstanceOf(Docker::class, $template);
84
85
        $code = $template->getCode('pre-commit');
86
        $this->assertStringContainsString('pre-commit', $code);
87
        $this->assertStringContainsString('docker exec -i captain-container', $code);
88
        $this->assertStringNotContainsString('--bootstrap=', $code);
89
    }
90
91
    public function testBuildDockerTemplateWithBinaryOutsideRepo(): void
92
    {
93
        $repo = new DummyRepo(
94
            [],
95
            [
96
                'captainhook.json' => '{}',
97
                'vendor' => [
98
                    'autoload.php' => '',
99
                ]
100
            ]
101
        );
102
103
        $executable = realpath(__DIR__ . '/../../../../bin/captainhook');
104
        $resolver   = $this->createResolverMock($executable, false);
105
        $repository = $this->createRepositoryMock($repo->getRoot());
106
        $config     = $this->createConfigMock(true, $repo->getRoot() . '/captainhook.json');
107
        $runConfig  = new Run(['mode' => 'docker', 'exec' => 'docker exec captain-container', 'path' => '']);
108
        $config->method('getRunConfig')->willReturn($runConfig);
109
        $config->method('getBootstrap')->willReturn('vendor/autoload.php');
110
111
        $template = Builder::build($config, $repository, $resolver);
112
        $code     = $template->getCode('pre-commit');
113
114
        $this->assertInstanceOf(Docker::class, $template);
115
        $this->assertStringContainsString('pre-commit', $code);
116
        $this->assertStringContainsString('docker exec -i captain-container', $code);
117
        $this->assertStringContainsString($executable, $code);
118
    }
119
120
    public function testBuildLocalTemplateWithoutBootstrapFromPHAR(): void
121
    {
122
        $resolver   = $this->createResolverMock(CH_PATH_FILES . '/bin/captainhook', true);
123
        $repository = $this->createRepositoryMock(CH_PATH_FILES);
124
        $config     = $this->createConfigMock(true, CH_PATH_FILES . '/template/captainhook.json');
125
        $runConfig  = new Run(['mode' => 'shell', 'exec' => '', 'path' => '']);
126
        $config->method('getRunConfig')->willReturn($runConfig);
127
        $config->method('getBootstrap')->willReturn('');
128
129
        $template = Builder::build($config, $repository, $resolver);
130
        $this->assertInstanceOf(Local\Shell::class, $template);
131
132
        $code = $template->getCode('pre-commit');
133
        $this->assertStringContainsString('pre-commit', $code);
134
        $this->assertStringNotContainsString('--bootstrap=', $code);
135
    }
136
137
    public function testBuildLocalTemplate(): void
138
    {
139
        $resolver   = $this->createResolverMock(CH_PATH_FILES . '/bin/captainhook', false);
140
        $repository = $this->createRepositoryMock(CH_PATH_FILES);
141
        $config     = $this->createConfigMock(true, CH_PATH_FILES . '/template/captainhook.json');
142
        $runConfig  = new Run(['mode' => 'php', 'exec' => '', 'path' => '']);
143
        $config->method('getRunConfig')->willReturn($runConfig);
144
        $config->method('getBootstrap')->willReturn('vendor/autoload.php');
145
146
        $template = Builder::build($config, $repository, $resolver);
147
        $this->assertInstanceOf(Local\PHP::class, $template);
148
149
        $code = $template->getCode('pre-commit');
150
        $this->assertStringContainsString('pre-commit', $code);
151
        $this->assertStringContainsString('$captainHook->run', $code);
152
    }
153
154
    public function testBuildWSLTemplate(): void
155
    {
156
        $resolver   = $this->createResolverMock(CH_PATH_FILES . '/bin/captainhook', false);
157
        $repository = $this->createRepositoryMock(CH_PATH_FILES);
158
        $config     = $this->createConfigMock(true, CH_PATH_FILES . '/template/captainhook.json');
159
        $runConfig  = new Run(['mode' => 'wsl', 'exec' => '', 'path' => '']);
160
        $config->method('getRunConfig')->willReturn($runConfig);
161
        $config->method('getBootstrap')->willReturn('vendor/autoload.php');
162
163
        $template = Builder::build($config, $repository, $resolver);
164
        $this->assertInstanceOf(Local\WSL::class, $template);
165
166
        $code = $template->getCode('pre-commit');
167
        $this->assertStringContainsString('pre-commit', $code);
168
        $this->assertStringContainsString('wsl.exe', $code);
169
    }
170
171
    public function testBuildBootstrapNotFound(): void
172
    {
173
        $this->expectException(Exception::class);
174
175
        $resolver   = $this->createResolverMock(CH_PATH_FILES . '/bin/captainhook');
176
        $repository = $this->createRepositoryMock(CH_PATH_FILES);
177
        $config     = $this->createConfigMock(true, CH_PATH_FILES . '/template/captainhook.json');
178
        $runConfig  = new Run(['mode' => 'php', 'exec' => '', 'path' => '']);
179
        $config->method('getRunConfig')->willReturn($runConfig);
180
        $config->method('getBootstrap')->willReturn('vendorXX/autoload.php');
181
182
        $template = Builder::build($config, $repository, $resolver);
183
        $this->assertInstanceOf(Local\PHP::class, $template);
184
185
        $code = $template->getCode('pre-commit');
186
        $this->assertStringContainsString('pre-commit', $code);
187
        $this->assertStringContainsString('$captainHook->run', $code);
188
    }
189
190
    public function testBuildInvalidVendor(): void
191
    {
192
        $this->expectException(Exception::class);
193
194
        $resolver   = $this->createResolverMock('./captainhook');
195
        $repository = $this->createRepositoryMock(CH_PATH_FILES . '/config');
196
        $config     = $this->createConfigMock(true, CH_PATH_FILES . '/config/valid.json');
197
        $runConfig  = new Run(['mode' => 'php', 'exec' => '', 'path' => '']);
198
        $config->method('getRunConfig')->willReturn($runConfig);
199
        $config->method('getBootstrap')->willReturn('file-not-there.php');
200
201
        Builder::build($config, $repository, $resolver);
202
    }
203
}
204