mirror of
https://github.com/rustdesk/doc.rustdesk.com.git
synced 2026-07-16 11:44:03 +00:00
78 lines
2.4 KiB
JavaScript
78 lines
2.4 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
|
|
import {
|
|
buildPostAlternates,
|
|
findTranslatedPost,
|
|
groupPostsByTranslationKey,
|
|
localizedPath,
|
|
validatePostTranslations,
|
|
} from '../src/utils/blog-i18n.mjs';
|
|
|
|
const posts = [
|
|
{
|
|
lang: 'en',
|
|
translationKey: 'acl-1-5',
|
|
slug: 'acl',
|
|
permalink: 'blog/2025/02/acl',
|
|
},
|
|
{
|
|
lang: 'zh-cn',
|
|
translationKey: 'acl-1-5',
|
|
slug: '增强-acl',
|
|
permalink: 'zh-cn/blog/2025/02/增强-acl',
|
|
},
|
|
];
|
|
|
|
test('groups and resolves translations by stable key', () => {
|
|
assert.equal(groupPostsByTranslationKey(posts).get('acl-1-5').length, 2);
|
|
assert.equal(findTranslatedPost(posts[0], posts, 'zh-cn'), posts[1]);
|
|
});
|
|
|
|
test('builds localized and default-locale paths', () => {
|
|
assert.equal(localizedPath('en', 'blog'), '/blog');
|
|
assert.equal(localizedPath('ja', 'blog'), '/ja/blog');
|
|
assert.equal(localizedPath('zh-cn', 'blog/2025/02/增强-acl'), '/zh-cn/blog/2025/02/增强-acl');
|
|
});
|
|
|
|
test('reports missing locales and duplicate locale entries', () => {
|
|
assert.throws(() => validatePostTranslations(posts, ['en', 'zh-cn', 'de']), /missing locale de/i);
|
|
assert.throws(
|
|
() => validatePostTranslations([...posts, { ...posts[0], slug: 'acl-copy' }], ['en', 'zh-cn']),
|
|
/duplicate locale en/i
|
|
);
|
|
});
|
|
|
|
test('allows a post to publish in one locale before translations exist', () => {
|
|
assert.doesNotThrow(() => validatePostTranslations([posts[0]], ['en', 'zh-cn', 'de']));
|
|
});
|
|
|
|
test('rejects unsupported locales and duplicate slugs in one locale', () => {
|
|
assert.throws(() => validatePostTranslations([{ ...posts[0], lang: 'xx' }], ['en']), /unsupported locale xx/i);
|
|
assert.throws(
|
|
() =>
|
|
validatePostTranslations(
|
|
[
|
|
{ ...posts[0], translationKey: 'a', slug: 'same' },
|
|
{ ...posts[0], translationKey: 'b', slug: 'same' },
|
|
],
|
|
['en']
|
|
),
|
|
/duplicate slug same/i
|
|
);
|
|
});
|
|
|
|
test('rejects a locale that does not match the content directory', () => {
|
|
assert.throws(
|
|
() => validatePostTranslations([{ ...posts[0], id: 'zh-cn/acl.md' }], ['en', 'zh-cn']),
|
|
/directory zh-cn does not match locale en/i
|
|
);
|
|
});
|
|
|
|
test('builds alternate links from actual translated permalinks', () => {
|
|
assert.deepEqual(buildPostAlternates(posts[0], posts, ['en', 'zh-cn']), [
|
|
{ lang: 'en', path: '/blog/2025/02/acl' },
|
|
{ lang: 'zh-cn', path: '/zh-cn/blog/2025/02/增强-acl' },
|
|
]);
|
|
});
|