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,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();
|
||||
});
|
||||
},
|
||||
);
|
||||
Reference in New Issue
Block a user