| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778 |
- import type { IPage } from '@growi/core';
- import { addSeconds } from 'date-fns/addSeconds';
- import mongoose from 'mongoose';
- import {
- PageActionStage,
- PageActionType,
- } from '../../../src/interfaces/page-operation';
- import type Crowi from '../../../src/server/crowi';
- import type { PageDocument, PageModel } from '../../../src/server/models/page';
- import type {
- IPageOperation,
- PageOperationModel,
- } from '../../../src/server/models/page-operation';
- import { getInstance } from '../setup-crowi';
- describe('Test page service methods', () => {
- let crowi: Crowi;
- let Page: PageModel;
- // biome-ignore lint/suspicious/noImplicitAnyLet: ignore
- let User;
- let PageOperation: PageOperationModel;
- let rootPage: PageDocument;
- // biome-ignore lint/suspicious/noImplicitAnyLet: ignore
- let dummyUser1;
- let pageOpId1: mongoose.Types.ObjectId;
- let pageOpId2: mongoose.Types.ObjectId;
- let pageOpId3: mongoose.Types.ObjectId;
- let pageOpId4: mongoose.Types.ObjectId;
- beforeAll(async () => {
- crowi = await getInstance();
- await crowi.configManager.updateConfig('app:isV5Compatible', true);
- User = mongoose.model('User');
- Page = mongoose.model<IPage, PageModel>('Page');
- PageOperation = mongoose.model<IPageOperation, PageOperationModel>(
- 'PageOperation',
- );
- /*
- * Common
- */
- // ***********************************************************************************************************
- // * Do NOT change properties of globally used documents. Otherwise, it might cause some errors in other tests
- // ***********************************************************************************************************
- // users
- dummyUser1 = await User.findOne({ username: 'v5DummyUser1' });
- // page
- rootPage = (await Page.findOne({ path: '/' }))!;
- /**
- * pages
- */
- const pageId0 = new mongoose.Types.ObjectId();
- const pageId1 = new mongoose.Types.ObjectId();
- const pageId2 = new mongoose.Types.ObjectId();
- const pageId3 = new mongoose.Types.ObjectId();
- const pageId4 = new mongoose.Types.ObjectId();
- const pageId5 = new mongoose.Types.ObjectId();
- const pageId6 = new mongoose.Types.ObjectId();
- const pageId7 = new mongoose.Types.ObjectId();
- const pageId8 = new mongoose.Types.ObjectId();
- const pageId9 = new mongoose.Types.ObjectId();
- const pageId10 = new mongoose.Types.ObjectId();
- const pageId11 = new mongoose.Types.ObjectId();
- const pageId12 = new mongoose.Types.ObjectId();
- const pageId13 = new mongoose.Types.ObjectId();
- const pageId14 = new mongoose.Types.ObjectId();
- const pageId15 = new mongoose.Types.ObjectId();
- const pageId16 = new mongoose.Types.ObjectId();
- const pageId17 = new mongoose.Types.ObjectId();
- const pageId18 = new mongoose.Types.ObjectId();
- const pageId19 = new mongoose.Types.ObjectId();
- const pageId20 = new mongoose.Types.ObjectId();
- await Page.insertMany([
- {
- _id: pageId0,
- path: '/resume_rename_0',
- parent: rootPage._id,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 1,
- isEmpty: false,
- },
- {
- _id: pageId1,
- path: '/resume_rename_0/resume_rename_1',
- parent: pageId0,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 2,
- isEmpty: false,
- },
- {
- _id: pageId2,
- path: '/resume_rename_1/resume_rename_2',
- parent: pageId1,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 1,
- isEmpty: false,
- },
- {
- _id: pageId3,
- path: '/resume_rename_1/resume_rename_2/resume_rename_3',
- parent: pageId2,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 0,
- isEmpty: false,
- },
- {
- _id: pageId4,
- path: '/resume_rename_4',
- parent: rootPage._id,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 0,
- isEmpty: false,
- },
- {
- _id: pageId5,
- path: '/resume_rename_4/resume_rename_5',
- parent: pageId4,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 1,
- isEmpty: false,
- },
- {
- _id: pageId6,
- path: '/resume_rename_5/resume_rename_6',
- parent: pageId5,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 0,
- isEmpty: false,
- },
- {
- _id: pageId7,
- path: '/resume_rename_7',
- parent: rootPage._id,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 0,
- isEmpty: false,
- },
- {
- _id: pageId8,
- path: '/resume_rename_8',
- parent: rootPage._id,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 1,
- isEmpty: false,
- },
- {
- _id: pageId9,
- path: '/resume_rename_8/resume_rename_9',
- parent: pageId8,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 1,
- isEmpty: false,
- },
- {
- path: '/resume_rename_9/resume_rename_10',
- parent: pageId9,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 0,
- isEmpty: false,
- },
- {
- _id: pageId10,
- path: '/resume_rename_11',
- parent: rootPage._id,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 3,
- isEmpty: false,
- },
- {
- _id: pageId11,
- path: '/resume_rename_11/resume_rename_12',
- parent: pageId10,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 2,
- isEmpty: false,
- },
- {
- _id: pageId12,
- path: '/resume_rename_11/resume_rename_12/resume_rename_13',
- parent: pageId11,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 1,
- isEmpty: false,
- },
- {
- path: '/resume_rename_11/resume_rename_12/resume_rename_13/resume_rename_14',
- parent: pageId12,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 0,
- isEmpty: false,
- },
- {
- _id: pageId13,
- path: '/resume_rename_15',
- parent: rootPage._id,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 2,
- isEmpty: false,
- },
- {
- _id: pageId14,
- path: '/resume_rename_15/resume_rename_16',
- parent: pageId13,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 0,
- isEmpty: false,
- },
- {
- _id: pageId15,
- path: '/resume_rename_15/resume_rename_17',
- parent: pageId13,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 1,
- isEmpty: false,
- },
- {
- _id: pageId16,
- path: '/resume_rename_15/resume_rename_17/resume_rename_18',
- parent: pageId15,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 1,
- isEmpty: false,
- },
- {
- _id: pageId17,
- path: '/resume_rename_15/resume_rename_17/resume_rename_18/resume_rename_19',
- parent: pageId16,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 0,
- isEmpty: false,
- },
- {
- _id: pageId18,
- path: '/fix_descendantCount_1',
- parent: rootPage._id,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 100, // broken
- isEmpty: false,
- },
- {
- _id: pageId19,
- path: '/fix_descendantCount_1/fix_descendantCount_2',
- parent: pageId18,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 100, // broken
- isEmpty: true,
- },
- {
- path: '/fix_descendantCount_1/fix_descendantCount_2/fix_descendantCount_3',
- parent: pageId19,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 100, // broken
- isEmpty: false,
- },
- {
- _id: pageId20,
- path: '/fix_descendantCount_4',
- parent: rootPage._id,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 100, // broken
- isEmpty: false,
- },
- {
- path: '/fix_descendantCount_4/fix_descendantCount_5',
- parent: pageId20,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 100, // broken
- isEmpty: false,
- },
- ]);
- /**
- * PageOperation
- */
- pageOpId1 = new mongoose.Types.ObjectId();
- pageOpId2 = new mongoose.Types.ObjectId();
- pageOpId3 = new mongoose.Types.ObjectId();
- pageOpId4 = new mongoose.Types.ObjectId();
- const pageOpRevisionId1 = new mongoose.Types.ObjectId();
- const pageOpRevisionId2 = new mongoose.Types.ObjectId();
- const pageOpRevisionId3 = new mongoose.Types.ObjectId();
- const pageOpRevisionId4 = new mongoose.Types.ObjectId();
- await PageOperation.insertMany([
- {
- _id: pageOpId1,
- actionType: 'Rename',
- actionStage: 'Sub',
- fromPath: '/resume_rename_1',
- toPath: '/resume_rename_0/resume_rename_1',
- page: {
- _id: pageId1,
- parent: rootPage._id,
- descendantCount: 2,
- isEmpty: false,
- path: '/resume_rename_1',
- revision: pageOpRevisionId1,
- status: 'published',
- grant: 1,
- grantedUsers: [],
- grantedGroups: [],
- creator: dummyUser1._id,
- lastUpdateUser: dummyUser1._id,
- },
- user: {
- _id: dummyUser1._id,
- },
- options: {
- createRedirectPage: false,
- updateMetadata: true,
- },
- unprocessableExpiryDate: null,
- },
- {
- _id: pageOpId2,
- actionType: 'Rename',
- actionStage: 'Sub',
- fromPath: '/resume_rename_5',
- toPath: '/resume_rename_4/resume_rename_5',
- page: {
- _id: pageId5,
- parent: rootPage._id,
- descendantCount: 2,
- isEmpty: false,
- path: '/resume_rename_5',
- revision: pageOpRevisionId2,
- status: 'published',
- grant: 1,
- grantedUsers: [],
- grantedGroups: [],
- creator: dummyUser1._id,
- lastUpdateUser: dummyUser1._id,
- },
- user: {
- _id: dummyUser1._id,
- },
- options: {
- createRedirectPage: false,
- updateMetadata: true,
- },
- unprocessableExpiryDate: new Date(),
- },
- {
- _id: pageOpId3,
- actionType: 'Rename',
- actionStage: 'Sub',
- fromPath: '/resume_rename_7',
- // toPath NOT exist
- page: {
- _id: pageId7,
- parent: rootPage._id,
- descendantCount: 2,
- isEmpty: false,
- path: '/resume_rename_7',
- revision: pageOpRevisionId3,
- status: 'published',
- grant: 1,
- grantedUsers: [],
- grantedGroups: [],
- creator: dummyUser1._id,
- lastUpdateUser: dummyUser1._id,
- },
- user: {
- _id: dummyUser1._id,
- },
- options: {
- createRedirectPage: false,
- updateMetadata: true,
- },
- unprocessableExpiryDate: new Date(),
- },
- {
- _id: pageOpId4,
- actionType: 'Rename',
- actionStage: 'Sub',
- fromPath: '/resume_rename_9',
- toPath: '/resume_rename_8/resume_rename_9',
- page: {
- _id: pageId9,
- parent: rootPage._id,
- descendantCount: 1,
- isEmpty: false,
- path: '/resume_rename_9',
- revision: pageOpRevisionId4,
- status: 'published',
- grant: Page.GRANT_PUBLIC,
- grantedUsers: [],
- grantedGroups: [],
- creator: dummyUser1._id,
- lastUpdateUser: dummyUser1._id,
- },
- user: {
- _id: dummyUser1._id,
- },
- options: {
- createRedirectPage: false,
- updateMetadata: true,
- },
- unprocessableExpiryDate: null,
- },
- ]);
- });
- describe('restart renameOperation', () => {
- const resumeRenameSubOperation = async (renamePage, pageOp, activity?) => {
- const mockedPathsAndDescendantCountOfAncestors = jest
- .spyOn(crowi.pageService, 'fixPathsAndDescendantCountOfAncestors')
- .mockReturnValue(null);
- await crowi.pageService.resumeRenameSubOperation(
- renamePage,
- pageOp,
- activity,
- );
- const argsForRenameSubOperation =
- mockedPathsAndDescendantCountOfAncestors.mock.calls[0];
- mockedPathsAndDescendantCountOfAncestors.mockRestore();
- await crowi.pageService.fixPathsAndDescendantCountOfAncestors(
- ...argsForRenameSubOperation,
- );
- };
- test('it should successfully restart rename operation', async () => {
- // paths before renaming
- const _path0 = '/resume_rename_0'; // out of renaming scope
- const _path1 = '/resume_rename_0/resume_rename_1'; // renamed already
- const _path2 = '/resume_rename_1/resume_rename_2'; // not renamed yet
- const _path3 = '/resume_rename_1/resume_rename_2/resume_rename_3'; // not renamed yet
- // paths after renaming
- const path0 = '/resume_rename_0';
- const path1 = '/resume_rename_0/resume_rename_1';
- const path2 = '/resume_rename_0/resume_rename_1/resume_rename_2';
- const path3 =
- '/resume_rename_0/resume_rename_1/resume_rename_2/resume_rename_3';
- // activity options
- const activity = 'randomActivityId';
- // page
- const _page0 = await Page.findOne({ path: _path0 });
- const _page1 = await Page.findOne({ path: _path1 });
- const _page2 = await Page.findOne({ path: _path2 });
- const _page3 = await Page.findOne({ path: _path3 });
- expect(_page0).toBeTruthy();
- expect(_page1).toBeTruthy();
- expect(_page2).toBeTruthy();
- expect(_page3).toBeTruthy();
- expect(_page0?.descendantCount).toBe(1);
- expect(_page1?.descendantCount).toBe(2);
- expect(_page2?.descendantCount).toBe(1);
- expect(_page3?.descendantCount).toBe(0);
- // page operation
- const fromPath = '/resume_rename_1';
- const toPath = '/resume_rename_0/resume_rename_1';
- const _pageOperation = await PageOperation.findOne({
- _id: pageOpId1,
- fromPath,
- toPath,
- 'page._id': _page1?._id,
- actionType: PageActionType.Rename,
- actionStage: PageActionStage.Sub,
- });
- expect(_pageOperation).toBeTruthy();
- // rename
- await resumeRenameSubOperation(_page1, _pageOperation, activity);
- // page
- const page0 = await Page.findById(_page0?._id);
- const page1 = await Page.findById(_page1?._id);
- const page2 = await Page.findById(_page2?._id);
- const page3 = await Page.findById(_page3?._id);
- expect(page0).toBeTruthy();
- expect(page1).toBeTruthy();
- expect(page2).toBeTruthy();
- expect(page3).toBeTruthy();
- // check paths after renaming
- expect(page0?.path).toBe(path0);
- expect(page1?.path).toBe(path1);
- expect(page2?.path).toBe(path2);
- expect(page3?.path).toBe(path3);
- // page operation
- const pageOperation = await PageOperation.findById(_pageOperation?._id);
- expect(pageOperation).toBeNull(); // should not exist
- expect(page0?.descendantCount).toBe(3);
- expect(page1?.descendantCount).toBe(2);
- expect(page2?.descendantCount).toBe(1);
- expect(page3?.descendantCount).toBe(0);
- });
- test('it should successfully restart rename operation when unprocessableExpiryDate is null', async () => {
- // paths before renaming
- const _path0 = '/resume_rename_8'; // out of renaming scope
- const _path1 = '/resume_rename_8/resume_rename_9'; // renamed already
- const _path2 = '/resume_rename_9/resume_rename_10'; // not renamed yet
- // paths after renaming
- const path0 = '/resume_rename_8';
- const path1 = '/resume_rename_8/resume_rename_9';
- const path2 = '/resume_rename_8/resume_rename_9/resume_rename_10';
- // activity options
- const activityParameters = {
- ip: '::ffff:127.0.0.1',
- endpoint: '/_api/v3/pages/rename',
- activityId: '62e291bc10e0ab61bd691794',
- };
- // page
- const _page0 = await Page.findOne({ path: _path0 });
- const _page1 = await Page.findOne({ path: _path1 });
- const _page2 = await Page.findOne({ path: _path2 });
- expect(_page0).toBeTruthy();
- expect(_page1).toBeTruthy();
- expect(_page2).toBeTruthy();
- expect(_page0?.descendantCount).toBe(1);
- expect(_page1?.descendantCount).toBe(1);
- expect(_page2?.descendantCount).toBe(0);
- // page operation
- const fromPath = '/resume_rename_9';
- const toPath = '/resume_rename_8/resume_rename_9';
- const _pageOperation = await PageOperation.findOne({
- _id: pageOpId4,
- fromPath,
- toPath,
- 'page._id': _page1?._id,
- actionType: PageActionType.Rename,
- actionStage: PageActionStage.Sub,
- });
- expect(_pageOperation).toBeTruthy();
- // rename
- await resumeRenameSubOperation(
- _page1,
- _pageOperation,
- activityParameters,
- );
- // page
- const page0 = await Page.findById(_page0?._id);
- const page1 = await Page.findById(_page1?._id);
- const page2 = await Page.findById(_page2?._id);
- expect(page0).toBeTruthy();
- expect(page1).toBeTruthy();
- expect(page2).toBeTruthy();
- // check paths after renaming
- expect(page0?.path).toBe(path0);
- expect(page1?.path).toBe(path1);
- expect(page2?.path).toBe(path2);
- // page operation
- const pageOperation = await PageOperation.findById(_pageOperation?._id);
- expect(pageOperation).toBeNull(); // should not exist
- // others
- expect(page1?.parent).toStrictEqual(page0?._id);
- expect(page2?.parent).toStrictEqual(page1?._id);
- expect(page0?.descendantCount).toBe(2);
- expect(page1?.descendantCount).toBe(1);
- expect(page2?.descendantCount).toBe(0);
- });
- test('it should fail and throw error if the current time is behind unprocessableExpiryDate', async () => {
- // path before renaming
- const _path0 = '/resume_rename_4'; // out of renaming scope
- const _path1 = '/resume_rename_4/resume_rename_5'; // renamed already
- const _path2 = '/resume_rename_5/resume_rename_6'; // not renamed yet
- // page
- const _page0 = await Page.findOne({ path: _path0 });
- const _page1 = await Page.findOne({ path: _path1 });
- const _page2 = await Page.findOne({ path: _path2 });
- expect(_page0).toBeTruthy();
- expect(_page1).toBeTruthy();
- expect(_page2).toBeTruthy();
- // page operation
- const fromPath = '/resume_rename_5';
- const toPath = '/resume_rename_4/resume_rename_5';
- const _pageOperation = await PageOperation.findOne({
- _id: pageOpId2,
- fromPath,
- toPath,
- 'page._id': _page1?._id,
- actionType: PageActionType.Rename,
- actionStage: PageActionStage.Sub,
- });
- expect(_pageOperation).toBeTruthy();
- // Make `unprocessableExpiryDate` 15 seconds ahead of current time.
- // The number 15 seconds has no meaning other than placing time in the furue.
- const pageOperation = await PageOperation.findByIdAndUpdate(
- _pageOperation?._id,
- { unprocessableExpiryDate: addSeconds(new Date(), 15) },
- { new: true },
- );
- expect(pageOperation).toBeTruthy();
- await expect(
- resumeRenameSubOperation(_page1, pageOperation),
- ).rejects.toThrow(
- new Error('This page operation is currently being processed'),
- );
- // cleanup
- await PageOperation.findByIdAndDelete(pageOperation?._id);
- });
- test('Missing property(toPath) for PageOperation should throw error', async () => {
- // page
- const _path1 = '/resume_rename_7';
- const _page1 = await Page.findOne({ path: _path1 });
- expect(_page1).toBeTruthy();
- // page operation
- const pageOperation = await PageOperation.findOne({
- _id: pageOpId3,
- 'page._id': _page1?._id,
- actionType: PageActionType.Rename,
- actionStage: PageActionStage.Sub,
- });
- expect(pageOperation).toBeTruthy();
- const promise = resumeRenameSubOperation(_page1, pageOperation);
- await expect(promise).rejects.toThrow(
- new Error(
- `Property toPath is missing which is needed to resume rename operation(${pageOperation?._id})`,
- ),
- );
- // cleanup
- await PageOperation.findByIdAndDelete(pageOperation?._id);
- });
- });
- describe('updateDescendantCountOfPagesWithPaths', () => {
- test('should fix descendantCount of pages with one of the given paths', async () => {
- // path
- const _path1 = '/fix_descendantCount_1';
- const _path2 = '/fix_descendantCount_1/fix_descendantCount_2'; // empty
- const _path3 =
- '/fix_descendantCount_1/fix_descendantCount_2/fix_descendantCount_3';
- const _path4 = '/fix_descendantCount_4';
- const _path5 = '/fix_descendantCount_4/fix_descendantCount_5';
- // page
- const _page1 = await Page.findOne({ path: _path1 });
- const _page2 = await Page.findOne({ path: _path2 });
- const _page3 = await Page.findOne({ path: _path3 });
- const _page4 = await Page.findOne({ path: _path4 });
- const _page5 = await Page.findOne({ path: _path5 });
- // check existance
- expect(_page1).toBeTruthy();
- expect(_page2).toBeTruthy();
- expect(_page3).toBeTruthy();
- expect(_page4).toBeTruthy();
- expect(_page5).toBeTruthy();
- // check descendantCount (all broken)
- expect(_page1?.descendantCount).toBe(100);
- expect(_page2?.descendantCount).toBe(100);
- expect(_page3?.descendantCount).toBe(100);
- expect(_page4?.descendantCount).toBe(100);
- expect(_page5?.descendantCount).toBe(100);
- // check isEmpty
- expect(_page1?.isEmpty).toBe(false);
- expect(_page2?.isEmpty).toBe(true);
- expect(_page3?.isEmpty).toBe(false);
- expect(_page4?.isEmpty).toBe(false);
- expect(_page5?.isEmpty).toBe(false);
- // check parent
- expect(_page1?.parent).toStrictEqual(rootPage._id);
- expect(_page2?.parent).toStrictEqual(_page1?._id);
- expect(_page3?.parent).toStrictEqual(_page2?._id);
- expect(_page4?.parent).toStrictEqual(rootPage._id);
- expect(_page5?.parent).toStrictEqual(_page4?._id);
- await crowi.pageService.updateDescendantCountOfPagesWithPaths([
- _path1,
- _path2,
- _path3,
- _path4,
- _path5,
- ]);
- // page
- const page1 = await Page.findById(_page1?._id);
- const page2 = await Page.findById(_page2?._id);
- const page3 = await Page.findById(_page3?._id);
- const page4 = await Page.findById(_page4?._id);
- const page5 = await Page.findById(_page5?._id);
- // check existance
- expect(page1).toBeTruthy();
- expect(page2).toBeTruthy();
- expect(page3).toBeTruthy();
- expect(page4).toBeTruthy();
- expect(page5).toBeTruthy();
- // check descendantCount (all fixed)
- expect(page1?.descendantCount).toBe(1);
- expect(page2?.descendantCount).toBe(1);
- expect(page3?.descendantCount).toBe(0);
- expect(page4?.descendantCount).toBe(1);
- expect(page5?.descendantCount).toBe(0);
- // check isEmpty
- expect(page1?.isEmpty).toBe(false);
- expect(page2?.isEmpty).toBe(true);
- expect(page3?.isEmpty).toBe(false);
- expect(page4?.isEmpty).toBe(false);
- expect(page5?.isEmpty).toBe(false);
- // check parent
- expect(page1?.parent).toStrictEqual(rootPage._id);
- expect(page2?.parent).toStrictEqual(page1?._id);
- expect(page3?.parent).toStrictEqual(page2?._id);
- expect(page4?.parent).toStrictEqual(rootPage._id);
- expect(page5?.parent).toStrictEqual(page4?._id);
- });
- });
- });
|