Skip to content

Commit e4ff652

Browse files
authored
Merge pull request #7 from RonasIT/add-new-init-command-step
feat: install packages in command
2 parents dcbd8c3 + cad46cc commit e4ff652

File tree

3 files changed

+69
-31
lines changed

3 files changed

+69
-31
lines changed

src/Commands/InitCommand.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ class InitCommand extends Command implements Isolatable
5252

5353
protected string $readmeContent = '';
5454

55+
protected array $composerCommands = [
56+
'composer require ronasit/laravel-helpers',
57+
'composer require ronasit/laravel-swagger',
58+
'composer require --dev ronasit/laravel-entity-generator',
59+
];
60+
5561
public function handle(): void
5662
{
5763
$appName = $this->argument('application-name');
@@ -114,11 +120,16 @@ public function handle(): void
114120
}
115121
}
116122

123+
if ($this->confirm('Do you want to install media package?')) {
124+
$this->composerCommands[] = 'composer require ronasit/laravel-media';
125+
}
126+
117127
if ($this->confirm('Do you want to uninstall project-initializator package?', true)) {
118-
$command = 'composer remove ronasit/laravel-project-initializator';
119-
$path = base_path();
128+
$this->composerCommands[] = 'composer remove ronasit/laravel-project-initializator';
129+
}
120130

121-
exec("cd {$path} && {$command}");
131+
foreach ($this->composerCommands as $composerCommand) {
132+
shell_exec($composerCommand);
122133
}
123134
}
124135

tests/InitCommandTest.php

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,19 @@ public function testRunWithoutAdminAndReadmeCreation()
2323

2424
$this->mockFilePutContent();
2525

26+
$this->mockShellExec(
27+
['arguments' => 'composer require ronasit/laravel-helpers'],
28+
['arguments' => 'composer require ronasit/laravel-swagger'],
29+
['arguments' => 'composer require --dev ronasit/laravel-entity-generator'],
30+
);
31+
2632
$this
2733
->artisan('init "My App"')
2834
->expectsOutput('Project initialized successfully!')
2935
->expectsQuestion('Please enter an application URL', 'https://mysite.com')
3036
->expectsConfirmation('Do you want to generate an admin user?')
3137
->expectsConfirmation('Do you want to generate a README file?')
38+
->expectsConfirmation('Do you want to install media package?')
3239
->expectsConfirmation('Do you want to uninstall project-initializator package?')
3340
->assertExitCode(0);
3441
}
@@ -55,6 +62,12 @@ public function testRunWithAdminAndWithoutReadmeCreation()
5562
]
5663
);
5764

65+
$this->mockShellExec(
66+
['arguments' => 'composer require ronasit/laravel-helpers'],
67+
['arguments' => 'composer require ronasit/laravel-swagger'],
68+
['arguments' => 'composer require --dev ronasit/laravel-entity-generator'],
69+
);
70+
5871
$this
5972
->artisan('init "My App"')
6073
->expectsOutput('Project initialized successfully!')
@@ -65,14 +78,13 @@ public function testRunWithAdminAndWithoutReadmeCreation()
6578
->expectsQuestion('Please enter an admin password', '123456')
6679
->expectsQuestion('Please enter an admin role id', 1)
6780
->expectsConfirmation('Do you want to generate a README file?')
81+
->expectsConfirmation('Do you want to install media package?')
6882
->expectsConfirmation('Do you want to uninstall project-initializator package?')
6983
->assertExitCode(0);
7084
}
7185

7286
public function testRunWithAdminAndDefaultReadmeCreation()
7387
{
74-
$this->mockShellExec();
75-
7688
$this->mockFileGetContent(
7789
[
7890
'arguments' => ['.env.example'],
@@ -131,6 +143,13 @@ public function testRunWithAdminAndDefaultReadmeCreation()
131143
]
132144
);
133145

146+
$this->mockShellExec(
147+
['arguments' => 'git ls-remote --get-url origin', 'result' => 'https://github.com/ronasit/laravel-helpers.git'],
148+
['arguments' => 'composer require ronasit/laravel-helpers'],
149+
['arguments' => 'composer require ronasit/laravel-swagger'],
150+
['arguments' => 'composer require --dev ronasit/laravel-entity-generator'],
151+
);
152+
134153
$this
135154
->artisan('init "My App"')
136155
->expectsOutput('Project initialized successfully!')
@@ -195,6 +214,7 @@ public function testRunWithAdminAndDefaultReadmeCreation()
195214
->expectsOutput('- ArgoCD link')
196215
->expectsOutput('- Manager\'s email')
197216
->expectsOutput('- Code Owner/Team Lead\'s email')
217+
->expectsConfirmation('Do you want to install media package?')
198218
->expectsConfirmation('Do you want to uninstall project-initializator package?')
199219
->assertExitCode(0);
200220
}
@@ -245,6 +265,12 @@ public function testRunWithAdminAndPartialReadmeCreation()
245265
]
246266
);
247267

268+
$this->mockShellExec(
269+
['arguments' => 'composer require ronasit/laravel-helpers'],
270+
['arguments' => 'composer require ronasit/laravel-swagger'],
271+
['arguments' => 'composer require --dev ronasit/laravel-entity-generator'],
272+
);
273+
248274
$this
249275
->artisan('init "My App"')
250276
->expectsOutput('Project initialized successfully!')
@@ -298,14 +324,13 @@ public function testRunWithAdminAndPartialReadmeCreation()
298324
->expectsOutput('Don`t forget to fill the following empty values:')
299325
->expectsOutput('- Issue Tracker link')
300326
->expectsOutput('- Code Owner/Team Lead\'s email')
327+
->expectsConfirmation('Do you want to install media package?')
301328
->expectsConfirmation('Do you want to uninstall project-initializator package?')
302329
->assertExitCode(0);
303330
}
304331

305-
public function testRunWithAdminAndFullReadmeCreationAndRemovingInitializator()
332+
public function testRunWithAdminAndFullReadmeCreationAndRemovingInitializatorInstallationMedia()
306333
{
307-
$this->mockShellExec();
308-
309334
$this->mockFileGetContent(
310335
[
311336
'arguments' => ['.env.example'],
@@ -364,13 +389,14 @@ public function testRunWithAdminAndFullReadmeCreationAndRemovingInitializator()
364389
]
365390
);
366391

367-
$this->mockNativeFunction('RonasIT\ProjectInitializator\Commands', [
368-
$this->functionCall('exec', [
369-
'cd /app/tests/.. && composer remove ronasit/laravel-project-initializator',
370-
'optionalParameter',
371-
'optionalParameter',
372-
], 'success'),
373-
]);
392+
$this->mockShellExec(
393+
['arguments' => 'git ls-remote --get-url origin', 'result' => 'https://github.com/ronasit/laravel-helpers.git'],
394+
['arguments' => 'composer require ronasit/laravel-helpers'],
395+
['arguments' => 'composer require ronasit/laravel-swagger'],
396+
['arguments' => 'composer require --dev ronasit/laravel-entity-generator'],
397+
['arguments' => 'composer require ronasit/laravel-media'],
398+
['arguments' => 'composer remove ronasit/laravel-project-initializator'],
399+
);
374400

375401
$this
376402
->artisan('init "My App"')
@@ -430,6 +456,7 @@ public function testRunWithAdminAndFullReadmeCreationAndRemovingInitializator()
430456
->expectsQuestion('Please enter a Laravel Nova\'s admin email', '[email protected]')
431457
->expectsQuestion('Please enter a Laravel Nova\'s admin password', '654321')
432458
->expectsOutput('README generated successfully!')
459+
->expectsConfirmation('Do you want to install media package?', 'yes')
433460
->expectsConfirmation('Do you want to uninstall project-initializator package?', 'yes')
434461
->assertExitCode(0);
435462
}

tests/Support/Traits/InitCommandMockTrait.php

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,27 +26,27 @@ public function mockFilePutContent(...$arguments): void
2626
);
2727
}
2828

29-
public function mockShellExec(): void
29+
public function mockShellExec(array ...$rawCallChain): void
3030
{
31-
$this->mockNativeFunction('RonasIT\ProjectInitializator\Commands', [
32-
$this->functionCall(
33-
name: 'shell_exec',
34-
arguments: ['git ls-remote --get-url origin'],
35-
result: 'https://github.com/ronasit/laravel-helpers.git',
36-
),
37-
]);
31+
$callChain = array_map(fn ($call) => $this->functionCall(
32+
name: 'shell_exec',
33+
arguments: Arr::wrap($call['arguments']),
34+
result: Arr::get($call, 'result', 'success'),
35+
), $rawCallChain);
36+
37+
$this->mockNativeFunction('RonasIT\ProjectInitializator\Commands', $callChain);
3838
}
3939

40-
public function mockFileGetContent(...$rawCallChain): void
40+
public function mockFileGetContent(array ...$rawCallChain): void
4141
{
42-
$callChain = array_map(fn ($call) => [
43-
'function' => 'file_get_contents',
44-
'arguments' => array_merge(
45-
Arr::get($call, 'arguments', []),
46-
['optionalParameter', 'optionalParameter', 'optionalParameter', 'optionalParameter'],
42+
$callChain = array_map(fn ($call) => $this->functionCall(
43+
name: 'file_get_contents',
44+
arguments: array_merge(
45+
$call['arguments'],
46+
array_fill(0, 5 - count($call['arguments']), 'optionalParameter'),
4747
),
48-
'result' => $call['result'],
49-
], $rawCallChain);
48+
result: $call['result'],
49+
), $rawCallChain);
5050

5151
$this->mockNativeFunction(
5252
namespace: 'RonasIT\ProjectInitializator\Commands',

0 commit comments

Comments
 (0)