| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- import mongoose from 'mongoose';
- import { PageActionType } from '../../../src/server/models/page-operation';
- import { getInstance } from '../setup-crowi';
- describe('Test page service methods', () => {
- let crowi;
- let Page;
- let Revision;
- let User;
- let UserGroup;
- let UserGroupRelation;
- let Tag;
- let PageTagRelation;
- let Bookmark;
- let Comment;
- let ShareLink;
- let PageRedirect;
- let PageOperation;
- let xssSpy;
- let rootPage;
- let dummyUser1;
- let dummyUser2;
- let globalGroupUser1;
- let globalGroupUser2;
- let globalGroupUser3;
- let globalGroupIsolate;
- let globalGroupA;
- let globalGroupB;
- let globalGroupC;
- beforeAll(async() => {
- crowi = await getInstance();
- await crowi.configManager.updateConfigsInTheSameNamespace('crowi', { 'app:isV5Compatible': true });
- User = mongoose.model('User');
- UserGroup = mongoose.model('UserGroup');
- UserGroupRelation = mongoose.model('UserGroupRelation');
- Page = mongoose.model('Page');
- Revision = mongoose.model('Revision');
- Tag = mongoose.model('Tag');
- PageTagRelation = mongoose.model('PageTagRelation');
- Bookmark = mongoose.model('Bookmark');
- Comment = mongoose.model('Comment');
- ShareLink = mongoose.model('ShareLink');
- PageRedirect = mongoose.model('PageRedirect');
- UserGroup = mongoose.model('UserGroup');
- UserGroupRelation = mongoose.model('UserGroupRelation');
- PageOperation = mongoose.model('PageOperation');
- /*
- * Common
- */
- xssSpy = jest.spyOn(crowi.xss, 'process').mockImplementation(path => path);
- // ***********************************************************************************************************
- // * Do NOT change properties of globally used documents. Otherwise, it might cause some errors in other tests
- // ***********************************************************************************************************
- // users
- dummyUser1 = await User.findOne({ username: 'v5DummyUser1' });
- dummyUser2 = await User.findOne({ username: 'v5DummyUser2' });
- globalGroupUser1 = await User.findOne({ username: 'gGroupUser1' });
- globalGroupUser2 = await User.findOne({ username: 'gGroupUser2' });
- globalGroupUser3 = await User.findOne({ username: 'gGroupUser3' });
- // groups
- globalGroupIsolate = await UserGroup.findOne({ name: 'globalGroupIsolate' });
- globalGroupA = await UserGroup.findOne({ name: 'globalGroupA' });
- globalGroupB = await UserGroup.findOne({ name: 'globalGroupB' });
- globalGroupC = await UserGroup.findOne({ name: 'globalGroupC' });
- // 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();
- await Page.insertMany([
- {
- _id: pageId0,
- path: '/POP0',
- parent: rootPage._id,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 0,
- },
- {
- _id: pageId1,
- path: '/POP0/renamePOP1',
- parent: pageId0._id,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 2,
- },
- {
- _id: pageId2,
- path: '/renamePOP1/renamePOP2',
- parent: pageId1,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 1,
- },
- {
- _id: pageId3,
- path: '/renamePOP1/renamePOP2/renamePOP3',
- parent: pageId2,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 0,
- },
- {
- _id: pageId4,
- path: '/POP1',
- parent: rootPage._id,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 0,
- },
- {
- _id: pageId5,
- path: '/POP1/renamePOP4',
- parent: pageId0._id,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 1,
- },
- {
- _id: pageId6,
- path: '/renamePOP4/renamePOP5',
- parent: pageId5,
- grant: Page.GRANT_PUBLIC,
- creator: dummyUser1,
- lastUpdateUser: dummyUser1._id,
- descendantCount: 0,
- },
- ]);
- /**
- * PageOperation
- */
- const pageOpId1 = new mongoose.Types.ObjectId();
- const pageOpId2 = new mongoose.Types.ObjectId();
- const pageOpRevisionId1 = new mongoose.Types.ObjectId();
- const pageOpRevisionId2 = new mongoose.Types.ObjectId();
- await PageOperation.insertMany([
- {
- _id: pageOpId1,
- actionType: 'Rename',
- actionStage: 'Sub',
- fromPath: '/renamePOP1',
- toPath: '/POP0/renamePOP1',
- page: {
- _id: pageId1,
- parent: rootPage._id,
- descendantCount: 2,
- isEmpty: false,
- path: '/renamePOP1',
- revision: pageOpRevisionId1,
- status: 'published',
- grant: 1,
- grantedUsers: [],
- grantedGroup: null,
- creator: dummyUser1._id,
- lastUpdateUser: dummyUser1._id,
- },
- user: {
- _id: dummyUser1._id,
- },
- options: {
- createRedirectPage: false,
- updateMetadata: true,
- },
- unprocessableExpiryDate: null,
- },
- {
- _id: pageOpId2,
- actionType: 'Rename',
- actionStage: 'Sub',
- fromPath: '/renamePOP4',
- toPath: '/POP1/renamePOP4',
- page: {
- _id: pageId5,
- parent: rootPage._id,
- descendantCount: 2,
- isEmpty: false,
- path: '/renamePOP4',
- revision: pageOpRevisionId2,
- status: 'published',
- grant: 1,
- grantedUsers: [],
- grantedGroup: null,
- creator: dummyUser1._id,
- lastUpdateUser: dummyUser1._id,
- },
- user: {
- _id: dummyUser1._id,
- },
- options: {
- createRedirectPage: false,
- updateMetadata: true,
- },
- unprocessableExpiryDate: new Date(5000, 0, 1), // year 5000
- },
- ]);
- });
- describe('restart renameOperation', () => {
- const resumePageRenameOperation = async(pageId) => {
- const mockedRenameSubOperation = jest.spyOn(crowi.pageService, 'renameSubOperation').mockReturnValue(null);
- await crowi.pageService.resumePageRenameOperation(pageId);
- const argsForRenameSubOperation = mockedRenameSubOperation.mock.calls[0];
- mockedRenameSubOperation.mockRestore();
- await crowi.pageService.renameSubOperation(...argsForRenameSubOperation);
- };
- test('it should successfully restart rename operation', async() => {
- const _path0 = '/POP0';
- const _path1 = '/POP0/renamePOP1'; // renamed already
- const _path2 = '/renamePOP1/renamePOP2'; // not renamed yet
- const _path3 = '/renamePOP1/renamePOP2/renamePOP3'; // not renamed yet
- 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();
- const _pageOperation = await PageOperation.findOne({ 'page._id': _page1._id, actionType: PageActionType.Rename });
- expect(_pageOperation).toBeTruthy();
- await resumePageRenameOperation(_pageOperation.page._id);
- const path0 = '/POP0';
- const path1 = '/POP0/renamePOP1';
- const path2 = '/POP0/renamePOP1/renamePOP2';
- const path3 = '/POP0/renamePOP1/renamePOP2/renamePOP3';
- 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 });
- const pageOperation = await PageOperation.findOne({ _id: _pageOperation._id });
- expect(page0.descendantCount).toBe(3);
- expect(page0).toBeTruthy();
- expect(page1).toBeTruthy();
- expect(page2).toBeTruthy();
- expect(page3).toBeTruthy();
- expect(pageOperation).toBeNull(); // should not exist
- expect(page1.parent).toStrictEqual(page0._id);
- expect(page2.parent).toStrictEqual(page1._id);
- expect(page3.parent).toStrictEqual(page2._id);
- expect(page0.descendantCount).toBe(3);
- expect(page1.descendantCount).toBe(2);
- expect(page2.descendantCount).toBe(1);
- expect(page3.descendantCount).toBe(0);
- });
- test('it should fail and throw error if PageOperation is not found', async() => {
- const pageId = new mongoose.Types.ObjectId(); // not exist in DB
- await expect(resumePageRenameOperation(pageId))
- .rejects.toThrow(new Error('it did not restart rename operation because page operation to be processed was not found'));
- });
- test('it should fail and throw error if the current time is behind unprocessableExpiryDate', async() => {
- const _path0 = '/POP1';
- const _path1 = '/POP1/renamePOP4'; // renamed already
- const _path2 = '/renamePOP4/renamePOP5'; // not renamed yet
- const _page0 = await Page.findOne({ path: _path0 });
- const _page1 = await Page.findOne({ path: _path1 });
- const _page2 = await Page.findOne({ path: _path2 });
- const _pageOperation = await PageOperation.findOne({ 'page._id': _page1._id, actionType: PageActionType.Rename });
- expect(_page0).toBeTruthy();
- expect(_page1).toBeTruthy();
- expect(_page2).toBeTruthy();
- expect(_pageOperation).toBeTruthy();
- const promise = resumePageRenameOperation(_pageOperation.page._id);
- await expect(promise).rejects.toThrow(new Error('it did not restart rename operation because it is currently being processed'));
- });
- });
- });
|