Add tests for fetchTechDocsMetadata

Signed-off-by: vitorgrenzel <vitorgrenzel@gmail.com>
This commit is contained in:
vitorgrenzel
2021-02-22 10:31:34 -03:00
parent 1ad2b0ed92
commit 71684c6cb4
3 changed files with 91 additions and 19 deletions
@@ -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<BlobUploadCommonResponse> {
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,
@@ -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', () => {
@@ -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);
})