Files
crashtestdev/tests/migrate-posts.test.mjs
Ken 62fe16623b feat: migrate existing posts to Astro content collection
Copy two existing blog posts from content/posts/ (old Gatsby location)
to src/content/posts/ with updated frontmatter:

- localize-react-without-bloating-the-bundle.md
- speeding-up-webpack-typescript-incremental-builds-by-7x.md (was .mdx)

Frontmatter changes: removed path/heroImage fields, added type/tags/summary,
simplified date to YYYY-MM-DD format. Body content preserved verbatim.
2026-05-26 23:11:49 +00:00

155 lines
6.3 KiB
JavaScript

import { describe, it } from 'node:test';
import { strict as assert } from 'node:assert';
import { readFileSync, existsSync } from 'node:fs';
import { resolve } from 'node:path';
const postsDir = resolve('src/content/posts');
const post1Path = resolve(postsDir, 'localize-react-without-bloating-the-bundle.md');
const post2Path = resolve(postsDir, 'speeding-up-webpack-typescript-incremental-builds-by-7x.md');
const originalPost1Path = resolve('content/posts/localize-react-without-bloating-the-bundle.md');
const originalPost2Path = resolve('content/posts/speeding-up-webpack-typescript-incremental-builds-by-7x.mdx');
function extractFrontmatter(content) {
const match = content.match(/^---\n([\s\S]*?)\n---/);
return match ? match[1] : null;
}
function extractBody(content) {
const match = content.match(/^---\n[\s\S]*?\n---\n([\s\S]*)$/);
return match ? match[1] : null;
}
describe('Migrated post: localize-react-without-bloating-the-bundle', () => {
it('should exist at src/content/posts/localize-react-without-bloating-the-bundle.md', () => {
assert.ok(existsSync(post1Path), 'Post file should exist');
});
describe('Frontmatter', () => {
it('should have title field', () => {
const content = readFileSync(post1Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.match(fm, /title:\s*['"]?Localize React without Bloating the Bundle['"]?/, 'should have correct title');
});
it('should have date as 2019-08-16 (YYYY-MM-DD)', () => {
const content = readFileSync(post1Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.match(fm, /date:\s*2019-08-16\s*$/m, 'should have simplified date');
});
it('should have type: post', () => {
const content = readFileSync(post1Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.match(fm, /type:\s*post/, 'should have type: post');
});
it('should have correct tags', () => {
const content = readFileSync(post1Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.match(fm, /tags:/, 'should have tags field');
assert.match(fm, /react/, 'should include react tag');
assert.match(fm, /localization/, 'should include localization tag');
assert.match(fm, /webpack/, 'should include webpack tag');
assert.match(fm, /performance/, 'should include performance tag');
});
it('should have summary field', () => {
const content = readFileSync(post1Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.match(fm, /summary:/, 'should have summary field');
});
it('should NOT have path field', () => {
const content = readFileSync(post1Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.doesNotMatch(fm, /^path:/m, 'should not have path field');
});
it('should NOT have heroImage field', () => {
const content = readFileSync(post1Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.doesNotMatch(fm, /heroImage:/, 'should not have heroImage field');
});
});
describe('Body content', () => {
it('should have body matching original post verbatim', () => {
const newContent = readFileSync(post1Path, 'utf-8');
const originalContent = readFileSync(originalPost1Path, 'utf-8');
const newBody = extractBody(newContent);
const originalBody = extractBody(originalContent);
assert.equal(newBody, originalBody, 'Body content should match original exactly');
});
});
});
describe('Migrated post: speeding-up-webpack-typescript-incremental-builds-by-7x', () => {
it('should exist at src/content/posts/speeding-up-webpack-typescript-incremental-builds-by-7x.md', () => {
assert.ok(existsSync(post2Path), 'Post file should exist');
});
it('should be a .md file (not .mdx)', () => {
assert.ok(post2Path.endsWith('.md'), 'should be .md extension');
assert.ok(!post2Path.endsWith('.mdx'), 'should not be .mdx extension');
});
describe('Frontmatter', () => {
it('should have title field', () => {
const content = readFileSync(post2Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.match(fm, /title:\s*['"]?Speeding Up Webpack Typescript Incremental Builds by 7x['"]?/, 'should have correct title');
});
it('should have date as 2019-08-16 (YYYY-MM-DD)', () => {
const content = readFileSync(post2Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.match(fm, /date:\s*2019-08-16\s*$/m, 'should have simplified date');
});
it('should have type: post', () => {
const content = readFileSync(post2Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.match(fm, /type:\s*post/, 'should have type: post');
});
it('should have correct tags', () => {
const content = readFileSync(post2Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.match(fm, /tags:/, 'should have tags field');
assert.match(fm, /webpack/, 'should include webpack tag');
assert.match(fm, /typescript/, 'should include typescript tag');
assert.match(fm, /performance/, 'should include performance tag');
assert.match(fm, /microsoft/, 'should include microsoft tag');
});
it('should have summary field', () => {
const content = readFileSync(post2Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.match(fm, /summary:/, 'should have summary field');
});
it('should NOT have path field', () => {
const content = readFileSync(post2Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.doesNotMatch(fm, /^path:/m, 'should not have path field');
});
it('should NOT have heroImage field', () => {
const content = readFileSync(post2Path, 'utf-8');
const fm = extractFrontmatter(content);
assert.doesNotMatch(fm, /heroImage:/, 'should not have heroImage field');
});
});
describe('Body content', () => {
it('should have body matching original post verbatim', () => {
const newContent = readFileSync(post2Path, 'utf-8');
const originalContent = readFileSync(originalPost2Path, 'utf-8');
const newBody = extractBody(newContent);
const originalBody = extractBody(originalContent);
assert.equal(newBody, originalBody, 'Body content should match original exactly');
});
});
});