diff --git a/packages/editor-ui/src/Interface.ts b/packages/editor-ui/src/Interface.ts index 1f799a3fa1..ee54891261 100644 --- a/packages/editor-ui/src/Interface.ts +++ b/packages/editor-ui/src/Interface.ts @@ -364,6 +364,7 @@ export interface ICredentialsResponse extends ICredentialsEncrypted { currentUserHasAccess?: boolean; scopes?: Scope[]; ownedBy?: Pick; + isManaged: boolean; } export interface ICredentialsBase { diff --git a/packages/editor-ui/src/__tests__/server/factories/credential.ts b/packages/editor-ui/src/__tests__/server/factories/credential.ts index 1cd28a06e6..5612d0d4d9 100644 --- a/packages/editor-ui/src/__tests__/server/factories/credential.ts +++ b/packages/editor-ui/src/__tests__/server/factories/credential.ts @@ -18,4 +18,7 @@ export const credentialFactory = Factory.extend({ updatedAt() { return ''; }, + isManaged() { + return false; + }, }); diff --git a/packages/editor-ui/src/components/CredentialCard.test.ts b/packages/editor-ui/src/components/CredentialCard.test.ts index 7b3abc6acb..e21edf0321 100644 --- a/packages/editor-ui/src/components/CredentialCard.test.ts +++ b/packages/editor-ui/src/components/CredentialCard.test.ts @@ -17,6 +17,7 @@ const createCredential = (overrides = {}): ICredentialsResponse => ({ type: '', name: '', sharedWithProjects: [], + isManaged: false, homeProject: {} as ProjectSharingData, ...overrides, }); diff --git a/packages/editor-ui/src/components/CredentialCard.vue b/packages/editor-ui/src/components/CredentialCard.vue index c39166f15a..d82c67d83e 100644 --- a/packages/editor-ui/src/components/CredentialCard.vue +++ b/packages/editor-ui/src/components/CredentialCard.vue @@ -39,6 +39,7 @@ const props = withDefaults( name: '', sharedWithProjects: [], homeProject: {} as ProjectSharingData, + isManaged: false, }), readOnly: false, }, diff --git a/packages/editor-ui/src/components/CredentialConfig.test.ts b/packages/editor-ui/src/components/CredentialConfig.test.ts new file mode 100644 index 0000000000..b84fcb3eae --- /dev/null +++ b/packages/editor-ui/src/components/CredentialConfig.test.ts @@ -0,0 +1,56 @@ +import CredentialConfig from './CredentialEdit/CredentialConfig.vue'; +import { screen } from '@testing-library/vue'; +import type { ICredentialDataDecryptedObject, ICredentialType } from 'n8n-workflow'; +import { createTestingPinia } from '@pinia/testing'; +import type { RenderOptions } from '@/__tests__/render'; +import { createComponentRenderer } from '@/__tests__/render'; +import { STORES } from '@/constants'; + +const defaultRenderOptions: RenderOptions = { + pinia: createTestingPinia({ + initialState: { + [STORES.SETTINGS]: { + settings: { + enterprise: { + sharing: false, + externalSecrets: false, + }, + }, + }, + }, + }), + props: { + isManaged: true, + mode: 'edit', + credentialType: {} as ICredentialType, + credentialProperties: [], + credentialData: {} as ICredentialDataDecryptedObject, + credentialPermissions: { + share: false, + move: false, + create: false, + read: false, + update: false, + delete: false, + list: false, + }, + }, +}; + +const renderComponent = createComponentRenderer(CredentialConfig, defaultRenderOptions); + +describe('CredentialConfig', () => { + it('should display a warning when isManaged is true', async () => { + renderComponent(); + expect( + screen.queryByText('This is a managed credential and cannot be edited.'), + ).toBeInTheDocument(); + }); + + it('should not display a warning when isManaged is false', async () => { + renderComponent({ props: { isManaged: false } }, { merge: true }); + expect( + screen.queryByText('This is a managed credential and cannot be edited.'), + ).not.toBeInTheDocument(); + }); +}); diff --git a/packages/editor-ui/src/components/CredentialEdit/CredentialConfig.vue b/packages/editor-ui/src/components/CredentialEdit/CredentialConfig.vue index fa754304fa..45c1802852 100644 --- a/packages/editor-ui/src/components/CredentialEdit/CredentialConfig.vue +++ b/packages/editor-ui/src/components/CredentialEdit/CredentialConfig.vue @@ -55,6 +55,7 @@ type Props = { isRetesting?: boolean; requiredPropertiesFilled?: boolean; showAuthTypeSelector?: boolean; + isManaged?: boolean; }; const props = withDefaults(defineProps(), { @@ -235,7 +236,10 @@ watch(showOAuthSuccessBanner, (newValue, oldValue) => {