Passed
Pull Request — master (#57)
by Kyle
06:09
created

MenuItemTest   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 292
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 138
dl 0
loc 292
rs 10
c 0
b 0
f 0
wmc 24

24 Methods

Rating   Name   Duplication   Size   Complexity  
A it_can_create_a_dropdown_menu_item() 0 9 1
A it_can_set_properties_on_menu_item() 0 16 1
A it_can_get_the_icon_html_attribute() 0 5 1
A it_can_check_for_a_submenu() 0 10 1
A it_returns_default_icon_if_none_exist() 0 5 1
A it_can_set_icon_via_attributes() 0 5 1
A it_can_add_a_child_menu_item() 0 6 1
A it_can_make_a_route_menu_item() 0 14 1
A it_can_fill_a_menu_item_with_allowed_properties() 0 24 1
A it_can_make_an_empty_menu_item() 0 5 1
A it_can_get_item_properties() 0 5 1
A it_can_get_ordered_children() 0 10 1
A it_can_check_active_state_on_item() 0 2 1
A it_can_add_a_menu_item_divider() 0 14 1
A it_can_make_a_simple_route_menu_item() 0 12 1
A it_can_get_the_correct_url_for_url_type() 0 5 1
A it_can_make_a_simple_url_menu_item() 0 12 1
A it_can_add_a_header_menu_item() 0 15 1
A it_returns_no_icon_if_none_exist() 0 5 1
A it_can_get_item_html_attributes() 0 5 1
A it_can_get_request_uri() 0 5 1
A setUp() 0 4 1
A it_can_get_the_correct_url_for_route_type() 0 11 1
A it_can_make_a_url_menu_item() 0 14 1
1
<?php
2
3
namespace KyleMassacre\Menus\Tests;
4
5
use Illuminate\Support\Arr;
6
use KyleMassacre\Menus\Menu;
7
use KyleMassacre\Menus\MenuItem;
8
9
class MenuItemTest extends BaseTestCase
10
{
11
    /**
12
     * @var Menu
13
     */
14
    private $menu;
15
16
    public function setUp() : void
17
    {
18
        parent::setUp();
19
        $this->menu = app(Menu::class);
20
    }
21
    /** @test */
22
    public function it_can_make_an_empty_menu_item()
23
    {
24
        $menuItem = MenuItem::make([]);
25
26
        $this->assertInstanceOf(MenuItem::class, $menuItem);
27
    }
28
29
    /** @test */
30
    public function it_can_set_properties_on_menu_item()
31
    {
32
        $properties = [
33
            'url' => 'my.url',
34
            'route' => 'my.route',
35
            'title' => 'My Menu item',
36
            'name' => 'my-menu-item',
37
            'icon' => 'fa fa-user',
38
            'parent' => 1,
39
            'attributes' => [],
40
            'active' => false,
41
            'order' => 1,
42
        ];
43
        $menuItem = MenuItem::make($properties);
44
45
        $this->assertEquals($properties, $menuItem->getProperties());
46
    }
47
48
    /** @test */
49
    public function it_can_fill_a_menu_item_with_allowed_properties()
50
    {
51
        $properties = [
52
            'url' => 'my.url',
53
            'route' => 'my.route',
54
            'title' => 'My Menu item',
55
            'name' => 'my-menu-item',
56
            'icon' => 'fa fa-user',
57
            'parent' => 1,
58
            'attributes' => [],
59
            'active' => false,
60
            'order' => 1,
61
        ];
62
        $menuItem = MenuItem::make($properties);
63
64
        $this->assertEquals('my.url', $menuItem->url);
65
        $this->assertEquals('my.route', $menuItem->route);
66
        $this->assertEquals('My Menu item', $menuItem->title);
67
        $this->assertEquals('my-menu-item', $menuItem->name);
68
        $this->assertEquals('fa fa-user', $menuItem->icon);
69
        $this->assertSame(1, $menuItem->parent);
70
        $this->assertSame([], $menuItem->attributes);
71
        $this->assertFalse($menuItem->active);
72
        $this->assertSame(1, $menuItem->order);
73
    }
74
75
    /** @test */
76
    public function it_can_set_icon_via_attributes()
77
    {
78
        $menuItem = MenuItem::make(['attributes' => ['icon' => 'fa fa-user']]);
79
80
        $this->assertEquals('fa fa-user', $menuItem->icon);
81
    }
82
83
    /** @test */
84
    public function it_can_add_a_child_menu_item()
85
    {
86
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
87
        $menuItem->child(['title' => 'Child Item']);
88
89
        $this->assertCount(1, $menuItem->getChilds());
90
    }
91
92
    /** @test */
93
    public function it_can_get_ordered_children()
94
    {
95
        $this->app['config']->set('menus.ordering', true);
96
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
97
        $menuItem->child(['title' => 'Child Item', 'order' => 10]);
98
        $menuItem->child(['title' => 'First Child Item', 'order' => 1]);
99
100
        $children = $menuItem->getChilds();
101
        $this->assertEquals('First Child Item', $children[1]->title);
102
        $this->assertEquals('Child Item', $children[0]->title);
103
    }
104
105
    /** @test */
106
    public function it_can_create_a_dropdown_menu_item()
107
    {
108
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
109
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
110
            $sub->url('settings/account', 'Account');
111
            $sub->url('settings/password', 'Password');
112
        });
113
        $this->assertCount(1, $menuItem->getChilds());
114
        $this->assertCount(2, $menuItem->getChilds()[0]->getChilds());
115
    }
116
117
    /** @test */
118
    public function it_can_make_a_simple_route_menu_item()
119
    {
120
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
121
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
122
            $sub->route('settings.account', 'Account', ['user_id' => 1]);
123
        });
124
        $children = $menuItem->getChilds()[0]->getChilds();
125
126
        $this->assertCount(1, $children);
127
        $childMenuItem = Arr::first($children);
0 ignored issues
show
Bug introduced by
It seems like $children can also be of type Countable; however, parameter $array of Illuminate\Support\Arr::first() does only seem to accept iterable, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

127
        $childMenuItem = Arr::first(/** @scrutinizer ignore-type */ $children);
Loading history...
128
        $this->assertEquals('settings.account', $childMenuItem->route[0]);
129
        $this->assertEquals(['user_id' => 1], $childMenuItem->route[1]);
130
    }
131
132
    /** @test */
133
    public function it_can_make_a_route_menu_item()
134
    {
135
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
136
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
137
            $sub->route('settings.account', 'Account', ['user_id' => 1], 1, ['my-attr' => 'value']);
138
        });
139
        $children = $menuItem->getChilds()[0]->getChilds();
140
141
        $this->assertCount(1, $children);
142
        $childMenuItem = Arr::first($children);
0 ignored issues
show
Bug introduced by
It seems like $children can also be of type Countable; however, parameter $array of Illuminate\Support\Arr::first() does only seem to accept iterable, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

142
        $childMenuItem = Arr::first(/** @scrutinizer ignore-type */ $children);
Loading history...
143
        $this->assertEquals('settings.account', $childMenuItem->route[0]);
144
        $this->assertEquals(['user_id' => 1], $childMenuItem->route[1]);
145
        $this->assertSame(1, $childMenuItem->order);
146
        $this->assertEquals(['my-attr' => 'value'], $childMenuItem->attributes);
147
    }
148
149
    /** @test */
150
    public function it_can_make_a_simple_url_menu_item()
151
    {
152
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
153
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
154
            $sub->url('settings/account', 'Account');
155
        });
156
        $children = $menuItem->getChilds()[0]->getChilds();
157
158
        $this->assertCount(1, $children);
159
        $childMenuItem = Arr::first($children);
0 ignored issues
show
Bug introduced by
It seems like $children can also be of type Countable; however, parameter $array of Illuminate\Support\Arr::first() does only seem to accept iterable, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

159
        $childMenuItem = Arr::first(/** @scrutinizer ignore-type */ $children);
Loading history...
160
        $this->assertEquals('settings/account', $childMenuItem->url);
161
        $this->assertEquals('Account', $childMenuItem->title);
162
    }
163
164
    /** @test */
165
    public function it_can_make_a_url_menu_item()
166
    {
167
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
168
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
169
            $sub->url('settings/account', 'Account', 1, ['my-attr' => 'value']);
170
        });
171
        $children = $menuItem->getChilds()[0]->getChilds();
172
173
        $this->assertCount(1, $children);
174
        $childMenuItem = Arr::first($children);
0 ignored issues
show
Bug introduced by
It seems like $children can also be of type Countable; however, parameter $array of Illuminate\Support\Arr::first() does only seem to accept iterable, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

174
        $childMenuItem = Arr::first(/** @scrutinizer ignore-type */ $children);
Loading history...
175
        $this->assertEquals('settings/account', $childMenuItem->url);
176
        $this->assertEquals('Account', $childMenuItem->title);
177
        $this->assertSame(1, $childMenuItem->order);
178
        $this->assertEquals(['my-attr' => 'value'], $childMenuItem->attributes);
179
    }
180
181
    /** @test */
182
    public function it_can_add_a_menu_item_divider()
183
    {
184
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
185
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
186
            $sub->url('settings/account', 'Account');
187
            $sub->divider();
188
        });
189
190
        $children = $menuItem->getChilds()[0]->getChilds();
191
192
        $this->assertCount(2, $children);
193
        $dividerMenuItem = $children[1];
194
        $this->assertEquals('divider', $dividerMenuItem->name);
195
        $this->assertTrue($dividerMenuItem->isDivider());
196
    }
197
198
    /** @test */
199
    public function it_can_add_a_header_menu_item()
200
    {
201
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
202
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
203
            $sub->header('User Stuff');
204
            $sub->url('settings/account', 'Account');
205
        });
206
207
        $children = $menuItem->getChilds()[0]->getChilds();
208
209
        $this->assertCount(2, $children);
210
        $headerItem = $children[0];
211
        $this->assertEquals('header', $headerItem->name);
212
        $this->assertEquals('User Stuff', $headerItem->title);
213
        $this->assertTrue($headerItem->isHeader());
214
    }
215
216
    /** @test */
217
    public function it_can_get_the_correct_url_for_url_type()
218
    {
219
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item']);
220
221
        $this->assertEquals('http://localhost/settings/account', $menuItem->getUrl());
222
    }
223
224
    /** @test */
225
    public function it_can_get_the_correct_url_for_route_type()
226
    {
227
        $this->app['router']->get('settings/account', ['as' => 'settings.account']);
228
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
229
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
230
            $sub->route('settings.account', 'Account');
231
        });
232
        $children = $menuItem->getChilds()[0]->getChilds();
233
        $childMenuItem = Arr::first($children);
234
235
        $this->assertEquals('http://localhost/settings/account', $childMenuItem->getUrl());
236
    }
237
238
    /** @test */
239
    public function it_can_get_request_uri()
240
    {
241
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item']);
242
243
        $this->assertEquals('settings/account', $menuItem->getRequest());
244
    }
245
246
    /** @test */
247
    public function it_can_get_the_icon_html_attribute()
248
    {
249
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item', 'icon' => 'fa fa-user']);
250
251
        $this->assertEquals('<i class="fa fa-user"></i>', $menuItem->getIcon());
252
    }
253
254
    /** @test */
255
    public function it_returns_no_icon_if_none_exist()
256
    {
257
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item']);
258
259
        $this->assertNull($menuItem->getIcon());
260
    }
261
262
    /** @test */
263
    public function it_returns_default_icon_if_none_exist()
264
    {
265
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item']);
266
267
        $this->assertEquals('<i class="fa fa-user"></i>', $menuItem->getIcon('fa fa-user'));
268
    }
269
270
    /** @test */
271
    public function it_can_get_item_properties()
272
    {
273
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item']);
274
275
        $this->assertEquals(['url' => 'settings/account', 'title' => 'Parent Item'], $menuItem->getProperties());
276
    }
277
278
    /** @test */
279
    public function it_can_get_item_html_attributes()
280
    {
281
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item', 'attributes' => ['my-attr' => 'value']]);
282
283
        $this->assertEquals(' my-attr="value"', $menuItem->getAttributes());
284
    }
285
286
    /** @test */
287
    public function it_can_check_for_a_submenu()
288
    {
289
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
290
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
291
            $sub->header('User Stuff');
292
            $sub->url('settings/account', 'Account');
293
        });
294
295
        $this->assertTrue($menuItem->hasSubMenu());
296
        $this->assertTrue($menuItem->hasChilds());
297
    }
298
299
    public function it_can_check_active_state_on_item()
300
    {
301
    }
302
}
303