ryoji-s пре 2 година
родитељ
комит
3f9fe51d31

+ 2 - 0
apps/app/src/server/service/page/consts.ts

@@ -0,0 +1,2 @@
+export const BULK_REINDEX_SIZE = 100;
+export const LIMIT_FOR_MULTIPLE_PAGE_OP = 20;

+ 64 - 8
apps/app/src/server/service/page/delete-completely-user-home-by-system.integ.ts

@@ -1,6 +1,11 @@
 import mongoose from 'mongoose';
 import { vi } from 'vitest';
 
+import { getPageSchema } from '~/server/models/obsolete-page';
+import { configManager } from '~/server/service/config-manager';
+
+import pageModel from '../../models/page';
+
 import { deleteCompletelyUserHomeBySystem } from './delete-completely-user-home-by-system';
 
 import PageService from '.';
@@ -17,12 +22,63 @@ const userSchema = new mongoose.Schema({
 const User = mongoose.model('User', userSchema);
 
 describe('delete-completely-user-home-by-system test', () => {
+  let Page;
+
+  const initialEnv = process.env;
+
   const userId1 = new mongoose.Types.ObjectId();
+  const user1HomepageId = new mongoose.Types.ObjectId();
 
   beforeAll(async() => {
-    await User.create({
+    // setup page model
+    getPageSchema(null);
+    pageModel(null);
+    Page = mongoose.model('Page');
+
+    // setup config
+    await configManager.loadConfigs();
+    await configManager.updateConfigsInTheSameNamespace('crowi', { 'app:isV5Compatible': true });
+    const isV5Compatible = configManager.getConfig('crowi', 'app:isV5Compatible');
+    expect(isV5Compatible).toBeTruthy();
+
+    // setup user documents
+    const user1 = await User.create({
       _id: userId1, name: 'user1', username: 'user1', email: 'user1@example.com',
     });
+
+    // setup page documents
+    await Page.insertMany([
+      {
+        _id: user1HomepageId,
+        path: '/user/user1',
+        grant: Page.GRANT_PUBLIC,
+        creator: user1,
+        lastUpdateUser: user1,
+        parent: new mongoose.Types.ObjectId(),
+        descendantCount: 2,
+        isEmpty: false,
+        status: 'published',
+      },
+      {
+        path: '/user/user1/subpage1',
+        grant: Page.GRANT_PUBLIC,
+        creator: user1,
+        lastUpdateUser: user1,
+        parent: user1HomepageId,
+      },
+      {
+        path: '/user/user1//subpage2',
+        grant: Page.GRANT_PUBLIC,
+        creator: user1,
+        lastUpdateUser: user1,
+        parent: user1HomepageId,
+      },
+    ]);
+  });
+
+  afterAll(() => {
+    process.env = initialEnv;
+    Page.deleteMany({});
   });
 
   describe('deleteCompletelyUserHomeBySystem()', () => {
@@ -39,25 +95,25 @@ describe('delete-completely-user-home-by-system test', () => {
       deleteMultipleCompletely: mockDeleteMultipleCompletely,
     } as unknown as PageService;
 
-    it('should call page service functions', async() => {
+    it('should call used page service functions', async() => {
       // when
-      await deleteCompletelyUserHomeBySystem('/user/user1', mockPageService);
+      const existsUserHomepagePath = '/user/user1';
+      await deleteCompletelyUserHomeBySystem(existsUserHomepagePath, mockPageService);
 
       // then
       expect(mockUpdateDescendantCountOfAncestors).toHaveBeenCalled();
       expect(mockDeleteCompletelyOperation).toHaveBeenCalled();
-      expect(mockPageEvent).toHaveBeenCalled();
+      expect(mockPageEvent.emit).toHaveBeenCalled();
       expect(mockDeleteMultipleCompletely).toHaveBeenCalled();
     });
 
     it('should throw error if userHomepage is not exists', async() => {
       // when
-      const throwError = async() => {
-        await deleteCompletelyUserHomeBySystem('/user/not_exists_user', mockPageService);
-      };
+      const nonExistsUserHomepagePath = '/user/not_exists_user';
+      const deleteUserHomepageFunction = deleteCompletelyUserHomeBySystem(nonExistsUserHomepagePath, mockPageService);
 
       // then
-      expect(throwError).toThrowError();
+      expect(deleteUserHomepageFunction).rejects.toThrow('user homepage is not found.');
     });
   });
 });

+ 2 - 1
apps/app/src/server/service/page/delete-completely-user-home-by-system.ts

@@ -10,9 +10,10 @@ import type { PageModel } from '~/server/models/page';
 import { createBatchStream } from '~/server/util/batch-stream';
 import loggerFactory from '~/utils/logger';
 
+import { BULK_REINDEX_SIZE } from './consts';
 import { shouldUseV4Process } from './should-use-v4-process';
 
-import PageService, { BULK_REINDEX_SIZE } from '.';
+import PageService from '.';
 
 const logger = loggerFactory('growi:services:page');
 

+ 1 - 3
apps/app/src/server/service/page/index.ts

@@ -45,6 +45,7 @@ import { V5ConversionError } from '../../models/vo/v5-conversion-error';
 import { divideByType } from '../../util/granted-group';
 import { configManager } from '../config-manager';
 
+import { BULK_REINDEX_SIZE, LIMIT_FOR_MULTIPLE_PAGE_OP } from './consts';
 import { shouldUseV4Process } from './should-use-v4-process';
 
 const debug = require('debug')('growi:services:page');
@@ -57,9 +58,6 @@ const {
 
 const { addTrailingSlash } = pathUtils;
 
-export const BULK_REINDEX_SIZE = 100;
-const LIMIT_FOR_MULTIPLE_PAGE_OP = 20;
-
 // TODO: improve type
 class PageCursorsForDescendantsFactory {