Passed
Pull Request — master (#105)
by Craig
08:59
created

testInstalledJsonUsedAsFallback()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 28
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 15
dl 0
loc 28
rs 9.7666
c 0
b 0
f 0
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
class LocateComposerPackageDirectDependenciesSourceFilesTest extends TestCase
14
{
15
    /** @var LocateComposerPackageDirectDependenciesSourceFiles */
16
    private $locator;
17
    /** @var vfsStreamDirectory */
18
    private $root;
19
20
    protected function setUp()
21
    {
22
        parent::setUp();
23
24
        $this->locator = new LocateComposerPackageDirectDependenciesSourceFiles();
25
        $this->root = vfsStream::setup();
26
    }
27
28
    public function testNoDependencies()
29
    {
30
        $composerJson = vfsStream::newFile('composer.json')->at($this->root)->withContent('{}')->url();
31
32
        $files = $this->locate($composerJson);
33
34
        $this->assertCount(0, $files);
35
    }
36
37
    public function testSingleDependency()
38
    {
39
        vfsStream::create([
40
            'composer.json' => '{"require":{"foo/bar": "^1.0"}}',
41
            'vendor' => [
42
                'foo' => [
43
                    'bar' => [
44
                        'composer.json' => '{"autoload":{"psr-4":{"":"src"}}}',
45
                        'src' => [
46
                            'MyClass.php' => '',
47
                        ],
48
                    ],
49
                ],
50
            ],
51
        ]);
52
53
        $files = $this->locate($this->root->getChild('composer.json')->url());
54
55
        $this->assertCount(1, $files);
56
57
        $expectedFile = $this->root->getChild('vendor/foo/bar/src/MyClass.php')->url();
58
        $actualFile = str_replace('\\', '/', reset($files));
59
        $this->assertSame($expectedFile, $actualFile);
60
    }
61
62
    public function testVendorDirsWithoutComposerFilesAreIgnored()
63
    {
64
        vfsStream::create([
65
            'composer.json' => '{"require": {"foo/bar": "^1.0"}}',
66
            'vendor' => [
67
                'foo' => [
68
                    'bar' => [
69
                        'src' => [
70
                            'MyClass.php' => '',
71
                        ],
72
                    ],
73
                ],
74
            ],
75
        ]);
76
77
        $files = $this->locate($this->root->getChild('composer.json')->url());
78
79
        $this->assertCount(0, $files);
80
    }
81
82
    public function testVendorConfigSettingIsBeingUsed()
83
    {
84
        vfsStream::create([
85
            'composer.json' => '{"require":{"foo/bar": "^1.0"},"config":{"vendor-dir":"alternate-vendor"}}',
86
            'alternate-vendor' => [
87
                'foo' => [
88
                    'bar' => [
89
                        'composer.json' => '{"autoload":{"psr-4":{"":"src"}}}',
90
                        'src' => [
91
                            'MyClass.php' => '',
92
                        ],
93
                    ],
94
                ],
95
            ],
96
        ]);
97
98
        $files = $this->locate($this->root->getChild('composer.json')->url());
99
100
        $this->assertCount(1, $files);
101
102
        $expectedFile = $this->root->getChild('alternate-vendor/foo/bar/src/MyClass.php')->url();
103
        $actualFile = str_replace('\\', '/', reset($files));
104
        $this->assertSame($expectedFile, $actualFile);
105
    }
106
107
    public function testInstalledJsonUsedAsFallback()
108
    {
109
        vfsStream::create([
110
            'composer.json' => '{"require":{"foo/bar": "^1.0"}}',
111
            'vendor' => [
112
                'composer' => [
113
                    'installed.json' => '{"packages": [{"name": "foo/bar", "autoload":{"psr-4":{"":"src"}}}]}',
114
                ],
115
                'foo' => [
116
                    'bar' => [
117
                        'src' => [
118
                            'MyClass.php' => '',
119
                        ],
120
                    ],
121
                ],
122
            ],
123
        ]);
124
125
        $files = $this->locate($this->root->getChild('composer.json')->url());
126
127
        $this->assertCount(1, $files);
128
129
        $expectedFile = $this->root->getChild('vendor/foo/bar/src/MyClass.php')->url();
130
        $actualFile = str_replace('\\', '/', reset($files));
131
        $this->assertSame($expectedFile, $actualFile);
132
133
        # Ensure we didn't leave our temporary composer.json lying around
134
        $this->assertFalse($this->root->hasChild('vendor/foo/bar/composer.json'));
135
    }
136
137
138
    /**
139
     * https://github.com/composer/composer/pull/7999
140
     */
141
    public function testOldInstalledJsonUsedAsFallback()
142
    {
143
        vfsStream::create([
144
            'composer.json' => '{"require":{"foo/bar": "^1.0"}}',
145
            'vendor' => [
146
                'composer' => [
147
                    'installed.json' => '[{"name": "foo/bar", "autoload":{"psr-4":{"":"src"}}}]',
148
                ],
149
                'foo' => [
150
                    'bar' => [
151
                        'src' => [
152
                            'MyClass.php' => '',
153
                        ],
154
                    ],
155
                ],
156
            ],
157
        ]);
158
159
        $files = $this->locate($this->root->getChild('composer.json')->url());
160
161
        $this->assertCount(1, $files);
162
163
        $expectedFile = $this->root->getChild('vendor/foo/bar/src/MyClass.php')->url();
164
        $actualFile = str_replace('\\', '/', reset($files));
165
        $this->assertSame($expectedFile, $actualFile);
166
167
        # Ensure we didn't leave our temporary composer.json lying around
168
        $this->assertFalse($this->root->hasChild('vendor/foo/bar/composer.json'));
169
    }
170
171
    /**
172
     * @return string[]
173
     */
174
    private function locate(string $composerJson): array
175
    {
176
        return iterator_to_array(($this->locator)($composerJson));
177
    }
178
}
179