diff --git a/app/Http/View/Composers/SideMenuComposer.php b/app/Http/View/Composers/SideMenuComposer.php index 4fb5c895..c609d706 100644 --- a/app/Http/View/Composers/SideMenuComposer.php +++ b/app/Http/View/Composers/SideMenuComposer.php @@ -4,6 +4,7 @@ namespace App\Http\View\Composers; use App\Events; use App\Services\PluginManager; +use Blessing\Filter; use Illuminate\Http\Request; use Illuminate\Support\Arr; use Illuminate\View\View; @@ -13,9 +14,13 @@ class SideMenuComposer /** @var Request */ protected $request; - public function __construct(Request $request) + /** @var Filter */ + protected $filter; + + public function __construct(Request $request, Filter $filter) { $this->request = $request; + $this->filter = $filter; } public function compose(View $view) @@ -36,9 +41,12 @@ class SideMenuComposer break; } + $menu = $menu[$type]; + $menu = $this->filter->apply('side_menu', $menu, [$type]); + $view->with('items', array_map(function ($item) { return $this->transform($item); - }, $menu[$type])); + }, $menu)); } public function transform(array $item): array diff --git a/tests/Fakes/Filter.php b/tests/Fakes/Filter.php index 875613ee..5d2f92eb 100644 --- a/tests/Fakes/Filter.php +++ b/tests/Fakes/Filter.php @@ -3,6 +3,7 @@ namespace Tests\Fakes; use Blessing\Filter as BaseFilter; +use Illuminate\Support\Arr; use PHPUnit\Framework\Assert; class Filter extends BaseFilter @@ -11,7 +12,10 @@ class Filter extends BaseFilter public function apply(string $hook, $init, $args = []) { - $this->applied[$hook] = array_merge([$init], $args); + if (!Arr::has($this->applied, $hook)) { + $this->applied[$hook] = []; + } + $this->applied[$hook][] = array_merge([$init], $args); return parent::apply($hook, $init, $args); } @@ -34,9 +38,31 @@ class Filter extends BaseFilter if (!empty($predicate)) { Assert::assertTrue( - call_user_func_array($predicate, $this->applied[$hook]), + call_user_func_array( + $predicate, + Arr::last($this->applied[$hook]) + ), "Arguments of Filter '$hook' does not satisfies the predicate." ); } } + + public function assertHaveBeenApplied(string $hook, $predicate = null) + { + Assert::assertArrayHasKey( + $hook, $this->applied, + "Expected Filter '$hook' was not applied." + ); + + $result = Arr::first( + $this->applied[$hook], + function ($arguments) use ($predicate) { + return call_user_func_array($predicate, $arguments); + } + ); + Assert::assertNotNull( + $result, + "None of applies of Filter '$hook' satisfy the predicate." + ); + } } diff --git a/tests/HttpTest/ViewTest/ComposersTest/SideMenuComposerTest.php b/tests/HttpTest/ViewTest/ComposersTest/SideMenuComposerTest.php index ddd1a1b0..90731f94 100644 --- a/tests/HttpTest/ViewTest/ComposersTest/SideMenuComposerTest.php +++ b/tests/HttpTest/ViewTest/ComposersTest/SideMenuComposerTest.php @@ -24,6 +24,26 @@ class SideMenuComposerTest extends TestCase Event::assertDispatched(Events\ConfigureAdminMenu::class); } + public function testFilter() + { + $filter = Fakes\Filter::fake(); + + $user = factory(User::class)->create(); + $this->actingAs($user)->get('/user'); + $filter->assertHaveBeenApplied('side_menu', function ($menu, $type) { + $this->assertCount(count(config('menu.user')), $menu); + $this->assertEquals('user', $type); + + return true; + }); + $filter->assertApplied('side_menu', function ($menu, $type) { + $this->assertCount(count(config('menu.explore')), $menu); + $this->assertEquals('explore', $type); + + return true; + }); + } + public function testTransform() { $user = factory(User::class)->create();