Failed Conditions
Pull Request — master (#163)
by Guillaume
07:51
created

testWithoutDevDependencies()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 34
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 21
c 0
b 0
f 0
dl 0
loc 34
rs 9.584
cc 1
nc 1
nop 0
1
<?php
2
3
namespace ComposerRequireCheckerTest\FileLocator;
4
5
use ComposerRequireChecker\FileLocator\LocateComposerPackageDirectDependenciesSourceFiles;
6
use org\bovigo\vfs\vfsStream;
7
use org\bovigo\vfs\vfsStreamDirectory;
8
use PHPUnit\Framework\TestCase;
9
10
/**
11
 * @covers \ComposerRequireChecker\FileLocator\LocateComposerPackageDirectDependenciesSourceFiles
12
 */
13
final class LocateComposerPackageDirectDependenciesSourceFilesTest extends TestCase
14
{
15
    /** @var LocateComposerPackageDirectDependenciesSourceFiles */
16
    private $locator;
17
    /** @var vfsStreamDirectory */
18
    private $root;
19
20
    protected function setUp(): void
21
    {
22
        parent::setUp();
23
24
        $this->locator = new LocateComposerPackageDirectDependenciesSourceFiles();
25
        $this->root = vfsStream::setup();
26
    }
27
28
    public function testNoDependencies(): void
29
    {
30
        vfsStream::create([
31
            'composer.json' => '{}',
32
            'vendor' => [
33
                'composer' => [
34
                    'installed.json' => '{"packages":[]}',
35
                ],
36
            ],
37
        ]);
38
39
        $files = $this->locate($this->root->getChild('composer.json')->url(), 'require');
40
41
        $this->assertCount(0, $files);
42
    }
43
44
    public function testSingleDependency(): void
45
    {
46
        vfsStream::create([
47
            'composer.json' => '{"require":{"foo/bar": "^1.0"}}',
48
            'vendor' => [
49
                'composer' => [
50
                    'installed.json' => '{"packages":[{"name": "foo/bar", "autoload":{"psr-4":{"":"src"}}}]}',
51
                ],
52
                'foo' => [
53
                    'bar' => [
54
                        'src' => [
55
                            'MyClass.php' => '',
56
                        ],
57
                    ],
58
                ],
59
            ],
60
        ]);
61
62
        $files = $this->locate($this->root->getChild('composer.json')->url(), 'require');
63
64
        $this->assertCount(1, $files);
65
66
        $expectedFile = $this->root->getChild('vendor/foo/bar/src/MyClass.php')->url();
67
        $actualFile = str_replace('\\', '/', reset($files));
68
        $this->assertSame($expectedFile, $actualFile);
69
    }
70
71
    public function testVendorDirsWithoutComposerFilesAreIgnored(): void
72
    {
73
        vfsStream::create([
74
            'composer.json' => '{"require": {"foo/bar": "^1.0"}}',
75
            'vendor' => [
76
                'composer' => [
77
                    'installed.json' => '{"packages":[]}',
78
                ],
79
                'foo' => [
80
                    'bar' => [
81
                        'src' => [
82
                            'MyClass.php' => '',
83
                        ],
84
                    ],
85
                ],
86
            ],
87
        ]);
88
89
        $files = $this->locate($this->root->getChild('composer.json')->url(), 'require');
90
91
        $this->assertCount(0, $files);
92
    }
93
94
    public function testVendorConfigSettingIsBeingUsed(): void
95
    {
96
        vfsStream::create([
97
            'composer.json' => '{"require":{"foo/bar": "^1.0"},"config":{"vendor-dir":"alternate-vendor"}}',
98
            'alternate-vendor' => [
99
                'composer' => [
100
                    'installed.json' => '{"packages":[{"name": "foo/bar", "autoload":{"psr-4":{"":"src"}}}]}',
101
                ],
102
                'foo' => [
103
                    'bar' => [
104
                        'src' => [
105
                            'MyClass.php' => '',
106
                        ],
107
                    ],
108
                ],
109
            ],
110
        ]);
111
112
        $files = $this->locate($this->root->getChild('composer.json')->url(), 'require');
113
114
        $this->assertCount(1, $files);
115
116
        $expectedFile = $this->root->getChild('alternate-vendor/foo/bar/src/MyClass.php')->url();
117
        $actualFile = str_replace('\\', '/', reset($files));
118
        $this->assertSame($expectedFile, $actualFile);
119
    }
120
121
    public function testInstalledJsonUsedAsFallback(): void
122
    {
123
        vfsStream::create([
124
            'composer.json' => '{"require":{"foo/bar": "^1.0"}}',
125
            'vendor' => [
126
                'composer' => [
127
                    'installed.json' => '{"packages": [{"name": "foo/bar", "autoload":{"psr-4":{"":"src"}}}]}',
128
                ],
129
                'foo' => [
130
                    'bar' => [
131
                        'src' => [
132
                            'MyClass.php' => '',
133
                        ],
134
                    ],
135
                ],
136
            ],
137
        ]);
138
139
        $files = $this->locate($this->root->getChild('composer.json')->url(), 'require');
140
141
        $this->assertCount(1, $files);
142
143
        $expectedFile = $this->root->getChild('vendor/foo/bar/src/MyClass.php')->url();
144
        $actualFile = str_replace('\\', '/', reset($files));
145
        $this->assertSame($expectedFile, $actualFile);
146
147
        # Ensure we didn't leave our temporary composer.json lying around
148
        $this->assertFalse($this->root->hasChild('vendor/foo/bar/composer.json'));
149
    }
150
151
152
    /**
153
     * https://github.com/composer/composer/pull/7999
154
     */
155
    public function testOldInstalledJsonUsedAsFallback(): void
156
    {
157
        vfsStream::create([
158
            'composer.json' => '{"require":{"foo/bar": "^1.0"}}',
159
            'vendor' => [
160
                'composer' => [
161
                    'installed.json' => '[{"name": "foo/bar", "autoload":{"psr-4":{"":"src"}}}]',
162
                ],
163
                'foo' => [
164
                    'bar' => [
165
                        'src' => [
166
                            'MyClass.php' => '',
167
                        ],
168
                    ],
169
                ],
170
            ],
171
        ]);
172
173
        $files = $this->locate($this->root->getChild('composer.json')->url(), 'require');
174
175
        $this->assertCount(1, $files);
176
177
        $expectedFile = $this->root->getChild('vendor/foo/bar/src/MyClass.php')->url();
178
        $actualFile = str_replace('\\', '/', reset($files));
179
        $this->assertSame($expectedFile, $actualFile);
180
181
        # Ensure we didn't leave our temporary composer.json lying around
182
        $this->assertFalse($this->root->hasChild('vendor/foo/bar/composer.json'));
183
    }
184
185
    public function testWithoutDevDependencies(): void
186
    {
187
        vfsStream::create([
188
            'composer.json' => '{"require":{"foo/bar": "^1.0"},"require-dev":{"foo/baz": "^1.0"}}',
189
            'vendor' => [
190
                'composer' => [
191
                    'installed.json' =>
192
                        '{"packages":[' .
193
                            '{"name": "foo/bar", "autoload":{"psr-4":{"":"src"}}},' .
194
                            '{"name": "foo/baz", "autoload":{"psr-4":{"":"src"}}}' .
195
                        ']}',
196
                ],
197
                'foo' => [
198
                    'bar' => [
199
                        'src' => [
200
                            'MyClass.php' => '',
201
                        ],
202
                    ],
203
                    'baz' => [
204
                        'src' => [
205
                            'BazClass.php' => '',
206
                        ],
207
                    ],
208
                ],
209
            ],
210
        ]);
211
212
        $files = $this->locate($this->root->getChild('composer.json')->url(), 'require');
213
214
        $this->assertCount(1, $files);
215
216
        $expectedFile = $this->root->getChild('vendor/foo/bar/src/MyClass.php')->url();
217
        $actualFile = str_replace('\\', '/', reset($files));
218
        $this->assertSame($expectedFile, $actualFile);
219
    }
220
221
    public function testWithDevDependencies(): void
222
    {
223
        vfsStream::create([
224
            'composer.json' => '{"require":{"foo/bar": "^1.0"},"require-dev":{"foo/baz": "^1.0"}}',
225
            'vendor' => [
226
                'composer' => [
227
                    'installed.json' => <<<'INSTALLEDJSON'
228
{
229
    "packages": [
230
        {"name": "foo/bar", "autoload": {"psr-4":{"":"src"}}},
231
        {"name": "foo/baz", "autoload": {"psr-4":{"":"src"}}}
232
    ]
233
}
234
INSTALLEDJSON
235
                ],
236
                'foo' => [
237
                    'bar' => [
238
                        'src' => [
239
                            'MyClass.php' => '',
240
                        ],
241
                    ],
242
                    'baz' => [
243
                        'src' => [
244
                            'BazClass.php' => '',
245
                        ],
246
                    ],
247
                ],
248
            ],
249
        ]);
250
251
        $files = $this->locate($this->root->getChild('composer.json')->url(), 'require-dev');
252
253
        $this->assertCount(1, $files);
254
        $this->assertContains($this->root->getChild('vendor/foo/baz/src/BazClass.php')->url(), $files);
255
    }
256
257
    /**
258
     * @param string $composerJson
259
     * @param string $requireKey
260
     * @return string[]
261
     */
262
    private function locate(string $composerJson, string $requireKey): array
263
    {
264
        $files = [];
265
        $generator = ($this->locator)($composerJson, $requireKey);
266
        foreach ($generator as $file) {
267
            $files[] = str_replace(DIRECTORY_SEPARATOR, '/', $file);
268
        }
269
        return $files;
270
    }
271
}
272