mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-09-16 14:57:15 +00:00
feat(bots): bind plugin processor configurations independently
This commit is contained in:
@@ -64,6 +64,7 @@ interface BotMock {
|
||||
adapter_config: JsonRecord;
|
||||
use_pipeline_uuid?: string;
|
||||
event_bindings: unknown[];
|
||||
plugin_processors: unknown[];
|
||||
pipeline_routing_rules: unknown[];
|
||||
adapter_runtime_values: JsonRecord;
|
||||
updated_at: string;
|
||||
@@ -505,6 +506,7 @@ function makeBot(
|
||||
? String(data.use_pipeline_uuid)
|
||||
: undefined,
|
||||
event_bindings: (data.event_bindings as unknown[] | undefined) || [],
|
||||
plugin_processors: (data.plugin_processors as unknown[] | undefined) || [],
|
||||
pipeline_routing_rules:
|
||||
(data.pipeline_routing_rules as unknown[] | undefined) || [],
|
||||
adapter_runtime_values: {
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
import { expect, test } from '@playwright/test';
|
||||
import { installLangBotApiMocks } from './fixtures/langbot-api';
|
||||
|
||||
test('creates a configured processor, persists subscriptions separately and reuses an instance', async ({
|
||||
page,
|
||||
}) => {
|
||||
await installLangBotApiMocks(page, {
|
||||
authenticated: true,
|
||||
withAdapterEvents: true,
|
||||
});
|
||||
const ref = 'plugin:test/welcome/default';
|
||||
const processors: Record<string, unknown>[] = [];
|
||||
await page.route('**/api/v1/agents/_/metadata', async (route) =>
|
||||
route.fulfill({
|
||||
json: {
|
||||
code: 0,
|
||||
data: {
|
||||
event_processors: [
|
||||
{
|
||||
id: ref,
|
||||
plugin_author: 'test',
|
||||
plugin_name: 'welcome',
|
||||
usages: ['event'],
|
||||
label: { en_US: 'Welcome members', zh_Hans: '欢迎新成员' },
|
||||
supported_event_patterns: ['group.member_joined'],
|
||||
config_schema: [
|
||||
{
|
||||
name: 'greeting',
|
||||
type: 'string',
|
||||
label: { en_US: 'Greeting', zh_Hans: '欢迎语' },
|
||||
required: true,
|
||||
default: 'Hello',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
}),
|
||||
);
|
||||
await page.route('**/api/v1/agents', async (route) => {
|
||||
if (route.request().method() === 'POST') {
|
||||
processors.push({
|
||||
...route.request().postDataJSON(),
|
||||
uuid: 'processor-new',
|
||||
supported_event_patterns: ['group.member_joined'],
|
||||
});
|
||||
return route.fulfill({
|
||||
json: {
|
||||
code: 0,
|
||||
data: { uuid: 'processor-new', kind: 'event_processor' },
|
||||
},
|
||||
});
|
||||
}
|
||||
return route.fulfill({ json: { code: 0, data: { agents: processors } } });
|
||||
});
|
||||
await page.goto('/home/bots?id=new');
|
||||
await page.getByRole('combobox').click();
|
||||
await page.getByRole('option', { name: 'Playwright Adapter' }).click();
|
||||
await page.locator('input[name="name"]').fill('Subscription Bot');
|
||||
await page.getByRole('button', { name: /^Submit$/ }).click();
|
||||
await expect(page).toHaveURL(/id=bot-1$/);
|
||||
const section = page.getByRole('region', {
|
||||
name: 'Plugin processor',
|
||||
exact: true,
|
||||
});
|
||||
await section.getByRole('button', { name: 'Add plugin processor' }).click();
|
||||
const dialog = page.getByRole('dialog');
|
||||
await dialog.getByRole('button', { name: /Welcome members/ }).click();
|
||||
await dialog.getByLabel('Name', { exact: true }).fill('Customer welcome');
|
||||
await dialog.locator('input[name="greeting"]').fill('Welcome aboard');
|
||||
await dialog.getByRole('button', { name: 'Create and bind' }).click();
|
||||
await expect(dialog).toBeHidden();
|
||||
expect(processors[0]).toMatchObject({
|
||||
kind: 'event_processor',
|
||||
component_ref: ref,
|
||||
config: { runner_config: { [ref]: { greeting: 'Welcome aboard' } } },
|
||||
});
|
||||
await expect(section).toContainText('Customer welcome');
|
||||
const save = async () => {
|
||||
const request = page.waitForRequest(
|
||||
(r) => r.method() === 'PUT' && r.url().endsWith('/platform/bots/bot-1'),
|
||||
);
|
||||
await page.getByRole('button', { name: /^Save$/ }).click();
|
||||
const body = (await request).postDataJSON();
|
||||
await expect(page.getByRole('button', { name: /^Save$/ })).toBeDisabled();
|
||||
return body;
|
||||
};
|
||||
const body = await save();
|
||||
expect(body.plugin_processors).toEqual([
|
||||
{ processor_uuid: 'processor-new', enabled: true },
|
||||
]);
|
||||
expect(body.event_bindings).toEqual([]);
|
||||
await page.reload();
|
||||
await expect(section).toContainText('Customer welcome');
|
||||
await expect(
|
||||
section.getByRole('link', { name: 'View logs' }),
|
||||
).toHaveAttribute('href', '/home/agents?id=processor-new&tab=logs');
|
||||
await section
|
||||
.getByRole('switch', { name: 'Enable Customer welcome' })
|
||||
.click();
|
||||
expect((await save()).plugin_processors).toEqual([
|
||||
{ processor_uuid: 'processor-new', enabled: false },
|
||||
]);
|
||||
await section
|
||||
.getByRole('button', { name: 'Unbind Customer welcome' })
|
||||
.click();
|
||||
await section.getByRole('button', { name: 'Add plugin processor' }).click();
|
||||
await dialog.getByRole('checkbox', { name: /Customer welcome/ }).check();
|
||||
await dialog
|
||||
.getByRole('button', { name: 'Add plugin processor', exact: true })
|
||||
.click();
|
||||
await expect(section).toContainText('Customer welcome');
|
||||
expect(processors).toHaveLength(1);
|
||||
|
||||
processors.push({
|
||||
...processors[0],
|
||||
uuid: 'processor-observer',
|
||||
name: 'Event observer',
|
||||
});
|
||||
await page.reload();
|
||||
await section
|
||||
.getByRole('button', { name: 'Unbind Customer welcome' })
|
||||
.click();
|
||||
await section.getByRole('button', { name: 'Add plugin processor' }).click();
|
||||
await dialog.getByRole('checkbox', { name: /Customer welcome/ }).check();
|
||||
await dialog.getByRole('checkbox', { name: /Event observer/ }).check();
|
||||
await dialog
|
||||
.getByRole('button', { name: 'Add plugin processor', exact: true })
|
||||
.click();
|
||||
expect((await save()).plugin_processors).toEqual([
|
||||
{ processor_uuid: 'processor-new', enabled: true },
|
||||
{ processor_uuid: 'processor-observer', enabled: true },
|
||||
]);
|
||||
});
|
||||
Reference in New Issue
Block a user