From 6f45fc799068db91e4d4bf09e7f2138363e8c827 Mon Sep 17 00:00:00 2001 From: Jussi Hallila Date: Fri, 3 Sep 2021 16:00:00 +0200 Subject: [PATCH] Modify TechDocsCollator to be aware of new urls * Add boolean constructor param to define if to use legacy paths * Swap urls to match new pattern * Add few tests Signed-off-by: Jussi Hallila --- packages/backend/src/plugins/search.ts | 9 +++- plugins/techdocs-backend/api-report.md | 2 + .../search/DefaultTechDocsCollator.test.ts | 47 ++++++++++++++++++- .../src/search/DefaultTechDocsCollator.ts | 8 +++- 4 files changed, 63 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/plugins/search.ts b/packages/backend/src/plugins/search.ts index 2da108608e..219bb7e0c9 100644 --- a/packages/backend/src/plugins/search.ts +++ b/packages/backend/src/plugins/search.ts @@ -73,7 +73,14 @@ export default async function createPlugin({ indexBuilder.addCollator({ defaultRefreshIntervalSeconds: 600, - collator: new DefaultTechDocsCollator({ discovery, logger }), + collator: new DefaultTechDocsCollator({ + discovery, + logger, + legacyPathCasing: + config.getOptionalBoolean( + 'techdocs.legacyUseCaseSensitiveTripletPaths', + ) || false, + }), }); // The scheduler controls when documents are gathered from collators and sent diff --git a/plugins/techdocs-backend/api-report.md b/plugins/techdocs-backend/api-report.md index 4190b3e67c..8c2de20405 100644 --- a/plugins/techdocs-backend/api-report.md +++ b/plugins/techdocs-backend/api-report.md @@ -31,12 +31,14 @@ export class DefaultTechDocsCollator implements DocumentCollator { logger, catalogClient, parallelismLimit, + legacyPathCasing, }: { discovery: PluginEndpointDiscovery; logger: Logger_2; locationTemplate?: string; catalogClient?: CatalogApi; parallelismLimit?: number; + legacyPathCasing?: boolean; }); // (undocumented) protected applyArgsToFormat( diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts index 618bb54d60..49b2c46622 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts @@ -83,7 +83,7 @@ const expectedEntities: Entity[] = [ }, ]; -describe('DefaultTechDocsCollator', () => { +describe('DefaultTechDocsCollator with legacyPathCasing configuration', () => { let mockDiscoveryApi: jest.Mocked; let collator: DefaultTechDocsCollator; @@ -97,6 +97,7 @@ describe('DefaultTechDocsCollator', () => { collator = new DefaultTechDocsCollator({ discovery: mockDiscoveryApi, logger, + legacyPathCasing: true, }); worker.use( @@ -132,6 +133,50 @@ describe('DefaultTechDocsCollator', () => { }); }); }); +}); + +describe('DefaultTechDocsCollator', () => { + let mockDiscoveryApi: jest.Mocked; + let collator: DefaultTechDocsCollator; + + const worker = setupServer(); + msw.setupDefaultHandlers(worker); + beforeEach(() => { + mockDiscoveryApi = { + getBaseUrl: jest.fn().mockResolvedValue('http://test-backend'), + getExternalBaseUrl: jest.fn(), + }; + collator = new DefaultTechDocsCollator({ + discovery: mockDiscoveryApi, + logger, + }); + + worker.use( + rest.get( + 'http://test-backend/static/docs/default/component/test-entity-with-docs/search/search_index.json', + (_, res, ctx) => res(ctx.status(200), ctx.json(mockSearchDocIndex)), + ), + rest.get('http://test-backend/entities', (_, res, ctx) => + res(ctx.status(200), ctx.json(expectedEntities)), + ), + ); + }); + + it('should create documents for each tech docs search index', async () => { + const documents = await collator.execute(); + const entity = expectedEntities[0]; + documents.forEach((document, idx) => { + expect(document).toMatchObject({ + title: mockSearchDocIndex.docs[idx].title, + location: `/docs/default/component/${entity.metadata.name}/${mockSearchDocIndex.docs[idx].location}`, + text: mockSearchDocIndex.docs[idx].text, + namespace: 'default', + componentType: entity!.spec!.type, + lifecycle: entity!.spec!.lifecycle, + owner: '', + }); + }); + }); it('maps a returned entity with a custom locationTemplate', async () => { // Provide an alternate location template. diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts index 850be2823c..e83491448a 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts @@ -36,6 +36,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { private readonly logger: Logger; private readonly catalogClient: CatalogApi; private readonly parallelismLimit: number; + private readonly legacyPathCasing: boolean; public readonly type: string = 'techdocs'; constructor({ @@ -44,12 +45,14 @@ export class DefaultTechDocsCollator implements DocumentCollator { logger, catalogClient, parallelismLimit = 10, + legacyPathCasing = false, }: { discovery: PluginEndpointDiscovery; logger: Logger; locationTemplate?: string; catalogClient?: CatalogApi; parallelismLimit?: number; + legacyPathCasing?: boolean; }) { this.discovery = discovery; this.locationTemplate = @@ -58,6 +61,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { this.catalogClient = catalogClient || new CatalogClient({ discoveryApi: discovery }); this.parallelismLimit = parallelismLimit; + this.legacyPathCasing = legacyPathCasing; } async execute() { @@ -80,7 +84,9 @@ export class DefaultTechDocsCollator implements DocumentCollator { .map((entity: Entity) => limit(async (): Promise => { const entityInfo = { - kind: entity.kind, + kind: this.legacyPathCasing + ? entity.kind + : entity.kind.toLowerCase(), namespace: entity.metadata.namespace || 'default', name: entity.metadata.name, };