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 <jussi@hallila.com>
This commit is contained in:
Jussi Hallila
2021-09-03 16:00:00 +02:00
parent 7f00902d97
commit 6f45fc7990
4 changed files with 63 additions and 3 deletions
+8 -1
View File
@@ -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
+2
View File
@@ -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(
@@ -83,7 +83,7 @@ const expectedEntities: Entity[] = [
},
];
describe('DefaultTechDocsCollator', () => {
describe('DefaultTechDocsCollator with legacyPathCasing configuration', () => {
let mockDiscoveryApi: jest.Mocked<PluginEndpointDiscovery>;
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<PluginEndpointDiscovery>;
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.
@@ -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<TechDocsDocument[]> => {
const entityInfo = {
kind: entity.kind,
kind: this.legacyPathCasing
? entity.kind
: entity.kind.toLowerCase(),
namespace: entity.metadata.namespace || 'default',
name: entity.metadata.name,
};