v5.page.test.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. import mongoose from 'mongoose';
  2. import { getInstance } from '../setup-crowi';
  3. describe('Page', () => {
  4. let crowi;
  5. let Page;
  6. let Revision;
  7. let User;
  8. let Tag;
  9. let PageTagRelation;
  10. let Bookmark;
  11. let Comment;
  12. let ShareLink;
  13. let PageRedirect;
  14. let xssSpy;
  15. let rootPage;
  16. let dummyUser1;
  17. beforeAll(async() => {
  18. crowi = await getInstance();
  19. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', { 'app:isV5Compatible': true });
  20. jest.restoreAllMocks();
  21. User = mongoose.model('User');
  22. Page = mongoose.model('Page');
  23. Revision = mongoose.model('Revision');
  24. Tag = mongoose.model('Tag');
  25. PageTagRelation = mongoose.model('PageTagRelation');
  26. Bookmark = mongoose.model('Bookmark');
  27. Comment = mongoose.model('Comment');
  28. ShareLink = mongoose.model('ShareLink');
  29. PageRedirect = mongoose.model('PageRedirect');
  30. dummyUser1 = await User.findOne({ username: 'v5DummyUser1' });
  31. rootPage = await Page.findOne({ path: '/' });
  32. const pageIdCreate1 = new mongoose.Types.ObjectId();
  33. const pageIdCreate2 = new mongoose.Types.ObjectId();
  34. const pageIdCreate3 = new mongoose.Types.ObjectId();
  35. const pageIdCreate4 = new mongoose.Types.ObjectId();
  36. /**
  37. * create
  38. * mc_ => model create
  39. * emp => empty => page with isEmpty: true
  40. * pub => public => GRANT_PUBLIC
  41. */
  42. await Page.insertMany([
  43. {
  44. _id: pageIdCreate1,
  45. path: '/v5_empty_create_4',
  46. grant: Page.GRANT_PUBLIC,
  47. parent: rootPage._id,
  48. isEmpty: true,
  49. },
  50. {
  51. path: '/v5_empty_create_4/v5_create_5',
  52. grant: Page.GRANT_PUBLIC,
  53. creator: dummyUser1,
  54. lastUpdateUser: dummyUser1._id,
  55. parent: pageIdCreate1,
  56. isEmpty: false,
  57. },
  58. {
  59. _id: pageIdCreate2,
  60. path: '/mc4_top/mc1_emp',
  61. grant: Page.GRANT_PUBLIC,
  62. creator: dummyUser1,
  63. lastUpdateUser: dummyUser1._id,
  64. parent: rootPage._id,
  65. isEmpty: true,
  66. },
  67. {
  68. path: '/mc4_top/mc1_emp/mc2_pub',
  69. grant: Page.GRANT_PUBLIC,
  70. creator: dummyUser1,
  71. lastUpdateUser: dummyUser1._id,
  72. parent: pageIdCreate2,
  73. isEmpty: false,
  74. },
  75. {
  76. path: '/mc5_top/mc3_awl',
  77. grant: Page.GRANT_RESTRICTED,
  78. creator: dummyUser1,
  79. lastUpdateUser: dummyUser1._id,
  80. isEmpty: false,
  81. },
  82. {
  83. _id: pageIdCreate3,
  84. path: '/mc4_top',
  85. grant: Page.GRANT_PUBLIC,
  86. creator: dummyUser1,
  87. lastUpdateUser: dummyUser1._id,
  88. isEmpty: false,
  89. parent: rootPage._id,
  90. descendantCount: 1,
  91. },
  92. {
  93. _id: pageIdCreate4,
  94. path: '/mc5_top',
  95. grant: Page.GRANT_PUBLIC,
  96. creator: dummyUser1,
  97. lastUpdateUser: dummyUser1._id,
  98. isEmpty: false,
  99. parent: rootPage._id,
  100. descendantCount: 0,
  101. },
  102. ]);
  103. /**
  104. * update
  105. * mup_ => model update
  106. * emp => empty => page with isEmpty: true
  107. * pub => public => GRANT_PUBLIC
  108. * awl => Anyone with the link => GRANT_RESTRICTED
  109. */
  110. const pageIdUpd1 = new mongoose.Types.ObjectId();
  111. const pageIdUpd2 = new mongoose.Types.ObjectId();
  112. const pageIdUpd3 = new mongoose.Types.ObjectId();
  113. const pageIdUpd4 = new mongoose.Types.ObjectId();
  114. const pageIdUpd5 = new mongoose.Types.ObjectId();
  115. const pageIdUpd6 = new mongoose.Types.ObjectId();
  116. const pageIdUpd7 = new mongoose.Types.ObjectId();
  117. const pageIdUpd8 = new mongoose.Types.ObjectId();
  118. const pageIdUpd9 = new mongoose.Types.ObjectId();
  119. const pageIdUpd10 = new mongoose.Types.ObjectId();
  120. const pageIdUpd11 = new mongoose.Types.ObjectId();
  121. const pageIdUpd12 = new mongoose.Types.ObjectId();
  122. await Page.insertMany([
  123. {
  124. _id: pageIdUpd1,
  125. path: '/mup13_top/mup1_emp',
  126. grant: Page.GRANT_PUBLIC,
  127. parent: pageIdUpd8._id,
  128. isEmpty: true,
  129. },
  130. {
  131. _id: pageIdUpd2,
  132. path: '/mup13_top/mup1_emp/mup2_pub',
  133. grant: Page.GRANT_PUBLIC,
  134. parent: pageIdUpd1._id,
  135. creator: dummyUser1,
  136. lastUpdateUser: dummyUser1._id,
  137. isEmpty: false,
  138. },
  139. {
  140. _id: pageIdUpd3,
  141. path: '/mup14_top/mup6_pub',
  142. grant: Page.GRANT_PUBLIC,
  143. creator: dummyUser1,
  144. lastUpdateUser: dummyUser1._id,
  145. parent: pageIdUpd9,
  146. isEmpty: false,
  147. descendantCount: 1,
  148. },
  149. {
  150. path: '/mup14_top/mup6_pub/mup7_pub',
  151. grant: Page.GRANT_PUBLIC,
  152. creator: dummyUser1,
  153. lastUpdateUser: dummyUser1._id,
  154. parent: pageIdUpd3,
  155. isEmpty: false,
  156. descendantCount: 0,
  157. },
  158. {
  159. _id: pageIdUpd4,
  160. path: '/mup15_top/mup8_pub',
  161. grant: Page.GRANT_PUBLIC,
  162. creator: dummyUser1,
  163. lastUpdateUser: dummyUser1._id,
  164. parent: pageIdUpd10._id,
  165. isEmpty: false,
  166. },
  167. {
  168. _id: pageIdUpd5,
  169. path: '/mup16_top/mup9_pub/mup10_pub/mup11_awl',
  170. grant: Page.GRANT_RESTRICTED,
  171. creator: dummyUser1,
  172. lastUpdateUser: dummyUser1._id,
  173. isEmpty: false,
  174. },
  175. {
  176. _id: pageIdUpd6,
  177. path: '/mup17_top/mup12_emp',
  178. isEmpty: true,
  179. parent: pageIdUpd12._id,
  180. descendantCount: 1,
  181. },
  182. {
  183. _id: pageIdUpd7,
  184. path: '/mup17_top/mup12_emp',
  185. grant: Page.GRANT_RESTRICTED,
  186. creator: dummyUser1,
  187. lastUpdateUser: dummyUser1._id,
  188. isEmpty: false,
  189. },
  190. {
  191. path: '/mup17_top/mup12_emp/mup18_pub',
  192. isEmpty: false,
  193. creator: dummyUser1,
  194. lastUpdateUser: dummyUser1._id,
  195. parent: pageIdUpd6._id,
  196. },
  197. {
  198. _id: pageIdUpd8,
  199. path: '/mup13_top',
  200. grant: Page.GRANT_PUBLIC,
  201. creator: dummyUser1,
  202. lastUpdateUser: dummyUser1._id,
  203. isEmpty: false,
  204. parent: rootPage._id,
  205. descendantCount: 2,
  206. },
  207. {
  208. _id: pageIdUpd9,
  209. path: '/mup14_top',
  210. grant: Page.GRANT_PUBLIC,
  211. creator: dummyUser1,
  212. lastUpdateUser: dummyUser1._id,
  213. isEmpty: false,
  214. parent: rootPage._id,
  215. descendantCount: 2,
  216. },
  217. {
  218. _id: pageIdUpd10,
  219. path: '/mup15_top',
  220. grant: Page.GRANT_PUBLIC,
  221. creator: dummyUser1,
  222. lastUpdateUser: dummyUser1._id,
  223. isEmpty: false,
  224. parent: rootPage._id,
  225. descendantCount: 1,
  226. },
  227. {
  228. _id: pageIdUpd11,
  229. path: '/mup16_top',
  230. grant: Page.GRANT_PUBLIC,
  231. creator: dummyUser1,
  232. lastUpdateUser: dummyUser1._id,
  233. isEmpty: false,
  234. parent: rootPage._id,
  235. descendantCount: 0,
  236. },
  237. {
  238. _id: pageIdUpd12,
  239. path: '/mup17_top',
  240. grant: Page.GRANT_PUBLIC,
  241. creator: dummyUser1,
  242. lastUpdateUser: dummyUser1._id,
  243. isEmpty: false,
  244. parent: rootPage._id,
  245. descendantCount: 1,
  246. },
  247. ]);
  248. /**
  249. * getParentAndFillAncestors
  250. */
  251. const pageIdPAF1 = new mongoose.Types.ObjectId();
  252. const pageIdPAF2 = new mongoose.Types.ObjectId();
  253. await Page.insertMany([
  254. {
  255. _id: pageIdPAF1,
  256. path: '/PAF1',
  257. grant: Page.GRANT_PUBLIC,
  258. creator: dummyUser1,
  259. lastUpdateUser: dummyUser1._id,
  260. isEmpty: false,
  261. parent: rootPage._id,
  262. descendantCount: 0,
  263. },
  264. {
  265. path: '/emp_anc1/emp_anc2/PAF2',
  266. grant: Page.GRANT_PUBLIC,
  267. creator: dummyUser1,
  268. lastUpdateUser: dummyUser1._id,
  269. isEmpty: false,
  270. descendantCount: 0,
  271. },
  272. {
  273. _id: pageIdPAF2,
  274. path: '/emp_anc3',
  275. grant: Page.GRANT_PUBLIC,
  276. isEmpty: true,
  277. descendantCount: 1,
  278. parent: rootPage._id,
  279. },
  280. {
  281. path: '/emp_anc3/PAF3',
  282. grant: Page.GRANT_PUBLIC,
  283. creator: dummyUser1,
  284. lastUpdateUser: dummyUser1._id,
  285. isEmpty: false,
  286. descendantCount: 0,
  287. parent: pageIdPAF2,
  288. },
  289. ]);
  290. });
  291. describe('create', () => {
  292. test('Should create single page', async() => {
  293. const page = await Page.create('/v5_create1', 'create1', dummyUser1, {});
  294. expect(page).toBeTruthy();
  295. expect(page.parent).toStrictEqual(rootPage._id);
  296. });
  297. test('Should create empty-child and non-empty grandchild', async() => {
  298. const grandchildPage = await Page.create('/v5_empty_create2/v5_create_3', 'grandchild', dummyUser1, {});
  299. const childPage = await Page.findOne({ path: '/v5_empty_create2' });
  300. expect(childPage.isEmpty).toBe(true);
  301. expect(grandchildPage).toBeTruthy();
  302. expect(childPage).toBeTruthy();
  303. expect(childPage.parent).toStrictEqual(rootPage._id);
  304. expect(grandchildPage.parent).toStrictEqual(childPage._id);
  305. });
  306. test('Should create on empty page', async() => {
  307. const beforeCreatePage = await Page.findOne({ path: '/v5_empty_create_4' });
  308. expect(beforeCreatePage.isEmpty).toBe(true);
  309. const childPage = await Page.create('/v5_empty_create_4', 'body', dummyUser1, {});
  310. const grandchildPage = await Page.findOne({ parent: childPage._id });
  311. expect(childPage).toBeTruthy();
  312. expect(childPage.isEmpty).toBe(false);
  313. expect(childPage.revision.body).toBe('body');
  314. expect(grandchildPage).toBeTruthy();
  315. expect(childPage.parent).toStrictEqual(rootPage._id);
  316. expect(grandchildPage.parent).toStrictEqual(childPage._id);
  317. });
  318. describe('Creating a page using existing path', () => {
  319. test('with grant RESTRICTED should only create the page and change nothing else', async() => {
  320. const pathT = '/mc4_top';
  321. const path1 = '/mc4_top/mc1_emp';
  322. const path2 = '/mc4_top/mc1_emp/mc2_pub';
  323. const pageT = await Page.findOne({ path: pathT, descendantCount: 1 });
  324. const page1 = await Page.findOne({ path: path1, grant: Page.GRANT_PUBLIC });
  325. const page2 = await Page.findOne({ path: path2 });
  326. const page3 = await Page.findOne({ path: path1, grant: Page.GRANT_RESTRICTED });
  327. expect(pageT).toBeTruthy();
  328. expect(page1).toBeTruthy();
  329. expect(page2).toBeTruthy();
  330. expect(page3).toBeNull();
  331. // use existing path
  332. await Page.create(path1, 'new body', dummyUser1, { grant: Page.GRANT_RESTRICTED });
  333. const _pageT = await Page.findOne({ path: pathT });
  334. const _page1 = await Page.findOne({ path: path1, grant: Page.GRANT_PUBLIC });
  335. const _page2 = await Page.findOne({ path: path2 });
  336. const _page3 = await Page.findOne({ path: path1, grant: Page.GRANT_RESTRICTED });
  337. expect(_pageT).toBeTruthy();
  338. expect(_page1).toBeTruthy();
  339. expect(_page2).toBeTruthy();
  340. expect(_page3).toBeTruthy();
  341. expect(_pageT.descendantCount).toBe(1);
  342. });
  343. });
  344. describe('Creating a page under a page with grant RESTRICTED', () => {
  345. test('will create a new empty page with the same path as the grant RESTRECTED page and become a parent', async() => {
  346. const pathT = '/mc5_top';
  347. const path1 = '/mc5_top/mc3_awl';
  348. const pathN = '/mc5_top/mc3_awl/mc4_pub'; // used to create
  349. const pageT = await Page.findOne({ path: pathT });
  350. const page1 = await Page.findOne({ path: path1, grant: Page.GRANT_RESTRICTED });
  351. const page2 = await Page.findOne({ path: path1, grant: Page.GRANT_PUBLIC });
  352. expect(pageT).toBeTruthy();
  353. expect(page1).toBeTruthy();
  354. expect(page2).toBeNull();
  355. await Page.create(pathN, 'new body', dummyUser1, { grant: Page.GRANT_PUBLIC });
  356. const _pageT = await Page.findOne({ path: pathT });
  357. const _page1 = await Page.findOne({ path: path1, grant: Page.GRANT_RESTRICTED });
  358. const _page2 = await Page.findOne({ path: path1, grant: Page.GRANT_PUBLIC, isEmpty: true });
  359. const _pageN = await Page.findOne({ path: pathN, grant: Page.GRANT_PUBLIC }); // newly crated
  360. expect(_pageT).toBeTruthy();
  361. expect(_page1).toBeTruthy();
  362. expect(_page2).toBeTruthy();
  363. expect(_pageN).toBeTruthy();
  364. expect(_pageN.parent).toStrictEqual(_page2._id);
  365. expect(_pageT.descendantCount).toStrictEqual(1);
  366. });
  367. });
  368. });
  369. describe('update', () => {
  370. describe('Changing grant from PUBLIC to RESTRICTED of', () => {
  371. test('an only-child page will delete its empty parent page', async() => {
  372. const pathT = '/mup13_top';
  373. const path1 = '/mup13_top/mup1_emp';
  374. const path2 = '/mup13_top/mup1_emp/mup2_pub';
  375. const pageT = await Page.findOne({ path: pathT, descendantCount: 2 });
  376. const page1 = await Page.findOne({ path: path1, isEmpty: true });
  377. const page2 = await Page.findOne({ path: path2, grant: Page.GRANT_PUBLIC });
  378. expect(pageT).toBeTruthy();
  379. expect(page1).toBeTruthy();
  380. expect(page2).toBeTruthy();
  381. const options = { grant: Page.GRANT_RESTRICTED, grantUserGroupId: null };
  382. await Page.updatePage(page2, 'newRevisionBody', 'oldRevisionBody', dummyUser1, options);
  383. const _pageT = await Page.findOne({ path: pathT });
  384. const _page1 = await Page.findOne({ path: path1 });
  385. const _page2 = await Page.findOne({ path: path2, grant: Page.GRANT_RESTRICTED });
  386. expect(_pageT).toBeTruthy();
  387. expect(_page1).toBeNull();
  388. expect(_page2).toBeTruthy();
  389. expect(_pageT.descendantCount).toBe(1);
  390. });
  391. test('a page that has children will create an empty page with the same path and it becomes a new parent', async() => {
  392. const pathT = '/mup14_top';
  393. const path1 = '/mup14_top/mup6_pub';
  394. const path2 = '/mup14_top/mup6_pub/mup7_pub';
  395. const top = await Page.findOne({ path: pathT, descendantCount: 2 });
  396. const page1 = await Page.findOne({ path: path1, grant: Page.GRANT_PUBLIC });
  397. const page2 = await Page.findOne({ path: path2, grant: Page.GRANT_PUBLIC });
  398. expect(top).toBeTruthy();
  399. expect(page1).toBeTruthy();
  400. expect(page2).toBeTruthy();
  401. await Page.updatePage(page1, 'newRevisionBody', 'oldRevisionBody', dummyUser1, { grant: Page.GRANT_RESTRICTED });
  402. const _top = await Page.findOne({ path: pathT });
  403. const _page1 = await Page.findOne({ path: path1, grant: Page.GRANT_RESTRICTED });
  404. const _page2 = await Page.findOne({ path: path2 });
  405. const _pageN = await Page.findOne({ path: path1, grant: Page.GRANT_PUBLIC });
  406. expect(_page1).toBeTruthy();
  407. expect(_page2).toBeTruthy();
  408. expect(_pageN).toBeTruthy();
  409. expect(_page1.parent).toBeNull();
  410. expect(_page2.parent).toStrictEqual(_pageN._id);
  411. expect(_pageN.parent).toStrictEqual(top._id);
  412. expect(_pageN.isEmpty).toBe(true);
  413. expect(_pageN.descendantCount).toBe(1);
  414. expect(_top.descendantCount).toBe(1);
  415. });
  416. test('of a leaf page will NOT have an empty page with the same path', async() => {
  417. const pathT = '/mup15_top';
  418. const path1 = '/mup15_top/mup8_pub';
  419. const pageT = await Page.findOne({ path: pathT, descendantCount: 1 });
  420. const page1 = await Page.findOne({ path: path1, grant: Page.GRANT_PUBLIC });
  421. const count = await Page.count({ path: path1 });
  422. expect(pageT).toBeTruthy();
  423. expect(page1).toBeTruthy();
  424. expect(count).toBe(1);
  425. await Page.updatePage(page1, 'newRevisionBody', 'oldRevisionBody', dummyUser1, { grant: Page.GRANT_RESTRICTED });
  426. const _pageT = await Page.findOne({ path: pathT });
  427. const _page1 = await Page.findOne({ path: path1, grant: Page.GRANT_RESTRICTED });
  428. const _pageNotExist = await Page.findOne({ path: path1, isEmpty: true });
  429. expect(_pageT).toBeTruthy();
  430. expect(_page1).toBeTruthy();
  431. expect(_pageNotExist).toBeNull();
  432. expect(_pageT.descendantCount).toBe(0);
  433. });
  434. });
  435. describe('Changing grant from RESTRICTED to PUBLIC of', () => {
  436. test('a page will create ancestors if they do not exist', async() => {
  437. const pathT = '/mup16_top';
  438. const path1 = '/mup16_top/mup9_pub';
  439. const path2 = '/mup16_top/mup9_pub/mup10_pub';
  440. const path3 = '/mup16_top/mup9_pub/mup10_pub/mup11_awl';
  441. const top = await Page.findOne({ path: pathT });
  442. const page1 = await Page.findOne({ path: path1 });
  443. const page2 = await Page.findOne({ path: path2 });
  444. const page3 = await Page.findOne({ path: path3, grant: Page.GRANT_RESTRICTED });
  445. expect(top).toBeTruthy();
  446. expect(page3).toBeTruthy();
  447. expect(page1).toBeNull();
  448. expect(page2).toBeNull();
  449. await Page.updatePage(page3, 'newRevisionBody', 'oldRevisionBody', dummyUser1, { grant: Page.GRANT_PUBLIC });
  450. const _pageT = await Page.findOne({ path: pathT });
  451. const _page1 = await Page.findOne({ path: path1, isEmpty: true });
  452. const _page2 = await Page.findOne({ path: path2, isEmpty: true });
  453. const _page3 = await Page.findOne({ path: path3, grant: Page.GRANT_PUBLIC });
  454. expect(_page1).toBeTruthy();
  455. expect(_page2).toBeTruthy();
  456. expect(_page3).toBeTruthy();
  457. expect(_page1.parent).toStrictEqual(top._id);
  458. expect(_page2.parent).toStrictEqual(_page1._id);
  459. expect(_page3.parent).toStrictEqual(_page2._id);
  460. expect(_pageT.descendantCount).toBe(1);
  461. });
  462. test('a page will replace an empty page with the same path if any', async() => {
  463. const pathT = '/mup17_top';
  464. const path1 = '/mup17_top/mup12_emp';
  465. const path2 = '/mup17_top/mup12_emp/mup18_pub';
  466. const pageT = await Page.findOne({ path: pathT, descendantCount: 1 });
  467. const page1 = await Page.findOne({ path: path1, isEmpty: true });
  468. const page2 = await Page.findOne({ path: path1, grant: Page.GRANT_RESTRICTED, isEmpty: false });
  469. const page3 = await Page.findOne({ path: path2 });
  470. expect(pageT).toBeTruthy();
  471. expect(page1).toBeTruthy();
  472. expect(page2).toBeTruthy();
  473. expect(page3).toBeTruthy();
  474. await Page.updatePage(page2, 'newRevisionBody', 'oldRevisionBody', dummyUser1, { grant: Page.GRANT_PUBLIC });
  475. const _pageT = await Page.findOne({ path: pathT });
  476. const _page1 = await Page.findOne({ path: path1, isEmpty: true }); // should be replaced
  477. const _page2 = await Page.findOne({ path: path1, grant: Page.GRANT_PUBLIC });
  478. const _page3 = await Page.findOne({ path: path2 });
  479. expect(_pageT).toBeTruthy();
  480. expect(_page1).toBeNull();
  481. expect(_page2).toBeTruthy();
  482. expect(_page3).toBeTruthy();
  483. expect(_page2.grant).toBe(Page.GRANT_PUBLIC);
  484. expect(_page2.parent).toStrictEqual(_pageT._id);
  485. expect(_page3.parent).toStrictEqual(_page2._id);
  486. expect(_pageT.descendantCount).toBe(2);
  487. });
  488. });
  489. });
  490. describe('getParentAndFillAncestors', () => {
  491. test('return parent if exist', async() => {
  492. const page1 = await Page.findOne({ path: '/PAF1' });
  493. const parent = await Page.getParentAndFillAncestors(page1.path, dummyUser1);
  494. expect(parent).toBeTruthy();
  495. expect(page1.parent).toStrictEqual(parent._id);
  496. });
  497. test('create parent and ancestors when they do not exsit, and return the new parent', async() => {
  498. const path1 = '/emp_anc1';
  499. const path2 = '/emp_anc1/emp_anc2';
  500. const path3 = '/emp_anc1/emp_anc2/PAF2';
  501. const _page1 = await Page.findOne({ path: path1 }); // not exist
  502. const _page2 = await Page.findOne({ path: path2 }); // not exist
  503. const _page3 = await Page.findOne({ path: path3 }); // exist
  504. expect(_page1).toBeNull();
  505. expect(_page2).toBeNull();
  506. expect(_page3).toBeTruthy();
  507. const parent = await Page.getParentAndFillAncestors(_page3.path, dummyUser1);
  508. const page1 = await Page.findOne({ path: path1 });
  509. const page2 = await Page.findOne({ path: path2 });
  510. const page3 = await Page.findOne({ path: path3 });
  511. expect(parent._id).toStrictEqual(page2._id);
  512. expect(parent.path).toStrictEqual(page2.path);
  513. expect(parent.parent).toStrictEqual(page2.parent);
  514. expect(parent).toBeTruthy();
  515. expect(page1).toBeTruthy();
  516. expect(page2).toBeTruthy();
  517. expect(page3).toBeTruthy();
  518. expect(page1.parent).toStrictEqual(rootPage._id);
  519. expect(page2.parent).toStrictEqual(page1._id);
  520. expect(page3.parent).toBeNull(); // no parent is set as this method only returns parent page
  521. });
  522. test('return parent even if the parent page is empty', async() => {
  523. const path1 = '/emp_anc3';
  524. const path2 = '/emp_anc3/PAF3';
  525. const _page1 = await Page.findOne({ path: path1, isEmpty: true });
  526. const _page2 = await Page.findOne({ path: path2, isEmpty: false });
  527. expect(_page1).toBeTruthy();
  528. expect(_page2).toBeTruthy();
  529. const parent = await Page.getParentAndFillAncestors(_page2.path, dummyUser1);
  530. const page1 = await Page.findOne({ path: path1, isEmpty: true }); // parent
  531. const page2 = await Page.findOne({ path: path2, isEmpty: false });
  532. // check for the parent (should be the same as page1)
  533. expect(parent._id).toStrictEqual(page1._id);
  534. expect(parent.path).toStrictEqual(page1.path);
  535. expect(parent.parent).toStrictEqual(page1.parent);
  536. expect(page1.parent).toStrictEqual(rootPage._id);
  537. expect(page2.parent).toStrictEqual(page1._id);
  538. });
  539. });
  540. });