Completed
Push — master ( c82052...3a3de9 )
by Alexis
15:30
created

MenuBuilderTest::getMenuContext()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 28
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 28
rs 8.5806
cc 4
eloc 22
nc 4
nop 1
1
<?php
2
3
namespace Alpixel\Bundle\MenuBundle\Tests\Builder;
4
5
use Alpixel\Bundle\MenuBundle\Entity\Item;
6
use Alpixel\Bundle\MenuBundle\Entity\Menu;
7
use Alpixel\Bundle\MenuBundle\Builder\MenuBuilder;
8
use Alpixel\Bundle\MenuBundle\Entity\Repository\MenuRepository;
9
use Doctrine\ORM\EntityManager;
10
use Knp\Menu\FactoryInterface;
11
use Knp\Menu\MenuItem;
12
use Doctrine\Common\Collections\ArrayCollection;
13
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
14
15
class MenuBuilderTest extends KernelTestCase
16
{
17
    private $container;
18
19
    public function setUp()
20
    {
21
        self::bootKernel();
22
        $this->container = static::$kernel->getContainer();
23
    }
24
25
    public function getMenuBuilder()
26
    {
27
        return $this->container->get('alpixel_menu.builder');
28
    }
29
30
    public function testIsValidLocale()
31
    {
32
        $this->assertEquals(true, MenuBuilder::isValidLocale('fr'));
33
    }
34
35
    public function testIsValidMachineName()
36
    {
37
        $this->assertEquals(true, MenuBuilder::isValidMachineName('Machine Name'));
38
    }
39
40
    public function testSetDefaultLocale()
41
    {
42
        $entityManagerMock = $this->getMockBuilder(EntityManager::class)
43
            ->disableOriginalConstructor()
44
            ->getMock()
45
        ;
46
        $factoryMock = $this->getMockBuilder(FactoryInterface::class)
47
            ->disableOriginalConstructor()
48
            ->getMock()
49
        ;
50
51
        $builder = new MenuBuilder($entityManagerMock, $factoryMock);
52
        $this->assertNull($builder->getDefaultLocale());
53
54
        $test = 'fr';
55
        $builder->setDefaultLocale($test);
56
        $this->assertEquals($test, $builder->getDefaultLocale());
57
    }
58
59
    public function testCreateKnpMenu()
60
    {
61
        $entityManagerMock = $this->getMockBuilder(EntityManager::class)
62
            ->disableOriginalConstructor()
63
            ->getMock()
64
        ;
65
        $repositoryMock = $this->getMockBuilder(MenuRepository::class)
66
            ->disableOriginalConstructor()
67
            ->setMethods(array('findOneMenuByMachineNameAndLocale'))
68
            ->getMock()
69
        ;
70
        $repositoryMock->method('findOneMenuByMachineNameAndLocale')->willReturn($this->getMenuContext('fr'));
71
        $entityManagerMock->method('getRepository')->willReturn($repositoryMock);
72
73
        $builder = new MenuBuilder($entityManagerMock, $this->container->get('knp_menu.factory'));
74
        $knpMenu = $builder->createKnpMenu('main', 'fr');
75
        $this->assertInstanceOf(MenuItem::class, $knpMenu);
76
77
        $knpMenu = $builder->createKnpMenu('main');
78
        $this->assertInstanceOf(MenuItem::class, $knpMenu);
79
    }
80
81
    public function getMenuContext($locale)
82
    {
83
        $menuData = $this->getMenuData()[$locale];
84
        $menu = new Menu();
85
        $menu->setName($menuData['name']);
86
        $menu->setMachineName($menuData['machineName']);
87
        $menu->setLocale($menuData['locale']);
88
        $collectionA = new ArrayCollection();
89
        for ($i = 1; $i <= 5; $i++) {
90
            $itemA = $this->newItem($menu, $i);
91
            $collectionB = new ArrayCollection();
92
            for ($j = 1; $j <= 5; $j++) {
93
                $itemB = $this->newItem($menu, $j, $itemA);
94
                $collectionB->add($itemB);
95
                $collectionC = new ArrayCollection();
96
                for ($k = 1; $k <= 5; $k++) {
97
                    $itemC = $this->newItem($menu, $k);
98
                    $collectionC->add($itemC);
99
                }
100
                $itemB->addChildren($collectionC);
101
            }
102
            $itemA->addChildren($collectionB);
103
            $collectionA->add($itemA);
104
        }
105
        $menu->addItems($collectionA);
106
107
        return $menu;
108
    }
109
110
    public function newItem(Menu $menu, $i, Item $parentItem = null)
111
    {
112
        $item = new Item();
113
        $item->setMenu($menu);
114
        $item->setName('Item '.$i);
115
        $item->setPosition($i);
116
        $item->setUri('http://alpixel.fr');
117
118
        if ($parentItem !== null) {
119
            $item->setParent($parentItem);
120
        }
121
122
        return $item;
123
    }
124
125
    public function getMenuData()
126
    {
127
        return [
128
            'fr' => [
129
                'name' => 'Menu principal',
130
                'machineName' => 'main',
131
                'locale' => 'fr',
132
            ],
133
            'en' => [
134
                'name' => 'Main menu',
135
                'machineName' => 'main',
136
                'locale' => 'en',
137
            ],
138
        ];
139
    }
140
141
}