]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-16490 Embedded documentation throws exception when visited twice
authorWouter Admiraal <wouter.admiraal@sonarsource.com>
Tue, 14 Jun 2022 09:38:48 +0000 (11:38 +0200)
committersonartech <sonartech@sonarsource.com>
Tue, 14 Jun 2022 20:02:52 +0000 (20:02 +0000)
server/sonar-web/src/main/js/apps/documentation/components/SearchResults.tsx
server/sonar-web/src/main/js/apps/documentation/components/__tests__/SearchResults-test.tsx

index c5395620f1abc58f34b75664f109de0c21ce28cb..784909c3e4099877b8e3b3ff6a3bab17561a9875 100644 (file)
@@ -157,8 +157,14 @@ export function tokenContextPluginCallback(token: LunrToken, index: number, toke
   return token;
 }
 
+let tokenContextPluginRegistered = false;
+
 export function tokenContextPlugin(builder: LunrBuilder) {
-  (lunr as any).Pipeline.registerFunction(tokenContextPluginCallback, 'tokenContext');
+  if (!tokenContextPluginRegistered) {
+    (lunr as any).Pipeline.registerFunction(tokenContextPluginCallback, 'tokenContext');
+    tokenContextPluginRegistered = true;
+  }
+
   builder.pipeline.before((lunr as any).stemmer, tokenContextPluginCallback);
   builder.metadataWhitelist.push('tokenContext');
 }
index 40fd9ed3aaef475b70dc731a25627af00a18c4b0..d01e6646c7627fe66401f9a77eecf14be095b4fb 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import { shallow } from 'enzyme';
-import lunr, { LunrToken } from 'lunr';
+import lunr, { LunrBuilder, LunrToken } from 'lunr';
 import * as React from 'react';
 import { mockDocumentationEntry } from '../../../../helpers/testMocks';
 import { getUrlsList } from '../../navTreeUtils';
@@ -30,8 +30,8 @@ jest.mock('../../navTreeUtils', () => ({
   getUrlsList: jest.fn().mockReturnValue([])
 }));
 
-jest.mock('lunr', () =>
-  jest.fn(() => ({
+jest.mock('lunr', () => {
+  const lunr = jest.fn(() => ({
     search: jest.fn(() => [
       {
         ref: 'lorem/origin',
@@ -68,8 +68,14 @@ jest.mock('lunr', () =>
         }
       }
     ])
-  }))
-);
+  }));
+
+  (lunr as any).Pipeline = {
+    registerFunction: jest.fn()
+  };
+
+  return lunr;
+});
 
 it('should render correctly', () => {
   expect(shallowRender()).toMatchSnapshot('default');
@@ -164,10 +170,28 @@ describe('tokenContextPluginCallback', () => {
     }
   }
 
+  class LunrBuilderMock {
+    pipeline: { before: (stemmer: any, cb: Function) => void };
+    metadataWhitelist: string[];
+
+    constructor() {
+      this.pipeline = {
+        before: () => {
+          /* noop */
+        }
+      };
+      this.metadataWhitelist = [];
+    }
+  }
+
   function mockLunrToken(str: string): LunrToken {
     return new LunrTokenMock(str);
   }
 
+  function mockLunrBuilder(): LunrBuilder {
+    return new LunrBuilderMock();
+  }
+
   it('should correctly provide token context for text', () => {
     const tokens = [
       mockLunrToken('this'),
@@ -189,6 +213,12 @@ describe('tokenContextPluginCallback', () => {
       expect.objectContaining({ tokenContext: 'some text' })
     );
   });
+
+  it('should only register the plugin once', () => {
+    tokenContextPlugin(mockLunrBuilder());
+    tokenContextPlugin(mockLunrBuilder());
+    expect((lunr as any).Pipeline.registerFunction).toBeCalledTimes(1);
+  });
 });
 
 function shallowRender(props: Partial<SearchResults['props']> = {}) {