Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add tests for check markdown script #3378

Merged
merged 60 commits into from
Dec 14, 2024
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
5a90f49
initial setup
vishvamsinh28 Nov 9, 2024
5373c9f
tests updated
vishvamsinh28 Nov 9, 2024
a30cef3
test updated again
vishvamsinh28 Nov 9, 2024
a9da240
fwqfwef
vishvamsinh28 Nov 9, 2024
1079101
Merge branch 'master' into markdownTest
vishvamsinh28 Nov 10, 2024
86201ed
use async await
vishvamsinh28 Nov 10, 2024
7c44f4a
tests updated
vishvamsinh28 Nov 10, 2024
c98ecdd
wqegeg
vishvamsinh28 Nov 10, 2024
6e34205
test updated
vishvamsinh28 Nov 10, 2024
4445ce5
Merge branch 'master' into markdownTest
vishvamsinh28 Nov 11, 2024
333e0b2
feg
vishvamsinh28 Nov 11, 2024
8849351
Fixed variable shadowing
vishvamsinh28 Nov 11, 2024
1fbac7c
Merge branch 'master' into markdownTest
vishvamsinh28 Nov 13, 2024
fada5ab
added tests for continue
vishvamsinh28 Nov 13, 2024
68cd3ee
workflow re-run
vishvamsinh28 Nov 14, 2024
998af5a
workflow update
vishvamsinh28 Nov 14, 2024
f5c8964
ff
vishvamsinh28 Nov 14, 2024
d92b519
Merge branch 'master' into markdownTest
vishvamsinh28 Nov 15, 2024
d0fe33a
Merge branch 'master' into markdownTest
vishvamsinh28 Nov 18, 2024
216a511
Merge branch 'master' into markdownTest
vishvamsinh28 Nov 22, 2024
8a5235b
Merge branch 'master' into markdownTest
vishvamsinh28 Nov 23, 2024
a93b45d
suggetion applied
vishvamsinh28 Nov 23, 2024
2732f0f
suggetion applied
vishvamsinh28 Nov 23, 2024
4fcdea8
suggetion applied 2
vishvamsinh28 Nov 23, 2024
e1a16c1
test added for err
vishvamsinh28 Nov 23, 2024
7401e7f
Merge branch 'master' into markdownTest
vishvamsinh28 Nov 28, 2024
0fbdc06
main function added
vishvamsinh28 Nov 28, 2024
02e221b
added test for main function
vishvamsinh28 Nov 28, 2024
b17b83e
tests updated
vishvamsinh28 Nov 28, 2024
35d2e84
jgk
vishvamsinh28 Nov 28, 2024
7921604
test updated
vishvamsinh28 Nov 28, 2024
9d75691
Merge branch 'master' into markdownTest
vishvamsinh28 Nov 29, 2024
b36972d
Merge branch 'markdownTest' of https://github.com/vishvamsinh28/websi…
vishvamsinh28 Nov 29, 2024
dff6ccc
main function test added
vishvamsinh28 Nov 29, 2024
53c86fd
test updated
vishvamsinh28 Nov 29, 2024
92cc885
test updates
vishvamsinh28 Nov 29, 2024
871e305
Merge branch 'master' into markdownTest
vishvamsinh28 Nov 29, 2024
c0afa97
script updated
vishvamsinh28 Nov 29, 2024
10c1ba5
add tests for main function
vishvamsinh28 Nov 29, 2024
2fa09e6
test updated
vishvamsinh28 Nov 29, 2024
aa0e241
status code upudated
vishvamsinh28 Nov 29, 2024
746dc88
test updated
vishvamsinh28 Nov 29, 2024
4558748
Merge branch 'markdownTest' of https://github.com/vishvamsinh28/websi…
vishvamsinh28 Nov 29, 2024
29cd78c
script updated
vishvamsinh28 Nov 29, 2024
e50392c
Merge branch 'master' into markdownTest
vishvamsinh28 Nov 30, 2024
7a4b871
Merge branch 'master' into markdownTest
vishvamsinh28 Dec 2, 2024
d993379
Merge branch 'master' into markdownTest
vishvamsinh28 Dec 4, 2024
8d9221b
apply nitpicks
vishvamsinh28 Dec 4, 2024
f595339
coverage udpated
vishvamsinh28 Dec 4, 2024
1cb57f0
Merge branch 'master' into markdownTest
vishvamsinh28 Dec 5, 2024
4ee6c48
Merge branch 'master' into markdownTest
vishvamsinh28 Dec 7, 2024
04127eb
Merge branch 'master' into markdownTest
vishvamsinh28 Dec 7, 2024
bcaf621
remove nested try/catch
vishvamsinh28 Dec 8, 2024
dd802c4
Merge branch 'master' into markdownTest
vishvamsinh28 Dec 9, 2024
1a46eda
Merge branch 'master' into markdownTest
vishvamsinh28 Dec 9, 2024
3a9916c
Merge branch 'master' into markdownTest
vishvamsinh28 Dec 10, 2024
cc23800
apply nitpicks
vishvamsinh28 Dec 10, 2024
486b4af
Merge branch 'master' into markdownTest
vishvamsinh28 Dec 12, 2024
0a91465
Merge branch 'master' into markdownTest
vishvamsinh28 Dec 13, 2024
17dab5c
Merge branch 'master' into markdownTest
vishvamsinh28 Dec 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 26 additions & 31 deletions scripts/markdown/check-markdown.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const fs = require('fs');
const fs = require('fs').promises;
const matter = require('gray-matter');
akshatnema marked this conversation as resolved.
Show resolved Hide resolved
const path = require('path');

Expand Down Expand Up @@ -98,49 +98,44 @@ function validateDocs(frontmatter) {
* @param {Function} validateFunction - The function used to validate the frontmatter.
* @param {string} [relativePath=''] - The relative path of the folder for logging purposes.
*/
function checkMarkdownFiles(folderPath, validateFunction, relativePath = '') {
fs.readdir(folderPath, (err, files) => {
if (err) {
console.error('Error reading directory:', err);
return;
}

files.forEach(file => {
async function checkMarkdownFiles(folderPath, validateFunction, relativePath = '') {
try {
const files = await fs.readdir(folderPath);
for (const file of files) {
const filePath = path.join(folderPath, file);
const relativeFilePath = path.join(relativePath, file);

// Skip the folder 'docs/reference/specification'
if (relativeFilePath.includes('reference/specification')) {
return;
continue;
}

fs.stat(filePath, (err, stats) => {
if (err) {
console.error('Error reading file stats:', err);
return;
}
const stats = await fs.stat(filePath);

// Recurse if directory, otherwise validate markdown file
if (stats.isDirectory()) {
await checkMarkdownFiles(filePath, validateFunction, relativeFilePath);
} else if (path.extname(file) === '.md') {
const fileContent = await fs.readFile(filePath, 'utf-8');
const { data: frontmatter } = matter(fileContent);

// Recurse if directory, otherwise validate markdown file
if (stats.isDirectory()) {
checkMarkdownFiles(filePath, validateFunction, relativeFilePath);
} else if (path.extname(file) === '.md') {
const fileContent = fs.readFileSync(filePath, 'utf-8');
const { data: frontmatter } = matter(fileContent);

const errors = validateFunction(frontmatter);
if (errors) {
console.log(`Errors in file ${relativeFilePath}:`);
errors.forEach(error => console.log(` - ${error}`));
process.exitCode = 1;
}
const errors = validateFunction(frontmatter);
if (errors) {
console.log(`Errors in file ${relativeFilePath}:`);
errors.forEach(error => console.log(` - ${error}`));
process.exitCode = 1;
}
});
});
});
}
}
} catch (err) {
console.error('Error processing files:', err);
}
}
Copy link

@coderabbitai coderabbitai bot Nov 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Enhance error handling and optimize async operations.

Several improvements could be made to this function:

  1. The error handling is too generic
  2. Multiple await operations inside the loop could impact performance
  3. The 'reference/specification' skip condition needs test coverage

Consider these improvements:

 async function checkMarkdownFiles(folderPath, validateFunction, relativePath = '') {
     try {
         const files = await fs.readdir(folderPath);
+        const filePromises = files.map(async file => {
             const filePath = path.join(folderPath, file);
             const relativeFilePath = path.join(relativePath, file);
 
             if (relativeFilePath.includes('reference/specification')) {
                 return;
             }
 
-            const stats = await fs.stat(filePath);
+            try {
+                const stats = await fs.stat(filePath);
 
-            if (stats.isDirectory()) {
-                await checkMarkdownFiles(filePath, validateFunction, relativeFilePath);
-            } else if (path.extname(file) === '.md') {
-                const fileContent = await fs.readFile(filePath, 'utf-8');
-                const { data: frontmatter } = matter(fileContent);
+                if (stats.isDirectory()) {
+                    await checkMarkdownFiles(filePath, validateFunction, relativeFilePath);
+                } else if (path.extname(file) === '.md') {
+                    const fileContent = await fs.readFile(filePath, 'utf-8');
+                    const { data: frontmatter } = matter(fileContent);
 
-                const errors = validateFunction(frontmatter);
-                if (errors) {
-                    console.log(`Errors in file ${relativeFilePath}:`);
-                    errors.forEach(error => console.log(` - ${error}`));
-                    process.exitCode = 1;
+                    const errors = validateFunction(frontmatter);
+                    if (errors) {
+                        console.log(`Errors in file ${relativeFilePath}:`);
+                        errors.forEach(error => console.log(` - ${error}`));
+                        process.exitCode = 1;
+                    }
                 }
+            } catch (err) {
+                console.error(`Error processing file ${relativeFilePath}:`, err);
+                throw err;
             }
-        }
+        });
+        await Promise.all(filePromises);
     } catch (err) {
-        console.error('Error processing files:', err);
+        console.error(`Error in directory ${folderPath}:`, err);
+        throw err;
     }
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
async function checkMarkdownFiles(folderPath, validateFunction, relativePath = '') {
try {
const files = await fs.readdir(folderPath);
for (const file of files) {
const filePath = path.join(folderPath, file);
const relativeFilePath = path.join(relativePath, file);
// Skip the folder 'docs/reference/specification'
if (relativeFilePath.includes('reference/specification')) {
return;
continue;
}
fs.stat(filePath, (err, stats) => {
if (err) {
console.error('Error reading file stats:', err);
return;
}
const stats = await fs.stat(filePath);
// Recurse if directory, otherwise validate markdown file
if (stats.isDirectory()) {
await checkMarkdownFiles(filePath, validateFunction, relativeFilePath);
} else if (path.extname(file) === '.md') {
const fileContent = await fs.readFile(filePath, 'utf-8');
const { data: frontmatter } = matter(fileContent);
// Recurse if directory, otherwise validate markdown file
if (stats.isDirectory()) {
checkMarkdownFiles(filePath, validateFunction, relativeFilePath);
} else if (path.extname(file) === '.md') {
const fileContent = fs.readFileSync(filePath, 'utf-8');
const { data: frontmatter } = matter(fileContent);
const errors = validateFunction(frontmatter);
if (errors) {
console.log(`Errors in file ${relativeFilePath}:`);
errors.forEach(error => console.log(` - ${error}`));
process.exitCode = 1;
}
const errors = validateFunction(frontmatter);
if (errors) {
console.log(`Errors in file ${relativeFilePath}:`);
errors.forEach(error => console.log(` - ${error}`));
process.exitCode = 1;
}
});
});
});
}
}
} catch (err) {
console.error('Error processing files:', err);
}
async function checkMarkdownFiles(folderPath, validateFunction, relativePath = '') {
try {
const files = await fs.readdir(folderPath);
const filePromises = files.map(async file => {
const filePath = path.join(folderPath, file);
const relativeFilePath = path.join(relativePath, file);
if (relativeFilePath.includes('reference/specification')) {
return;
}
try {
const stats = await fs.stat(filePath);
if (stats.isDirectory()) {
await checkMarkdownFiles(filePath, validateFunction, relativeFilePath);
} else if (path.extname(file) === '.md') {
const fileContent = await fs.readFile(filePath, 'utf-8');
const { data: frontmatter } = matter(fileContent);
const errors = validateFunction(frontmatter);
if (errors) {
console.log(`Errors in file ${relativeFilePath}:`);
errors.forEach(error => console.log(` - ${error}`));
process.exitCode = 1;
}
}
} catch (err) {
console.error(`Error processing file ${relativeFilePath}:`, err);
throw err;
}
});
await Promise.all(filePromises);
} catch (err) {
console.error(`Error in directory ${folderPath}:`, err);
throw err;
}
}
🧰 Tools
🪛 GitHub Check: codecov/patch

[warning] 110-110: scripts/markdown/check-markdown.js#L110
Added line #L110 was not covered by tests

🪛 eslint

[error] 102-102: Delete ··

(prettier/prettier)


[error] 103-103: Replace ········ with ····

(prettier/prettier)


[error] 104-104: Delete ····

(prettier/prettier)


[error] 104-129: iterators/generators require regenerator-runtime, which is too heavyweight for this guide to allow them. Separately, loops should be avoided in favor of array iterations.

(no-restricted-syntax)


[error] 105-105: Replace ············ with ······

(prettier/prettier)


[error] 106-106: Delete ······

(prettier/prettier)


[error] 108-108: Replace ············ with ······

(prettier/prettier)


[error] 109-109: Delete ······

(prettier/prettier)


[error] 110-110: Replace ················ with ········

(prettier/prettier)


[error] 110-110: Unexpected use of continue statement.

(no-continue)


[error] 111-111: Delete ······

(prettier/prettier)


[error] 113-113: Replace ············ with ······

(prettier/prettier)


[error] 113-113: Unexpected await inside a loop.

(no-await-in-loop)


[error] 115-115: Delete ······

(prettier/prettier)


[error] 116-116: Replace ············ with ······

(prettier/prettier)


[error] 117-117: Delete ········

(prettier/prettier)


[error] 117-117: Unexpected await inside a loop.

(no-await-in-loop)


[error] 118-118: Replace ············ with ······

(prettier/prettier)


[error] 119-119: Replace ················ with ········

(prettier/prettier)


[error] 119-119: Unexpected await inside a loop.

(no-await-in-loop)


[error] 120-120: Delete ········

(prettier/prettier)


[error] 122-122: Replace ················ with ········

(prettier/prettier)


[error] 123-123: Replace ················ with ········

(prettier/prettier)


[error] 124-124: Delete ··········

(prettier/prettier)


[error] 125-125: Replace ····················errors.forEach(error with ··········errors.forEach((error)

(prettier/prettier)


[error] 126-126: Replace ···················· with ··········

(prettier/prettier)


[error] 127-127: Replace ················ with ········

(prettier/prettier)


[error] 128-128: Replace ············ with ······

(prettier/prettier)


[error] 129-129: Replace ········ with ····

(prettier/prettier)


[error] 130-130: Delete ··

(prettier/prettier)


[error] 131-131: Delete ····

(prettier/prettier)


[error] 132-132: Delete ··

(prettier/prettier)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vishvamsinh28 Can you apply this suggestion?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


const docsFolderPath = path.resolve(__dirname, '../../markdown/docs');
const blogsFolderPath = path.resolve(__dirname, '../../markdown/blog');

checkMarkdownFiles(docsFolderPath, validateDocs);
checkMarkdownFiles(blogsFolderPath, validateBlogs);

module.exports = { validateBlogs, validateDocs, checkMarkdownFiles }
95 changes: 95 additions & 0 deletions tests/markdown/check-markdown.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
const fs = require('fs').promises;
const path = require('path');
const os = require('os');
const {
validateBlogs,
validateDocs,
checkMarkdownFiles
} = require('../../scripts/markdown/check-markdown');

describe('Frontmatter Validator', () => {
let tempDir;
let mockConsoleError;

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix variable shadowing of mockConsoleError.

The mockConsoleError variable is already declared in the outer scope (line 12) but is redeclared in the test case (line 77). This could lead to confusion and potential issues.

Apply this fix:

 it('logs error to console when an error occurs in checkMarkdownFiles', async () => {
     const invalidFolderPath = path.join(tempDir, 'non-existent-folder');
-    const mockConsoleError = jest.spyOn(console, 'error').mockImplementation();

     await checkMarkdownFiles(invalidFolderPath, validateBlogs);

     expect(mockConsoleError.mock.calls[0][0]).toContain('Error processing files:');
-    mockConsoleError.mockRestore();
 });

Also applies to: 75-82

🧰 Tools
🪛 eslint

[error] 11-11: Delete ··

(prettier/prettier)


[error] 12-12: Delete ··

(prettier/prettier)

beforeEach(async () => {
mockConsoleError = jest.spyOn(console, 'error').mockImplementation();
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'test-config'));
});

afterEach(async () => {
mockConsoleError.mockRestore();
await fs.rm(tempDir, { recursive: true, force: true });
});

it('validates authors array and returns specific errors', async () => {
const frontmatter = {
title: 'Test Blog',
date: '2024-01-01',
type: 'blog',
tags: ['test'],
cover: 'cover.jpg',
authors: [{ name: 'John' }, { photo: 'jane.jpg' }, { name: 'Bob', photo: 'bob.jpg', link: 'not-a-url' }]
};

const errors = validateBlogs(frontmatter);
expect(errors).toEqual(expect.arrayContaining([
'Author at index 0 is missing a photo',
'Author at index 1 is missing a name',
'Invalid URL for author at index 2: not-a-url'
]));
});

it('validates docs frontmatter for required fields', async () => {
const frontmatter = { title: 123, weight: 'not-a-number' };
const errors = validateDocs(frontmatter);
expect(errors).toEqual(expect.arrayContaining([
'Title is missing or not a string',
'Weight is missing or not a number'
]));
});

it('checks for errors in markdown files in a directory', async () => {
await fs.writeFile(path.join(tempDir, 'invalid.md'), `---\ntitle: Invalid Blog\n---`);
const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();

await checkMarkdownFiles(tempDir, validateBlogs);

expect(mockConsoleLog).toHaveBeenCalledWith(expect.stringContaining('Errors in file invalid.md:'));
mockConsoleLog.mockRestore();
});

it('returns multiple validation errors for invalid blog frontmatter', async () => {
const frontmatter = {
title: 123,
date: 'invalid-date',
type: 'blog',
tags: 'not-an-array',
cover: ['not-a-string'],
authors: { name: 'John Doe' }
};
const errors = validateBlogs(frontmatter);

expect(errors.length).toBeGreaterThan(3);
});
Copy link

@coderabbitai coderabbitai bot Nov 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Enhance test assertions for multiple validation errors.

The test only checks the number of errors but not their specific content. This could allow incorrect error messages to pass the test.

 it('returns multiple validation errors for invalid blog frontmatter', async () => {
     const frontmatter = {
         title: 123,
         date: 'invalid-date',
         type: 'blog',
         tags: 'not-an-array',
         cover: ['not-a-string'],
         authors: { name: 'John Doe' }
     };
     const errors = validateBlogs(frontmatter);
 
-    expect(errors.length).toBeGreaterThan(3);
+    expect(errors).toEqual(expect.arrayContaining([
+        'Title must be a string',
+        'Date must be a valid date string',
+        'Tags must be an array',
+        'Cover must be a string',
+        'Authors must be an array'
+    ]));
 });

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 eslint

[error] 62-62: Delete ··

(prettier/prettier)


[error] 63-63: Delete ····

(prettier/prettier)


[error] 64-64: Delete ······

(prettier/prettier)


[error] 65-65: Replace ············ with ······

(prettier/prettier)


[error] 66-66: Delete ······

(prettier/prettier)


[error] 67-67: Replace ············ with ······

(prettier/prettier)


[error] 68-68: Replace ············ with ······

(prettier/prettier)


[error] 69-69: Delete ······

(prettier/prettier)


[error] 70-70: Delete ····

(prettier/prettier)


[error] 71-71: Delete ····

(prettier/prettier)


[error] 73-73: Delete ····

(prettier/prettier)


[error] 74-74: Delete ··

(prettier/prettier)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vishvamsinh28, thank you for making the changes!


If you found this review helpful, would you consider giving us a shout-out on X?
Thank you for using CodeRabbit!


it('logs error to console when an error occurs in checkMarkdownFiles', async () => {
const invalidFolderPath = path.join(tempDir, 'non-existent-folder');

await checkMarkdownFiles(invalidFolderPath, validateBlogs);

expect(mockConsoleError.mock.calls[0][0]).toContain('Error processing files:');
});
Copy link

@coderabbitai coderabbitai bot Nov 14, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Refactor error handling test to follow test suite patterns.

The test case should be restructured to use the existing mockConsoleError from the outer scope instead of creating a new one.

Apply this fix:

 it('logs error to console when an error occurs in checkMarkdownFiles', async () => {
     const invalidFolderPath = path.join(tempDir, 'non-existent-folder');
-    
     await checkMarkdownFiles(invalidFolderPath, validateBlogs);
-    
     expect(mockConsoleError.mock.calls[0][0]).toContain('Error processing files:');
 });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
it('logs error to console when an error occurs in checkMarkdownFiles', async () => {
const invalidFolderPath = path.join(tempDir, 'non-existent-folder');
await checkMarkdownFiles(invalidFolderPath, validateBlogs);
expect(mockConsoleError.mock.calls[0][0]).toContain('Error processing files:');
});
it('logs error to console when an error occurs in checkMarkdownFiles', async () => {
const invalidFolderPath = path.join(tempDir, 'non-existent-folder');
await checkMarkdownFiles(invalidFolderPath, validateBlogs);
expect(mockConsoleError.mock.calls[0][0]).toContain('Error processing files:');
});
🧰 Tools
🪛 eslint

[error] 75-75: Delete ··

(prettier/prettier)


[error] 76-76: Replace ········ with ····

(prettier/prettier)


[error] 77-77: Delete ····

(prettier/prettier)


[error] 78-78: Replace ········ with ····

(prettier/prettier)


[error] 79-79: Delete ····

(prettier/prettier)


[error] 80-80: Delete ····

(prettier/prettier)


[error] 81-81: Delete ··

(prettier/prettier)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vishvamsinh28 Apply this suggestion.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


it('skips the "reference/specification" folder during validation', async () => {
const referenceSpecDir = path.join(tempDir, 'reference', 'specification');
await fs.mkdir(referenceSpecDir, { recursive: true });
await fs.writeFile(path.join(referenceSpecDir, 'skipped.md'), `---\ntitle: Skipped File\n---`);

const mockConsoleLog = jest.spyOn(console, 'log').mockImplementation();

await checkMarkdownFiles(tempDir, validateDocs);

expect(mockConsoleLog).not.toHaveBeenCalledWith(expect.stringContaining('Errors in file reference/specification/skipped.md'));
mockConsoleLog.mockRestore();
});
});
Loading