From ce9c61ff2376701b503e47be34ec03c64a08027c Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Sun, 30 Apr 2023 16:11:17 -0500 Subject: [PATCH] tests: write test for parseMarkdown function --- src/app/lib/markdoc.ts | 6 +- .../{Markdoc.spec.ts => Markdoc.spec.tsx} | 104 ++++++++++++++++++ 2 files changed, 108 insertions(+), 2 deletions(-) rename tests/unit/{Markdoc.spec.ts => Markdoc.spec.tsx} (64%) diff --git a/src/app/lib/markdoc.ts b/src/app/lib/markdoc.ts index 5aedf1e..ec6c03b 100644 --- a/src/app/lib/markdoc.ts +++ b/src/app/lib/markdoc.ts @@ -8,7 +8,7 @@ import Fence from '../components/Fence'; import { DOCS_PATH } from '../constants'; import { Doc, DocSection } from './../types/types'; -const markDocConfig = { +export const markDocConfig = { nodes: { fence: { render: 'Fence', @@ -48,7 +48,9 @@ const markDocConfig = { }, }; -function parseMarkdown(sourcePath: string): ReactNode { +export function parseMarkdown( + sourcePath: string +): ReactNode { const source = fs.readFileSync(sourcePath, 'utf8'); const ast = Markdoc.parse(source); const content = Markdoc.transform( diff --git a/tests/unit/Markdoc.spec.ts b/tests/unit/Markdoc.spec.tsx similarity index 64% rename from tests/unit/Markdoc.spec.ts rename to tests/unit/Markdoc.spec.tsx index c44339c..ca65df1 100644 --- a/tests/unit/Markdoc.spec.ts +++ b/tests/unit/Markdoc.spec.tsx @@ -1,19 +1,29 @@ +import Clients from '@/app/components/Clients'; +import CodeSnippet from '@/app/components/CodeSnippet'; +import Fence from '@/app/components/Fence'; import { DOCS_PATH } from '@/app/constants'; import { getCopyPath, getExamplePath, + markDocConfig, + parseMarkdown, } from '@/app/lib/markdoc'; import { Doc } from '@/app/types/types'; +import { default as Markdoc } from '@markdoc/markdoc'; +import fs from 'fs'; import path from 'path'; +import React from 'react'; describe('Markdoc lib functions', () => { describe('getCopyPath', () => { const version = 'v1.0.0'; + const doc: Doc = { title: 'Title', folder: 'folder', copy: 'copy.md', }; + const docPath = 'path/to/doc'; it('returns empty string if doc.copy is undefined', () => { @@ -21,18 +31,22 @@ describe('Markdoc lib functions', () => { title: 'Title', folder: 'folder', }; + const result = getCopyPath(version, doc, docPath); + expect(result).toEqual(''); }); it('returns correct copy path', () => { const result = getCopyPath(version, doc, docPath); + const expected = path.join( DOCS_PATH, version, docPath, doc.copy! ); + expect(result).toEqual(expected); }); @@ -42,23 +56,27 @@ describe('Markdoc lib functions', () => { doc, '/path/to/doc/' ); + const expected = path.join( DOCS_PATH, version, docPath, doc.copy! ); + expect(result).toEqual(expected); }); it('returns correct copy path with different version', () => { const result = getCopyPath('v2.0.0', doc, docPath); + const expected = path.join( DOCS_PATH, 'v2.0.0', docPath, doc.copy! ); + expect(result).toEqual(expected); }); @@ -68,23 +86,27 @@ describe('Markdoc lib functions', () => { doc, 'path/to/nested/doc' ); + const expected = path.join( DOCS_PATH, version, 'path/to/nested/doc', doc.copy! ); + expect(result).toEqual(expected); }); }); describe('getExamplePath', () => { const version = 'v1.0.0'; + const doc: Doc = { title: 'Title', folder: 'folder', example: 'example.md', }; + const docPath = 'path/to/doc'; it('returns empty string if doc.example is undefined', () => { @@ -92,18 +114,22 @@ describe('Markdoc lib functions', () => { title: 'Title', folder: 'folder', }; + const result = getExamplePath(version, doc, docPath); + expect(result).toEqual(''); }); it('returns correct example path', () => { const result = getExamplePath(version, doc, docPath); + const expected = path.join( DOCS_PATH, version, docPath, doc.example! ); + expect(result).toEqual(expected); }); @@ -113,23 +139,27 @@ describe('Markdoc lib functions', () => { doc, '/path/to/doc/' ); + const expected = path.join( DOCS_PATH, version, docPath, doc.example! ); + expect(result).toEqual(expected); }); it('returns correct example path with different version', () => { const result = getExamplePath('v2.0.0', doc, docPath); + const expected = path.join( DOCS_PATH, 'v2.0.0', docPath, doc.example! ); + expect(result).toEqual(expected); }); @@ -139,12 +169,86 @@ describe('Markdoc lib functions', () => { doc, 'path/to/nested/doc' ); + const expected = path.join( DOCS_PATH, version, 'path/to/nested/doc', doc.example! ); + + expect(result).toEqual(expected); + }); + }); + + describe('parseMarkdown', () => { + const sourcePath = 'test.md'; + const sourceContent = '# Test Heading'; + + beforeAll(() => { + jest + .spyOn(fs, 'readFileSync') + .mockReturnValue(sourceContent); + }); + + it('should parse markdown file and return react node', () => { + const expected = ( +
+

Test Heading

+
+ ); + + const result = parseMarkdown(sourcePath); + + expect(result).toEqual(expected); + }); + + it('should read source file using the correct path', () => { + parseMarkdown(sourcePath); + + expect(fs.readFileSync).toHaveBeenCalledWith( + sourcePath, + 'utf8' + ); + }); + + it('should transform the AST using markDocConfig', () => { + const ast = Markdoc.parse(sourceContent); + const spy = jest.spyOn(Markdoc, 'transform'); + + parseMarkdown(sourcePath); + + expect(spy).toHaveBeenCalledWith( + ast, + markDocConfig as any + ); + }); + + it('should render react components using Markdoc.renderers', () => { + const ast = Markdoc.parse(sourceContent); + + const content = Markdoc.transform( + ast, + markDocConfig as any + ); + + const expected = ( +
+

Test Heading

+
+ ); + + const spy = jest.spyOn(Markdoc.renderers, 'react'); + const result = parseMarkdown(sourcePath); + + expect(spy).toHaveBeenCalledWith(content, React, { + components: { + CodeSnippet: CodeSnippet, + Fence: Fence, + Clients: Clients, + }, + }); + expect(result).toEqual(expected); }); });