TreeHelperTest.php 9.4 KB

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