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(); }); });