@mintlify/scraping
Version:
Scrape documentation frameworks to Mintlify docs
175 lines (148 loc) • 4.81 kB
text/typescript
import type { DocumentV3 } from '@mintlify/common';
import type { DecoratedNavigationPage } from '@mintlify/models';
import type { OpenAPIV3 } from 'openapi-types';
import { describe, it, expect } from 'vitest';
import { findNavGroup } from '../src/apiPages/common.js';
import { OpenApiExtensions, processOpenApiPath } from '../src/openapi/common.js';
import { simpleDoc } from './fixtures/openapi.js';
type OperationObject = OpenAPIV3.OperationObject<OpenApiExtensions>;
const createOperation = (overrides: Partial<OperationObject>) => {
return {
responses: {
200: {
description: 'OK',
},
},
...overrides,
};
};
describe('processOpenApiPath', () => {
const schema: DocumentV3 = simpleDoc;
const defaultOptions = {
writeFiles: false,
} as const;
it('should add a page and nav entry for a standard operation', () => {
const nav: DecoratedNavigationPage[] = [];
const decoratedNav: DecoratedNavigationPage[] = [];
const writePromises: Promise<void>[] = [];
const pagesAcc: Record<string, DecoratedNavigationPage> = {};
const pathItemObject = {
get: createOperation({ summary: 'List Pets', tags: ['Pets'] }),
};
processOpenApiPath(
'/pets',
pathItemObject,
schema,
nav,
decoratedNav,
writePromises,
pagesAcc,
defaultOptions,
findNavGroup
);
expect(nav).toHaveLength(1);
expect(nav[0]).toHaveProperty('group', 'Pets');
expect(nav[0]).toHaveProperty('pages');
expect(nav[0]?.pages).toHaveLength(1);
expect(decoratedNav).toHaveLength(1);
expect(decoratedNav[0]?.pages).toHaveLength(1);
expect(Object.keys(pagesAcc)).toHaveLength(1);
expect(writePromises).toHaveLength(0);
});
it('should skip operations marked with x-excluded', () => {
const nav: DecoratedNavigationPage[] = [];
const decoratedNav: DecoratedNavigationPage[] = [];
const writePromises: Promise<void>[] = [];
const pagesAcc: Record<string, DecoratedNavigationPage> = {};
const operation: Partial<OperationObject> = {
summary: 'List Pets',
tags: ['Pets'],
'x-excluded': true,
};
const pathItemObject = {
get: createOperation(operation),
};
processOpenApiPath(
'/pets',
pathItemObject,
schema,
nav,
decoratedNav,
writePromises,
pagesAcc,
defaultOptions,
findNavGroup
);
expect(nav).toHaveLength(0);
expect(Object.keys(pagesAcc)).toHaveLength(0);
});
it('should use x-mint.metadata.title and description to override defaults', () => {
const nav: DecoratedNavigationPage[] = [];
const decoratedNav: DecoratedNavigationPage[] = [];
const writePromises: Promise<void>[] = [];
const pagesAcc: Record<string, DecoratedNavigationPage> = {};
const operation: Partial<OperationObject> = {
summary: 'List Pets',
tags: ['Pets'],
'x-mint': {
metadata: {
title: 'Custom Pet Title',
description: 'Custom description',
},
},
};
const pathItemObject = {
get: createOperation(operation),
};
processOpenApiPath(
'/pets',
pathItemObject,
schema,
nav,
decoratedNav,
writePromises,
pagesAcc,
defaultOptions,
findNavGroup
);
const page = (decoratedNav[0]?.pages as DecoratedNavigationPage[])[0];
expect(page?.title).toBe('Custom Pet Title');
expect(page?.description).toBe('Custom description');
const accPage = pagesAcc[Object.keys(pagesAcc)[0]!] as DecoratedNavigationPage;
expect(accPage.title).toBe('Custom Pet Title');
expect(accPage.description).toBe('Custom description');
});
it('should use x-mint.href to override the generated path', () => {
const nav: DecoratedNavigationPage[] = [];
const decoratedNav: DecoratedNavigationPage[] = [];
const writePromises: Promise<void>[] = [];
const pagesAcc: Record<string, DecoratedNavigationPage> = {};
const operation: Partial<OperationObject> = {
summary: 'List Pets',
tags: ['Pets'],
'x-mint': {
href: '/custom/list',
},
};
const pathItemObject = {
get: createOperation(operation),
};
processOpenApiPath(
'/pets',
pathItemObject,
schema,
nav,
decoratedNav,
writePromises,
pagesAcc,
defaultOptions,
findNavGroup
);
expect(nav).toHaveLength(1);
expect(nav[0]?.pages).toHaveLength(1);
expect((nav[0]?.pages as DecoratedNavigationPage[])[0]).toBe('custom/list');
expect(decoratedNav).toHaveLength(1);
expect(decoratedNav[0]?.pages).toHaveLength(1);
expect((decoratedNav[0]?.pages as DecoratedNavigationPage[])[0]?.href).toBe('/custom/list');
});
});