diff --git a/tests/Composer/Test/Command/FundCommandTest.php b/tests/Composer/Test/Command/FundCommandTest.php new file mode 100644 index 000000000..92593724f --- /dev/null +++ b/tests/Composer/Test/Command/FundCommandTest.php @@ -0,0 +1,204 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Test\Command; + +use Composer\Test\TestCase; +use Generator; + +class FundCommandTest extends TestCase +{ + /** + * @dataProvider useCaseProvider + * @param array $composerJson + * @param array $command + * @param array $funding + */ + public function testFundCommand( + array $composerJson, + array $command, + array $funding, + string $expected + ): void { + $this->initTempComposer($composerJson); + + $packages = [ + 'first/pkg' => $this->getPackage('first/pkg', '2.3.4'), + 'stable/pkg' => $this->getPackage('stable/pkg', '1.0.0'), + ]; + $devPackages = [ + 'dev/pkg' => $this->getPackage('dev/pkg', '2.3.4.5') + ]; + + if (count($funding) !== 0) { + foreach ($funding as $pkg => $fundingInfo) { + if (isset($packages[$pkg])) { + $packages[$pkg]->setFunding([$fundingInfo]); + } + if (isset($devPackages[$pkg])) { + $devPackages[$pkg]->setFunding([$fundingInfo]); + } + } + } + + $this->createInstalledJson($packages, $devPackages); + + $appTester = $this->getApplicationTester(); + $appTester->run(array_merge(['command' => 'fund'], $command)); + + $appTester->assertCommandIsSuccessful(); + $this->assertSame(trim($expected), trim($appTester->getDisplay(true))); + } + + public function useCaseProvider(): Generator + { + yield 'no funding links present, locally or remotely' => [ + [ + 'repositories' => [], + 'require' => [ + 'first/pkg' => '^2.0', + ], + 'require-dev' => [ + 'dev/pkg' => '~4.0', + ] + ], + [], + [], + "No funding links were found in your package dependencies. This doesn't mean they don't need your support!" + ]; + + yield 'funding links set locally are used as fallback if not found remotely' => [ + [ + 'repositories' => [], + 'require' => [ + 'first/pkg' => '^2.0', + ], + 'require-dev' => [ + 'dev/pkg' => '~4.0', + ] + ], + [], + [ + 'first/pkg' => [ + 'type' => 'github', + 'url' => 'https://github.com/composer-test-data' + ], + 'dev/pkg' => [ + 'type' => 'github', + 'url' => 'https://github.com/composer-test-data-dev' + ] + ], + "The following packages were found in your dependencies which publish funding information: + +dev + pkg + https://github.com/sponsors/composer-test-data-dev + +first + https://github.com/sponsors/composer-test-data + +Please consider following these links and sponsoring the work of package authors! +Thank you!" + ]; + + yield 'funding links set remotely are used as primary if found' => [ + [ + 'repositories' => [ + [ + 'type' => 'package', + 'package' => [ + // should not be used as there is a default branch version of this package available + ['name' => 'first/pkg', 'version' => 'dev-foo', 'funding' => [['type' => 'github', 'url' => 'https://github.com/test-should-not-be-used']]], + // should be used as default branch from remote repo takes precedence + ['name' => 'first/pkg', 'version' => 'dev-main', 'default-branch' => true, 'funding' => [['type' => 'custom', 'url' => 'https://example.org']]], + // should be used as default branch from remote repo takes precedence + ['name' => 'dev/pkg', 'version' => 'dev-foo', 'default-branch' => true, 'funding' => [['type' => 'github', 'url' => 'https://github.com/org']]], + // no default branch available so falling back to locally installed data + ['name' => 'stable/pkg', 'version' => '1.0.0', 'funding' => [['type' => 'github', 'url' => 'org2']]], + ], + ] + ], + 'require' => [ + 'first/pkg' => '^2.0', + 'stable/pkg' => '^1.0', + ], + 'require-dev' => [ + 'dev/pkg' => '~4.0', + ] + ], + [], + [ + 'first/pkg' => [ + 'type' => 'github', + 'url' => 'https://github.com/composer-test-data' + ], + 'dev/pkg' => [ + 'type' => 'github', + 'url' => 'https://github.com/composer-test-data-dev' + ], + 'stable/pkg' => [ + 'type' => 'github', + 'url' => 'https://github.com/composer-test-data-stable' + ] + ], + "The following packages were found in your dependencies which publish funding information: + +dev + pkg + https://github.com/sponsors/org + +first + https://example.org + +stable + https://github.com/sponsors/composer-test-data-stable + +Please consider following these links and sponsoring the work of package authors! +Thank you!" + ]; + + yield 'format funding links as JSON' => [ + [ + 'repositories' => [], + 'require' => [ + 'first/pkg' => '^2.0', + ], + 'require-dev' => [ + 'dev/pkg' => '~4.0', + ] + ], + ['--format' => 'json'], + [ + 'first/pkg' => [ + 'type' => 'github', + 'url' => 'https://github.com/composer-test-data' + ], + 'dev/pkg' => [ + 'type' => 'github', + 'url' => 'https://github.com/composer-test-data-dev' + ] + ], + '{ + "dev": { + "https://github.com/sponsors/composer-test-data-dev": [ + "pkg" + ] + }, + "first": { + "https://github.com/sponsors/composer-test-data": [ + "pkg" + ] + } +}' + ]; + } +}