import express from 'express'
import { RuleController } from './DynamicRuleController'
import { StorageController } from './StorageController'
import { TelegramController } from './TelegramController'
async function makeInitedDynamicRuleController () {
const app = express()
const storageController = new StorageController({
url: `${__dirname}/../test/empty-test-git-storage`,
localCachePath: './.storage.test.rule.tmp',
serverUrl: 'https://localhost:3001',
})
await storageController.init(app)
const controller = new RuleController({
serverUrl: 'https://localhost:3001',
storageController,
ruleControllers: [
new TelegramController({ serverUrl: 'https://localhost:3001', token: '', callbackUrl: '' }),
storageController,
],
})
await controller.init(app)
return controller
}
test('DynamicRuleController.init()', async () => {
const controller = await makeInitedDynamicRuleController()
expect(controller.name).toEqual('_rule')
})
test('DynamicRuleController validation action', async () => {
const controller = await makeInitedDynamicRuleController()
const result = await controller.action('_updateRules', {
namespace: 'test',
rules: JSON.stringify([
{
controller: 'telegram',
when: 'message',
case: '{{ chat.id and document.mime_type === "multipart/x-zip" and document.file_size < 12300100 and document.file_name.endsWith("serverless.zip") }}',
do: [
{
controller: 'telegram',
action: '_temporarilyDownloadFileLocally',
as: 'localFilePath',
args: {
fileId: '{{ document.file_id }}',
},
},
],
},
]),
})
expect(result).toEqual({
namespace: 'test',
error: 'AssertionError [ERR_ASSERTION]: rules: "do"."action" name should not starts with _',
})
})
test('DynamicRuleController validation controller', async () => {
const controller = await makeInitedDynamicRuleController()
const result = await controller.action('_updateRules', {
namespace: 'test',
rules: JSON.stringify([
{
controller: '_rules',
when: 'message',
case: '{{ chat.id and document.mime_type === "multipart/x-zip" and document.file_size < 12300100 and document.file_name.endsWith("serverless.zip") }}',
do: [
{
'controller': 'telegram',
'action': 'sendMessage',
'args': {
'chatId': '{{ chat.id }}',
'text': 'Hi from `{{ chat.id }}`',
'mode': 'Markdown',
},
},
],
},
]),
})
expect(result).toEqual({
namespace: 'test',
error: 'AssertionError [ERR_ASSERTION]: rules: "controller" name should not starts with _',
})
})
test('DynamicRuleController rules', async () => {
const controller = await makeInitedDynamicRuleController()
const result = await controller.action('_updateRules', {
namespace: 'test',
rules: JSON.stringify([
{
'controller': 'github',
'when': 'check_run',
'case': '{{ action == "completed" and check_run.status == "completed" and sender.login == "pahaz" }}',
'do': [
{
'controller': 'telegram',
'action': 'sendMessage',
'args': {
'chatId': '-144812829',
'text': '{{ check_run.name | escape }}: {{ check_run.conclusion }}\n{{ repository.full_name }}/run/{{ check_run.id }} (
{{ check_run.check_suite.head_branch | escape }})\nby {{ sender.login }}',
'mode': 'HTML',
},
},
],
},
{
'controller': 'telegram',
'when': 'message',
'case': '{{ sticker.set_name == "Cat2O" and sticker.file_unique_id == "AgADQQADKA9qFA" }}',
'do': [
{
'controller': 'telegram',
'action': 'sendSticker',
'args': {
'chatId': '{{ chat.id }}',
'sticker': 'CAACAgIAAxkBAAIBA2HHn2i4ZT38s_hEy8cSBnddF0J4AAI1AAMoD2oUUlHZS3d3sAUjBA',
},
},
],
},
{
'controller': 'telegram',
'when': 'message',
'case': '{{ r/(привет|что это|ты кто|что умеешь|как)/ig.test(text) and chat.type == "private" }}',
'do': [
{
'controller': 'telegram',
'action': 'sendMessage',
'args': {
'chatId': '{{ chat.id }}',
'text': 'Я БоТ! Короче, мне надо прислать `rules.json` файлик!',
'mode': 'Markdown',
},
},
],
},
{
'controller': 'telegram',
'when': 'message',
'case': '{{ new_chat_participant.username === "DevBot" or group_chat_created }}',
'do': [
{
'controller': 'telegram',
'action': 'sendMessage',
'args': {
'chatId': '{{ chat.id }}',
'text': 'Привет! Я программируемый бот!',
},
},
],
},
{
'controller': 'telegram',
'when': 'message',
'case': '{{ r/^(скажи|подскажи|какой)?.*(chatId|чатид|чат ид|ид чата)/ig.test(text) }}',
'do': [
{
'controller': 'telegram',
'action': 'sendMessage',
'args': {
'chatId': '{{ chat.id }}',
'text': 'Если что, chatIdэтого чатика
{{ chat.id }}',
'mode': 'HTML',
},
},
],
},
{
'controller': 'scheduler',
'when': '* * * * *',
'do': [
{
'controller': 'telegram',
'action': 'sendMessage',
'args': {
'chatId': '-744812727',
'text': 'БДИ!',
},
},
],
},
]),
})
expect(result).toEqual({
namespace: 'test',
error: 'Error: unknown rule controller name: github. Allowed: telegram, storage',
})
})