|
@@ -1,9 +1,21 @@
|
|
|
-import type mongoose from 'mongoose';
|
|
|
|
|
|
|
+import { EventEmitter } from 'node:events';
|
|
|
import { mock } from 'vitest-mock-extended';
|
|
import { mock } from 'vitest-mock-extended';
|
|
|
|
|
|
|
|
|
|
+import type Crowi from '~/server/crowi';
|
|
|
import { configManager } from '~/server/service/config-manager';
|
|
import { configManager } from '~/server/service/config-manager';
|
|
|
import type { S2sMessagingService } from '~/server/service/s2s-messaging/base';
|
|
import type { S2sMessagingService } from '~/server/service/s2s-messaging/base';
|
|
|
|
|
|
|
|
|
|
+// Minimal mock for PageEvent that extends EventEmitter
|
|
|
|
|
+class MockPageEvent extends EventEmitter {
|
|
|
|
|
+ onCreate = vi.fn();
|
|
|
|
|
+
|
|
|
|
|
+ onUpdate = vi.fn();
|
|
|
|
|
+
|
|
|
|
|
+ onCreateMany = vi.fn();
|
|
|
|
|
+
|
|
|
|
|
+ onAddSeenUsers = vi.fn();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
describe('Page', () => {
|
|
describe('Page', () => {
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
let Page: any;
|
|
let Page: any;
|
|
@@ -27,16 +39,24 @@ describe('Page', () => {
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
let parentPage: any;
|
|
let parentPage: any;
|
|
|
|
|
|
|
|
|
|
+ // Mock Crowi instance with minimal required properties
|
|
|
|
|
+ const mockPageEvent = new MockPageEvent();
|
|
|
|
|
+ const crowiMock = {
|
|
|
|
|
+ events: {
|
|
|
|
|
+ page: mockPageEvent,
|
|
|
|
|
+ },
|
|
|
|
|
+ } as unknown as Crowi;
|
|
|
|
|
+
|
|
|
beforeAll(async () => {
|
|
beforeAll(async () => {
|
|
|
// Initialize configManager
|
|
// Initialize configManager
|
|
|
const s2sMessagingServiceMock = mock<S2sMessagingService>();
|
|
const s2sMessagingServiceMock = mock<S2sMessagingService>();
|
|
|
configManager.setS2sMessagingService(s2sMessagingServiceMock);
|
|
configManager.setS2sMessagingService(s2sMessagingServiceMock);
|
|
|
await configManager.loadConfigs();
|
|
await configManager.loadConfigs();
|
|
|
|
|
|
|
|
- // Initialize models without Crowi using dynamic import
|
|
|
|
|
|
|
+ // Initialize models with mocked Crowi using dynamic import
|
|
|
const pageModule = await import('./page');
|
|
const pageModule = await import('./page');
|
|
|
const pageFactory = pageModule.default;
|
|
const pageFactory = pageModule.default;
|
|
|
- Page = pageFactory(null);
|
|
|
|
|
|
|
+ Page = pageFactory(crowiMock);
|
|
|
PageQueryBuilder = Page.PageQueryBuilder;
|
|
PageQueryBuilder = Page.PageQueryBuilder;
|
|
|
|
|
|
|
|
const userModule = await import('./user/index');
|
|
const userModule = await import('./user/index');
|
|
@@ -376,8 +396,7 @@ describe('Page', () => {
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- // Skip: These tests require crowi instance
|
|
|
|
|
- describe.skip('.findListWithDescendants', () => {
|
|
|
|
|
|
|
+ describe('.findListWithDescendants', () => {
|
|
|
test('can retrieve all pages with testUser0', async () => {
|
|
test('can retrieve all pages with testUser0', async () => {
|
|
|
const result = await Page.findListWithDescendants('/grant', testUser0);
|
|
const result = await Page.findListWithDescendants('/grant', testUser0);
|
|
|
const { pages } = result;
|
|
const { pages } = result;
|
|
@@ -451,8 +470,7 @@ describe('Page', () => {
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- // Skip: These tests require crowi instance
|
|
|
|
|
- describe.skip('.findManageableListWithDescendants', () => {
|
|
|
|
|
|
|
+ describe('.findManageableListWithDescendants', () => {
|
|
|
test('can retrieve all pages with testUser0', async () => {
|
|
test('can retrieve all pages with testUser0', async () => {
|
|
|
const pages = await Page.findManageableListWithDescendants(
|
|
const pages = await Page.findManageableListWithDescendants(
|
|
|
parentPage,
|
|
parentPage,
|