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

This commit is contained in:
2026-03-17 16:22:57 +03:30
commit 3d5eaf9445
15349 changed files with 2847338 additions and 0 deletions
@@ -0,0 +1,21 @@
import { test, expect } from '../../../fixtures/base';
test.describe(
'Admin user',
{
annotation: [{ type: 'owner', description: 'Identity & Access' }],
},
() => {
test('should see same Settings sub menu items as instance owner', async ({ n8n }) => {
await n8n.api.setupTest('signin-only', 'owner');
await n8n.settingsPersonal.gotoSettings();
const ownerMenuItems = await n8n.settingsPersonal.getMenuItems().count();
await n8n.api.setupTest('signin-only', 'admin');
await n8n.settingsPersonal.gotoSettings();
await expect(n8n.settingsPersonal.getMenuItems()).toHaveCount(ownerMenuItems);
});
},
);
@@ -0,0 +1,22 @@
import { test, expect } from '../../../fixtures/base';
test.describe('Authentication', {
annotation: [
{ type: 'owner', description: 'Identity & Access' },
],
}, () => {
const testCases = [
{ role: 'default', expectedUrl: /\/workflow/, auth: '' },
{ role: 'owner', expectedUrl: /\/workflow/, auth: '@auth:owner' },
{ role: 'admin', expectedUrl: /\/workflow/, auth: '@auth:admin' },
{ role: 'member', expectedUrl: /\/workflow/, auth: '@auth:member' },
{ role: 'none', expectedUrl: /\/signin/, auth: '@auth:none' },
];
for (const { role, expectedUrl, auth } of testCases) {
test(`${role} authentication ${auth}`, async ({ n8n }) => {
await n8n.goHome();
await expect(n8n.page).toHaveURL(expectedUrl);
});
}
});
@@ -0,0 +1,35 @@
import { test, expect } from '../../../fixtures/base';
test.use({
capability: 'oidc',
ignoreHTTPSErrors: true, // Keycloak uses self-signed certs
});
test.describe('OIDC Authentication @capability:oidc', {
annotation: [
{ type: 'owner', description: 'Identity & Access' },
],
}, () => {
test('should configure OIDC and login with Keycloak @auth:owner', async ({
n8n,
api,
services,
}) => {
const keycloak = services.keycloak;
await api.enableFeature('oidc');
await n8n.oidcComposer.configureOidc(
keycloak.internalDiscoveryUrl,
keycloak.clientId,
keycloak.clientSecret,
);
await n8n.sideBar.signOutFromWorkflows();
await n8n.page.waitForURL('/signin');
await n8n.signIn.getSsoButton().click();
await n8n.keycloakLogin.login(keycloak.testUser.email, keycloak.testUser.password);
await expect(n8n.page).toHaveURL(/\/(workflow|home)/);
await expect(n8n.sideBar.getSettings()).toBeVisible();
});
});
@@ -0,0 +1,21 @@
import { test, expect } from '../../../fixtures/base';
test.use({ capability: 'email' });
test('Password reset email is delivered @capability:email', {
annotation: [
{ type: 'owner', description: 'Identity & Access' },
],
}, async ({ api, services }) => {
const ownerEmail = 'nathan@n8n.io';
const res = await api.request.post('/rest/forgot-password', {
data: { email: ownerEmail },
});
expect(res.ok()).toBeTruthy();
const msg = await services.mailpit.waitForMessage({
to: ownerEmail,
subject: /password reset/i,
});
expect(msg).toBeTruthy();
});
@@ -0,0 +1,23 @@
import { INSTANCE_OWNER_CREDENTIALS } from '../../../config/test-users';
import { test, expect } from '../../../fixtures/base';
test.describe(
'Sign In',
{
annotation: [{ type: 'owner', description: 'Identity & Access' }],
},
() => {
test('should login and logout @auth:none', async ({ n8n }) => {
await n8n.goHome();
await n8n.signIn.goto();
await n8n.signIn.loginWithEmailAndPassword(
INSTANCE_OWNER_CREDENTIALS.email,
INSTANCE_OWNER_CREDENTIALS.password,
);
await expect(n8n.sideBar.getSettings()).toBeVisible();
});
},
);