Skip to content

Commit 60a94d5

Browse files
Coverage with AI is now 76.6
1 parent dcdbb00 commit 60a94d5

File tree

4 files changed

+654
-35
lines changed

4 files changed

+654
-35
lines changed

tests/Pest.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
<?php
22

3-
use PlinCode\LaravelCleanArchitecture\Tests\TestCase;
3+
uses(
4+
PlinCode\LaravelCleanArchitecture\Tests\TestCase::class,
5+
)->in('Feature', 'Unit');
46

5-
uses(TestCase::class)->in('Unit', 'Feature');
7+
// Global imports for all tests
8+
uses()->beforeEach(function () {
9+
if (class_exists('Mockery')) {
10+
Mockery::globalHelpers();
11+
}
12+
})->in('Unit');
Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
<?php
2+
3+
use PlinCode\LaravelCleanArchitecture\Commands\GeneratePackageCommand;
4+
use Illuminate\Filesystem\Filesystem;
5+
use Illuminate\Support\Facades\File;
6+
7+
describe('GeneratePackageCommand', function () {
8+
beforeEach(function () {
9+
$this->filesystem = new Filesystem();
10+
$this->command = new GeneratePackageCommand($this->filesystem);
11+
$this->tempPath = sys_get_temp_dir() . '/test-package-' . uniqid();
12+
13+
// Mock the output to avoid writeln errors
14+
$mockOutput = mock('Symfony\Component\Console\Output\OutputInterface');
15+
$mockOutput->shouldReceive('writeln')->andReturn();
16+
$mockOutput->shouldReceive('write')->andReturn();
17+
18+
$reflection = new ReflectionClass($this->command);
19+
$outputProperty = $reflection->getProperty('output');
20+
$outputProperty->setAccessible(true);
21+
$outputProperty->setValue($this->command, $mockOutput);
22+
});
23+
24+
afterEach(function () {
25+
if (is_dir($this->tempPath)) {
26+
$this->filesystem->deleteDirectory($this->tempPath);
27+
}
28+
});
29+
30+
it('has correct command signature and description', function () {
31+
expect($this->command->getName())->toBe('clean-arch:generate-package');
32+
expect($this->command->getDescription())->toBe('Generate a new Laravel package with Clean Architecture structure');
33+
});
34+
35+
it('has required arguments', function () {
36+
$definition = $this->command->getDefinition();
37+
38+
expect($definition->hasArgument('name'))->toBeTrue();
39+
expect($definition->hasArgument('vendor'))->toBeTrue();
40+
expect($definition->getArgument('name')->getDescription())->toBe('The name of the package');
41+
expect($definition->getArgument('vendor')->getDescription())->toBe('The vendor name');
42+
});
43+
44+
it('has correct options', function () {
45+
$definition = $this->command->getDefinition();
46+
47+
expect($definition->hasOption('path'))->toBeTrue();
48+
expect($definition->hasOption('force'))->toBeTrue();
49+
expect($definition->getOption('path')->getDescription())->toBe('Custom path for the package');
50+
expect($definition->getOption('force')->getDescription())->toBe('Overwrite existing files');
51+
});
52+
53+
it('can create package structure', function () {
54+
$reflection = new ReflectionClass($this->command);
55+
$method = $reflection->getMethod('createPackageStructure');
56+
$method->setAccessible(true);
57+
58+
$packageName = 'test-package';
59+
$studlyName = 'TestPackage';
60+
$namespace = 'TestVendor\\TestPackage';
61+
$vendor = 'test-vendor';
62+
63+
// Mock the filesystem to avoid actual file creation
64+
$mockFilesystem = mock(Filesystem::class);
65+
$mockFilesystem->shouldReceive('isDirectory')->andReturn(false);
66+
$mockFilesystem->shouldReceive('makeDirectory')->andReturn(true);
67+
$mockFilesystem->shouldReceive('put')->andReturn(true);
68+
$mockFilesystem->shouldReceive('exists')->andReturn(true);
69+
$mockFilesystem->shouldReceive('get')->andReturn('stub content');
70+
71+
$reflection->getProperty('files')->setValue($this->command, $mockFilesystem);
72+
73+
$result = $method->invoke($this->command, $this->tempPath, $packageName, $studlyName, $namespace, $vendor);
74+
expect($result)->toBeNull(); // Void method returns null
75+
});
76+
77+
it('can create package composer.json', function () {
78+
$reflection = new ReflectionClass($this->command);
79+
$method = $reflection->getMethod('createPackageComposer');
80+
$method->setAccessible(true);
81+
82+
$packageName = 'test-package';
83+
$studlyName = 'TestPackage';
84+
$namespace = 'TestVendor\\TestPackage';
85+
$vendor = 'test-vendor';
86+
87+
// Create temp directory
88+
$this->filesystem->makeDirectory($this->tempPath, 0755, true);
89+
90+
$method->invoke($this->command, $this->tempPath, $packageName, $studlyName, $namespace, $vendor);
91+
92+
expect(file_exists($this->tempPath . '/composer.json'))->toBeTrue();
93+
94+
$composerContent = json_decode(file_get_contents($this->tempPath . '/composer.json'), true);
95+
expect($composerContent['name'])->toBe('test-vendor/test-package');
96+
expect($composerContent['description'])->toBe('Laravel package for TestPackage');
97+
expect($composerContent['type'])->toBe('library');
98+
});
99+
100+
it('can create service provider', function () {
101+
$reflection = new ReflectionClass($this->command);
102+
$method = $reflection->getMethod('createPackageServiceProvider');
103+
$method->setAccessible(true);
104+
105+
$studlyName = 'TestPackage';
106+
$namespace = 'TestVendor\\TestPackage';
107+
108+
// Create a mock stub content
109+
$stubContent = '<?php namespace {{Namespace}}; class {{StudlyName}}ServiceProvider {}';
110+
111+
// Mock filesystem to return stub content
112+
$mockFilesystem = mock(Filesystem::class);
113+
$mockFilesystem->shouldReceive('exists')->andReturn(true);
114+
$mockFilesystem->shouldReceive('get')->andReturn($stubContent);
115+
$mockFilesystem->shouldReceive('put')->andReturn(true);
116+
117+
$reflection->getProperty('files')->setValue($this->command, $mockFilesystem);
118+
119+
$result = $method->invoke($this->command, $this->tempPath, $studlyName, $namespace);
120+
expect($result)->toBeNull(); // Void method returns null
121+
});
122+
123+
it('can create package model', function () {
124+
$reflection = new ReflectionClass($this->command);
125+
$method = $reflection->getMethod('createPackageModel');
126+
$method->setAccessible(true);
127+
128+
$studlyName = 'TestPackage';
129+
$namespace = 'TestVendor\\TestPackage';
130+
131+
// Mock filesystem and stub
132+
$mockFilesystem = mock(Filesystem::class);
133+
$mockFilesystem->shouldReceive('exists')->andReturn(true);
134+
$mockFilesystem->shouldReceive('get')->andReturn('<?php namespace {{Namespace}}; class {{StudlyName}} {}');
135+
$mockFilesystem->shouldReceive('put')->andReturn(true);
136+
137+
$reflection->getProperty('files')->setValue($this->command, $mockFilesystem);
138+
139+
$result = $method->invoke($this->command, $this->tempPath, $studlyName, $namespace);
140+
expect($result)->toBeNull(); // Void method returns null
141+
});
142+
143+
it('can create package service', function () {
144+
$reflection = new ReflectionClass($this->command);
145+
$method = $reflection->getMethod('createPackageService');
146+
$method->setAccessible(true);
147+
148+
$studlyName = 'TestPackage';
149+
$namespace = 'TestVendor\\TestPackage';
150+
151+
// Mock filesystem and stub
152+
$mockFilesystem = mock(Filesystem::class);
153+
$mockFilesystem->shouldReceive('exists')->andReturn(true);
154+
$mockFilesystem->shouldReceive('get')->andReturn('<?php namespace {{Namespace}}; class {{StudlyName}}Service {}');
155+
$mockFilesystem->shouldReceive('put')->andReturn(true);
156+
157+
$reflection->getProperty('files')->setValue($this->command, $mockFilesystem);
158+
159+
$result = $method->invoke($this->command, $this->tempPath, $studlyName, $namespace);
160+
expect($result)->toBeNull(); // Void method returns null
161+
});
162+
163+
it('can create package readme', function () {
164+
$reflection = new ReflectionClass($this->command);
165+
$method = $reflection->getMethod('createPackageReadme');
166+
$method->setAccessible(true);
167+
168+
$packageName = 'test-package';
169+
$studlyName = 'TestPackage';
170+
$vendor = 'test-vendor';
171+
172+
// Mock filesystem and stub
173+
$mockFilesystem = mock(Filesystem::class);
174+
$mockFilesystem->shouldReceive('exists')->andReturn(true);
175+
$mockFilesystem->shouldReceive('get')->andReturn('# {{PackageName}} by {{VendorName}}');
176+
$mockFilesystem->shouldReceive('put')->andReturn(true);
177+
178+
$reflection->getProperty('files')->setValue($this->command, $mockFilesystem);
179+
180+
$result = $method->invoke($this->command, $this->tempPath, $packageName, $studlyName, $vendor);
181+
expect($result)->toBeNull(); // Void method returns null
182+
});
183+
184+
it('throws exception when stub file not found', function () {
185+
$reflection = new ReflectionClass($this->command);
186+
$method = $reflection->getMethod('getStub');
187+
$method->setAccessible(true);
188+
189+
// Mock filesystem to return false for exists
190+
$mockFilesystem = mock(Filesystem::class);
191+
$mockFilesystem->shouldReceive('exists')->andReturn(false);
192+
193+
$reflection->getProperty('files')->setValue($this->command, $mockFilesystem);
194+
195+
expect(function () use ($method) {
196+
$method->invoke($this->command, 'non-existent-stub');
197+
})->toThrow(Exception::class, 'Stub file not found');
198+
});
199+
200+
it('can get stub content when file exists', function () {
201+
$reflection = new ReflectionClass($this->command);
202+
$method = $reflection->getMethod('getStub');
203+
$method->setAccessible(true);
204+
205+
$stubContent = '<?php // Test stub content';
206+
207+
// Mock filesystem to return stub content
208+
$mockFilesystem = mock(Filesystem::class);
209+
$mockFilesystem->shouldReceive('exists')->andReturn(true);
210+
$mockFilesystem->shouldReceive('get')->andReturn($stubContent);
211+
212+
$reflection->getProperty('files')->setValue($this->command, $mockFilesystem);
213+
214+
$result = $method->invoke($this->command, 'test-stub');
215+
expect($result)->toBe($stubContent);
216+
});
217+
});

0 commit comments

Comments
 (0)