Improve wizard mapping and quality guidance
This commit is contained in:
@@ -122,6 +122,7 @@ test('wizard loads reusable upstreams from backend', async ({ page }) => {
|
||||
);
|
||||
|
||||
await page.goto('/wizard/');
|
||||
await expect(page.locator('#step-panel-1')).toBeVisible();
|
||||
await page.locator('[data-testid="wizard-protocol-rest"]').click();
|
||||
await page.locator('.btn-continue').click();
|
||||
await expect(page.locator('#step-panel-2')).toBeVisible();
|
||||
@@ -132,6 +133,69 @@ test('wizard loads reusable upstreams from backend', async ({ page }) => {
|
||||
await expect(page.locator('#upstream-dropdown-list')).not.toContainText('Open Meteo');
|
||||
});
|
||||
|
||||
test('wizard builds visual request mappings from JSON sample and path params', async ({ page }) => {
|
||||
await login(page);
|
||||
|
||||
await page.goto('/wizard/');
|
||||
await page.locator('[data-testid="wizard-protocol-rest"]').click();
|
||||
await page.evaluate(() => window.CrankWizardShell.doGoToStep(2));
|
||||
await expect(page.locator('#step-panel-2')).toBeVisible();
|
||||
await page.locator('#endpoint-path').fill('/rates/{date}');
|
||||
|
||||
await page.evaluate(() => window.CrankWizardShell.doGoToStep(3));
|
||||
await expect(page.locator('#step-panel-3-rest')).toBeVisible();
|
||||
await page.locator('.method-card[data-method="GET"]').click();
|
||||
|
||||
await page.evaluate(() => window.CrankWizardShell.doGoToStep(5));
|
||||
await expect(page.locator('#step-panel-5')).toBeVisible();
|
||||
|
||||
await page.locator('#wizard-input-sample').fill(JSON.stringify({
|
||||
date: '2024-01-01',
|
||||
base: 'USD',
|
||||
symbols: 'EUR',
|
||||
}, null, 2));
|
||||
await page.locator('#wizard-output-sample').fill(JSON.stringify({
|
||||
base: 'USD',
|
||||
rates: {
|
||||
EUR: 0.91,
|
||||
},
|
||||
providers: [
|
||||
{
|
||||
name: 'ecb',
|
||||
priority: 1,
|
||||
},
|
||||
],
|
||||
}, null, 2));
|
||||
|
||||
await page.locator('#wizard-format-samples').click();
|
||||
|
||||
await expect(page.locator('[data-testid="wizard-request-mapping-rows"] [data-role="input"]').first()).toHaveValue('date');
|
||||
await expect(page.locator('[data-testid="wizard-request-mapping-rows"] [data-role="input"]').nth(1)).toHaveValue('base');
|
||||
await expect(page.locator('#tool-input-mapping')).toHaveValue(/path\.date/);
|
||||
await expect(page.locator('#tool-input-mapping')).toHaveValue(/query\.base/);
|
||||
await expect(page.locator('#tool-input-mapping')).toHaveValue(/query\.symbols/);
|
||||
await expect(page.locator('#tool-input-schema')).toHaveValue(/"date"/);
|
||||
await expect(page.locator('#tool-output-schema')).toHaveValue(/"rates"/);
|
||||
await expect(page.locator('[data-testid="wizard-response-json-tree"]')).toContainText('rates.EUR');
|
||||
await expect(page.locator('[data-testid="wizard-response-json-tree"]')).toContainText('providers[0].name');
|
||||
await expect(page.locator('#tool-output-mapping')).toHaveValue(/providers_0_name: \$\.response\.body\.providers\[0\]\.name/);
|
||||
await expect(page.locator('[data-testid="wizard-mapping-warnings"]')).toContainText(/одного элемента массива/);
|
||||
|
||||
await page.locator('#wizard-add-request-mapping-row').click();
|
||||
const defaultRow = page.locator('[data-testid="wizard-request-mapping-rows"] [data-mapping-row="request"]').last();
|
||||
await defaultRow.locator('[data-role="input"]').fill('group');
|
||||
await defaultRow.locator('[data-role="target"]').selectOption('query');
|
||||
await defaultRow.locator('[data-role="apiName"]').fill('group');
|
||||
await defaultRow.locator('[data-role="defaultValue"]').fill('month');
|
||||
await defaultRow.locator('[data-role="transform"]').selectOption('to_string');
|
||||
await expect(page.locator('#tool-input-mapping')).toHaveValue(/query\.group:/);
|
||||
await expect(page.locator('#tool-input-mapping')).toHaveValue(/default_value: month/);
|
||||
await expect(page.locator('#tool-input-mapping')).toHaveValue(/transform: to_string/);
|
||||
|
||||
await page.locator('[data-testid="wizard-request-mapping-rows"] .mapping-row-remove').first().click();
|
||||
await expect(page.locator('[data-testid="wizard-mapping-warnings"]')).toContainText(/date/);
|
||||
});
|
||||
|
||||
test('wizard edit mode hydrates fields from operation version snapshot', async ({ page }) => {
|
||||
await login(page);
|
||||
const workspace = await getCurrentWorkspace(page);
|
||||
@@ -301,6 +365,15 @@ test('wizard edit mode hydrates fields from operation version snapshot', async (
|
||||
from: 'GBP',
|
||||
to: 'USD',
|
||||
},
|
||||
import_findings: [
|
||||
{
|
||||
severity: 'warning',
|
||||
code: 'openapi_import.weak_tool_description',
|
||||
message: 'Описание инструмента слишком короткое или техническое.',
|
||||
suggested_action: 'Уточните, когда агент должен вызывать инструмент.',
|
||||
field_path: 'GET /rates',
|
||||
},
|
||||
],
|
||||
},
|
||||
samples: [],
|
||||
generated_draft: null,
|
||||
@@ -338,6 +411,13 @@ test('wizard edit mode hydrates fields from operation version snapshot', async (
|
||||
await expect(page.locator('#wizard-test-input')).toHaveValue(/"from": "GBP"/);
|
||||
await expect(page.locator('#wizard-test-input')).toHaveValue(/"to": "USD"/);
|
||||
await expect(page.locator('#wizard-test-input')).not.toHaveValue(/Ada/);
|
||||
|
||||
await page.evaluate(() => window.CrankWizardShell.doGoToStep(5));
|
||||
await expect(page.locator('#wizard-quality-findings')).toContainText('Описание инструмента слишком короткое');
|
||||
await expect(page.locator('#wizard-quality-findings')).toContainText('GET /rates');
|
||||
await page.getByRole('button', { name: 'Перейти к описанию' }).click();
|
||||
await expect(page.locator('#step-panel-4')).toBeVisible();
|
||||
await expect(page.locator('#tool-description')).toBeFocused();
|
||||
});
|
||||
|
||||
test('wizard shows agent-facing MCP preview from current draft fields', async ({ page }) => {
|
||||
@@ -669,6 +749,7 @@ test('wizard edit mode preserves explicit request mapping targets on save', asyn
|
||||
target: '$.request.query.group',
|
||||
required: false,
|
||||
default_value: 'month',
|
||||
transform: { kind: 'to_string' },
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -706,6 +787,15 @@ test('wizard edit mode preserves explicit request mapping targets on save', asyn
|
||||
base: 'CHF',
|
||||
symbols: 'JPY',
|
||||
},
|
||||
import_findings: [
|
||||
{
|
||||
severity: 'warning',
|
||||
code: 'openapi_import.weak_tool_description',
|
||||
message: 'Описание инструмента слишком короткое или техническое.',
|
||||
suggested_action: 'Уточните описание.',
|
||||
field_path: 'GET /latest',
|
||||
},
|
||||
],
|
||||
},
|
||||
samples: [],
|
||||
generated_draft: null,
|
||||
@@ -719,6 +809,7 @@ test('wizard edit mode preserves explicit request mapping targets on save', asyn
|
||||
await page.goto(`/wizard/?mode=edit&operationId=${operationId}`);
|
||||
await expect(page.locator('#tool-input-mapping')).toHaveValue(/query\.base/);
|
||||
await expect(page.locator('#tool-input-mapping')).toHaveValue(/path\.date/);
|
||||
await expect(page.locator('#tool-input-mapping')).toHaveValue(/transform: to_string/);
|
||||
await page.locator('.btn-save-draft').click();
|
||||
await expect.poll(() => updatePayload).not.toBeNull();
|
||||
|
||||
@@ -766,6 +857,15 @@ test('wizard edit mode preserves explicit request mapping targets on save', asyn
|
||||
base: 'CHF',
|
||||
symbols: 'JPY',
|
||||
},
|
||||
import_findings: [
|
||||
{
|
||||
severity: 'warning',
|
||||
code: 'openapi_import.weak_tool_description',
|
||||
message: 'Описание инструмента слишком короткое или техническое.',
|
||||
suggested_action: 'Уточните описание.',
|
||||
field_path: 'GET /latest',
|
||||
},
|
||||
],
|
||||
});
|
||||
expect(updatePayload.input_mapping.rules).toEqual([
|
||||
{ source: '$.mcp.base', target: '$.request.query.base', required: true },
|
||||
@@ -776,6 +876,7 @@ test('wizard edit mode preserves explicit request mapping targets on save', asyn
|
||||
target: '$.request.query.group',
|
||||
required: false,
|
||||
default_value: 'month',
|
||||
transform: { kind: 'to_string' },
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user