Files
2025-11-23 08:38:13 -08:00

197 lines
5.0 KiB
TypeScript

import type { Context } from '@yaakapp/api';
import { describe, expect, it } from 'vitest';
import { plugin } from '../src';
describe('regex.match', () => {
const matchFunction = plugin.templateFunctions?.find((f) => f.name === 'regex.match');
it('should exist', () => {
expect(matchFunction).toBeDefined();
});
it('should extract first capture group', async () => {
const result = await matchFunction?.onRender({} as Context, {
values: {
regex: 'Hello (\\w+)',
input: 'Hello World',
},
purpose: 'send',
});
expect(result).toBe('World');
});
it('should extract named capture group', async () => {
const result = await matchFunction?.onRender({} as Context, {
values: {
regex: 'Hello (?<name>\\w+)',
input: 'Hello World',
},
purpose: 'send',
});
expect(result).toBe('World');
});
it('should return full match when no capture groups', async () => {
const result = await matchFunction?.onRender({} as Context, {
values: {
regex: 'Hello \\w+',
input: 'Hello World',
},
purpose: 'send',
});
expect(result).toBe('Hello World');
});
it('should return empty string when no match', async () => {
const result = await matchFunction?.onRender({} as Context, {
values: {
regex: 'Goodbye',
input: 'Hello World',
},
purpose: 'send',
});
expect(result).toBe('');
});
it('should return empty string when regex is empty', async () => {
const result = await matchFunction?.onRender({} as Context, {
values: {
regex: '',
input: 'Hello World',
},
purpose: 'send',
});
expect(result).toBe('');
});
it('should return empty string when input is empty', async () => {
const result = await matchFunction?.onRender({} as Context, {
values: {
regex: 'Hello',
input: '',
},
purpose: 'send',
});
expect(result).toBe('');
});
});
describe('regex.replace', () => {
const replaceFunction = plugin.templateFunctions?.find((f) => f.name === 'regex.replace');
it('should exist', () => {
expect(replaceFunction).toBeDefined();
});
it('should replace one occurrence by default', async () => {
const result = await replaceFunction?.onRender({} as Context, {
values: {
regex: 'o',
input: 'Hello World',
replacement: 'a',
},
purpose: 'send',
});
expect(result).toBe('Hella World');
});
it('should replace with capture groups', async () => {
const result = await replaceFunction?.onRender({} as Context, {
values: {
regex: '(\\w+) (\\w+)',
input: 'Hello World',
replacement: '$2 $1',
},
purpose: 'send',
});
expect(result).toBe('World Hello');
});
it('should replace with full match reference', async () => {
const result = await replaceFunction?.onRender({} as Context, {
values: {
regex: 'World',
input: 'Hello World',
replacement: '[$&]',
},
purpose: 'send',
});
expect(result).toBe('Hello [World]');
});
it('should respect flags parameter', async () => {
const result = await replaceFunction?.onRender({} as Context, {
values: {
regex: 'hello',
input: 'Hello World',
replacement: 'Hi',
flags: 'i',
},
purpose: 'send',
});
expect(result).toBe('Hi World');
});
it('should handle empty replacement', async () => {
const result = await replaceFunction?.onRender({} as Context, {
values: {
regex: 'World',
input: 'Hello World',
replacement: '',
},
purpose: 'send',
});
expect(result).toBe('Hello ');
});
it('should return original input when no match', async () => {
const result = await replaceFunction?.onRender({} as Context, {
values: {
regex: 'Goodbye',
input: 'Hello World',
replacement: 'Hi',
},
purpose: 'send',
});
expect(result).toBe('Hello World');
});
it('should return empty string when regex is empty', async () => {
const result = await replaceFunction?.onRender({} as Context, {
values: {
regex: '',
input: 'Hello World',
replacement: 'Hi',
},
purpose: 'send',
});
expect(result).toBe('');
});
it('should return empty string when input is empty', async () => {
const result = await replaceFunction?.onRender({} as Context, {
values: {
regex: 'Hello',
input: '',
replacement: 'Hi',
},
purpose: 'send',
});
expect(result).toBe('');
});
it('should throw on invalid regex', async () => {
const fn = replaceFunction?.onRender({} as Context, {
values: {
regex: '[',
input: 'Hello World',
replacement: 'Hi',
},
purpose: 'send',
});
await expect(fn).rejects.toThrow(
'Invalid regular expression: /[/: Unterminated character class',
);
});
});