Completed
Push — master ( 14eaec...c0ed6e )
by Nicolas
06:58
created

MenuItemTest::it_can_check_active_state_on_item()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 3
rs 10
c 1
b 0
f 0
cc 1
eloc 1
nc 1
nop 0
1
<?php
2
3
namespace Nwidart\Menus\Tests;
4
5
use Nwidart\Menus\Menu;
6
use Nwidart\Menus\MenuItem;
7
8
class MenuItemTest extends BaseTestCase
0 ignored issues
show
Bug introduced by
There is at least one abstract method in this class. Maybe declare it as abstract, or implement the remaining methods: artisan, be, call, seed
Loading history...
9
{
10
    /**
11
     * @var Menu
12
     */
13
    private $menu;
14
15
    public function setUp()
16
    {
17
        parent::setUp();
18
        $this->menu = app(Menu::class);
19
    }
20
    /** @test */
21
    public function it_can_make_an_empty_menu_item()
22
    {
23
        $menuItem = MenuItem::make([]);
24
25
        $this->assertInstanceOf(MenuItem::class, $menuItem);
26
    }
27
28
    /** @test */
29
    public function it_can_set_properties_on_menu_item()
30
    {
31
        $properties = [
32
            'url' => 'my.url',
33
            'route' => 'my.route',
34
            'title' => 'My Menu item',
35
            'name' => 'my-menu-item',
36
            'icon' => 'fa fa-user',
37
            'parent' => 1,
38
            'attributes' => [],
39
            'active' => false,
40
            'order' => 1,
41
        ];
42
        $menuItem = MenuItem::make($properties);
43
44
        $this->assertEquals($properties, $menuItem->getProperties());
45
    }
46
47
    /** @test */
48
    public function it_can_fill_a_menu_item_with_allowed_properties()
49
    {
50
        $properties = [
51
            'url' => 'my.url',
52
            'route' => 'my.route',
53
            'title' => 'My Menu item',
54
            'name' => 'my-menu-item',
55
            'icon' => 'fa fa-user',
56
            'parent' => 1,
57
            'attributes' => [],
58
            'active' => false,
59
            'order' => 1,
60
        ];
61
        $menuItem = MenuItem::make($properties);
62
63
        $this->assertEquals('my.url', $menuItem->url);
64
        $this->assertEquals('my.route', $menuItem->route);
65
        $this->assertEquals('My Menu item', $menuItem->title);
66
        $this->assertEquals('my-menu-item', $menuItem->name);
67
        $this->assertEquals('fa fa-user', $menuItem->icon);
68
        $this->assertSame(1, $menuItem->parent);
69
        $this->assertSame([], $menuItem->attributes);
70
        $this->assertFalse($menuItem->active);
71
        $this->assertSame(1, $menuItem->order);
72
    }
73
74
    /** @test */
75
    public function it_can_set_icon_via_attributes()
76
    {
77
        $menuItem = MenuItem::make(['attributes' => ['icon' => 'fa fa-user']]);
78
79
        $this->assertEquals('fa fa-user', $menuItem->icon);
80
    }
81
82
    /** @test */
83
    public function it_can_add_a_child_menu_item()
84
    {
85
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
86
        $menuItem->child(['title' => 'Child Item']);
87
88
        $this->assertCount(1, $menuItem->getChilds());
89
    }
90
91
    /** @test */
92
    public function it_can_get_ordered_children()
93
    {
94
        $this->app['config']->set('menus.ordering', true);
95
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
96
        $menuItem->child(['title' => 'Child Item', 'order' => 10]);
97
        $menuItem->child(['title' => 'First Child Item', 'order' => 1]);
98
99
        $children = $menuItem->getChilds();
100
        $this->assertEquals('First Child Item', $children[1]->title);
101
        $this->assertEquals('Child Item', $children[0]->title);
102
    }
103
104
    /** @test */
105
    public function it_can_create_a_dropdown_menu_item()
106
    {
107
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
108
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
109
            $sub->url('settings/account', 'Account');
110
            $sub->url('settings/password', 'Password');
111
        });
112
        $this->assertCount(1, $menuItem->getChilds());
113
        $this->assertCount(2, $menuItem->getChilds()[0]->getChilds());
114
    }
115
116
    /** @test */
117
    public function it_can_make_a_simple_route_menu_item()
118
    {
119
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
120
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
121
            $sub->route('settings.account', 'Account', ['user_id' => 1]);
122
        });
123
        $children = $menuItem->getChilds()[0]->getChilds();
124
125
        $this->assertCount(1, $children);
126
        $childMenuItem = array_first($children);
127
        $this->assertEquals('settings.account', $childMenuItem->route[0]);
128
        $this->assertEquals(['user_id' => 1], $childMenuItem->route[1]);
129
    }
130
131
    /** @test */
132
    public function it_can_make_a_route_menu_item()
133
    {
134
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
135
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
136
            $sub->route('settings.account', 'Account', ['user_id' => 1], 1, ['my-attr' => 'value']);
137
        });
138
        $children = $menuItem->getChilds()[0]->getChilds();
139
140
        $this->assertCount(1, $children);
141
        $childMenuItem = array_first($children);
142
        $this->assertEquals('settings.account', $childMenuItem->route[0]);
143
        $this->assertEquals(['user_id' => 1], $childMenuItem->route[1]);
144
        $this->assertSame(1, $childMenuItem->order);
145
        $this->assertEquals(['my-attr' => 'value'], $childMenuItem->attributes);
146
    }
147
148
    /** @test */
149 View Code Duplication
    public function it_can_make_a_simple_url_menu_item()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
150
    {
151
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
152
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
153
            $sub->url('settings/account', 'Account');
154
        });
155
        $children = $menuItem->getChilds()[0]->getChilds();
156
157
        $this->assertCount(1, $children);
158
        $childMenuItem = array_first($children);
159
        $this->assertEquals('settings/account', $childMenuItem->url);
160
        $this->assertEquals('Account', $childMenuItem->title);
161
    }
162
163
    /** @test */
164
    public function it_can_make_a_url_menu_item()
165
    {
166
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
167
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
168
            $sub->url('settings/account', 'Account', 1, ['my-attr' => 'value']);
169
        });
170
        $children = $menuItem->getChilds()[0]->getChilds();
171
172
        $this->assertCount(1, $children);
173
        $childMenuItem = array_first($children);
174
        $this->assertEquals('settings/account', $childMenuItem->url);
175
        $this->assertEquals('Account', $childMenuItem->title);
176
        $this->assertSame(1, $childMenuItem->order);
177
        $this->assertEquals(['my-attr' => 'value'], $childMenuItem->attributes);
178
    }
179
180
    /** @test */
181 View Code Duplication
    public function it_can_add_a_menu_item_divider()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

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