@mintlify/cli
Version:
The Mintlify CLI
128 lines (103 loc) • 4.18 kB
text/typescript
import { getOpenApiDocumentFromUrl, isAllowedLocalSchemaUrl, validate } from '@mintlify/common';
import * as previewing from '@mintlify/previewing';
import { mockProcessExit } from 'vitest-mock-process';
import { readLocalOpenApiFile } from '../src/helpers.js';
import { mockValidOpenApiDocument, runCommand } from './utils.js';
vi.mock('@mintlify/common', () => ({
getOpenApiDocumentFromUrl: vi.fn(),
isAllowedLocalSchemaUrl: vi.fn(),
validate: vi.fn(),
}));
vi.mock('../src/helpers.js', async () => {
const originalModule = await import('../src/helpers.js');
return {
...originalModule,
readLocalOpenApiFile: vi.fn(),
};
});
const addLogSpy = vi.spyOn(previewing, 'addLog');
const processExitMock = mockProcessExit();
describe('openApiCheck', () => {
beforeEach(() => {
vi.clearAllMocks();
});
afterEach(() => {
vi.clearAllMocks();
});
it('valid openApi file from url', async () => {
vi.mocked(isAllowedLocalSchemaUrl).mockReturnValueOnce(true);
vi.mocked(getOpenApiDocumentFromUrl).mockResolvedValueOnce(mockValidOpenApiDocument);
await runCommand('openapi-check', 'https://petstore3.swagger.io/api/v3/openapi.json');
expect(addLogSpy).toHaveBeenCalledWith(
expect.objectContaining({
props: { message: 'OpenAPI definition is valid.' },
})
);
expect(processExitMock).toHaveBeenCalledWith(0);
});
it('invalid openApi file from url', async () => {
vi.mocked(isAllowedLocalSchemaUrl).mockReturnValueOnce(true);
vi.mocked(getOpenApiDocumentFromUrl).mockRejectedValueOnce(
new Error('Could not parse OpenAPI document.')
);
await runCommand('openapi-check', 'https://petstore3.swagger.io/api/v3/openapi.json');
expect(addLogSpy).toHaveBeenCalledWith(
expect.objectContaining({
props: { message: 'Could not parse OpenAPI document.' },
})
);
expect(processExitMock).toHaveBeenCalledWith(1);
});
it('valid openApi file from localhost', async () => {
vi.mocked(isAllowedLocalSchemaUrl).mockReturnValueOnce(true);
vi.mocked(getOpenApiDocumentFromUrl).mockResolvedValueOnce(mockValidOpenApiDocument);
await runCommand('openapi-check', 'http://localhost:3000/openapi.json');
expect(addLogSpy).toHaveBeenCalledWith(
expect.objectContaining({
props: { message: 'OpenAPI definition is valid.' },
})
);
expect(processExitMock).toHaveBeenCalledWith(0);
});
it('invalid openApi file from localhost', async () => {
vi.mocked(isAllowedLocalSchemaUrl).mockReturnValueOnce(false);
vi.mocked(readLocalOpenApiFile).mockResolvedValueOnce(undefined);
await runCommand('openapi-check', 'http://localhost:3000/openapi.json');
expect(addLogSpy).toHaveBeenCalledWith(
expect.objectContaining({
props: {
message:
'failed to parse OpenAPI spec: could not parse file correctly, please check for any syntax errors.',
},
})
);
expect(processExitMock).toHaveBeenCalledWith(1);
});
it('valid openApi file from local file', async () => {
vi.mocked(isAllowedLocalSchemaUrl).mockReturnValueOnce(false);
vi.mocked(readLocalOpenApiFile).mockResolvedValueOnce(mockValidOpenApiDocument);
vi.mocked(validate).mockResolvedValueOnce({
valid: true,
errors: [],
});
await runCommand('openapi-check', 'test/openapi.yaml');
expect(addLogSpy).toHaveBeenCalledWith(
expect.objectContaining({
props: { message: 'OpenAPI definition is valid.' },
})
);
expect(processExitMock).toHaveBeenCalledWith(0);
});
it('invalid openApi file from local file', async () => {
vi.mocked(isAllowedLocalSchemaUrl).mockReturnValueOnce(false);
vi.mocked(readLocalOpenApiFile).mockResolvedValueOnce(mockValidOpenApiDocument);
vi.mocked(validate).mockRejectedValueOnce(new Error('some schema parsing error'));
await runCommand('openapi-check', 'test/openapi.yaml');
expect(addLogSpy).toHaveBeenCalledWith(
expect.objectContaining({
props: { message: 'some schema parsing error' },
})
);
expect(processExitMock).toHaveBeenCalledWith(1);
});
});