Improve wizard mapping and quality guidance

This commit is contained in:
github-ops
2026-06-23 21:03:25 +00:00
parent 052b9356ec
commit 04f63e690c
7 changed files with 1228 additions and 24 deletions
+101
View File
@@ -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' },
},
]);
});