File: RepositoryUtilsTest.php

package info (click to toggle)
composer 2.8.11-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,752 kB
  • sloc: php: 77,487; makefile: 59; xml: 39
file content (96 lines) | stat: -rw-r--r-- 3,763 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php declare(strict_types=1);

/*
 * This file is part of Composer.
 *
 * (c) Nils Adermann <naderman@naderman.de>
 *     Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Composer\Test\Repository;

use Composer\Package\PackageInterface;
use Composer\Repository\RepositoryUtils;
use Composer\Test\TestCase;
use Generator;
use PHPUnit\Framework\Attributes\DataProvider;

class RepositoryUtilsTest extends TestCase
{
    /**
     * @param PackageInterface[] $pkgs
     * @param string[] $expected
     */
    #[DataProvider('provideFilterRequireTests')]
    public function testFilterRequiredPackages(array $pkgs, PackageInterface $requirer, array $expected, bool $includeRequireDev = false): void
    {
        $expected = array_map(static function (string $name) use ($pkgs): PackageInterface {
            return $pkgs[$name];
        }, $expected);

        self::assertSame($expected, RepositoryUtils::filterRequiredPackages($pkgs, $requirer, $includeRequireDev));
    }

    /**
     * @return array<PackageInterface>
     */
    private static function getPackages(): array
    {
        $packageA = self::getPackage('required/a');
        $packageB = self::getPackage('required/b');
        self::configureLinks($packageB, ['require' => ['required/c' => '*']]);
        $packageC = self::getPackage('required/c');
        $packageCAlias = self::getAliasPackage($packageC, '2.0.0');

        $packageCircular = self::getPackage('required/circular');
        self::configureLinks($packageCircular, ['require' => ['required/circular-b' => '*']]);
        $packageCircularB = self::getPackage('required/circular-b');
        self::configureLinks($packageCircularB, ['require' => ['required/circular' => '*']]);

        return [
            self::getPackage('dummy/pkg'),
            self::getPackage('dummy/pkg2', '2.0.0'),
            'a' => $packageA,
            'b' => $packageB,
            'c' => $packageC,
            'c-alias' => $packageCAlias,
            'circular' => $packageCircular,
            'circular-b' => $packageCircularB,
        ];
    }

    public static function provideFilterRequireTests(): Generator
    {
        $pkgs = self::getPackages();

        $requirer = self::getPackage('requirer/pkg');
        yield 'no require' => [$pkgs, $requirer, []];

        $requirer = self::getPackage('requirer/pkg');
        self::configureLinks($requirer, ['require-dev' => ['required/a' => '*']]);
        yield 'require-dev has no effect' => [$pkgs, $requirer, []];

        $requirer = self::getPackage('requirer/pkg');
        self::configureLinks($requirer, ['require-dev' => ['required/a' => '*']]);
        yield 'require-dev works if called with it enabled' => [$pkgs, $requirer, ['a'], true];

        $requirer = self::getPackage('requirer/pkg');
        self::configureLinks($requirer, ['require' => ['required/a' => '*']]);
        yield 'simple require' => [$pkgs, $requirer, ['a']];

        $requirer = self::getPackage('requirer/pkg');
        self::configureLinks($requirer, ['require' => ['required/a' => 'dev-lala']]);
        yield 'require constraint is irrelevant' => [$pkgs, $requirer, ['a']];

        $requirer = self::getPackage('requirer/pkg');
        self::configureLinks($requirer, ['require' => ['required/b' => '*']]);
        yield 'require transitive deps and aliases are included' => [$pkgs, $requirer, ['b', 'c', 'c-alias']];

        $requirer = self::getPackage('requirer/pkg');
        self::configureLinks($requirer, ['require' => ['required/circular' => '*']]);
        yield 'circular deps are no problem' => [$pkgs, $requirer, ['circular', 'circular-b']];
    }
}