pagev5.test.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. /* eslint-disable no-unused-vars */
  2. import { advanceTo } from 'jest-date-mock';
  3. import mongoose from 'mongoose';
  4. import { getInstance } from '../setup-crowi';
  5. describe('PageService page operations with only public pages', () => {
  6. let dummyUser1;
  7. let dummyUser2;
  8. let crowi;
  9. let Page;
  10. let Revision;
  11. let User;
  12. let Tag;
  13. let PageTagRelation;
  14. let Bookmark;
  15. let Comment;
  16. let ShareLink;
  17. let PageRedirect;
  18. let xssSpy;
  19. let rootPage;
  20. // parents
  21. let parentForRename1;
  22. let parentForRename2;
  23. let parentForRename3;
  24. let parentForRename4;
  25. let parentForRename5;
  26. let parentForRename6;
  27. // children
  28. let childForRename1;
  29. let childForRename2;
  30. let childForRename3;
  31. let childForRename4;
  32. let childForRename5;
  33. let childForRename6GrantRestricted;
  34. // Grandchild
  35. let grandchildForRename5;
  36. beforeAll(async() => {
  37. crowi = await getInstance();
  38. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', { 'app:isV5Compatible': true });
  39. User = mongoose.model('User');
  40. Page = mongoose.model('Page');
  41. Revision = mongoose.model('Revision');
  42. Tag = mongoose.model('Tag');
  43. PageTagRelation = mongoose.model('PageTagRelation');
  44. Bookmark = mongoose.model('Bookmark');
  45. Comment = mongoose.model('Comment');
  46. ShareLink = mongoose.model('ShareLink');
  47. PageRedirect = mongoose.model('PageRedirect');
  48. /*
  49. * Common
  50. */
  51. await User.insertMany([
  52. { name: 'dummyUser1', username: 'dummyUser1', email: 'dummyUser1@example.com' },
  53. { name: 'dummyUser2', username: 'dummyUser2', email: 'dummyUser2@example.com' },
  54. ]);
  55. dummyUser1 = await User.findOne({ username: 'dummyUser1' });
  56. dummyUser2 = await User.findOne({ username: 'dummyUser2' });
  57. xssSpy = jest.spyOn(crowi.xss, 'process').mockImplementation(path => path);
  58. /*
  59. * Rename
  60. */
  61. rootPage = await Page.create('/', 'body', dummyUser1._id, {});
  62. // Create Pages
  63. await Page.insertMany([
  64. // parents
  65. {
  66. path: '/v5_ParentForRename1',
  67. grant: Page.GRANT_PUBLIC,
  68. creator: dummyUser1,
  69. lastUpdateUser: dummyUser1._id,
  70. parent: rootPage._id,
  71. },
  72. {
  73. path: '/v5_ParentForRename2',
  74. grant: Page.GRANT_PUBLIC,
  75. creator: dummyUser1,
  76. lastUpdateUser: dummyUser1._id,
  77. parent: rootPage._id,
  78. isEmpty: true,
  79. },
  80. {
  81. path: '/v5_ParentForRename3',
  82. grant: Page.GRANT_PUBLIC,
  83. creator: dummyUser1,
  84. lastUpdateUser: dummyUser1._id,
  85. parent: rootPage._id,
  86. },
  87. {
  88. path: '/v5_ParentForRename4',
  89. grant: Page.GRANT_PUBLIC,
  90. creator: dummyUser1,
  91. lastUpdateUser: dummyUser1._id,
  92. parent: rootPage._id,
  93. },
  94. {
  95. path: '/v5_ParentForRename5',
  96. grant: Page.GRANT_PUBLIC,
  97. creator: dummyUser1,
  98. lastUpdateUser: dummyUser1._id,
  99. parent: rootPage._id,
  100. },
  101. {
  102. path: '/v5_ParentForRename6',
  103. grant: Page.GRANT_PUBLIC,
  104. creator: dummyUser1,
  105. lastUpdateUser: dummyUser1._id,
  106. parent: rootPage._id,
  107. },
  108. // children
  109. {
  110. path: '/v5_childForRename1',
  111. grant: Page.GRANT_PUBLIC,
  112. creator: dummyUser1,
  113. lastUpdateUser: dummyUser1._id,
  114. parent: rootPage._id,
  115. },
  116. {
  117. path: '/v5_childForRename2',
  118. grant: Page.GRANT_PUBLIC,
  119. creator: dummyUser1,
  120. lastUpdateUser: dummyUser1._id,
  121. parent: rootPage._id,
  122. },
  123. {
  124. path: '/v5_childForRename3',
  125. grant: Page.GRANT_PUBLIC,
  126. creator: dummyUser1,
  127. lastUpdateUser: dummyUser1._id,
  128. parent: rootPage._id,
  129. updatedAt: new Date('2021'),
  130. },
  131. {
  132. path: '/v5_childForRename4',
  133. grant: Page.GRANT_PUBLIC,
  134. creator: dummyUser1,
  135. lastUpdateUser: dummyUser1._id,
  136. parent: rootPage._id,
  137. },
  138. {
  139. path: '/v5_childForRename5',
  140. grant: Page.GRANT_PUBLIC,
  141. creator: dummyUser1,
  142. lastUpdateUser: dummyUser1._id,
  143. parent: rootPage._id,
  144. },
  145. {
  146. path: '/v5_childForRename6GrantRestricted',
  147. grant: Page.GRANT_RESTRICTED,
  148. creator: dummyUser1,
  149. lastUpdateUser: dummyUser1._id,
  150. parent: rootPage._id,
  151. },
  152. ]);
  153. // Find pages as Parent
  154. parentForRename1 = await Page.findOne({ path: '/v5_ParentForRename1' });
  155. parentForRename2 = await Page.findOne({ path: '/v5_ParentForRename2' });
  156. parentForRename3 = await Page.findOne({ path: '/v5_ParentForRename3' });
  157. parentForRename4 = await Page.findOne({ path: '/v5_ParentForRename4' });
  158. parentForRename5 = await Page.findOne({ path: '/v5_ParentForRename5' });
  159. parentForRename6 = await Page.findOne({ path: '/v5_ParentForRename6' });
  160. // Find pages as Child
  161. childForRename1 = await Page.findOne({ path: '/v5_childForRename1' });
  162. childForRename2 = await Page.findOne({ path: '/v5_childForRename2' });
  163. childForRename3 = await Page.findOne({ path: '/v5_childForRename3' });
  164. childForRename4 = await Page.findOne({ path: '/v5_childForRename4' });
  165. childForRename5 = await Page.findOne({ path: '/v5_childForRename5' });
  166. childForRename6GrantRestricted = await Page.findOne({ path: '/v5_childForRename6GrantRestricted' });
  167. // create grandchild
  168. await Page.insertMany([
  169. // Grandchild
  170. {
  171. path: '/v5_childForRename5/grandchildForRename5',
  172. grant: Page.GRANT_PUBLIC,
  173. creator: dummyUser1,
  174. lastUpdateUser: dummyUser1._id,
  175. parent: childForRename5._id,
  176. updatedAt: new Date('2021'),
  177. },
  178. ]);
  179. });
  180. const renamePage = async(page, newPagePath, user, options) => {
  181. // mock return value
  182. const mockedResumableRenameDescendants = jest.spyOn(crowi.pageService, 'resumableRenameDescendants').mockReturnValue(null);
  183. const mockedCreateAndSendNotifications = jest.spyOn(crowi.pageService, 'createAndSendNotifications').mockReturnValue(null);
  184. const renamedPage = await crowi.pageService.renamePage(page, newPagePath, user, options);
  185. // retrieve the arguments passed when calling method resumableRenameDescendants inside renamePage method
  186. const argsForCreateAndSendNotifications = mockedResumableRenameDescendants.mock.calls[0];
  187. // restores the original implementation
  188. mockedResumableRenameDescendants.mockRestore();
  189. mockedCreateAndSendNotifications.mockRestore();
  190. // rename descendants
  191. await crowi.pageService.resumableRenameDescendants(...argsForCreateAndSendNotifications);
  192. return renamedPage;
  193. };
  194. describe('Rename', () => {
  195. test('Should NOT rename top page', async() => {
  196. let isThrown = false;
  197. try {
  198. await crowi.pageService.renamePage(rootPage, '/new_root', dummyUser1, {});
  199. }
  200. catch (err) {
  201. isThrown = true;
  202. }
  203. expect(isThrown).toBe(true);
  204. });
  205. test('Should move to under non-empty page', async() => {
  206. // rename target page
  207. const newPath = '/v5_ParentForRename1/renamedChildForRename1';
  208. const renamedPage = await renamePage(childForRename1, newPath, dummyUser1, {});
  209. expect(renamedPage.path).toBe(newPath);
  210. expect(renamedPage.parent).toStrictEqual(parentForRename1._id);
  211. });
  212. test('Should move to under empty page', async() => {
  213. // rename target page
  214. const newPath = '/v5_ParentForRename2/renamedChildForRename2';
  215. const renamedPage = await renamePage(childForRename2, newPath, dummyUser1, {});
  216. expect(renamedPage.path).toBe(newPath);
  217. expect(parentForRename2.isEmpty).toBe(true);
  218. expect(renamedPage.parent).toStrictEqual(parentForRename2._id);
  219. });
  220. test('Should move with option updateMetadata: true', async() => {
  221. // rename target page
  222. const newPath = '/v5_ParentForRename3/renamedChildForRename3';
  223. const oldUdpateAt = childForRename3.updatedAt;
  224. const renamedPage = await renamePage(childForRename3, newPath, dummyUser2, { updateMetadata: true });
  225. expect(renamedPage.path).toBe(newPath);
  226. expect(renamedPage.parent).toStrictEqual(parentForRename3._id);
  227. expect(renamedPage.lastUpdateUser).toStrictEqual(dummyUser2._id);
  228. expect(renamedPage.updatedAt.getFullYear()).toBeGreaterThan(oldUdpateAt.getFullYear());
  229. });
  230. // ****************** TODO ******************
  231. // uncomment the next test when working on 88097
  232. // ******************************************
  233. // test('Should move with option createRedirectPage: true', async() => {
  234. // // rename target page
  235. // const newPath = '/v5_ParentForRename4/renamedChildForRename4';
  236. // const renamedPage = await renamePage(childForRename4, newPath, dummyUser2, { createRedirectPage: true });
  237. // const pageRedirect = await PageRedirect.find({ fromPath: childForRename4.path, toPath: renamedPage.path });
  238. // expect(renamedPage.path).toBe(newPath);
  239. // expect(renamedPage.parent).toStrictEqual(parentForRename4._id);
  240. // expect(pageRedirect.length).toBeGreaterThan(0);
  241. // });
  242. test('Should move descendants', async() => {
  243. // rename target page
  244. const newPath = '/v5_ParentForRename5/renamedChildForRename5';
  245. const renamedPage = await renamePage(childForRename5, newPath, dummyUser1, {});
  246. const grandchildren = await Page.find({ parent: renamedPage._id });
  247. const grandchild = grandchildren[0];
  248. expect(renamedPage.path).toBe(newPath);
  249. expect(renamedPage.parent).toStrictEqual(parentForRename5._id);
  250. expect(grandchild.parent).toStrictEqual(renamedPage._id);
  251. expect(grandchild.path).toBe('/v5_ParentForRename5/renamedChildForRename5/grandchildForRename5');
  252. });
  253. test('Should move with same grant', async() => {
  254. // rename target page
  255. const newPath = '/v5_ParentForRename6/renamedChildForRename6';
  256. expect(childForRename6GrantRestricted.grant).toBe(2);
  257. const renamedPage = await renamePage(childForRename6GrantRestricted, newPath, dummyUser1, {});
  258. expect(renamedPage.path).toBe(newPath);
  259. expect(renamedPage.parent).toStrictEqual(parentForRename6._id);
  260. expect(renamedPage.grant).toBe(2);
  261. });
  262. });
  263. });
  264. describe('PageService page operations with non-public pages', () => {
  265. // TODO: write test code
  266. });