TreeHelperTest.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. <?php
  2. namespace Tools\Test\TestCase\View\Helper;
  3. use Cake\Datasource\ConnectionManager;
  4. use Cake\ORM\Entity;
  5. use Cake\ORM\Table;
  6. use Cake\ORM\TableRegistry;
  7. use Cake\View\View;
  8. use Tools\TestSuite\TestCase;
  9. use Tools\View\Helper\TreeHelper;
  10. class TreeHelperTest extends TestCase {
  11. /**
  12. * @var array
  13. */
  14. public $fixtures = [
  15. 'plugin.tools.after_trees'
  16. ];
  17. /**
  18. * @var \Cake\ORM\Table
  19. */
  20. public $Table;
  21. /**
  22. * Initial Tree
  23. *
  24. * - One
  25. * -- One-SubA
  26. * - Two
  27. * -- Two-SubA
  28. * --- Two-SubA-1
  29. * ---- Two-SubA-1-1
  30. * - Three
  31. * - Four
  32. * -- Four-SubA
  33. *
  34. * @return void
  35. */
  36. public function setUp() {
  37. parent::setUp();
  38. $this->Tree = new TreeHelper(new View(null));
  39. $this->Table = TableRegistry::get('AfterTrees');
  40. $this->Table->addBehavior('Tree');
  41. //$this->Table->truncate();
  42. $connection = ConnectionManager::get('test');
  43. $sql = $this->Table->schema()->truncateSql($connection);
  44. foreach ($sql as $snippet) {
  45. $connection->execute($snippet);
  46. }
  47. //$this->Table->deleteAll(array());
  48. $data = [
  49. ['name' => 'One'],
  50. ['name' => 'Two'],
  51. ['name' => 'Three'],
  52. ['name' => 'Four'],
  53. ['name' => 'One-SubA', 'parent_id' => 1],
  54. ['name' => 'Two-SubA', 'parent_id' => 2],
  55. ['name' => 'Four-SubA', 'parent_id' => 4],
  56. ['name' => 'Two-SubA-1', 'parent_id' => 6],
  57. ['name' => 'Two-SubA-1-1', 'parent_id' => 8],
  58. ];
  59. foreach ($data as $row) {
  60. $row = new Entity($row);
  61. $this->Table->save($row);
  62. }
  63. }
  64. public function tearDown() {
  65. unset($this->Table);
  66. TableRegistry::clear();
  67. parent::tearDown();
  68. }
  69. public function testObject() {
  70. $this->assertInstanceOf('Tools\View\Helper\TreeHelper', $this->Tree);
  71. }
  72. /**
  73. * TreeHelperTest::testGenerate()
  74. *
  75. * @return void
  76. */
  77. public function testGenerate() {
  78. $tree = $this->Table->find('threaded')->toArray();
  79. $output = $this->Tree->generate($tree);
  80. $expected = <<<TEXT
  81. <ul>
  82. <li>One
  83. <ul>
  84. <li>One-SubA</li>
  85. </ul>
  86. </li>
  87. <li>Two
  88. <ul>
  89. <li>Two-SubA
  90. <ul>
  91. <li>Two-SubA-1
  92. <ul>
  93. <li>Two-SubA-1-1</li>
  94. </ul>
  95. </li>
  96. </ul>
  97. </li>
  98. </ul>
  99. </li>
  100. <li>Three</li>
  101. <li>Four
  102. <ul>
  103. <li>Four-SubA</li>
  104. </ul>
  105. </li>
  106. </ul>
  107. TEXT;
  108. $this->assertTextEquals($expected, $output);
  109. $this->assertTrue(substr_count($output, '<ul>') === substr_count($output, '</ul>'));
  110. $this->assertTrue(substr_count($output, '<li>') === substr_count($output, '</li>'));
  111. }
  112. /**
  113. * TreeHelperTest::testGenerateWithFindAll()
  114. *
  115. * @return void
  116. */
  117. public function testGenerateWithFindAll() {
  118. $tree = $this->Table->find('all', ['order' => ['lft' => 'ASC']])->toArray();
  119. $output = $this->Tree->generate($tree);
  120. //debug($output); return;
  121. $expected = <<<TEXT
  122. <ul>
  123. <li>One
  124. <ul>
  125. <li>One-SubA</li>
  126. </ul>
  127. </li>
  128. <li>Two
  129. <ul>
  130. <li>Two-SubA
  131. <ul>
  132. <li>Two-SubA-1
  133. <ul>
  134. <li>Two-SubA-1-1</li>
  135. </ul>
  136. </li>
  137. </ul>
  138. </li>
  139. </ul>
  140. </li>
  141. <li>Three</li>
  142. <li>Four
  143. <ul>
  144. <li>Four-SubA</li>
  145. </ul>
  146. </li>
  147. </ul>
  148. TEXT;
  149. $output = str_replace(["\t", "\r", "\n"], '', $output);
  150. $expected = str_replace(["\t", "\r", "\n"], '', $expected);
  151. $this->assertTextEquals($expected, $output);
  152. }
  153. /**
  154. * TreeHelperTest::testGenerateWithDepth()
  155. *
  156. * @return void
  157. */
  158. public function testGenerateWithDepth() {
  159. $tree = $this->Table->find('threaded')->toArray();
  160. $output = $this->Tree->generate($tree, ['depth' => 1]);
  161. $expected = <<<TEXT
  162. <ul>
  163. <li>One
  164. <ul>
  165. <li>One-SubA</li>
  166. </ul>
  167. </li>
  168. <li>Two
  169. <ul>
  170. <li>Two-SubA
  171. <ul>
  172. <li>Two-SubA-1
  173. <ul>
  174. <li>Two-SubA-1-1</li>
  175. </ul>
  176. </li>
  177. </ul>
  178. </li>
  179. </ul>
  180. </li>
  181. <li>Three</li>
  182. <li>Four
  183. <ul>
  184. <li>Four-SubA</li>
  185. </ul>
  186. </li>
  187. </ul>
  188. TEXT;
  189. $this->assertTextEquals($expected, $output);
  190. }
  191. /**
  192. * TreeHelperTest::testGenerateWithSettings()
  193. *
  194. * @return void
  195. */
  196. public function testGenerateWithSettings() {
  197. $tree = $this->Table->find('threaded')->toArray();
  198. $output = $this->Tree->generate($tree, ['class' => 'navi', 'id' => 'main', 'type' => 'ol']);
  199. $expected = <<<TEXT
  200. <ol class="navi" id="main">
  201. <li>One
  202. <ol>
  203. <li>One-SubA</li>
  204. </ol>
  205. </li>
  206. <li>Two
  207. <ol>
  208. <li>Two-SubA
  209. <ol>
  210. <li>Two-SubA-1
  211. <ol>
  212. <li>Two-SubA-1-1</li>
  213. </ol>
  214. </li>
  215. </ol>
  216. </li>
  217. </ol>
  218. </li>
  219. <li>Three</li>
  220. <li>Four
  221. <ol>
  222. <li>Four-SubA</li>
  223. </ol>
  224. </li>
  225. </ol>
  226. TEXT;
  227. $this->assertTextEquals($expected, $output);
  228. }
  229. /**
  230. * TreeHelperTest::testGenerateWithMaxDepth()
  231. *
  232. * @return void
  233. */
  234. public function testGenerateWithMaxDepth() {
  235. $tree = $this->Table->find('threaded')->toArray();
  236. $output = $this->Tree->generate($tree, ['maxDepth' => 2]);
  237. $expected = <<<TEXT
  238. <ul>
  239. <li>One
  240. <ul>
  241. <li>One-SubA</li>
  242. </ul>
  243. </li>
  244. <li>Two
  245. <ul>
  246. <li>Two-SubA
  247. <ul>
  248. <li>Two-SubA-1</li>
  249. </ul>
  250. </li>
  251. </ul>
  252. </li>
  253. <li>Three</li>
  254. <li>Four
  255. <ul>
  256. <li>Four-SubA</li>
  257. </ul>
  258. </li>
  259. </ul>
  260. TEXT;
  261. $this->assertTextEquals($expected, $output);
  262. }
  263. /**
  264. * TreeHelperTest::testGenerateWithAutoPath()
  265. *
  266. * @return void
  267. */
  268. public function testGenerateWithAutoPath() {
  269. $tree = $this->Table->find('threaded')->toArray();
  270. //debug($tree);
  271. $output = $this->Tree->generate($tree, ['autoPath' => [7, 10]]); // Two-SubA-1
  272. //debug($output);
  273. $expected = <<<TEXT
  274. <ul>
  275. <li>One
  276. <ul>
  277. <li>One-SubA</li>
  278. </ul>
  279. </li>
  280. <li class="active">Two
  281. <ul>
  282. <li class="active">Two-SubA
  283. <ul>
  284. <li class="active">Two-SubA-1
  285. <ul>
  286. <li>Two-SubA-1-1</li>
  287. </ul>
  288. </li>
  289. </ul>
  290. </li>
  291. </ul>
  292. </li>
  293. <li>Three</li>
  294. <li>Four
  295. <ul>
  296. <li>Four-SubA</li>
  297. </ul>
  298. </li>
  299. </ul>
  300. TEXT;
  301. $this->assertTextEquals($expected, $output);
  302. $output = $this->Tree->generate($tree, ['autoPath' => [8, 9]]); // Two-SubA-1-1
  303. //debug($output);
  304. $expected = <<<TEXT
  305. <ul>
  306. <li>One
  307. <ul>
  308. <li>One-SubA</li>
  309. </ul>
  310. </li>
  311. <li class="active">Two
  312. <ul>
  313. <li class="active">Two-SubA
  314. <ul>
  315. <li class="active">Two-SubA-1
  316. <ul>
  317. <li class="active">Two-SubA-1-1</li>
  318. </ul>
  319. </li>
  320. </ul>
  321. </li>
  322. </ul>
  323. </li>
  324. <li>Three</li>
  325. <li>Four
  326. <ul>
  327. <li>Four-SubA</li>
  328. </ul>
  329. </li>
  330. </ul>
  331. TEXT;
  332. $this->assertTextEquals($expected, $output);
  333. }
  334. /**
  335. * - One
  336. * -- One-SubA
  337. * - Two
  338. * -- Two-SubA
  339. * --- Two-SubA-1
  340. * ---- Two-SubA-1-1
  341. * -- Two-SubB
  342. * -- Two-SubC
  343. * - Three
  344. * - Four
  345. * -- Four-SubA
  346. *
  347. * @return void
  348. */
  349. public function testGenerateWithAutoPathAndHideUnrelated() {
  350. $this->skipIf(true, 'FIXME');
  351. $data = [
  352. ['name' => 'Two-SubB', 'parent_id' => 2],
  353. ['name' => 'Two-SubC', 'parent_id' => 2],
  354. ];
  355. foreach ($data as $row) {
  356. $row = new Entity($row);
  357. $this->Table->save($row);
  358. }
  359. $tree = $this->Table->find('threaded')->toArray();
  360. $id = 6;
  361. $nodes = $this->Table->find('path', ['for' => $id]);
  362. $path = $nodes->extract('id')->toArray();
  363. $output = $this->Tree->generate($tree, ['autoPath' => [6, 11], 'hideUnrelated' => true, 'treePath' => $path, 'callback' => [$this, '_myCallback']]); // Two-SubA
  364. //debug($output);
  365. $expected = <<<TEXT
  366. <ul>
  367. <li>One</li>
  368. <li class="active">Two (active)
  369. <ul>
  370. <li class="active">Two-SubA (active)
  371. <ul>
  372. <li>Two-SubA-1</li>
  373. </ul>
  374. </li>
  375. <li>Two-SubB</li>
  376. <li>Two-SubC</li>
  377. </ul>
  378. </li>
  379. <li>Three</li>
  380. <li>Four</li>
  381. </ul>
  382. TEXT;
  383. $output = str_replace(["\t"], '', $output);
  384. $expected = str_replace(["\t"], '', $expected);
  385. $this->assertTextEquals($expected, $output);
  386. }
  387. /**
  388. * - One
  389. * -- One-SubA
  390. * - Two
  391. * -- Two-SubA
  392. * --- Two-SubA-1
  393. * ---- Two-SubA-1-1
  394. * -- Two-SubB
  395. * -- Two-SubC
  396. * - Three
  397. * - Four
  398. * -- Four-SubA
  399. *
  400. * @return void
  401. */
  402. public function testGenerateWithAutoPathAndHideUnrelatedAndSiblings() {
  403. $this->skipIf(true, 'FIXME');
  404. $data = [
  405. ['name' => 'Two-SubB', 'parent_id' => 2],
  406. ['name' => 'Two-SubC', 'parent_id' => 2],
  407. ];
  408. foreach ($data as $row) {
  409. $row = new Entity($row);
  410. $this->Table->save($row);
  411. }
  412. $tree = $this->Table->find('threaded')->toArray();
  413. $id = 6;
  414. $nodes = $this->Table->find('path', ['for' => $id]);
  415. $path = $nodes->extract('id')->toArray();
  416. $output = $this->Tree->generate($tree, [
  417. 'autoPath' => [6, 11], 'hideUnrelated' => true, 'treePath' => $path,
  418. 'callback' => [$this, '_myCallbackSiblings']]); // Two-SubA
  419. //debug($output);
  420. $expected = <<<TEXT
  421. <ul>
  422. <li>One (sibling)</li>
  423. <li class="active">Two (active)
  424. <ul>
  425. <li class="active">Two-SubA (active)
  426. <ul>
  427. <li>Two-SubA-1</li>
  428. </ul>
  429. </li>
  430. <li>Two-SubB</li>
  431. <li>Two-SubC</li>
  432. </ul>
  433. </li>
  434. <li>Three (sibling)</li>
  435. <li>Four (sibling)</li>
  436. </ul>
  437. TEXT;
  438. $output = str_replace(["\t", "\r", "\n"], '', $output);
  439. $expected = str_replace(["\t", "\r", "\n"], '', $expected);
  440. //debug($output);
  441. //debug($expected);
  442. $this->assertTextEquals($expected, $output);
  443. }
  444. public function _myCallback($data) {
  445. if (!empty($data['data']['hide'])) {
  446. return;
  447. }
  448. return $data['data']['name'] . ($data['activePathElement'] ? ' (active)' : '');
  449. }
  450. public function _myCallbackSiblings($data) {
  451. if (!empty($data['data']['hide'])) {
  452. return;
  453. }
  454. if ($data['depth'] == 0 && $data['isSibling']) {
  455. return $data['data']['name'] . ' (sibling)';
  456. }
  457. return $data['data']['name'] . ($data['activePathElement'] ? ' (active)' : '');
  458. }
  459. /**
  460. * TreeHelperTest::testGenerateProductive()
  461. *
  462. * @return void
  463. */
  464. public function testGenerateProductive() {
  465. $tree = $this->Table->find('threaded')->toArray();
  466. $output = $this->Tree->generate($tree, ['indent' => false]);
  467. $expected = '<ul><li>One<ul><li>One-SubA</li></ul></li><li>Two<ul><li>Two-SubA<ul><li>Two-SubA-1<ul><li>Two-SubA-1-1</li></ul></li></ul></li></ul></li><li>Three</li><li>Four<ul><li>Four-SubA</li></ul></li></ul>';
  468. $this->assertTextEquals($expected, $output);
  469. }
  470. }