Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/early-moles-talk.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sap-ux/generator-adp': patch
---

fix: Project name appears twice under system and password prompts when cloud system is selected.
19 changes: 17 additions & 2 deletions packages/generator-adp/src/app/questions/configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ import {
} from './helper/conditions';
import { getExtProjectMessage } from './helper/message';
import { validateExtensibilityExtension } from './helper/validators';
import type { IMessageSeverity } from '@sap-devx/yeoman-ui-types';

/**
* A stateful prompter class that creates configuration questions.
Expand Down Expand Up @@ -106,6 +107,10 @@ export class ConfigPrompter {
* Error message to be shown in the confirm extension project prompt.
*/
private appValidationErrorMessage: string | undefined;
/**
* System additional message.
*/
private systemAdditionalMessage: IMessageSeverity | undefined;
/**
* Indicates whether views are loaded synchronously.
*/
Expand Down Expand Up @@ -273,7 +278,10 @@ export class ConfigPrompter {
},
default: '',
validate: async (value: string, answers: ConfigAnswers) => await this.validateSystem(value, answers),
additionalMessages: () => getSystemAdditionalMessages(this.flexUISystem, !!this.isCloudProject)
additionalMessages: () => {
this.systemAdditionalMessage = getSystemAdditionalMessages(this.flexUISystem, this.isCloud);
return this.systemAdditionalMessage;
}
};
}

Expand Down Expand Up @@ -341,7 +349,13 @@ export class ConfigPrompter {
},
validate: async (value: string, answers: ConfigAnswers) => await this.validatePassword(value, answers),
when: (answers: ConfigAnswers) => showCredentialQuestion(answers, this.isAuthRequired),
additionalMessages: () => getSystemAdditionalMessages(this.flexUISystem, !!this.isCloudProject)
additionalMessages: () => {
if (!this.systemAdditionalMessage) {
this.systemAdditionalMessage = getSystemAdditionalMessages(this.flexUISystem, this.isCloud);
return this.systemAdditionalMessage;
}
return undefined;
}
};
}

Expand Down Expand Up @@ -598,6 +612,7 @@ export class ConfigPrompter {
try {
this.targetApps = [];
this.flexUISystem = undefined;
this.isCloudProject = undefined;
this.abapProvider = await getConfiguredProvider(options, this.logger);
this.isAuthRequired = await this.systemLookup.getSystemRequiresAuth(system);
if (!this.isAuthRequired) {
Expand Down
57 changes: 51 additions & 6 deletions packages/generator-adp/test/unit/questions/configuration.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
import type { ConfigAnswers, SourceApplication, SystemLookup, UI5Version } from '@sap-ux/adp-tooling';
import type {
ConfigAnswers,
FlexUISupportedSystem,
SourceApplication,
SystemLookup,
UI5Version
} from '@sap-ux/adp-tooling';
import {
FlexLayer,
SourceManifest,
Expand All @@ -20,6 +26,7 @@ import { ConfigPrompter } from '../../../src/app/questions/configuration';
import { configPromptNames } from '../../../src/app/types';
import { initI18n, t } from '../../../src/utils/i18n';
import { getSystemAdditionalMessages } from '../../../src/app/questions/helper/additional-messages';
import { type IMessageSeverity, Severity } from '@sap-devx/yeoman-ui-types';

jest.mock('../../../src/app/questions/helper/conditions', () => ({
showApplicationQuestion: jest.fn().mockResolvedValue(true),
Expand Down Expand Up @@ -108,6 +115,10 @@ const getSystemAdditionalMessagesMock = getSystemAdditionalMessages as jest.Mock
describe('ConfigPrompter Integration Tests', () => {
let configPrompter: ConfigPrompter;
const layer = FlexLayer.CUSTOMER_BASE;
const systemAdditionalMessage: IMessageSeverity = {
message: 'System additional message',
severity: Severity.information
};

beforeAll(async () => {
await initI18n();
Expand Down Expand Up @@ -183,18 +194,21 @@ describe('ConfigPrompter Integration Tests', () => {
...sourceSystems,
getSystemRequiresAuth: jest.fn().mockResolvedValueOnce(false).mockResolvedValueOnce(true)
} as unknown as SystemLookup;
isAbapCloudMock.mockResolvedValue(true);
configPrompter = new ConfigPrompter(systemLookup, layer, logger);
const prompts = configPrompter.getPrompts();
const systemPrompt = prompts.find((p) => p.name === configPromptNames.system);
expect(systemPrompt).toBeDefined();

const result1 = await systemPrompt?.validate?.('SYS010', dummyAnswers);
expect(configPrompter['isCloudProject']).toBe(true);
const result2 = await systemPrompt?.validate?.('SYS010_NOAUTH', dummyAnswers);

expect(result1).toEqual(true);
expect(result2).toEqual(true);
expect(configPrompter['flexUISystem']).toEqual(undefined);
expect(configPrompter['isAuthRequired']).toEqual(true);
expect(configPrompter['isCloudProject']).toBeUndefined();
});

it('system prompt validate should throw error', async () => {
Expand Down Expand Up @@ -253,6 +267,24 @@ describe('ConfigPrompter Integration Tests', () => {

expect(result).toEqual(true);
});

it('should set system additional messages when additionalMessages callback gets called', async () => {
const prompts = configPrompter.getPrompts();
const systemPrompt = prompts.find((p) => p.name === configPromptNames.system);
getSystemAdditionalMessagesMock.mockReturnValue(systemAdditionalMessage);
const flexUISystem: FlexUISupportedSystem = {
isUIFlex: true,
isOnPremise: false
};
configPrompter['flexUISystem'] = flexUISystem;
configPrompter['isCloudProject'] = true;

const result = await systemPrompt?.additionalMessages?.();

expect(result).toEqual(systemAdditionalMessage);
expect(getSystemAdditionalMessagesMock).toHaveBeenCalledWith(flexUISystem, true);
expect(configPrompter['systemAdditionalMessage']).toEqual(systemAdditionalMessage);
});
});

describe('System CLI Validation Prompt', () => {
Expand Down Expand Up @@ -360,16 +392,29 @@ describe('ConfigPrompter Integration Tests', () => {
expect(result).toEqual(`Authentication error: ${axiosError.message}`);
});

it('password prompt additionalMessages should return undefined if value is passed', async () => {
it('password prompt additionalMessages should return undefined if system additional messages are already set', async () => {
const prompts = configPrompter.getPrompts();
const passwordPrompt = prompts.find((p) => p.name === configPromptNames.password);
expect(passwordPrompt).toBeDefined();
const systemAdditionalMessage = 'System additional message';
getSystemAdditionalMessagesMock.mockResolvedValue(systemAdditionalMessage);
configPrompter['systemAdditionalMessage'] = systemAdditionalMessage;

const result = await passwordPrompt?.additionalMessages?.(dummyApps[0]);
const additionalMessages = await passwordPrompt?.additionalMessages?.();

expect(result).toEqual(systemAdditionalMessage);
expect(additionalMessages).toBeUndefined();
expect(getSystemAdditionalMessagesMock).not.toHaveBeenCalled();
});

it('password prompt additionalMessages callback should set the system additional messages if not set', async () => {
const prompts = configPrompter.getPrompts();
const passwordPrompt = prompts.find((p) => p.name === configPromptNames.password);
expect(passwordPrompt).toBeDefined();
getSystemAdditionalMessagesMock.mockReturnValue(systemAdditionalMessage);

const additionalMessages = await passwordPrompt?.additionalMessages?.();

expect(additionalMessages).toEqual(systemAdditionalMessage);
expect(getSystemAdditionalMessagesMock).toHaveBeenCalled();
expect(configPrompter['systemAdditionalMessage']).toEqual(systemAdditionalMessage);
});
});

Expand Down
Loading