105 lines
3.7 KiB
JavaScript
105 lines
3.7 KiB
JavaScript
import codeBlockLanguageBlocker from '~/content_editor/services/code_block_language_loader';
|
|
import waitForPromises from 'helpers/wait_for_promises';
|
|
import { backtickInputRegex } from '~/content_editor/extensions/code_block_highlight';
|
|
|
|
describe('content_editor/services/code_block_language_loader', () => {
|
|
let languageLoader;
|
|
let lowlight;
|
|
|
|
beforeEach(() => {
|
|
lowlight = {
|
|
languages: [],
|
|
registerLanguage: jest
|
|
.fn()
|
|
.mockImplementation((language) => lowlight.languages.push(language)),
|
|
registered: jest.fn().mockImplementation((language) => lowlight.languages.includes(language)),
|
|
};
|
|
languageLoader = codeBlockLanguageBlocker;
|
|
languageLoader.lowlight = lowlight;
|
|
});
|
|
|
|
describe('findOrCreateLanguageBySyntax', () => {
|
|
it.each`
|
|
syntax | language
|
|
${'javascript'} | ${{ syntax: 'javascript', label: 'Javascript' }}
|
|
${'js'} | ${{ syntax: 'javascript', label: 'Javascript' }}
|
|
${'jsx'} | ${{ syntax: 'javascript', label: 'Javascript' }}
|
|
`('returns a language by syntax and its variants', ({ syntax, language }) => {
|
|
expect(languageLoader.findOrCreateLanguageBySyntax(syntax)).toMatchObject(language);
|
|
});
|
|
|
|
it('returns Custom (syntax) if the language does not exist', () => {
|
|
expect(languageLoader.findOrCreateLanguageBySyntax('foobar')).toMatchObject({
|
|
syntax: 'foobar',
|
|
label: 'Custom (foobar)',
|
|
});
|
|
});
|
|
|
|
it('returns Diagram (syntax) if the language does not exist, and isDiagram = true', () => {
|
|
expect(languageLoader.findOrCreateLanguageBySyntax('foobar', true)).toMatchObject({
|
|
syntax: 'foobar',
|
|
label: 'Diagram (foobar)',
|
|
});
|
|
});
|
|
|
|
it('returns plaintext if no syntax is passed', () => {
|
|
expect(languageLoader.findOrCreateLanguageBySyntax('')).toMatchObject({
|
|
syntax: 'plaintext',
|
|
label: 'Plain text',
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('filterLanguages', () => {
|
|
it('filters languages by the given search term', () => {
|
|
expect(languageLoader.filterLanguages('ts')).toEqual([
|
|
{ label: 'Device Tree', syntax: 'dts' },
|
|
{ label: 'Kotlin', syntax: 'kotlin', variants: 'kt, kts' },
|
|
{ label: 'TypeScript', syntax: 'typescript', variants: 'ts, tsx' },
|
|
]);
|
|
});
|
|
});
|
|
|
|
describe('loadLanguage', () => {
|
|
it('loads highlight.js language packages identified by a list of languages', async () => {
|
|
const language = 'javascript';
|
|
|
|
await languageLoader.loadLanguage(language);
|
|
|
|
expect(lowlight.registerLanguage).toHaveBeenCalledWith(language, expect.any(Function));
|
|
});
|
|
|
|
describe('when language is already registered', () => {
|
|
it('does not load the language again', async () => {
|
|
await languageLoader.loadLanguage('javascript');
|
|
await languageLoader.loadLanguage('javascript');
|
|
|
|
expect(lowlight.registerLanguage).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('loadLanguageFromInputRule', () => {
|
|
it('loads highlight.js language packages identified from the input rule', async () => {
|
|
const match = new RegExp(backtickInputRegex).exec('```js ');
|
|
const attrs = languageLoader.loadLanguageFromInputRule(match);
|
|
|
|
await waitForPromises();
|
|
|
|
expect(attrs).toEqual({ language: 'javascript' });
|
|
expect(lowlight.registerLanguage).toHaveBeenCalledWith('javascript', expect.any(Function));
|
|
});
|
|
});
|
|
|
|
describe('isLanguageLoaded', () => {
|
|
it('returns true when a language is registered', async () => {
|
|
const language = 'javascript';
|
|
|
|
expect(languageLoader.isLanguageLoaded(language)).toBe(false);
|
|
|
|
await languageLoader.loadLanguage(language);
|
|
|
|
expect(languageLoader.isLanguageLoaded(language)).toBe(true);
|
|
});
|
|
});
|
|
});
|