Skip to content

Commit

Permalink
feat(provider): Add ability to register Gate policies using contract
Browse files Browse the repository at this point in the history
You service provider can register policies using HasPolicies interface.
  • Loading branch information
pionl committed Sep 27, 2022
1 parent 82fa307 commit d9a6287
Show file tree
Hide file tree
Showing 35 changed files with 137 additions and 31 deletions.
3 changes: 2 additions & 1 deletion src/Actions/BootServiceProviderAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use LaraStrict\Contracts\RunAppServiceProviderPipesActionContract;
use LaraStrict\Entities\AppServiceProviderEntity;
use LaraStrict\Providers\Pipes\LoadProviderRoutesPipe;
use LaraStrict\Providers\Pipes\RegisterProviderPoliciesPipe;
use LogicException;
use ReflectionClass;

Expand All @@ -27,7 +28,7 @@ public function execute(Application $application, ServiceProvider $provider): vo

$dir = $this->getRootDirectory($reflection);
$serviceName = $this->getServiceName($reflection, $provider);
$pipes = [LoadProviderRoutesPipe::class];
$pipes = [LoadProviderRoutesPipe::class, RegisterProviderPoliciesPipe::class];

$app = new AppServiceProviderEntity($application, $provider, $serviceName, $dir);

Expand Down
13 changes: 13 additions & 0 deletions src/Contracts/HasPolicies.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

declare(strict_types=1);

namespace LaraStrict\Contracts;

interface HasPolicies
{
/**
* @return array<string, class-string>
*/
public function policies(): array;
}
30 changes: 30 additions & 0 deletions src/Providers/Pipes/RegisterProviderPoliciesPipe.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

declare(strict_types=1);

namespace LaraStrict\Providers\Pipes;

use Closure;
use Illuminate\Contracts\Auth\Access\Gate;
use LaraStrict\Contracts\AppServiceProviderPipeContract;
use LaraStrict\Contracts\HasPolicies;
use LaraStrict\Entities\AppServiceProviderEntity;

class RegisterProviderPoliciesPipe implements AppServiceProviderPipeContract
{
public function __construct(
private readonly Gate $gate
) {
}

public function handle(AppServiceProviderEntity $appServiceProvider, Closure $next): void
{
if ($appServiceProvider->serviceProvider instanceof HasPolicies) {
foreach ($appServiceProvider->serviceProvider->policies() as $class => $policy) {
$this->gate->policy($class, $policy);
}
}

$next($appServiceProvider);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,25 @@

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers;
namespace Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe;

use Illuminate\Routing\Route;
use LaraStrict\Testing\Laravel\TestingServiceProvider;
use LaraStrict\Testing\Providers\Concerns\AssertProviderRegistersRoutes;
use Mockery\MockInterface;
use Psr\Log\LoggerInterface;
use Tests\LaraStrict\Feature\Providers\WithAll\WithAllServiceProvider;
use Tests\LaraStrict\Feature\Providers\WithApi\WithApiServiceProvider;
use Tests\LaraStrict\Feature\Providers\WithBoth\WithBothServiceProvider;
use Tests\LaraStrict\Feature\Providers\WithCustom\WithCustomServiceProvider;
use Tests\LaraStrict\Feature\Providers\WithVersionedApi\WithVersionedApiServiceProvider;
use Tests\LaraStrict\Feature\Providers\WithWeb\WithWebServiceProvider;
use Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithAll\WithAllServiceProvider;
use Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithApi\WithApiServiceProvider;
use Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithBoth\WithBothServiceProvider;
use Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithCustom\WithCustomServiceProvider;
use Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithVersionedApi\WithVersionedApiServiceProvider;
use Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithWeb\WithWebServiceProvider;
use Tests\LaraStrict\Feature\TestCase;

/**
* Expects that name of folder is used as prefix and directory prefixs.
*/
class AbstractServiceProviderTest extends TestCase
class LoadProviderRoutesPipeTest extends TestCase
{
use AssertProviderRegistersRoutes;

Expand Down Expand Up @@ -50,10 +50,13 @@ public function testWithoutAnyUrl(): void
$this->loggerMock->shouldReceive('warning')
->once()
->withArgs(function (string $message, array $context) {
$this->assertEquals('No routes have been loaded for <providers> service', $message);
$this->assertEquals('No routes have been loaded for <load_provider_routes_pipe> service', $message);
$this->assertArrayHasKey('dir', $context);
$this->assertArrayHasKey('service', $context);
$this->assertStringContainsString('tests/Feature/Providers', $context['dir']);
$this->assertStringContainsString(
'tests/Feature/Providers/Pipes/LoadProviderRoutesPipe',
$context['dir']
);
$this->assertEquals(RoutableWithNoFilesServiceProvider::class, $context['service']);

return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers;
namespace Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe;

use LaraStrict\Contracts\HasRoutes;
use LaraStrict\Providers\AbstractServiceProvider;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithAll;

use Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithCustom\WithCustomServiceProvider;

class WithAllServiceProvider extends WithCustomServiceProvider
{
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers\WithApi;
namespace Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithApi;

use LaraStrict\Contracts\HasRoutes;
use LaraStrict\Providers\AbstractServiceProvider;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers\WithBoth;
namespace Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithBoth;

use LaraStrict\Contracts\HasRoutes;
use LaraStrict\Providers\AbstractServiceProvider;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers\WithCustom;
namespace Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithCustom;

use Illuminate\Routing\RouteRegistrar;
use LaraStrict\Contracts\RegisterCustomRouteActionContract;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers\WithCustom;
namespace Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithCustom;

use Illuminate\Routing\RouteRegistrar;
use LaraStrict\Contracts\RegisterNamedCustomRouteActionContract;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers\WithCustom;
namespace Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithCustom;

use Illuminate\Routing\RouteRegistrar;
use LaraStrict\Contracts\HasCustomRoutes;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers\WithVersionedApi;
namespace Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithVersionedApi;

use LaraStrict\Contracts\HasCustomPrefixRoutes;
use LaraStrict\Contracts\HasRoutes;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers\WithWeb;
namespace Tests\LaraStrict\Feature\Providers\Pipes\LoadProviderRoutesPipe\WithWeb;

use LaraStrict\Contracts\HasRoutes;
use LaraStrict\Providers\AbstractServiceProvider;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers\Pipes\RegisterProviderPoliciesPipe;

use LaraStrict\Contracts\HasPolicies;
use LaraStrict\Providers\AbstractServiceProvider;

class PoliciesServiceProvider extends AbstractServiceProvider implements HasPolicies
{
public function policies(): array
{
return [
Test::class => TestPolicy::class,
];
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers\Pipes\RegisterProviderPoliciesPipe;

use Illuminate\Contracts\Auth\Access\Gate;
use Tests\LaraStrict\Feature\TestCase;

class RegisterProviderPoliciesPipeTest extends TestCase
{
public function test(): void
{
$this->app->register(PoliciesServiceProvider::class, true);

/** @var Gate $gate */
$gate = $this->app->make(Gate::class);

$policy = $gate->getPolicyFor(Test::class);
$this->assertInstanceOf(TestPolicy::class, $policy);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers\Pipes\RegisterProviderPoliciesPipe;

class Test
{
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Providers\Pipes\RegisterProviderPoliciesPipe;

class TestPolicy
{
}
11 changes: 0 additions & 11 deletions tests/Feature/Providers/WithAll/WithAllServiceProvider.php

This file was deleted.

3 changes: 2 additions & 1 deletion tests/Unit/Core/Actions/BootServiceProviderActionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

use LaraStrict\Actions\BootServiceProviderAction;
use LaraStrict\Providers\Pipes\LoadProviderRoutesPipe;
use LaraStrict\Providers\Pipes\RegisterProviderPoliciesPipe;
use LaraStrict\Testing\Actions\TestRunAppServiceProviderAction;
use LaraStrict\Testing\Laravel\TestingApplication;
use LaraStrict\Testing\Laravel\TestingServiceProvider;
Expand All @@ -16,7 +17,7 @@ class BootServiceProviderActionTest extends TestCase
public function testExecute(): void
{
$runAction = new TestRunAppServiceProviderAction(
expectedPipes: [LoadProviderRoutesPipe::class],
expectedPipes: [LoadProviderRoutesPipe::class, RegisterProviderPoliciesPipe::class],
expectedServiceName: 'laravel', // taken from App\Testing\Laravel namespace
expectServiceRootDirToEndWith: 'src/Testing/Laravel',
);
Expand Down

0 comments on commit d9a6287

Please sign in to comment.