first commit
Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled
Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
import { test, expect } from '../../../fixtures/base';
|
||||
import type { n8nPage } from '../../../pages/n8nPage';
|
||||
|
||||
// Helper functions for common operations
|
||||
async function waitForWorkflowSuccess(n8n: n8nPage, timeout = 10000) {
|
||||
await n8n.notifications.waitForNotificationAndClose('Workflow executed successfully', {
|
||||
timeout,
|
||||
});
|
||||
}
|
||||
|
||||
test.use({ capability: 'proxy' });
|
||||
test.describe('Langchain Integration @capability:proxy', {
|
||||
annotation: [
|
||||
{ type: 'owner', description: 'AI' },
|
||||
],
|
||||
}, () => {
|
||||
test.beforeEach(async ({ n8n, services }) => {
|
||||
await services.proxy.clearAllExpectations();
|
||||
await services.proxy.loadExpectations('langchain');
|
||||
await n8n.canvas.openNewWorkflow();
|
||||
});
|
||||
|
||||
test.describe('Advanced Workflow Features', () => {
|
||||
test('should render runItems for sub-nodes and allow switching between them', async ({
|
||||
n8n,
|
||||
}) => {
|
||||
await n8n.start.fromImportedWorkflow('In_memory_vector_store_fake_embeddings.json');
|
||||
await n8n.canvas.clickZoomToFitButton();
|
||||
await n8n.canvas.deselectAll();
|
||||
|
||||
await n8n.canvas.executeNode('Populate VS');
|
||||
await waitForWorkflowSuccess(n8n);
|
||||
|
||||
const assertInputOutputTextExists = async (text: string) => {
|
||||
await expect(n8n.ndv.getOutputPanel()).toContainText(text);
|
||||
await expect(n8n.ndv.getInputPanel()).toContainText(text);
|
||||
};
|
||||
|
||||
const assertInputOutputTextNotExists = async (text: string) => {
|
||||
await expect(n8n.ndv.getOutputPanel()).not.toContainText(text);
|
||||
await expect(n8n.ndv.getInputPanel()).not.toContainText(text);
|
||||
};
|
||||
|
||||
await n8n.canvas.openNode('Character Text Splitter');
|
||||
|
||||
await expect(n8n.ndv.getOutputRunSelector()).toBeVisible();
|
||||
await expect(n8n.ndv.getInputRunSelector()).toBeVisible();
|
||||
await expect(n8n.ndv.getInputRunSelectorInput()).toHaveValue('3 of 3');
|
||||
await expect(n8n.ndv.getOutputRunSelectorInput()).toHaveValue('3 of 3');
|
||||
await assertInputOutputTextExists('Kyiv');
|
||||
await assertInputOutputTextNotExists('Berlin');
|
||||
await assertInputOutputTextNotExists('Prague');
|
||||
|
||||
await n8n.ndv.changeOutputRunSelector('2 of 3');
|
||||
await assertInputOutputTextExists('Berlin');
|
||||
await assertInputOutputTextNotExists('Kyiv');
|
||||
await assertInputOutputTextNotExists('Prague');
|
||||
|
||||
await n8n.ndv.changeOutputRunSelector('1 of 3');
|
||||
await assertInputOutputTextExists('Prague');
|
||||
await assertInputOutputTextNotExists('Berlin');
|
||||
await assertInputOutputTextNotExists('Kyiv');
|
||||
|
||||
await n8n.ndv.toggleInputRunLinking();
|
||||
await n8n.ndv.changeOutputRunSelector('2 of 3');
|
||||
await expect(n8n.ndv.getInputRunSelectorInput()).toHaveValue('1 of 3');
|
||||
await expect(n8n.ndv.getOutputRunSelectorInput()).toHaveValue('2 of 3');
|
||||
await expect(n8n.ndv.getInputPanel()).toContainText('Prague');
|
||||
await expect(n8n.ndv.getInputPanel()).not.toContainText('Berlin');
|
||||
|
||||
await expect(n8n.ndv.getOutputPanel()).toContainText('Berlin');
|
||||
await expect(n8n.ndv.getOutputPanel()).not.toContainText('Prague');
|
||||
|
||||
await n8n.ndv.toggleInputRunLinking();
|
||||
await expect(n8n.ndv.getInputRunSelectorInput()).toHaveValue('1 of 3');
|
||||
await expect(n8n.ndv.getOutputRunSelectorInput()).toHaveValue('1 of 3');
|
||||
await assertInputOutputTextExists('Prague');
|
||||
await assertInputOutputTextNotExists('Berlin');
|
||||
await assertInputOutputTextNotExists('Kyiv');
|
||||
});
|
||||
|
||||
test('should execute up to Node 1 when using partial execution', async ({ n8n }) => {
|
||||
await n8n.start.fromImportedWorkflow('Test_workflow_chat_partial_execution.json');
|
||||
await n8n.canvas.clickZoomToFitButton();
|
||||
|
||||
// Check that chat modal is not initially visible
|
||||
await expect(n8n.canvas.getManualChatModal().getByTestId('canvas-chat-body')).toBeHidden();
|
||||
|
||||
// Open Node 1 and execute it
|
||||
await n8n.canvas.openNode('Node 1');
|
||||
await n8n.ndv.execute();
|
||||
// Chat modal should now be visible
|
||||
await expect(n8n.canvas.getManualChatModal().getByTestId('canvas-chat-body')).toBeVisible();
|
||||
|
||||
// Send first message
|
||||
await n8n.canvas.logsPanel.sendManualChatMessage('Test');
|
||||
await expect(n8n.canvas.getManualChatLatestBotMessage()).toContainText('this_my_field_1');
|
||||
|
||||
// Refresh session
|
||||
await n8n.canvas.logsPanel.refreshSession();
|
||||
await expect(n8n.canvas.logsPanel.getManualChatMessages()).not.toBeAttached();
|
||||
|
||||
// Send another message
|
||||
await n8n.canvas.logsPanel.sendManualChatMessage('Another test');
|
||||
await expect(n8n.canvas.getManualChatLatestBotMessage()).toContainText('this_my_field_3');
|
||||
await expect(n8n.canvas.getManualChatLatestBotMessage()).toContainText('this_my_field_4');
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user