Skip to content

Commit 334aa10

Browse files
committed
chore: update test scripts for improved coverage
Signed-off-by: Sam Poyigi <[email protected]>
1 parent ea30c73 commit 334aa10

19 files changed

+803
-49
lines changed

composer.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"laravel/pint": "^1.2",
1717
"larastan/larastan": "^2.4.0",
1818
"sampoyigi/testbench": "dev-main as 1.0",
19-
"pestphp/pest-plugin-laravel": "^2.0"
19+
"pestphp/pest-plugin-laravel": "^3.0"
2020
},
2121
"autoload": {
2222
"psr-4": {
@@ -41,8 +41,8 @@
4141
}
4242
},
4343
"scripts": {
44-
"test": "vendor/bin/pest",
45-
"test-coverage": "vendor/bin/pest --coverage",
44+
"test": "vendor/bin/pest --coverage --exactly=100",
45+
"test-coverage": "vendor/bin/pest --type-coverage",
4646
"format": "vendor/bin/pint",
4747
"static": "vendor/bin/phpstan analyse --ansi --memory-limit 1056M"
4848
},

src/Classes/MenuManager.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,7 @@ public function getMenusConfig()
3232
continue;
3333
}
3434

35-
$metaPath = $themeObj->getMetaPath();
36-
if ($themeObj->hasParent()) {
37-
$metaPath = $themeObj->getParent()->getMetaPath();
38-
}
35+
$metaPath = $themeObj->hasParent() ? $themeObj->getParent()->getMetaPath() : $themeObj->getMetaPath();
3936

4037
$files = File::glob($metaPath.'/menus/*.php');
4138
foreach ($files as $file) {
@@ -54,9 +51,7 @@ public function getMenusConfig()
5451

5552
public function generateReferences(Menu $menu, $pageOrLayout = null)
5653
{
57-
if (!strlen($currentUrl = Request::path())) {
58-
$currentUrl = '/';
59-
}
54+
$currentUrl = !strlen($currentUrl = Request::path()) ? '/' : $currentUrl;
6055

6156
$currentUrl = strtolower(URL::to($currentUrl));
6257
$activeMenuItem = $pageOrLayout->activeMenuItem ?: false;
@@ -75,7 +70,7 @@ public function generateReferences(Menu $menu, $pageOrLayout = null)
7570
$parentReference->isActive = $currentUrl == strtolower(URL::to($item->url)) || $activeMenuItem === $item->code;
7671
} else {
7772
$parentReference = $this->resolveItem(
78-
$menu, $item, $parentReference, $currentUrl, $activeMenuItem
73+
$menu, $item, $parentReference, $currentUrl, $activeMenuItem,
7974
);
8075
}
8176

@@ -125,11 +120,16 @@ protected function resolveItem($menu, $item, $parentReference, $currentUrl, $act
125120
$response = Event::dispatch('pages.menuitem.resolveItem', [$item, $currentUrl, $theme]);
126121

127122
if (is_array($response)) {
128-
foreach ($response as $itemInfo) {
129-
if (!is_array($itemInfo)) {
130-
continue;
123+
$eventResultItems = [];
124+
foreach (array_filter($response) as $eventResult) {
125+
if (!isset($eventResult[0])) {
126+
$eventResult = [$eventResult];
131127
}
132128

129+
$eventResultItems = array_merge($eventResultItems, $eventResult);
130+
}
131+
132+
foreach ($eventResultItems as $itemInfo) {
133133
if (isset($itemInfo['url'])) {
134134
$parentReference->url = $itemInfo['url'];
135135
$parentReference->isActive = $itemInfo['isActive'] || $activeMenuItem === $item->code;

src/Extension.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
use Igniter\Pages\Classes\Page as StaticPage;
88
use Igniter\Pages\Classes\PageManager;
99
use Igniter\Pages\Models\Menu;
10+
use Igniter\Pages\Models\Observers\MenuObserver;
11+
use Igniter\Pages\Models\Observers\PageObserver;
12+
use Igniter\Pages\Models\Page;
1013
use Illuminate\Database\Eloquent\Relations\Relation;
1114
use Illuminate\Routing\Router;
1215
use Illuminate\Support\Facades\Event;
@@ -20,6 +23,11 @@ class Extension extends \Igniter\System\Classes\BaseExtension
2023
'static_menu_items' => \Igniter\Pages\Models\MenuItem::class,
2124
];
2225

26+
protected $observers = [
27+
Page::class => PageObserver::class,
28+
Menu::class => MenuObserver::class,
29+
];
30+
2331
public function register()
2432
{
2533
parent::register();

src/Models/Menu.php

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -59,26 +59,9 @@ public function getThemeCodeOptions()
5959
return Theme::all()->pluck('name', 'code')->toArray();
6060
}
6161

62-
//
63-
// Events
64-
//
65-
66-
protected function afterSave()
67-
{
68-
$this->restorePurgedValues();
69-
70-
if (array_key_exists('items', $this->attributes)) {
71-
$this->addMenuItems((array)$this->attributes['items']);
72-
}
73-
}
74-
7562
public function addMenuItems($items)
7663
{
7764
$id = $this->getKey();
78-
if (!is_numeric($id)) {
79-
return false;
80-
}
81-
8265
$idsToKeep = [];
8366
foreach ($items as $item) {
8467
$item['menu_id'] = $id;

src/Models/Observers/MenuObserver.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Igniter\Pages\Models\Observers;
4+
5+
use Igniter\Pages\Models\Menu;
6+
7+
class MenuObserver
8+
{
9+
public function saved(Menu $model)
10+
{
11+
$model->restorePurgedValues();
12+
13+
if (array_key_exists('items', $model->getAttributes())) {
14+
$model->addMenuItems((array)$model->getAttribute('items'));
15+
}
16+
}
17+
}

src/Models/Observers/PageObserver.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
namespace Igniter\Pages\Models\Observers;
4+
5+
use Igniter\Pages\Models\Page;
6+
use Igniter\System\Models\Language;
7+
8+
class PageObserver
9+
{
10+
public function saving(Page $model)
11+
{
12+
if (is_null($model->language_id)) {
13+
$model->language_id = Language::getDefault()->getKey();
14+
}
15+
}
16+
}

src/Models/Page.php

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Igniter\Main\Classes\ThemeManager;
99
use Igniter\Main\Template\Layout;
1010
use Igniter\System\Models\Concerns\Switchable;
11-
use Igniter\System\Models\Language;
1211
use Illuminate\Support\Collection;
1312

1413
/**
@@ -20,7 +19,7 @@ class Page extends Model
2019
use Sortable;
2120
use Switchable;
2221

23-
const SORT_ORDER = 'priority';
22+
public const SORT_ORDER = 'priority';
2423

2524
/**
2625
* @var string The database table name
@@ -54,7 +53,7 @@ class Page extends Model
5453
],
5554
];
5655

57-
protected static ?Collection $pagesCache = null;
56+
public static ?Collection $pagesCache = null;
5857

5958
public static function getDropdownOptions()
6059
{
@@ -105,11 +104,4 @@ public function getContentAttribute($value)
105104
{
106105
return html_entity_decode($value);
107106
}
108-
109-
public function beforeSave()
110-
{
111-
if (is_null($this->language_id)) {
112-
$this->language_id = Language::getDefault()->getKey();
113-
}
114-
}
115107
}

tests/Classes/MenuManagerTest.php

Lines changed: 83 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
use Igniter\Pages\Classes\MenuManager;
77
use Igniter\Pages\Classes\Page;
88
use Igniter\Pages\Models\Menu;
9+
use Igniter\Pages\Models\MenuItem;
10+
use Illuminate\Http\Request;
911
use Illuminate\Support\Facades\Event;
1012
use Mockery;
1113

@@ -15,6 +17,13 @@
1517
});
1618

1719
it('loads menus from config files across loaded themes', function() {
20+
Theme::create([
21+
'name' => 'Test Theme',
22+
'code' => 'test-theme',
23+
'version' => '1.0.0',
24+
'status' => 1,
25+
]);
26+
1827
$menuManager = new MenuManager;
1928
$menus = $menuManager->getMenusConfig();
2029

@@ -23,16 +32,83 @@
2332
});
2433

2534
it('generates menu references with active state', function() {
26-
Event::fake();
35+
$request = Request::create('/account/address');
36+
app()->instance('request', $request);
2737

2838
$page = Mockery::mock(Page::class);
2939
$page->shouldReceive('getAttribute')->andReturn('view-menu');
30-
$menu = Menu::where('code', 'main-menu')->where('theme_code', 'igniter-orange')->first();
31-
$items = (new MenuManager)->generateReferences($menu, $page);
40+
$menu = Menu::create([
41+
'name' => 'Test menu',
42+
'code' => 'test-menu',
43+
'theme_code' => 'igniter-orange',
44+
]);
45+
$parent = $menu->items()->create([
46+
'title' => 'Test', 'code' => 'test', 'type' => 'url', 'url' => '/',
47+
]);
48+
$menu->items()->create([
49+
'title' => 'About Us', 'code' => 'about-us', 'type' => 'theme-page', 'theme_code' => 'igniter-orange',
50+
]);
51+
$menu->items()->create([
52+
'title' => 'Policy', 'code' => 'policy', 'type' => 'theme-page', 'url' => '/policy', 'theme_code' => 'igniter-orange',
53+
]);
54+
$menuItem = $menu->items()->create([
55+
'title' => 'Account', 'code' => 'account', 'type' => 'url', 'url' => '/account',
56+
]);
57+
$menuItem2 = $menu->items()->create([
58+
'title' => 'Address', 'code' => 'address', 'type' => 'url', 'url' => '/account/address',
59+
]);
60+
$menuItem3 = $menu->items()->create([
61+
'title' => 'Address Edit', 'code' => 'address-edit', 'type' => 'url', 'url' => '/account/address',
62+
]);
63+
MenuItem::fixTree();
64+
$menuItem->parent()->associate($parent)->save();
65+
$menuItem2->parent()->associate($parent)->save();
66+
$menuItem3->parent()->associate($menuItem)->save();
3267

33-
expect($items)->not->toBeEmpty();
68+
Event::listen('pages.menuitem.resolveItem', function($item, $currentUrl, $theme) {
69+
return [
70+
'url' => $item->url,
71+
'isActive' => $item->url == $currentUrl,
72+
'items' => [
73+
[
74+
'title' => 'Address Edit',
75+
'code' => 'address-edit',
76+
],
77+
],
78+
];
79+
});
3480

35-
Event::assertDispatched('pages.menu.referencesGenerated');
36-
});
81+
Event::listen('pages.menuitem.resolveItem', function($item, $currentUrl, $theme) {
82+
return [
83+
[
84+
'isActive' => $item->url == $currentUrl,
85+
'items' => [
86+
[
87+
'title' => 'Address Preview',
88+
'code' => 'address-preview',
89+
'url' => '/account/address',
90+
'items' => [
91+
[
92+
'title' => 'Address Edit',
93+
'code' => 'address-edit',
94+
],
95+
],
96+
],
97+
],
98+
],
99+
];
100+
});
37101

38-
it('resolves custom menu item types')->todo();
102+
$items = (new MenuManager)->generateReferences($menu, $page);
103+
104+
expect($items)->not->toBeEmpty()
105+
->and($items[0]->code)->toEqual('test')
106+
->and($items[0]->isActive)->toBeFalse()
107+
->and($items[0]->items[0]->isActive)->toBeFalse()
108+
->and($items[0]->items[0]->isChildActive)->toBeTrue()
109+
->and($items[0]->items[0]->items[0]->code)->toEqual('address-edit')
110+
->and($items[0]->items[0]->items[0]->isActive)->toBeTrue()
111+
->and($items[1]->code)->toEqual('about-us')
112+
->and($items[1]->items[0]->code)->toEqual('address-preview')
113+
->and($items[1]->items[0]->items[0]->code)->toEqual('address-edit');
114+
});

tests/Classes/PageManagerTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Igniter\Pages\Tests\Classes;
44

5+
use Igniter\Flame\Exception\ApplicationException;
56
use Igniter\Main\Models\Theme;
67
use Igniter\Pages\Classes\PageManager;
78

@@ -35,6 +36,26 @@
3536
expect($pageManager->getPageContents($page))->not->toBeEmpty();
3637
});
3738

39+
it('gets empty page contents for non static page', function() {
40+
$url = 'empty-page';
41+
42+
$pageManager = new PageManager;
43+
44+
$page = $pageManager->initPage($url);
45+
46+
expect($pageManager->getPageContents($page))->toBeNull();
47+
});
48+
49+
it('throws exception when no active theme', function() {
50+
config(['igniter-system.defaultTheme' => 'invalid-theme']);
51+
52+
$url = 'about-us';
53+
54+
$pageManager = new PageManager;
55+
56+
expect(fn() => $pageManager->initPage($url))->toThrow(ApplicationException::class);
57+
});
58+
3859
it('lists page slugs for enabled pages', function() {
3960
$slugs = (new PageManager)->listPageSlugs();
4061

0 commit comments

Comments
 (0)