Test Failed
Pull Request — master (#105)
by Craig
12:01
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
        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());
40
41
        $this->assertCount(0, $files);
42
    }
43
44
    public function testSingleDependency()
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());
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()
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());
90
91
        $this->assertCount(0, $files);
92
    }
93
94
    public function testVendorConfigSettingIsBeingUsed()
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());
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()
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());
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()
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());
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
    /**
186
     * @return string[]
187
     */
188
    private function locate(string $composerJson): array
189
    {
190
        return iterator_to_array(($this->locator)($composerJson));
191
    }
192
}
193