test: Add credential helper and ndv helper (#18636)

This commit is contained in:
shortstacked
2025-08-21 17:40:30 +01:00
committed by GitHub
parent 944960bf43
commit 8ca75d6f51
10 changed files with 747 additions and 7 deletions

View File

@@ -0,0 +1,195 @@
import type { CreateCredentialDto } from '@n8n/api-types';
import { test, expect } from '../../fixtures/base';
test.describe('Credential API Operations', () => {
test.describe('Basic CRUD Operations', () => {
test('should create, retrieve, update, and delete credential', async ({ api }) => {
const credentialData: CreateCredentialDto = {
name: 'Test HTTP Basic Auth',
type: 'httpBasicAuth',
data: {
user: 'test_user',
password: 'test_password',
},
};
const { credentialId, createdCredential } =
await api.credentialApi.createCredentialFromDefinition(credentialData);
expect(credentialId).toBeTruthy();
expect(createdCredential.type).toBe('httpBasicAuth');
expect(createdCredential.name).toContain('Test HTTP Basic Auth (Test');
const retrievedCredential = await api.credentialApi.getCredential(credentialId);
expect(retrievedCredential.id).toBe(credentialId);
expect(retrievedCredential.type).toBe('httpBasicAuth');
expect(retrievedCredential.name).toBe(createdCredential.name);
const credentialWithData = await api.credentialApi.getCredential(credentialId, {
includeData: true,
});
expect(credentialWithData.data).toBeDefined();
expect(credentialWithData.data?.user).toBe('test_user');
const updatedName = 'Updated HTTP Basic Auth';
const updatedCredential = await api.credentialApi.updateCredential(credentialId, {
name: updatedName,
data: {
user: 'updated_user',
password: 'updated_password',
},
});
expect(updatedCredential.name).toBe(updatedName);
const verifyUpdated = await api.credentialApi.getCredential(credentialId, {
includeData: true,
});
expect(verifyUpdated.name).toBe(updatedName);
expect(verifyUpdated.data?.user).toBe('updated_user');
const deleteResult = await api.credentialApi.deleteCredential(credentialId);
expect(deleteResult).toBe(true);
await expect(api.credentialApi.getCredential(credentialId)).rejects.toThrow();
});
});
test.describe('Credential Listing', () => {
test('should list credentials with different query options', async ({ api }) => {
const credential1 = await api.credentialApi.createCredentialFromDefinition({
name: 'First Test Credential',
type: 'httpBasicAuth',
data: { user: 'user1', password: 'pass1' },
});
const credential2 = await api.credentialApi.createCredentialFromDefinition({
name: 'Second Test Credential',
type: 'httpHeaderAuth',
data: { name: 'Authorization', value: 'Bearer token' },
});
const allCredentials = await api.credentialApi.getCredentials();
expect(allCredentials.length).toBeGreaterThanOrEqual(2);
const createdIds = [credential1.credentialId, credential2.credentialId];
const foundCredentials = allCredentials.filter((c) => createdIds.includes(c.id));
expect(foundCredentials).toHaveLength(2);
const credentialsWithScopes = await api.credentialApi.getCredentials({
includeScopes: true,
});
expect(credentialsWithScopes[0].scopes).toBeDefined();
expect(Array.isArray(credentialsWithScopes[0].scopes)).toBe(true);
const credentialsWithData = await api.credentialApi.getCredentials({
includeData: true,
});
const foundWithData = credentialsWithData.filter((c) => createdIds.includes(c.id));
expect(foundWithData.some((c) => c.data)).toBe(true);
});
});
test.describe('Project Integration', () => {
test('should handle credential-project associations', async ({ api }) => {
await api.enableFeature('projectRole:admin');
await api.enableFeature('projectRole:editor');
await api.setMaxTeamProjectsQuota(-1);
const project = await api.projectApi.createProject('Test Project for Credentials');
const credential = await api.credentialApi.createCredentialFromDefinition({
name: 'Project Credential',
type: 'httpBasicAuth',
data: { user: 'user', password: 'pass' },
projectId: project.id,
});
const projectCredentials = await api.credentialApi.getCredentialsForWorkflow({
projectId: project.id,
});
expect(projectCredentials).toBeDefined();
expect(Array.isArray(projectCredentials)).toBe(true);
const foundCredential = projectCredentials.find((c) => c.id === credential.credentialId);
expect(foundCredential).toBeDefined();
});
test('should transfer credential between projects', async ({ api }) => {
await api.enableFeature('projectRole:admin');
await api.enableFeature('projectRole:editor');
await api.setMaxTeamProjectsQuota(-1);
const sourceProject = await api.projectApi.createProject('Source Project');
const destinationProject = await api.projectApi.createProject('Destination Project');
const credential = await api.credentialApi.createCredentialFromDefinition({
name: 'Transfer Test Credential',
type: 'httpBasicAuth',
data: { user: 'user', password: 'pass' },
projectId: sourceProject.id,
});
const sourceCredentials = await api.credentialApi.getCredentialsForWorkflow({
projectId: sourceProject.id,
});
const foundInSource = sourceCredentials.find((c) => c.id === credential.credentialId);
expect(foundInSource).toBeDefined();
await api.credentialApi.transferCredential(credential.credentialId, destinationProject.id);
const destinationCredentials = await api.credentialApi.getCredentialsForWorkflow({
projectId: destinationProject.id,
});
const foundInDestination = destinationCredentials.find(
(c) => c.id === credential.credentialId,
);
expect(foundInDestination).toBeDefined();
const sourceCredentialsAfter = await api.credentialApi.getCredentialsForWorkflow({
projectId: sourceProject.id,
});
const stillInSource = sourceCredentialsAfter.find((c) => c.id === credential.credentialId);
expect(stillInSource).toBeUndefined();
});
});
test.describe('Data Persistence', () => {
test('should maintain credential data across operations', async ({ api }) => {
const originalData: CreateCredentialDto = {
name: 'Persistence Test Credential',
type: 'httpBasicAuth',
data: {
user: 'persistent_user',
password: 'persistent_password',
},
};
const { credentialId } = await api.credentialApi.createCredentialFromDefinition(originalData);
const afterCreate = await api.credentialApi.getCredential(credentialId, {
includeData: true,
});
expect(afterCreate.data?.user).toBe('persistent_user');
await api.credentialApi.updateCredential(credentialId, {
data: {
user: 'updated_persistent_user',
password: 'updated_persistent_password',
},
});
const afterUpdate = await api.credentialApi.getCredential(credentialId, {
includeData: true,
});
expect(afterUpdate.data?.user).toBe('updated_persistent_user');
expect(afterUpdate.data?.password).toBeDefined();
const allCredentials = await api.credentialApi.getCredentials();
const foundCredential = allCredentials.find((c) => c.id === credentialId);
expect(foundCredential).toBeDefined();
expect(foundCredential!.type).toBe('httpBasicAuth');
});
});
});