Yuki Takei 2 лет назад
Родитель
Сommit
2a3c62618d

+ 28 - 20
apps/app/src/server/service/config-manager.spec.ts

@@ -1,46 +1,54 @@
-import ConfigModel from '~/server/models/config';
+import {
+  vi,
+  beforeAll,
+  describe, expect, test,
+} from 'vitest';
+import { mock } from 'vitest-mock-extended';
 
-const { getInstance } = require('../setup-crowi');
+import ConfigModel from '../models/config';
+
+import { configManager } from './config-manager';
+import type { S2sMessagingService } from './s2s-messaging/base';
 
 describe('ConfigManager test', () => {
-  let crowi;
-  let configManager;
 
-  beforeEach(async() => {
-    process.env.CONFIG_PUBSUB_SERVER_TYPE = 'nchan';
+  const s2sMessagingServiceMock = mock<S2sMessagingService>();
 
-    crowi = await getInstance();
-    configManager = crowi.configManager;
+  beforeAll(async() => {
+    process.env.CONFIG_PUBSUB_SERVER_TYPE = 'nchan';
+    configManager.setS2sMessagingService(s2sMessagingServiceMock);
   });
 
 
   describe('updateConfigsInTheSameNamespace()', () => {
 
-    beforeEach(async() => {
-      configManager.s2sMessagingService = {};
-    });
-
-    test('invoke publishUpdateMessage()', async() => {
-      ConfigModel.bulkWrite = jest.fn();
-      configManager.loadConfigs = jest.fn();
-      configManager.publishUpdateMessage = jest.fn();
+    test.concurrent('invoke publishUpdateMessage()', async() => {
+      // setup
+      ConfigModel.bulkWrite = vi.fn();
+      configManager.loadConfigs = vi.fn();
+      configManager.publishUpdateMessage = vi.fn();
 
+      // when
       const dummyConfig = { dummyKey: 'dummyValue' };
       await configManager.updateConfigsInTheSameNamespace('dummyNs', dummyConfig);
 
+      // then
       expect(ConfigModel.bulkWrite).toHaveBeenCalledTimes(1);
       expect(configManager.loadConfigs).toHaveBeenCalledTimes(1);
       expect(configManager.publishUpdateMessage).toHaveBeenCalledTimes(1);
     });
 
-    test('does not invoke publishUpdateMessage()', async() => {
-      ConfigModel.bulkWrite = jest.fn();
-      configManager.loadConfigs = jest.fn();
-      configManager.publishUpdateMessage = jest.fn();
+    test.concurrent('does not invoke publishUpdateMessage()', async() => {
+      // setup
+      ConfigModel.bulkWrite = vi.fn();
+      configManager.loadConfigs = vi.fn();
+      configManager.publishUpdateMessage = vi.fn();
 
+      // when
       const dummyConfig = { dummyKey: 'dummyValue' };
       await configManager.updateConfigsInTheSameNamespace('dummyNs', dummyConfig, true);
 
+      // then
       expect(ConfigModel.bulkWrite).toHaveBeenCalledTimes(1);
       expect(configManager.loadConfigs).toHaveBeenCalledTimes(1);
       expect(configManager.publishUpdateMessage).not.toHaveBeenCalled();

+ 6 - 3
apps/app/src/server/service/config-manager.ts

@@ -6,8 +6,8 @@ import ConfigModel from '../models/config';
 import S2sMessage from '../models/vo/s2s-message';
 
 import ConfigLoader, { ConfigObject } from './config-loader';
-import { S2sMessagingService } from './s2s-messaging/base';
-import { S2sMessageHandlable } from './s2s-messaging/handlable';
+import type { S2sMessagingService } from './s2s-messaging/base';
+import type { S2sMessageHandlable } from './s2s-messaging/handlable';
 
 const logger = loggerFactory('growi:service:ConfigManager');
 
@@ -192,7 +192,7 @@ export default class ConfigManager implements S2sMessageHandlable {
    *  );
    * ```
    */
-  async updateConfigsInTheSameNamespace(namespace, configs, withoutPublishingS2sMessage?) {
+  async updateConfigsInTheSameNamespace(namespace: string, configs, withoutPublishingS2sMessage = false): Promise<void> {
     const queries: any[] = [];
     for (const key of Object.keys(configs)) {
       queries.push({
@@ -400,3 +400,6 @@ export default class ConfigManager implements S2sMessageHandlable {
   }
 
 }
+
+// export the singleton instance
+export const configManager = new ConfigManager();