v5.page.test.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. // pass unless the data is one of [false, 0, '', null, undefined, NaN]
  18. const expectAllToBeTruthy = (dataList) => {
  19. dataList.forEach((data, i) => {
  20. if (data == null) { console.log(`index: ${i}`) }
  21. expect(data).toBeTruthy();
  22. });
  23. };
  24. beforeAll(async() => {
  25. crowi = await getInstance();
  26. await crowi.configManager.updateConfigsInTheSameNamespace('crowi', { 'app:isV5Compatible': true });
  27. jest.restoreAllMocks();
  28. User = mongoose.model('User');
  29. Page = mongoose.model('Page');
  30. Revision = mongoose.model('Revision');
  31. Tag = mongoose.model('Tag');
  32. PageTagRelation = mongoose.model('PageTagRelation');
  33. Bookmark = mongoose.model('Bookmark');
  34. Comment = mongoose.model('Comment');
  35. ShareLink = mongoose.model('ShareLink');
  36. PageRedirect = mongoose.model('PageRedirect');
  37. dummyUser1 = await User.findOne({ username: 'v5DummyUser1' });
  38. rootPage = await Page.findOne({ path: '/' });
  39. const createPageId1 = new mongoose.Types.ObjectId();
  40. await Page.insertMany([
  41. {
  42. _id: createPageId1,
  43. path: '/v5_empty_create_4',
  44. grant: Page.GRANT_PUBLIC,
  45. parent: rootPage._id,
  46. isEmpty: true,
  47. },
  48. {
  49. path: '/v5_empty_create_4/v5_create_5',
  50. grant: Page.GRANT_PUBLIC,
  51. creator: dummyUser1,
  52. lastUpdateUser: dummyUser1._id,
  53. parent: createPageId1,
  54. },
  55. ]);
  56. /**
  57. * update
  58. * mup_ => model update
  59. */
  60. const pageIdUpd1 = new mongoose.Types.ObjectId();
  61. const pageIdUpd2 = new mongoose.Types.ObjectId();
  62. const pageIdUpd3 = new mongoose.Types.ObjectId();
  63. const revisionIdUpd2 = new mongoose.Types.ObjectId();
  64. await Page.insertMany([
  65. {
  66. _id: pageIdUpd1,
  67. path: '/mup1_empty',
  68. grant: Page.GRANT_PUBLIC,
  69. parent: rootPage._id,
  70. isEmpty: true,
  71. },
  72. {
  73. _id: pageIdUpd2,
  74. path: '/mup1_empty/mup2_public',
  75. grant: Page.GRANT_PUBLIC,
  76. parent: pageIdUpd1._id,
  77. creator: dummyUser1,
  78. lastUpdateUser: dummyUser1._id,
  79. revision: revisionIdUpd2,
  80. isEmpty: false,
  81. },
  82. {
  83. _id: pageIdUpd3,
  84. path: '/mup3_empty/mup4_empty/mup5_link',
  85. grant: Page.GRANT_RESTRICTED,
  86. isEmpty: true,
  87. },
  88. ]);
  89. await Revision.insertMany([
  90. {
  91. _id: revisionIdUpd2,
  92. pageId: pageIdUpd2,
  93. format: 'markdown',
  94. body: '/mup1_empty/mup2_public',
  95. },
  96. ]);
  97. });
  98. describe('create', () => {
  99. test('Should create single page', async() => {
  100. const page = await Page.create('/v5_create1', 'create1', dummyUser1, {});
  101. expect(page).toBeTruthy();
  102. expect(page.parent).toStrictEqual(rootPage._id);
  103. });
  104. test('Should create empty-child and non-empty grandchild', async() => {
  105. const grandchildPage = await Page.create('/v5_empty_create2/v5_create_3', 'grandchild', dummyUser1, {});
  106. const childPage = await Page.findOne({ path: '/v5_empty_create2' });
  107. expect(childPage.isEmpty).toBe(true);
  108. expect(grandchildPage).toBeTruthy();
  109. expect(childPage).toBeTruthy();
  110. expect(childPage.parent).toStrictEqual(rootPage._id);
  111. expect(grandchildPage.parent).toStrictEqual(childPage._id);
  112. });
  113. test('Should create on empty page', async() => {
  114. const beforeCreatePage = await Page.findOne({ path: '/v5_empty_create_4' });
  115. expect(beforeCreatePage.isEmpty).toBe(true);
  116. const childPage = await Page.create('/v5_empty_create_4', 'body', dummyUser1, {});
  117. const grandchildPage = await Page.findOne({ parent: childPage._id });
  118. expect(childPage).toBeTruthy();
  119. expect(childPage.isEmpty).toBe(false);
  120. expect(childPage.revision.body).toBe('body');
  121. expect(grandchildPage).toBeTruthy();
  122. expect(childPage.parent).toStrictEqual(rootPage._id);
  123. expect(grandchildPage.parent).toStrictEqual(childPage._id);
  124. });
  125. });
  126. describe('update', () => {
  127. describe('change grant', () => {
  128. test('Changing grant from PUBLIC to RESTRICTED of an only-child page will delete its empty parent page', async() => {
  129. const page1 = await Page.findOne({ path: '/mup1_empty', isEmpty: true });
  130. const page2 = await Page.findOne({ path: '/mup1_empty/mup2_public' }).populate({ path: 'revision', model: 'Revision' });
  131. const revision = page2.revision;
  132. const newBody = 'newBody';
  133. const options = { isSyncRevisionToHackmd: false, grant: 2, grantUserGroupId: null };
  134. expectAllToBeTruthy([page1, page2, revision]);
  135. await Page.updatePage(page2, newBody, revision.body, dummyUser1, options);
  136. // AU => After Update
  137. const page1AU = await Page.findOne({ path: '/mup1_empty', isEmpty: true });
  138. const page2AU = await Page.findOne({ path: '/mup1_empty/mup2_public' }).populate({ path: 'revision', model: 'Revision' });
  139. expect(page2AU).toBeTruthy();
  140. expect(page1AU).toBeNull();
  141. });
  142. test('Changing grant from RESTRICTED to PUBLIC of a page with no ancestors will create ancestors with isEmpty: true', async() => {
  143. });
  144. });
  145. });
  146. });