Skip to content

Commit 15c40e5

Browse files
author
Nathan Esayeas
authored
Fix namespaces (#121)
1 parent db562f2 commit 15c40e5

File tree

9 files changed

+75
-8
lines changed

9 files changed

+75
-8
lines changed

src/Generators/ControllerGenerator.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Blueprint\Blueprint;
66
use Blueprint\Contracts\Generator;
7+
use Blueprint\Models\Model;
78
use Blueprint\Models\Controller;
89
use Blueprint\Models\Statements\DispatchStatement;
910
use Blueprint\Models\Statements\EloquentStatement;
@@ -27,6 +28,8 @@ class ControllerGenerator implements Generator
2728

2829
private $imports = [];
2930

31+
private $models = [];
32+
3033
public function __construct($files)
3134
{
3235
$this->files = $files;
@@ -38,6 +41,8 @@ public function output(array $tree): array
3841

3942
$stub = $this->files->stub('controller/class.stub');
4043

44+
$this->registerModels($tree);
45+
4146
/** @var \Blueprint\Models\Controller $controller */
4247
foreach ($tree['controllers'] as $controller) {
4348
$this->addImport($controller, 'Illuminate\\Http\\Request');
@@ -198,6 +203,34 @@ private function fullyQualifyModelReference(string $sub_namespace, string $model
198203
// TODO: get model_name from tree.
199204
// If not found, assume parallel namespace as controller.
200205
// Use respond-statement.php as test case.
206+
207+
/** @var \Blueprint\Models\Model $model */
208+
$model = $this->modelForContext($model_name);
209+
210+
if (isset($this->models[Str::studly($model_name)])) {
211+
return $model->fullyQualifiedClassName();
212+
}
213+
201214
return config('blueprint.namespace') . '\\' . ($sub_namespace ? $sub_namespace . '\\' : '') . $model_name;
202215
}
216+
217+
private function modelForContext(string $context)
218+
{
219+
if (isset($this->models[Str::studly($context)])) {
220+
return $this->models[Str::studly($context)];
221+
}
222+
223+
$matches = array_filter(array_keys($this->models), function ($key) use ($context) {
224+
return Str::endsWith($key, '/'.Str::studly($context));
225+
});
226+
227+
if (count($matches) === 1) {
228+
return $this->models[$matches[0]];
229+
}
230+
}
231+
232+
private function registerModels(array $tree)
233+
{
234+
$this->models = array_merge($tree['cache'] ?? [], $tree['models'] ?? []);
235+
}
203236
}

src/Generators/RouteGenerator.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ protected function buildRoutes(Controller $controller)
4040
$routes = '';
4141
$methods = array_keys($controller->methods());
4242

43-
$className = $controller->className();
43+
$className = str_replace('App\Http\Controllers\\', '', $controller->fullyQualifiedClassName());
4444
$slug = Str::kebab($controller->prefix());
4545

4646
$resource_methods = array_intersect($methods, Controller::$resourceMethods);

src/Generators/TestGenerator.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ protected function buildTestCases(Controller $controller)
155155
} elseif ($statement instanceof ValidateStatement) {
156156
$this->addTestAssertionsTrait($controller);
157157

158-
$class = $controller->name() . Str::studly($name) . 'Request';
158+
$class = $this->buildFormRequestName($controller, $name);
159159
$test_case = $this->buildFormRequestTestCase($controller->fullyQualifiedClassName(), $name, config('blueprint.namespace') . '\\Http\\Requests\\' . $class) . PHP_EOL . PHP_EOL . $test_case;
160160

161161
if ($statement->data()) {
@@ -438,6 +438,15 @@ private function determineModel(string $prefix, ?string $reference)
438438
return Str::studly($reference);
439439
}
440440

441+
private function buildFormRequestName(Controller $controller, string $name)
442+
{
443+
if (empty($controller->namespace())) {
444+
return $controller->name() . Str::studly($name) . 'Request';
445+
}
446+
447+
return $controller->namespace() .'\\'. $controller->name() . Str::studly($name) . 'Request';
448+
}
449+
441450
private function buildFormRequestTestCase(string $controller, string $action, string $form_request)
442451
{
443452
return <<< END

tests/Feature/Generator/ControllerGeneratorTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ protected function setUp(): void
2727
$this->subject = new ControllerGenerator($this->files);
2828

2929
$this->blueprint = new Blueprint();
30+
$this->blueprint->registerLexer(new \Blueprint\Lexers\ModelLexer());
3031
$this->blueprint->registerLexer(new \Blueprint\Lexers\ControllerLexer(new StatementLexer()));
3132
$this->blueprint->registerGenerator($this->subject);
3233
}
@@ -66,7 +67,6 @@ public function output_writes_migration_for_controller_tree($definition, $path,
6667

6768
$tokens = $this->blueprint->parse($this->fixture($definition));
6869
$tree = $this->blueprint->analyze($tokens);
69-
7070
$this->assertEquals(['created' => [$path]], $this->subject->output($tree));
7171
}
7272

tests/Feature/Generator/RouteGeneratorTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public function controllerTreeDataProvider()
6363
['definitions/readme-example.bp', 'routes/readme-example.php'],
6464
['definitions/cruddy.bp', 'routes/cruddy.php'],
6565
['definitions/non-cruddy.bp', 'routes/non-cruddy.php'],
66+
['definitions/respond-statements.bp', 'routes/respond-statements.php'],
6667
];
6768
}
6869
}

tests/fixtures/controllers/respond-statements.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
namespace App\Http\Controllers\Api;
44

5-
use App\Api\Post;
65
use App\Http\Controllers\Controller;
6+
use App\Http\Requests\Api\PostStoreRequest;
7+
use App\Post;
78
use Illuminate\Http\Request;
89

910
class PostController extends Controller
@@ -20,10 +21,10 @@ public function index(Request $request)
2021
}
2122

2223
/**
23-
* @param \Illuminate\Http\Request $request
24+
* @param \App\Http\Requests\Api\PostStoreRequest $request
2425
* @return \Illuminate\Http\Response
2526
*/
26-
public function store(Request $request)
27+
public function store(PostStoreRequest $request)
2728
{
2829
return response()->noContent();
2930
}

tests/fixtures/definitions/respond-statements.bp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ controllers:
88
query: all
99
respond: posts
1010
store:
11+
validate: title
1112
respond: 204
1213
error:
1314
respond: 400
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
3+
Route::resource('post', 'Api\PostController')->only('index', 'store');
4+
Route::get('post/error', 'Api\PostController@error');

tests/fixtures/tests/respond-statements.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@
44

55
use App\Post;
66
use Illuminate\Foundation\Testing\RefreshDatabase;
7+
use Illuminate\Foundation\Testing\WithFaker;
8+
use JMac\Testing\Traits\AdditionalAssertions;
79
use Tests\TestCase;
810

911
/**
1012
* @see \App\Http\Controllers\Api\PostController
1113
*/
1214
class PostControllerTest extends TestCase
1315
{
14-
use RefreshDatabase;
16+
use AdditionalAssertions, RefreshDatabase, WithFaker;
1517

1618
/**
1719
* @test
@@ -27,12 +29,28 @@ public function index_responds_with()
2729
}
2830

2931

32+
/**
33+
* @test
34+
*/
35+
public function store_uses_form_request_validation()
36+
{
37+
$this->assertActionUsesFormRequest(
38+
\App\Http\Controllers\Api\PostController::class,
39+
'store',
40+
\App\Http\Requests\Api\PostStoreRequest::class
41+
);
42+
}
43+
3044
/**
3145
* @test
3246
*/
3347
public function store_responds_with()
3448
{
35-
$response = $this->post(route('post.store'));
49+
$title = $this->faker->sentence(4);
50+
51+
$response = $this->post(route('post.store'), [
52+
'title' => $title,
53+
]);
3654

3755
$response->assertNoContent();
3856
}

0 commit comments

Comments
 (0)