Completed
Push — master ( a7eafe...12a2e2 )
by Nicolas
03:02
created

MenuItemTest::it_can_add_a_header_menu_item()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 10

Duplication

Lines 15
Ratio 100 %

Importance

Changes 0
Metric Value
dl 15
loc 15
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 10
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
    }
195
196
    /** @test */
197 View Code Duplication
    public function it_can_add_a_header_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...
198
    {
199
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
200
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
201
            $sub->header('User Stuff');
202
            $sub->url('settings/account', 'Account');
203
        });
204
205
        $children = $menuItem->getChilds()[0]->getChilds();
206
207
        $this->assertCount(2, $children);
208
        $headerItem = $children[0];
209
        $this->assertEquals('header', $headerItem->name);
210
        $this->assertEquals('User Stuff', $headerItem->title);
211
    }
212
213
    /** @test */
214
    public function it_can_get_the_correct_url_for_url_type()
215
    {
216
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item']);
217
218
        $this->assertEquals('http://localhost/settings/account', $menuItem->getUrl());
219
    }
220
221
    /** @test */
222
    public function it_can_get_the_correct_url_for_route_type()
223
    {
224
        $this->app['router']->get('settings/account', ['as' => 'settings.account']);
225
        $menuItem = MenuItem::make(['title' => 'Parent Item']);
226
        $menuItem->dropdown('Dropdown item', function (MenuItem $sub) {
227
            $sub->route('settings.account', 'Account');
228
        });
229
        $children = $menuItem->getChilds()[0]->getChilds();
230
        $childMenuItem = array_first($children);
231
232
        $this->assertEquals('http://localhost/settings/account', $childMenuItem->getUrl());
233
    }
234
235
    /** @test */
236
    public function it_can_get_request_uri()
237
    {
238
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item']);
239
240
        $this->assertEquals('settings/account', $menuItem->getRequest());
241
    }
242
243
    /** @test */
244
    public function it_can_get_the_icon_html_attribute()
245
    {
246
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item', 'icon' => 'fa fa-user']);
247
248
        $this->assertEquals('<i class="fa fa-user"></i>', $menuItem->getIcon());
249
    }
250
251
    /** @test */
252
    public function it_returns_no_icon_if_none_exist()
253
    {
254
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item']);
255
256
        $this->assertNull($menuItem->getIcon());
257
    }
258
259
    /** @test */
260
    public function it_returns_default_icon_if_none_exist()
261
    {
262
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item']);
263
264
        $this->assertEquals('<i class="fa fa-user"></i>', $menuItem->getIcon('fa fa-user'));
265
    }
266
267
    /** @test */
268
    public function it_can_get_item_properties()
269
    {
270
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item']);
271
272
        $this->assertEquals(['url' => 'settings/account', 'title' => 'Parent Item'], $menuItem->getProperties());
273
    }
274
275
    /** @test */
276
    public function it_can_get_item_html_attributes()
277
    {
278
        $menuItem = MenuItem::make(['url' => 'settings/account', 'title' => 'Parent Item', 'attributes' => ['my-attr' => 'value']]);
279
280
        $this->assertEquals(' my-attr="value"', $menuItem->getAttributes());
281
    }
282
}
283