diff --git a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts index 8734b58891..11a034db09 100644 --- a/packages/techdocs-common/__mocks__/@azure/storage-blob.ts +++ b/packages/techdocs-common/__mocks__/@azure/storage-blob.ts @@ -23,6 +23,7 @@ import os from 'os'; import path from 'path'; const rootDir = os.platform() === 'win32' ? 'C:\\rootDir' : '/rootDir'; + /** * @param sourceFile Relative path to entity root dir. Contains either / or \ as file separator * depending upon the OS. @@ -49,14 +50,20 @@ export class BlockBlobClient { } uploadFile(source: string): Promise { - return Promise.resolve({ - _response: { - request: { - url: `https://example.blob.core.windows.net`, - } as any, - status: 200, - headers: {} as any, - }, + return new Promise((resolve, reject) => { + if (!fs.existsSync(source)) { + reject(`The file ${source} does not exist`); + } else { + resolve({ + _response: { + request: { + url: `https://example.blob.core.windows.net`, + } as any, + status: 200, + headers: {} as any, + }, + }); + } }); } @@ -65,17 +72,18 @@ export class BlockBlobClient { } download() { + const filePath = path.join(rootDir, this.blobName); const emitter = new EventEmitter(); process.nextTick(() => { - if (fs.existsSync(this.blobName)) { - emitter.emit('data', Buffer.from(fs.readFileSync(this.blobName))); + if (fs.existsSync(filePath)) { + emitter.emit('data', Buffer.from(fs.readFileSync(filePath))); + emitter.emit('end'); } else { emitter.emit( 'error', - new Error(`The file ${this.blobName} doest not exist!`), + new Error(`The file ${filePath} does not exist !`), ); } - emitter.emit('end'); }); return Promise.resolve({ readableStreamBody: emitter, diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts index e1edaa61bb..dc75a4648c 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.test.ts @@ -14,15 +14,18 @@ * limitations under the License. */ import { getVoidLogger } from '@backstage/backend-common'; -import { Entity, ENTITY_DEFAULT_NAMESPACE } from '@backstage/catalog-model'; +import { + Entity, + EntityName, + ENTITY_DEFAULT_NAMESPACE, +} from '@backstage/catalog-model'; import { ConfigReader } from '@backstage/config'; import mockFs from 'mock-fs'; import os from 'os'; import path from 'path'; import { AzureBlobStoragePublish } from './azureBlobStorage'; import { PublisherBase, TechDocsMetadata } from './types'; -import type { Entity, EntityName } from '@backstage/catalog-model'; -import type { Logger } from 'winston'; + // NOTE: /packages/techdocs-common/__mocks__ is being used to mock Azure client library const createMockEntity = (annotations = {}) => { @@ -46,6 +49,7 @@ const createMockEntityName = (): EntityName => ({ }); const rootDir = os.platform() === 'win32' ? 'C:\\rootDir' : '/rootDir'; + const getEntityRootDir = (entity: Entity) => { const { kind, @@ -170,6 +174,69 @@ describe('publishing with valid credentials', () => { expect(await publisher.hasDocsBeenGenerated(entity)).toBe(false); }); }); + + describe('fetchTechDocsMetadata', () => { + it('should return tech docs metadata', async () => { + const entityNameMock = createMockEntityName(); + const entity = createMockEntity(); + const entityRootDir = getEntityRootDir(entity); + + mockFs({ + [entityRootDir]: { + 'techdocs_metadata.json': + '{"site_name": "backstage", "site_description": "site_content"}', + }, + }); + const expectedMetadata: TechDocsMetadata = { + site_name: 'backstage', + site_description: 'site_content', + }; + expect( + await publisher.fetchTechDocsMetadata(entityNameMock), + ).toStrictEqual(expectedMetadata); + mockFs.restore(); + }); + + it('should return tech docs metadata when json encoded with single quotes', async () => { + const entityNameMock = createMockEntityName(); + const entity = createMockEntity(); + const entityRootDir = getEntityRootDir(entity); + + mockFs({ + [entityRootDir]: { + 'techdocs_metadata.json': `{'site_name': 'backstage', 'site_description': 'site_content'}`, + }, + }); + + const expectedMetadata: TechDocsMetadata = { + site_name: 'backstage', + site_description: 'site_content', + }; + expect( + await publisher.fetchTechDocsMetadata(entityNameMock), + ).toStrictEqual(expectedMetadata); + mockFs.restore(); + }); + + it('should return an error if the techdocs_metadata.json file is not present', async () => { + const entityNameMock = createMockEntityName(); + const entity = createMockEntity(); + const entityRootDir = getEntityRootDir(entity); + + await publisher + .fetchTechDocsMetadata(entityNameMock) + .catch(error => + expect(error).toEqual( + new Error( + `TechDocs metadata fetch failed, The file ${path.join( + entityRootDir, + 'techdocs_metadata.json', + )} does not exist !`, + ), + ), + ); + }); + }); }); describe('error reporting', () => { diff --git a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts index 1d172bf6c9..a0f512df6e 100644 --- a/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts +++ b/packages/techdocs-common/src/stages/publish/azureBlobStorage.ts @@ -201,10 +201,7 @@ export class AzureBlobStoragePublish implements PublisherBase { return; } body - .on('error', e => { - this.logger.error(e.message); - reject(e.message); - }) + .on('error', reject) .on('data', chunk => { fileStreamChunks.push(chunk); })