Completed
Push — develop ( ae5bdc...8aa11c )
by Bartko
01:50
created

AbstractTest::testAddNodeUserDefinedId()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 10
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace StefanoTreeTest\Integration;
6
7
use StefanoTree\NestedSet as TreeAdapter;
8
use StefanoTreeTest\IntegrationTestCase;
9
10
abstract class AbstractTest extends IntegrationTestCase
11
{
12
    /**
13
     * @var TreeAdapter
14
     */
15
    protected $treeAdapter;
16
17
    protected function setUp()
18
    {
19
        $this->treeAdapter = $this->getTreeAdapter();
20
21
        parent::setUp();
22
    }
23
24
    protected function tearDown()
25
    {
26
        $this->treeAdapter = null;
27
        parent::tearDown();
28
    }
29
30
    /**
31
     * @return TreeAdapter
32
     */
33
    abstract protected function getTreeAdapter();
34
35
    protected function getDataSet()
36
    {
37
        switch ($this->getName()) {
38
            case 'testCreateRootNode':
39
            case 'testCreateRootNodeWithCustomData':
40
            case 'testGetRootNodeRootDoesNotExist':
41
                return $this->createMySQLXMLDataSet(__DIR__.'/_files/NestedSet/initEmptyDataSet.xml');
42
            default:
43
                return $this->createMySQLXMLDataSet(__DIR__.'/_files/NestedSet/initDataSet.xml');
44
        }
45
    }
46
47
    public function testCreateRootNode()
48
    {
49
        $newId = $this->treeAdapter
50
            ->createRootNode();
51
52
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testCreateRootNode.xml');
53
        $this->assertEquals(1, $newId);
54
    }
55
56
    public function testCreateRootNodeWithCustomData()
57
    {
58
        $newId = $this->treeAdapter
59
            ->createRootNode(array('name' => 'This is root node'));
60
61
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testCreateRootNodeWithCustomData.xml');
62
        $this->assertEquals(1, $newId);
63
    }
64
65
    public function testCreateRootRootAlreadyExist()
66
    {
67
        $this->expectException(\StefanoTree\Exception\ValidationException::class);
68
        $this->expectExceptionMessage('Root node already exist');
69
70
        $this->treeAdapter
71
             ->createRootNode();
72
        $this->treeAdapter
73
            ->createRootNode();
74
    }
75
76
    public function testGetNode()
77
    {
78
        $expectedNodeData = array(
79
            'tree_traversal_id' => '12',
80
            'name' => null,
81
            'lft' => '18',
82
            'rgt' => '29',
83
            'parent_id' => '6',
84
            'level' => '3',
85
        );
86
87
        $nodeData = $this->treeAdapter
88
                         ->getNode(12);
89
90
        $this->assertEquals($expectedNodeData, $nodeData);
91
    }
92
93
    public function testGetNodeNodeDoesNotExist()
94
    {
95
        $this->assertNull($this->treeAdapter->getNode(123456789));
96
    }
97
98
    public function testAddNodeTargetNodeDoesNotExist()
99
    {
100
        $this->expectException(\StefanoTree\Exception\ValidationException::class);
101
        $this->expectExceptionMessage('Target Node does not exists.');
102
103
        try {
104
            $this->treeAdapter
105
                ->addNode(123456789, array(), TreeAdapter::PLACEMENT_BOTTOM);
106
        } catch (\Exception $e) {
107
            $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/initDataSetWithIds.xml');
108
            throw $e;
109
        }
110
    }
111
112
    public function testCreateNodePlacementStrategyDoesNotExists()
113
    {
114
        $this->expectException(\StefanoTree\Exception\InvalidArgumentException::class);
115
        $this->expectExceptionMessage('Unknown placement "unknown-placement"');
116
117
        $this->treeAdapter
118
            ->addNode(1, array(), 'unknown-placement');
119
    }
120
121
    public function testAddNodePlacementBottomTargetNodeIsRoot()
122
    {
123
        $this->expectException(\StefanoTree\Exception\ValidationException::class);
124
        $this->expectExceptionMessage('Cannot create node. Target node is root. Root node cannot have sibling.');
125
126
        try {
127
            $this->treeAdapter
128
                ->addNode(1, array(), TreeAdapter::PLACEMENT_BOTTOM);
129
        } catch (\Exception $e) {
130
            $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/initDataSetWithIds.xml');
131
            throw $e;
132
        }
133
    }
134
135
    public function testAddNodePlacementTopTargetNodeIsRoot()
136
    {
137
        $this->expectException(\StefanoTree\Exception\ValidationException::class);
138
        $this->expectExceptionMessage('Cannot create node. Target node is root. Root node cannot have sibling.');
139
140
        try {
141
            $this->treeAdapter
142
                ->addNode(1, array(), TreeAdapter::PLACEMENT_TOP);
143
        } catch (\Exception $e) {
144
            $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/initDataSetWithIds.xml');
145
            throw $e;
146
        }
147
    }
148
149
    public function testAddNodePlacementBottom()
150
    {
151
        //test 1
152
        $lastGeneratedValue = $this->treeAdapter
153
                                   ->addNode(12, array(), TreeAdapter::PLACEMENT_BOTTOM);
154
155
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testAddNodePlacementBottom-1.xml');
156
        $this->assertEquals(26, $lastGeneratedValue);
157
158
        //test 2 with data
159
        $data = array(
160
            'name' => 'ahoj',
161
        );
162
163
        $lastGeneratedValue = $this->treeAdapter
164
                                   ->addNode(19, $data, TreeAdapter::PLACEMENT_BOTTOM);
165
166
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testAddNodePlacementBottom-2.xml');
167
        $this->assertEquals(27, $lastGeneratedValue);
168
    }
169
170
    public function testAddNodeUserDefinedId()
171
    {
172
        $uuid = 652;
173
174
        $lastGeneratedValue = $this->treeAdapter
175
            ->addNode(
176
                12,
177
                array(
178
                    'tree_traversal_id' => $uuid,
179
                ),
180
                TreeAdapter::PLACEMENT_BOTTOM
181
            );
182
183
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testAddNodeUserDefinedId.xml');
184
        $this->assertEquals($uuid, $lastGeneratedValue);
185
    }
186
187
    public function testAddNodePlacementTop()
188
    {
189
        //test 1
190
        $lastGeneratedValue = $this->treeAdapter
191
                                   ->addNode(16, array(), TreeAdapter::PLACEMENT_TOP);
192
193
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testAddNodePlacementTop-1.xml');
194
        $this->assertEquals(26, $lastGeneratedValue);
195
196
        //test 2 with data
197
        $data = array(
198
            'name' => 'ahoj',
199
        );
200
        $lastGeneratedValue = $this->treeAdapter
201
                                   ->addNode(3, $data, TreeAdapter::PLACEMENT_TOP);
202
203
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testAddNodePlacementTop-2.xml');
204
        $this->assertEquals(27, $lastGeneratedValue);
205
    }
206
207
    public function testAddNodePlacementChildBottom()
208
    {
209
        //test 1
210
        $lastGeneratedValue = $this->treeAdapter
211
                                   ->addNode(21, array(), TreeAdapter::PLACEMENT_CHILD_BOTTOM);
212
213
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testAddNodePlacementChildBottom-1.xml');
214
        $this->assertEquals(26, $lastGeneratedValue);
215
216
        //test 2 with data
217
        $data = array(
218
            'name' => 'ahoj',
219
        );
220
        $lastGeneratedValue = $this->treeAdapter
221
                                   ->addNode(4, $data, TreeAdapter::PLACEMENT_CHILD_BOTTOM);
222
223
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testAddNodePlacementChildBottom-2.xml');
224
        $this->assertEquals(27, $lastGeneratedValue);
225
    }
226
227
    public function testAddNodePlacementChildTopDefaultPlacement()
228
    {
229
        //test 1
230
        $lastGeneratedValue = $this->treeAdapter
231
                                   ->addNode(4);
232
233
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testAddNodePlacementChildTop-1.xml');
234
        $this->assertEquals(26, $lastGeneratedValue);
235
236
        //test 2 with data
237
        $data = array(
238
            'name' => 'ahoj',
239
        );
240
        $lastGeneratedValue = $this->treeAdapter
241
                                   ->addNode(10, $data);
242
243
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testAddNodePlacementChildTop-2.xml');
244
        $this->assertEquals(27, $lastGeneratedValue);
245
    }
246
247
    public function testDeleteBranchDoesNotExist()
248
    {
249
        $this->treeAdapter
250
            ->deleteBranch(123456789);
251
252
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/initDataSetWithIds.xml');
253
    }
254
255
    public function testDeleteBranch()
256
    {
257
        $this->treeAdapter
258
                       ->deleteBranch(6);
259
260
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testDeleteBranch.xml');
261
    }
262
263
    public function testMoveNodeCannotMoveTargetNodeIsInsideSourceBranch()
264
    {
265
        $this->expectException(\StefanoTree\Exception\ValidationException::class);
266
        $this->expectExceptionMessage('Cannot move. Target node is inside source branch.');
267
268
        try {
269
            $this->treeAdapter
270
                ->moveNode(1, 12);
271
        } catch (\Exception $e) {
272
            $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/initDataSetWithIds.xml');
273
            throw $e;
274
        }
275
    }
276
277
    public function testMoveNodeCannotMoveTargetAndSourceNodeAreEqual()
278
    {
279
        $this->expectException(\StefanoTree\Exception\ValidationException::class);
280
        $this->expectExceptionMessage('Cannot move. Source node and Target node are equal.');
281
282
        try {
283
            $this->treeAdapter
284
                ->moveNode(10, 10);
285
        } catch (\Exception $e) {
286
            $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/initDataSetWithIds.xml');
287
            throw $e;
288
        }
289
    }
290
291
    public function testMoveNodeCannotMoveTargetNodeDoesNotExist()
292
    {
293
        $this->expectException(\StefanoTree\Exception\ValidationException::class);
294
        $this->expectExceptionMessage('Cannot move. Target node does not exists.');
295
296
        try {
297
            $this->treeAdapter
298
                ->moveNode(5, 123456);
299
        } catch (\Exception $e) {
300
            $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/initDataSetWithIds.xml');
301
            throw $e;
302
        }
303
    }
304
305
    public function testMoveNodeCannotMoveSourceNodeDoesNotExist()
306
    {
307
        $this->expectException(\StefanoTree\Exception\ValidationException::class);
308
        $this->expectExceptionMessage('Cannot move. Source node does not exists.');
309
310
        try {
311
            $this->treeAdapter
312
                ->moveNode(123456, 6);
313
        } catch (\Exception $e) {
314
            $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/initDataSetWithIds.xml');
315
            throw $e;
316
        }
317
    }
318
319
    public function testMoveNodePlacementStrategyDoesNotExists()
320
    {
321
        $this->expectException(\StefanoTree\Exception\InvalidArgumentException::class);
322
        $this->expectExceptionMessage('Unknown placement "unknown-placement"');
323
324
        $this->treeAdapter
325
            ->moveNode(11, 1, 'unknown-placement');
326
    }
327
328
    public function placementDataProvider()
329
    {
330
        return [
331
            [\StefanoTree\TreeInterface::PLACEMENT_TOP],
332
            [\StefanoTree\TreeInterface::PLACEMENT_BOTTOM],
333
        ];
334
    }
335
336
    /**
337
     * @dataProvider placementDataProvider
338
     *
339
     * @param string $placement
340
     *
341
     * @throws \Exception
342
     */
343
    public function testMoveNodeCannotCreateSiblingNodeAtRootNode(string $placement)
344
    {
345
        $this->expectException(\StefanoTree\Exception\ValidationException::class);
346
        $this->expectExceptionMessage('Cannot move. Target node is root. Root node cannot have sibling.');
347
348
        try {
349
            $this->treeAdapter
350
                ->moveNode(11, 1, $placement);
351
        } catch (\Exception $e) {
352
            $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/initDataSetWithIds.xml');
353
            throw $e;
354
        }
355
    }
356
357
    public function testMoveNodePlacementBottom()
358
    {
359
        //test source node is already at required position
360
        $this->treeAdapter
361
                       ->moveNode(3, 2, TreeAdapter::PLACEMENT_BOTTOM);
362
363
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/initDataSetWithIds.xml');
364
365
        //test
366
        $this->treeAdapter
367
                       ->moveNode(14, 18, TreeAdapter::PLACEMENT_BOTTOM);
368
369
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testMoveNodePlacementBottom-1.xml');
370
371
        //test
372
        $this->treeAdapter
373
                       ->moveNode(16, 7, TreeAdapter::PLACEMENT_BOTTOM);
374
375
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testMoveNodePlacementBottom-2.xml');
376
377
        //test
378
        $this->treeAdapter
379
                       ->moveNode(14, 3, TreeAdapter::PLACEMENT_BOTTOM);
380
381
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testMoveNodePlacementBottom-3.xml');
382
    }
383
384
    public function testMoveNodePlacementTop()
385
    {
386
        //test source node is already at required position
387
        $this->treeAdapter
388
                       ->moveNode(3, 4, TreeAdapter::PLACEMENT_TOP);
389
390
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/initDataSetWithIds.xml');
391
392
        //test
393
        $this->treeAdapter
394
                       ->moveNode(19, 12, TreeAdapter::PLACEMENT_TOP);
395
396
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testMoveNodePlacementTop-1.xml');
397
398
        //test
399
        $this->treeAdapter
400
                       ->moveNode(10, 18, TreeAdapter::PLACEMENT_TOP);
401
402
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testMoveNodePlacementTop-2.xml');
403
404
        //test
405
        $this->treeAdapter
406
                       ->moveNode(21, 6, TreeAdapter::PLACEMENT_TOP);
407
408
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testMoveNodePlacementTop-3.xml');
409
    }
410
411
    public function testMoveNodePlacementChildBottom()
412
    {
413
        //test source node is already at required position
414
        $this->treeAdapter
415
                       ->moveNode(22, 18, TreeAdapter::PLACEMENT_CHILD_BOTTOM);
416
417
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/initDataSetWithIds.xml');
418
419
        //test
420
        $this->treeAdapter
421
                       ->moveNode(9, 12, TreeAdapter::PLACEMENT_CHILD_BOTTOM);
422
423
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testMoveNodePlacementChildBottom-1.xml');
424
425
        //test
426
        $this->treeAdapter
427
                       ->moveNode(10, 3, TreeAdapter::PLACEMENT_CHILD_BOTTOM);
428
429
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testMoveNodePlacementChildBottom-2.xml');
430
431
        //test
432
        $this->treeAdapter
433
                       ->moveNode(21, 12, TreeAdapter::PLACEMENT_CHILD_BOTTOM);
434
435
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testMoveNodePlacementChildBottom-3.xml');
436
    }
437
438
    public function testMoveNodePlacementChildTopDefaultPlacement()
439
    {
440
        //test source node is already at required position
441
        $this->treeAdapter
442
                       ->moveNode(21, 18);
443
444
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/initDataSetWithIds.xml');
445
446
        //test
447
        $this->treeAdapter
448
                       ->moveNode(9, 21);
449
450
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testMoveNodePlacementChildTop-1.xml');
451
452
        //test
453
        $this->treeAdapter
454
                       ->moveNode(16, 3);
455
456
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testMoveNodePlacementChildTop-2.xml');
457
458
        //test
459
        $this->treeAdapter
460
               ->moveNode(18, 3);
461
462
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testMoveNodePlacementChildTop-3.xml');
463
    }
464
465
    public function testGetAncestorsReturnEmptyArrayIfNodeDoesNotExist()
466
    {
467
        $return = $this->treeAdapter
468
            ->getAncestorsQueryBuilder()
469
            ->get(123456789);
470
471
        $this->assertEquals(array(), $return);
472
    }
473
474
    public function testGetAncestorsReturnEmptyArrayIfNodeExistButHasNoPath()
475
    {
476
        $return = $this->treeAdapter
477
            ->getAncestorsQueryBuilder()
478
            ->excludeLastNLevel(1)
479
            ->get(1);
480
481
        $this->assertEquals(array(), $return);
482
    }
483
484
    public function testGetAncestor()
485
    {
486
        //test
487
        $return = $this->treeAdapter
488
                       ->getAncestorsQueryBuilder()
489
                       ->get(6);
490
491
        $expected = array(
492
            array(
493
                'tree_traversal_id' => '1',
494
                'name' => null,
495
                'lft' => '1',
496
                'rgt' => '50',
497
                'parent_id' => null,
498
                'level' => '0',
499
            ),
500
            array(
501
                'tree_traversal_id' => '3',
502
                'name' => null,
503
                'lft' => '16',
504
                'rgt' => '35',
505
                'parent_id' => '1',
506
                'level' => '1',
507
            ),
508
            array(
509
                'tree_traversal_id' => '6',
510
                'name' => null,
511
                'lft' => '17',
512
                'rgt' => '32',
513
                'parent_id' => '3',
514
                'level' => '2',
515
            ),
516
        );
517
        $this->assertEquals($expected, $return);
518
519
        //test
520
        $return = $this->treeAdapter
521
                       ->getAncestorsQueryBuilder()
522
                       ->excludeFirstNLevel(1)
523
                       ->get(6);
524
525
        $expected = array(
526
            array(
527
                'tree_traversal_id' => '3',
528
                'name' => null,
529
                'lft' => '16',
530
                'rgt' => '35',
531
                'parent_id' => '1',
532
                'level' => '1',
533
            ),
534
            array(
535
                'tree_traversal_id' => '6',
536
                'name' => null,
537
                'lft' => '17',
538
                'rgt' => '32',
539
                'parent_id' => '3',
540
                'level' => '2',
541
            ),
542
        );
543
        $this->assertEquals($expected, $return);
544
545
        //test
546
        $return = $this->treeAdapter
547
                       ->getAncestorsQueryBuilder()
548
                       ->excludeLastNLevel(1)
549
                       ->get(6);
550
551
        $expected = array(
552
            array(
553
                'tree_traversal_id' => '1',
554
                'name' => null,
555
                'lft' => '1',
556
                'rgt' => '50',
557
                'parent_id' => null,
558
                'level' => '0',
559
            ),
560
            array(
561
                'tree_traversal_id' => '3',
562
                'name' => null,
563
                'lft' => '16',
564
                'rgt' => '35',
565
                'parent_id' => '1',
566
                'level' => '1',
567
            ),
568
        );
569
        $this->assertEquals($expected, $return);
570
    }
571
572
    public function testGetDescendantsReturnEmptyArrayIfNodeDoesNotExist()
573
    {
574
        $return = $this->treeAdapter
575
            ->getDescendantsQueryBuilder()
576
            ->get(123456789);
577
        $this->assertEquals(array(), $return);
578
    }
579
580
    public function testGetDescendantsReturnEmptyArrayNodeDoesNotHaveDescendants()
581
    {
582
        $return = $this->treeAdapter
583
            ->getDescendantsQueryBuilder()
584
            ->excludeFirstNLevel(1)
585
            ->get(8);
586
587
        $this->assertEquals(array(), $return);
588
    }
589
590
    public function testGetDescendants()
591
    {
592
        //test whole branch
593
        $return = $this->treeAdapter
594
                       ->getDescendantsQueryBuilder()
595
                       ->get(21);
596
597
        $expected = array(
598
            array(
599
                'tree_traversal_id' => '21',
600
                'name' => null,
601
                'lft' => '20',
602
                'rgt' => '25',
603
                'parent_id' => '18',
604
                'level' => '5',
605
            ),
606
            array(
607
                'tree_traversal_id' => '24',
608
                'name' => null,
609
                'lft' => '21',
610
                'rgt' => '22',
611
                'parent_id' => '21',
612
                'level' => '6',
613
            ),
614
            array(
615
                'tree_traversal_id' => '25',
616
                'name' => null,
617
                'lft' => '23',
618
                'rgt' => '24',
619
                'parent_id' => '21',
620
                'level' => '6',
621
            ),
622
        );
623
        $this->assertEquals($expected, $return);
624
625
        //test exclude fist 3 levels
626
        $return = $this->treeAdapter
627
                       ->getDescendantsQueryBuilder()
628
                       ->excludeFirstNLevel(3)
629
                       ->get(6);
630
631
        $expected = array(
632
            array(
633
                'tree_traversal_id' => '21',
634
                'name' => null,
635
                'lft' => '20',
636
                'rgt' => '25',
637
                'parent_id' => '18',
638
                'level' => '5',
639
            ),
640
            array(
641
                'tree_traversal_id' => '24',
642
                'name' => null,
643
                'lft' => '21',
644
                'rgt' => '22',
645
                'parent_id' => '21',
646
                'level' => '6',
647
            ),
648
            array(
649
                'tree_traversal_id' => '25',
650
                'name' => null,
651
                'lft' => '23',
652
                'rgt' => '24',
653
                'parent_id' => '21',
654
                'level' => '6',
655
            ),
656
            array(
657
                'tree_traversal_id' => '22',
658
                'name' => null,
659
                'lft' => '26',
660
                'rgt' => '27',
661
                'parent_id' => '18',
662
                'level' => '5',
663
            ),
664
        );
665
        $this->assertEquals($expected, $return);
666
667
        //test limit depth
668
        $return = $this->treeAdapter
669
                       ->getDescendantsQueryBuilder()
670
                       ->levelLimit(2)
671
                       ->get(18);
672
673
        $expected = array(
674
            array(
675
                'tree_traversal_id' => '18',
676
                'name' => null,
677
                'lft' => '19',
678
                'rgt' => '28',
679
                'parent_id' => '12',
680
                'level' => '4',
681
            ),
682
            array(
683
                'tree_traversal_id' => '21',
684
                'name' => null,
685
                'lft' => '20',
686
                'rgt' => '25',
687
                'parent_id' => '18',
688
                'level' => '5',
689
            ),
690
            array(
691
                'tree_traversal_id' => '22',
692
                'name' => null,
693
                'lft' => '26',
694
                'rgt' => '27',
695
                'parent_id' => '18',
696
                'level' => '5',
697
            ),
698
        );
699
        $this->assertEquals($expected, $return);
700
701
        //test exclude node
702
        $return = $this->treeAdapter
703
                       ->getDescendantsQueryBuilder()
704
                       ->excludeBranch(21)
705
                       ->get(12);
706
707
        $expected = array(
708
            array(
709
                'tree_traversal_id' => '12',
710
                'name' => null,
711
                'lft' => '18',
712
                'rgt' => '29',
713
                'parent_id' => '6',
714
                'level' => '3',
715
            ),
716
            array(
717
                'tree_traversal_id' => '18',
718
                'name' => null,
719
                'lft' => '19',
720
                'rgt' => '28',
721
                'parent_id' => '12',
722
                'level' => '4',
723
            ),
724
            array(
725
                'tree_traversal_id' => '22',
726
                'name' => null,
727
                'lft' => '26',
728
                'rgt' => '27',
729
                'parent_id' => '18',
730
                'level' => '5',
731
            ),
732
        );
733
        $this->assertEquals($expected, $return);
734
    }
735
736
    public function testGetChildrenReturnEmptyArrayIfNodeDoesNotExist()
737
    {
738
        $return = $this->treeAdapter
739
            ->getDescendantsQueryBuilder()
740
            ->excludeFirstNLevel(1)
741
            ->levelLimit(1)
742
            ->get(123456789);
743
744
        $this->assertEquals(array(), $return);
745
    }
746
747
    public function testGetChildrenReturnEmptyArrayIfNodeDoesNotHaveChildren()
748
    {
749
        $return = $this->treeAdapter
750
            ->getDescendantsQueryBuilder()
751
            ->excludeFirstNLevel(1)
752
            ->levelLimit(1)
753
            ->get(8);
754
755
        $this->assertEquals(array(), $return);
756
    }
757
758
    public function testGetChildren()
759
    {
760
        //test exclude node
761
        $return = $this->treeAdapter
762
                       ->getDescendantsQueryBuilder()
763
                       ->levelLimit(1)
764
                       ->excludeFirstNLevel(1)
765
                       ->get(18);
766
767
        $expected = array(
768
            array(
769
                'tree_traversal_id' => '21',
770
                'name' => null,
771
                'lft' => '20',
772
                'rgt' => '25',
773
                'parent_id' => '18',
774
                'level' => '5',
775
            ),
776
            array(
777
                'tree_traversal_id' => '22',
778
                'name' => null,
779
                'lft' => '26',
780
                'rgt' => '27',
781
                'parent_id' => '18',
782
                'level' => '5',
783
            ),
784
        );
785
        $this->assertEquals($expected, $return);
786
    }
787
788
    public function testUpdateNode()
789
    {
790
        //test
791
        $data = array(
792
            'name' => 'ahoj',
793
        );
794
        $this->treeAdapter
795
             ->updateNode(3, $data);
796
797
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testUpdateNode-1.xml');
798
799
        //test
800
        $data = array(
801
            'name' => 'ahoj',
802
            'lft' => '123456',
803
            'rgt' => '123456',
804
            'tree_traversal_id' => '123456',
805
            'level' => '123456',
806
            'parent_id' => '123456',
807
        );
808
        $this->treeAdapter
809
             ->updateNode(3, $data);
810
811
        $this->assertCompareDataSet(array('tree_traversal'), __DIR__.'/_files/NestedSet/testUpdateNode-1.xml');
812
    }
813
814
    public function testGetRootNodeRootDoesNotExist()
815
    {
816
        $return = $this->treeAdapter
817
            ->getRootNode();
818
819
        $this->assertEquals(array(), $return);
820
    }
821
822
    public function testGetRootNode()
823
    {
824
        $return = $this->treeAdapter
825
            ->getRootNode();
826
827
        $expected = array(
828
            'tree_traversal_id' => '1',
829
            'name' => '',
830
            'lft' => '1',
831
            'rgt' => '50',
832
            'parent_id' => null,
833
            'level' => '0',
834
        );
835
        $this->assertEquals($expected, $return);
836
    }
837
}
838