page-node.spec.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. import type { IPageHasId } from '@growi/core';
  2. import { OptionParser } from '@growi/core/dist/remark-plugins';
  3. import { mock } from 'vitest-mock-extended';
  4. import type { PageNode } from '../../interfaces/page-node';
  5. import { generatePageNodeTree } from './page-node';
  6. function omitPageData(pageNode: PageNode): Omit<PageNode, 'page'> {
  7. // Destructure to omit 'page', and recursively process children
  8. const { page, children, ...rest } = pageNode;
  9. return {
  10. ...rest,
  11. children: children.map((child) => omitPageData(child)),
  12. };
  13. }
  14. describe('generatePageNodeTree()', () => {
  15. it("returns when the rootPagePath is '/'", () => {
  16. // setup
  17. const pages: IPageHasId[] = ['/', '/Sandbox'].map((path) =>
  18. mock<IPageHasId>({ path }),
  19. );
  20. // when
  21. const result = generatePageNodeTree('/', pages);
  22. const resultWithoutPageData = result.map((pageNode) =>
  23. omitPageData(pageNode),
  24. );
  25. // then
  26. expect(resultWithoutPageData).toStrictEqual([
  27. {
  28. pagePath: '/Sandbox',
  29. children: [],
  30. },
  31. ]);
  32. });
  33. it('returns when the pages are not empty', () => {
  34. // setup
  35. const pages: IPageHasId[] = [
  36. '/Sandbox',
  37. '/Sandbox/level2',
  38. '/Sandbox/level2/level3-1',
  39. '/Sandbox/level2/level3-2',
  40. '/Sandbox/level2/level3-3',
  41. ].map((path) => mock<IPageHasId>({ path }));
  42. // when
  43. const result = generatePageNodeTree('/Sandbox', pages);
  44. const resultWithoutPageData = result.map((pageNode) =>
  45. omitPageData(pageNode),
  46. );
  47. // then
  48. expect(resultWithoutPageData).toStrictEqual([
  49. {
  50. pagePath: '/Sandbox/level2',
  51. children: [
  52. {
  53. pagePath: '/Sandbox/level2/level3-1',
  54. children: [],
  55. },
  56. {
  57. pagePath: '/Sandbox/level2/level3-2',
  58. children: [],
  59. },
  60. {
  61. pagePath: '/Sandbox/level2/level3-3',
  62. children: [],
  63. },
  64. ],
  65. },
  66. ]);
  67. });
  68. it('returns when the pages include some empty pages', () => {
  69. // setup
  70. const pages: IPageHasId[] = [
  71. '/',
  72. '/user/foo',
  73. '/user/bar',
  74. '/user/bar/memo/2023/06/01',
  75. '/user/bar/memo/2023/06/02/memo-test',
  76. ].map((path) => mock<IPageHasId>({ path }));
  77. // when
  78. const result = generatePageNodeTree('/', pages);
  79. const resultWithoutPageData = result.map((pageNode) =>
  80. omitPageData(pageNode),
  81. );
  82. // then
  83. expect(resultWithoutPageData).toStrictEqual([
  84. {
  85. pagePath: '/user',
  86. children: [
  87. {
  88. pagePath: '/user/foo',
  89. children: [],
  90. },
  91. {
  92. pagePath: '/user/bar',
  93. children: [
  94. {
  95. pagePath: '/user/bar/memo',
  96. children: [
  97. {
  98. pagePath: '/user/bar/memo/2023',
  99. children: [
  100. {
  101. pagePath: '/user/bar/memo/2023/06',
  102. children: [
  103. {
  104. pagePath: '/user/bar/memo/2023/06/01',
  105. children: [],
  106. },
  107. {
  108. pagePath: '/user/bar/memo/2023/06/02',
  109. children: [
  110. {
  111. pagePath: '/user/bar/memo/2023/06/02/memo-test',
  112. children: [],
  113. },
  114. ],
  115. },
  116. ],
  117. },
  118. ],
  119. },
  120. ],
  121. },
  122. ],
  123. },
  124. ],
  125. },
  126. ]);
  127. });
  128. it("returns with 'depth=1:2'", () => {
  129. // setup
  130. const pages: IPageHasId[] = [
  131. '/Sandbox',
  132. '/Sandbox/level2-1',
  133. '/Sandbox/level2-2',
  134. '/user',
  135. '/user/foo',
  136. '/user/bar',
  137. ].map((path) => mock<IPageHasId>({ path }));
  138. // when
  139. const depthRange = OptionParser.parseRange('1:2');
  140. const result = generatePageNodeTree('/', pages, depthRange);
  141. const resultWithoutPageData = result.map((pageNode) =>
  142. omitPageData(pageNode),
  143. );
  144. // then
  145. expect(resultWithoutPageData).toStrictEqual([
  146. {
  147. pagePath: '/Sandbox',
  148. children: [
  149. {
  150. pagePath: '/Sandbox/level2-1',
  151. children: [],
  152. },
  153. {
  154. pagePath: '/Sandbox/level2-2',
  155. children: [],
  156. },
  157. ],
  158. },
  159. {
  160. pagePath: '/user',
  161. children: [
  162. {
  163. pagePath: '/user/foo',
  164. children: [],
  165. },
  166. {
  167. pagePath: '/user/bar',
  168. children: [],
  169. },
  170. ],
  171. },
  172. ]);
  173. });
  174. it("returns with 'depth=2:3'", () => {
  175. // setup
  176. const pages: IPageHasId[] = [
  177. '/foo/level2',
  178. '/foo/level2',
  179. '/foo/level2/level3-1',
  180. '/foo/level2/level3-2',
  181. ].map((path) => mock<IPageHasId>({ path }));
  182. // when
  183. const depthRange = OptionParser.parseRange('2:3');
  184. const result = generatePageNodeTree('/', pages, depthRange);
  185. const resultWithoutPageData = result.map((pageNode) =>
  186. omitPageData(pageNode),
  187. );
  188. // then
  189. expect(resultWithoutPageData).toStrictEqual([
  190. {
  191. pagePath: '/foo/level2',
  192. children: [
  193. {
  194. pagePath: '/foo/level2/level3-1',
  195. children: [],
  196. },
  197. {
  198. pagePath: '/foo/level2/level3-2',
  199. children: [],
  200. },
  201. ],
  202. },
  203. ]);
  204. });
  205. });