Passed
Pull Request — master (#105)
by Craig
12:22
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
                'composer' => [
43
                    'installed.json' => '{"packages":[{"name": "foo/bar", "autoload":{"psr-4":{"":"src"}}}]}',
44
                ],
45
                'foo' => [
46
                    'bar' => [
47
                        'src' => [
48
                            'MyClass.php' => '',
49
                        ],
50
                    ],
51
                ],
52
            ],
53
        ]);
54
55
        $files = $this->locate($this->root->getChild('composer.json')->url());
56
57
        $this->assertCount(1, $files);
58
59
        $expectedFile = $this->root->getChild('vendor/foo/bar/src/MyClass.php')->url();
60
        $actualFile = str_replace('\\', '/', reset($files));
61
        $this->assertSame($expectedFile, $actualFile);
62
    }
63
64
    public function testVendorDirsWithoutComposerFilesAreIgnored()
65
    {
66
        vfsStream::create([
67
            'composer.json' => '{"require": {"foo/bar": "^1.0"}}',
68
            'vendor' => [
69
                'composer' => [
70
                    'installed.json' => '{"packages":[]}',
71
                ],
72
                'foo' => [
73
                    'bar' => [
74
                        'src' => [
75
                            'MyClass.php' => '',
76
                        ],
77
                    ],
78
                ],
79
            ],
80
        ]);
81
82
        $files = $this->locate($this->root->getChild('composer.json')->url());
83
84
        $this->assertCount(0, $files);
85
    }
86
87
    public function testVendorConfigSettingIsBeingUsed()
88
    {
89
        vfsStream::create([
90
            'composer.json' => '{"require":{"foo/bar": "^1.0"},"config":{"vendor-dir":"alternate-vendor"}}',
91
            'alternate-vendor' => [
92
                'composer' => [
93
                    'installed.json' => '{"packages":[{"name": "foo/bar", "autoload":{"psr-4":{"":"src"}}}]}',
94
                ],
95
                'foo' => [
96
                    'bar' => [
97
                        'src' => [
98
                            'MyClass.php' => '',
99
                        ],
100
                    ],
101
                ],
102
            ],
103
        ]);
104
105
        $files = $this->locate($this->root->getChild('composer.json')->url());
106
107
        $this->assertCount(1, $files);
108
109
        $expectedFile = $this->root->getChild('alternate-vendor/foo/bar/src/MyClass.php')->url();
110
        $actualFile = str_replace('\\', '/', reset($files));
111
        $this->assertSame($expectedFile, $actualFile);
112
    }
113
114
    public function testInstalledJsonUsedAsFallback()
115
    {
116
        vfsStream::create([
117
            'composer.json' => '{"require":{"foo/bar": "^1.0"}}',
118
            'vendor' => [
119
                'composer' => [
120
                    'installed.json' => '{"packages": [{"name": "foo/bar", "autoload":{"psr-4":{"":"src"}}}]}',
121
                ],
122
                'foo' => [
123
                    'bar' => [
124
                        'src' => [
125
                            'MyClass.php' => '',
126
                        ],
127
                    ],
128
                ],
129
            ],
130
        ]);
131
132
        $files = $this->locate($this->root->getChild('composer.json')->url());
133
134
        $this->assertCount(1, $files);
135
136
        $expectedFile = $this->root->getChild('vendor/foo/bar/src/MyClass.php')->url();
137
        $actualFile = str_replace('\\', '/', reset($files));
138
        $this->assertSame($expectedFile, $actualFile);
139
140
        # Ensure we didn't leave our temporary composer.json lying around
141
        $this->assertFalse($this->root->hasChild('vendor/foo/bar/composer.json'));
142
    }
143
144
145
    /**
146
     * https://github.com/composer/composer/pull/7999
147
     */
148
    public function testOldInstalledJsonUsedAsFallback()
149
    {
150
        vfsStream::create([
151
            'composer.json' => '{"require":{"foo/bar": "^1.0"}}',
152
            'vendor' => [
153
                'composer' => [
154
                    'installed.json' => '[{"name": "foo/bar", "autoload":{"psr-4":{"":"src"}}}]',
155
                ],
156
                'foo' => [
157
                    'bar' => [
158
                        'src' => [
159
                            'MyClass.php' => '',
160
                        ],
161
                    ],
162
                ],
163
            ],
164
        ]);
165
166
        $files = $this->locate($this->root->getChild('composer.json')->url());
167
168
        $this->assertCount(1, $files);
169
170
        $expectedFile = $this->root->getChild('vendor/foo/bar/src/MyClass.php')->url();
171
        $actualFile = str_replace('\\', '/', reset($files));
172
        $this->assertSame($expectedFile, $actualFile);
173
174
        # Ensure we didn't leave our temporary composer.json lying around
175
        $this->assertFalse($this->root->hasChild('vendor/foo/bar/composer.json'));
176
    }
177
178
    /**
179
     * @return string[]
180
     */
181
    private function locate(string $composerJson): array
182
    {
183
        return iterator_to_array(($this->locator)($composerJson));
184
    }
185
}
186