44
55namespace Php \PieIntegrationTest \Command ;
66
7+ use Composer \Composer ;
78use Composer \Package \Link ;
89use Composer \Package \RootPackage ;
10+ use Composer \Repository \InstalledArrayRepository ;
11+ use Composer \Repository \RepositoryManager ;
912use Composer \Semver \Constraint \Constraint ;
1013use Php \Pie \Command \InstallExtensionsForProjectCommand ;
1114use Php \Pie \ComposerIntegration \MinimalHelperSet ;
1215use Php \Pie \ComposerIntegration \PieJsonEditor ;
1316use Php \Pie \ComposerIntegration \QuieterConsoleIO ;
1417use Php \Pie \ExtensionType ;
18+ use Php \Pie \Installing \InstallForPhpProject \ComposerFactoryForProject ;
19+ use Php \Pie \Installing \InstallForPhpProject \DetermineExtensionsRequired ;
1520use Php \Pie \Installing \InstallForPhpProject \FindMatchingPackages ;
16- use Php \Pie \Installing \InstallForPhpProject \FindRootPackage ;
1721use Php \Pie \Installing \InstallForPhpProject \InstallPiePackageFromPath ;
1822use Php \Pie \Installing \InstallForPhpProject \InstallSelectedPackage ;
1923use PHPUnit \Framework \Attributes \CoversClass ;
3539final class InstallExtensionsForProjectCommandTest extends TestCase
3640{
3741 private CommandTester $ commandTester ;
38- private FindRootPackage &MockObject $ findRootpackage ;
42+ private ComposerFactoryForProject &MockObject $ composerFactoryForProject ;
3943 private FindMatchingPackages &MockObject $ findMatchingPackages ;
4044 private InstallSelectedPackage &MockObject $ installSelectedPackage ;
4145 private QuestionHelper &MockObject $ questionHelper ;
@@ -63,14 +67,15 @@ function (string $service): mixed {
6367 },
6468 );
6569
66- $ this ->findRootpackage = $ this ->createMock (FindRootPackage ::class);
67- $ this ->findMatchingPackages = $ this ->createMock (FindMatchingPackages::class);
68- $ this ->installSelectedPackage = $ this ->createMock (InstallSelectedPackage::class);
69- $ this ->installPiePackage = $ this ->createMock (InstallPiePackageFromPath::class);
70- $ this ->questionHelper = $ this ->createMock (QuestionHelper::class);
70+ $ this ->composerFactoryForProject = $ this ->createMock (ComposerFactoryForProject ::class);
71+ $ this ->findMatchingPackages = $ this ->createMock (FindMatchingPackages::class);
72+ $ this ->installSelectedPackage = $ this ->createMock (InstallSelectedPackage::class);
73+ $ this ->installPiePackage = $ this ->createMock (InstallPiePackageFromPath::class);
74+ $ this ->questionHelper = $ this ->createMock (QuestionHelper::class);
7175
7276 $ cmd = new InstallExtensionsForProjectCommand (
73- $ this ->findRootpackage ,
77+ $ this ->composerFactoryForProject ,
78+ new DetermineExtensionsRequired (),
7479 $ this ->findMatchingPackages ,
7580 $ this ->installSelectedPackage ,
7681 $ this ->installPiePackage ,
@@ -89,7 +94,18 @@ public function testInstallingExtensionsForPhpProject(): void
8994 'ext-standard ' => new Link ('my/project ' , 'ext-standard ' , new Constraint ('= ' , '* ' ), Link::TYPE_REQUIRE ),
9095 'ext-foobar ' => new Link ('my/project ' , 'ext-foobar ' , new Constraint ('= ' , '* ' ), Link::TYPE_REQUIRE ),
9196 ]);
92- $ this ->findRootpackage ->method ('forCwd ' )->willReturn ($ rootPackage );
97+ $ this ->composerFactoryForProject ->method ('rootPackage ' )->willReturn ($ rootPackage );
98+
99+ $ installedRepository = new InstalledArrayRepository ([$ rootPackage ]);
100+
101+ $ repositoryManager = $ this ->createMock (RepositoryManager::class);
102+ $ repositoryManager ->method ('getLocalRepository ' )->willReturn ($ installedRepository );
103+
104+ $ composer = $ this ->createMock (Composer::class);
105+ $ composer ->method ('getPackage ' )->willReturn ($ rootPackage );
106+ $ composer ->method ('getRepositoryManager ' )->willReturn ($ repositoryManager );
107+
108+ $ this ->composerFactoryForProject ->method ('composer ' )->willReturn ($ composer );
93109
94110 $ this ->findMatchingPackages ->method ('for ' )->willReturn ([
95111 ['name ' => 'vendor1/foobar ' , 'description ' => 'The official foobar implementation ' ],
@@ -111,15 +127,15 @@ public function testInstallingExtensionsForPhpProject(): void
111127
112128 $ this ->commandTester ->assertCommandIsSuccessful ();
113129 self ::assertStringContainsString ('Checking extensions for your project my/project ' , $ outputString );
114- self ::assertStringContainsString ('requires: standard ✅ Already installed ' , $ outputString );
115- self ::assertStringContainsString ('requires: foobar ⚠️ Missing ' , $ outputString );
130+ self ::assertStringContainsString ('requires: my/project requires ext- standard (== *) ✅ Already installed ' , $ outputString );
131+ self ::assertStringContainsString ('requires: my/project requires ext- foobar (== *) ⚠️ Missing ' , $ outputString );
116132 }
117133
118134 public function testInstallingExtensionsForPieProject (): void
119135 {
120136 $ rootPackage = new RootPackage ('my/project ' , '1.2.3.0 ' , '1.2.3 ' );
121137 $ rootPackage ->setType (ExtensionType::PhpModule->value );
122- $ this ->findRootpackage ->method ('forCwd ' )->willReturn ($ rootPackage );
138+ $ this ->composerFactoryForProject ->method ('rootPackage ' )->willReturn ($ rootPackage );
123139
124140 $ this ->installPiePackage
125141 ->expects (self ::once ())
0 commit comments