Просмотр исходного кода

fix(elasticsearch): add support for ELASTICSEARCH_REINDEX_ON_BOOT and related tests

Ryu Sato 2 недель назад
Родитель
Сommit
d4e37a8e30

+ 3 - 0
apps/app/.env.test

@@ -7,3 +7,6 @@
 ##
 VITE_MONGOMS_VERSION="6.0.9"
 # VITE_MONGOMS_DEBUG=1
+
+VITE_ELASTICSEARCH_URI="http://elasticsearch:9200/growi"
+VITE_ELASTICSEARCH_REINDEX_ON_BOOT=true

+ 52 - 0
apps/app/src/server/service/search-delegator/elasticsearch.integ.ts

@@ -0,0 +1,52 @@
+import { vi } from 'vitest';
+
+import { configManager } from '~/server/service/config-manager';
+
+import { getInstance } from '../../../../test/setup/crowi';
+import ElasticsearchDelegator from './elasticsearch';
+
+describe('ElasticsearchDelegator#init() with ELASTICSEARCH_REINDEX_ON_BOOT', () => {
+  describe('when ELASTICSEARCH_REINDEX_ON_BOOT=true', () => {
+    beforeAll(async () => {
+      process.env.ELASTICSEARCH_REINDEX_ON_BOOT = 'true';
+      await configManager.loadConfigs();
+    });
+    afterAll(() => {
+      delete process.env.ELASTICSEARCH_REINDEX_ON_BOOT;
+    });
+
+    it('should invoke rebuildIndex and complete without error', async () => {
+      // arrange
+      const crowi = await getInstance();
+      const delegator = new ElasticsearchDelegator(crowi.socketIoService);
+      type WithRebuildIndex = {
+        rebuildIndex: (option?: {
+          shouldEmitProgress?: boolean;
+        }) => Promise<void>;
+      };
+      const rebuildSpy = vi.spyOn(
+        delegator as unknown as WithRebuildIndex,
+        'rebuildIndex',
+      );
+
+      // act
+      await delegator.init();
+
+      // assert
+      expect(rebuildSpy).toHaveBeenCalledOnce();
+    }, 60_000);
+
+    it('should leave indices in normalized state', async () => {
+      // arrange
+      const crowi = await getInstance();
+      const delegator = new ElasticsearchDelegator(crowi.socketIoService);
+
+      // act
+      await delegator.init();
+
+      // assert
+      const { isNormalized } = await delegator.getInfoForAdmin();
+      expect(isNormalized).toBe(true);
+    }, 60_000);
+  });
+});

+ 14 - 0
apps/app/test/setup/elasticsearch.ts

@@ -0,0 +1,14 @@
+// Vitest injects VITE_- and VITE_-prefixed .env.test vars into process.env for Node environments.
+// Map VITE_-prefixed vars to the names that the app's configManager expects.
+const VITE_ENV_MAP: Record<string, string> = {
+  VITE_ELASTICSEARCH_URI: 'ELASTICSEARCH_URI',
+  VITE_ELASTICSEARCH_VERSION: 'ELASTICSEARCH_VERSION',
+  VITE_ELASTICSEARCH_REINDEX_ON_BOOT: 'ELASTICSEARCH_REINDEX_ON_BOOT',
+};
+
+for (const [vitestKey, appKey] of Object.entries(VITE_ENV_MAP)) {
+  const value = process.env[vitestKey];
+  if (value != null) {
+    process.env[appKey] = value;
+  }
+}

+ 1 - 0
apps/app/vitest.workspace.mts

@@ -46,6 +46,7 @@ export default defineWorkspace([
       // Pre-download the MongoDB binary before workers start to avoid lock-file race conditions
       globalSetup: ['./test/setup/mongo/global-setup.ts'],
       setupFiles: [
+        './test/setup/elasticsearch.ts',
         './test/setup/migrate-mongo.ts',
         './test/setup/mongo/index.ts',
       ],