Fixes errors in GFM slash commands matcher and add tests for default matcher
See !8975
This commit is contained in:
parent
35b31ba84f
commit
f0e5938018
|
@ -83,12 +83,12 @@
|
||||||
_a = decodeURI("%C3%80");
|
_a = decodeURI("%C3%80");
|
||||||
_y = decodeURI("%C3%BF");
|
_y = decodeURI("%C3%BF");
|
||||||
|
|
||||||
regexp = new RegExp("^(?:\\B|[^a-zA-Z0-9_" + atSymbolsWithoutBar + "]|\\s)" + flag + "(?![" + atSymbolsWithBar + "])(([A-Za-z" + _a + "-" + _y + "0-9_\'\.\+\-]|[^\\x00-\\x7a])*)$", 'gi');
|
regexp = new RegExp("^(?:\\B|[^a-zA-Z0-9_" + atSymbolsWithoutBar + "]|\\s)" + flag + "(?!" + atSymbolsWithBar + ")((?:[A-Za-z" + _a + "-" + _y + "0-9_\'\.\+\-]|[^\\x00-\\x7a])*)$", 'gi');
|
||||||
|
|
||||||
match = regexp.exec(subtext);
|
match = regexp.exec(subtext);
|
||||||
|
|
||||||
if (match) {
|
if (match) {
|
||||||
return (match[1] || match[1] === "") ? match[1] : match[2];
|
return match[1];
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: Fix errors in slash commands matcher, add simple test coverage
|
||||||
|
merge_request:
|
||||||
|
author: YarNayar
|
|
@ -1,3 +1,5 @@
|
||||||
|
/* eslint no-param-reassign: "off" */
|
||||||
|
|
||||||
require('~/gfm_auto_complete');
|
require('~/gfm_auto_complete');
|
||||||
require('vendor/jquery.caret');
|
require('vendor/jquery.caret');
|
||||||
require('vendor/jquery.atwho');
|
require('vendor/jquery.atwho');
|
||||||
|
@ -63,6 +65,61 @@ describe('GfmAutoComplete', function () {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('DefaultOptions.matcher', function () {
|
||||||
|
const defaultMatcher = (context, flag, subtext) => (
|
||||||
|
GfmAutoComplete.DefaultOptions.matcher.call(context, flag, subtext)
|
||||||
|
);
|
||||||
|
|
||||||
|
const flagsUseDefaultMatcher = ['@', '#', '!', '~', '%'];
|
||||||
|
const otherFlags = ['/', ':'];
|
||||||
|
const flags = flagsUseDefaultMatcher.concat(otherFlags);
|
||||||
|
|
||||||
|
const flagsHash = flags.reduce((hash, el) => { hash[el] = null; return hash; }, {});
|
||||||
|
const atwhoInstance = { setting: {}, app: { controllers: flagsHash } };
|
||||||
|
|
||||||
|
const minLen = 1;
|
||||||
|
const maxLen = 20;
|
||||||
|
const argumentSize = [minLen, maxLen / 2, maxLen];
|
||||||
|
|
||||||
|
const allowedSymbols = ['', 'a', 'n', 'z', 'A', 'Z', 'N', '0', '5', '9', 'А', 'а', 'Я', 'я', '.', '\'', '+', '-', '_'];
|
||||||
|
const jointAllowedSymbols = allowedSymbols.join('');
|
||||||
|
|
||||||
|
describe('should match regular symbols', () => {
|
||||||
|
flagsUseDefaultMatcher.forEach((flag) => {
|
||||||
|
allowedSymbols.forEach((symbol) => {
|
||||||
|
argumentSize.forEach((size) => {
|
||||||
|
const query = new Array(size + 1).join(symbol);
|
||||||
|
const subtext = flag + query;
|
||||||
|
|
||||||
|
it(`matches argument "${flag}" with query "${subtext}"`, () => {
|
||||||
|
expect(defaultMatcher(atwhoInstance, flag, subtext)).toBe(query);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`matches combination of allowed symbols for flag "${flag}"`, () => {
|
||||||
|
const subtext = flag + jointAllowedSymbols;
|
||||||
|
|
||||||
|
expect(defaultMatcher(atwhoInstance, flag, subtext)).toBe(jointAllowedSymbols);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('should not match special sequences', () => {
|
||||||
|
const ShouldNotBeFollowedBy = flags.concat(['\x00', '\x10', '\x3f', '\n', ' ']);
|
||||||
|
|
||||||
|
flagsUseDefaultMatcher.forEach((atSign) => {
|
||||||
|
ShouldNotBeFollowedBy.forEach((followedSymbol) => {
|
||||||
|
const seq = atSign + followedSymbol;
|
||||||
|
|
||||||
|
it(`should not match "${seq}"`, () => {
|
||||||
|
expect(defaultMatcher(atwhoInstance, atSign, seq)).toBe(null);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('isLoading', function () {
|
describe('isLoading', function () {
|
||||||
it('should be true with loading data object item', function () {
|
it('should be true with loading data object item', function () {
|
||||||
expect(GfmAutoComplete.isLoading({ name: 'loading' })).toBe(true);
|
expect(GfmAutoComplete.isLoading({ name: 'loading' })).toBe(true);
|
||||||
|
|
Loading…
Reference in New Issue