Files
alighasami 3d5eaf9445
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
first commit
2026-03-17 16:22:57 +03:30

161 lines
5.2 KiB
TypeScript

import { test, expect } from '../../../fixtures/base';
test.use({ capability: { env: { TEST_ISOLATION: 'global-credentials' } } });
test.describe('Global credentials', {
annotation: [
{ type: 'owner', description: 'Identity & Access' },
],
}, () => {
test.describe.configure({ mode: 'serial' });
test.beforeAll(async ({ api }) => {
await api.enableFeature('sharing');
});
test('owner should create HTTP header credential and set to global', async ({ n8n }) => {
await n8n.api.signin('owner');
// Navigate to credentials page
await n8n.navigate.toCredentials();
// Create new credential
await n8n.credentials.addResource.credential();
await n8n.credentials.selectCredentialType('Header Auth');
// Fill in credential fields
await n8n.credentials.credentialModal.fillField('name', 'Authorization');
await n8n.credentials.credentialModal.fillField('value', 'Bearer test-token-123');
// Set credential name
await n8n.credentials.credentialModal.getCredentialName().click();
await n8n.credentials.credentialModal.getNameInput().fill('Global HTTP Header Cred');
// Switch to Sharing tab
await n8n.credentials.credentialModal.changeTab('Sharing');
// Share with all users (set to global)
await n8n.credentials.credentialModal.getUsersSelect().click();
await n8n.credentials.credentialModal.getVisibleDropdown().getByText('All users').click();
// Save the credential with sharing
await n8n.credentials.credentialModal.save();
await n8n.credentials.credentialModal.close();
// Verify credential appears in list with global badge
await expect(n8n.credentials.cards.getCredential('Global HTTP Header Cred')).toBeVisible();
await expect(
n8n.credentials.cards
.getCredential('Global HTTP Header Cred')
.getByTestId('credential-global-badge'),
).toBeVisible();
});
test('member should see global credential in credentials view', async ({ n8n }) => {
await n8n.api.signin('member', 0);
// Navigate to credentials page
await n8n.navigate.toCredentials();
// Verify global credential is visible to member
await expect(n8n.credentials.cards.getCredential('Global HTTP Header Cred')).toBeVisible();
// Verify global badge is displayed
await expect(
n8n.credentials.cards
.getCredential('Global HTTP Header Cred')
.getByTestId('credential-global-badge'),
).toBeVisible();
});
test('member should execute workflow with HTTP node using global credential', async ({
n8n,
baseURL,
}) => {
await n8n.api.signin('member', 0);
// Create a new workflow
await n8n.navigate.toWorkflow('new');
await n8n.canvas.setWorkflowName('Test Global Credential Workflow');
// Add manual trigger and HTTP Request node
await n8n.canvas.addNode('Manual Trigger');
await n8n.canvas.addNode('HTTP Request');
await n8n.ndv.fillParameterInput('URL', `${baseURL}/rest/settings`);
await n8n.ndv.selectOptionInParameterDropdown('authentication', 'Generic Credential Type');
await n8n.ndv.selectOptionInParameterDropdown('genericAuthType', 'Header Auth');
// Verify global credential is available in the credential select
const credentialSelect = n8n.ndv.getCredentialSelect();
await credentialSelect.click();
// Check that global credential appears in dropdown
const dropdown = n8n.credentials.credentialModal.getVisibleDropdown();
await expect(dropdown.getByText('Global HTTP Header Cred')).toBeVisible();
// Select the global credential
await dropdown.getByText('Global HTTP Header Cred').click();
// Verify credential is selected
await expect(credentialSelect).toHaveValue('Global HTTP Header Cred');
// Close NDV
await n8n.ndv.clickBackToCanvasButton();
await n8n.workflowComposer.executeWorkflowAndWaitForNotification(
'Workflow executed successfully',
);
});
test('owner should be able to remove global sharing', async ({ n8n }) => {
await n8n.api.signin('owner');
// Navigate to credentials page
await n8n.navigate.toCredentials();
// Open the global credential
await n8n.credentials.cards.getCredential('Global HTTP Header Cred').click();
// Switch to Sharing tab
await n8n.credentials.credentialModal.changeTab('Sharing');
// Verify "All users" is in the sharing list
await expect(
n8n.credentials.credentialModal
.getModal()
.getByTestId('project-sharing-list-item')
.filter({ hasText: 'All users' }),
).toBeVisible();
// Remove global sharing by clicking the remove button
await n8n.credentials.credentialModal
.getModal()
.getByTestId('project-sharing-list-item')
.filter({ hasText: 'All users' })
.getByTestId('project-sharing-remove')
.click();
// Save the changes
await n8n.credentials.credentialModal.save();
await n8n.credentials.credentialModal.close();
// Verify global badge is no longer visible
await expect(
n8n.credentials.cards
.getCredential('Global HTTP Header Cred')
.getByTestId('credential-global-badge'),
).toBeHidden();
});
test('member should not see credential after global sharing removed', async ({ n8n }) => {
await n8n.api.signin('member', 0);
// Navigate to credentials page
await n8n.navigate.toCredentials();
// Verify credential is no longer visible to member
await expect(n8n.credentials.cards.getCredential('Global HTTP Header Cred')).toBeHidden();
});
});