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);
});
});