Skip to content

Commit 3d63709

Browse files
authored
fix: Project type appears twice under system and password prompts when cloud system is selected. (#3706)
* fix: Add new business logic for setting up system additional message. * test: Add unit tests. * refactor: Mutate the config prompter systemAdditionalMessage in the additionalMessage to be consistent with the password prompt mutation. * chore: Add cset.
1 parent 5cd1e74 commit 3d63709

File tree

3 files changed

+73
-8
lines changed

3 files changed

+73
-8
lines changed

.changeset/early-moles-talk.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sap-ux/generator-adp': patch
3+
---
4+
5+
fix: Project name appears twice under system and password prompts when cloud system is selected.

packages/generator-adp/src/app/questions/configuration.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import {
6060
} from './helper/conditions';
6161
import { getExtProjectMessage } from './helper/message';
6262
import { validateExtensibilityExtension } from './helper/validators';
63+
import type { IMessageSeverity } from '@sap-devx/yeoman-ui-types';
6364

6465
/**
6566
* A stateful prompter class that creates configuration questions.
@@ -106,6 +107,10 @@ export class ConfigPrompter {
106107
* Error message to be shown in the confirm extension project prompt.
107108
*/
108109
private appValidationErrorMessage: string | undefined;
110+
/**
111+
* System additional message.
112+
*/
113+
private systemAdditionalMessage: IMessageSeverity | undefined;
109114
/**
110115
* Indicates whether views are loaded synchronously.
111116
*/
@@ -273,7 +278,10 @@ export class ConfigPrompter {
273278
},
274279
default: '',
275280
validate: async (value: string, answers: ConfigAnswers) => await this.validateSystem(value, answers),
276-
additionalMessages: () => getSystemAdditionalMessages(this.flexUISystem, !!this.isCloudProject)
281+
additionalMessages: () => {
282+
this.systemAdditionalMessage = getSystemAdditionalMessages(this.flexUISystem, this.isCloud);
283+
return this.systemAdditionalMessage;
284+
}
277285
};
278286
}
279287

@@ -341,7 +349,13 @@ export class ConfigPrompter {
341349
},
342350
validate: async (value: string, answers: ConfigAnswers) => await this.validatePassword(value, answers),
343351
when: (answers: ConfigAnswers) => showCredentialQuestion(answers, this.isAuthRequired),
344-
additionalMessages: () => getSystemAdditionalMessages(this.flexUISystem, !!this.isCloudProject)
352+
additionalMessages: () => {
353+
if (!this.systemAdditionalMessage) {
354+
this.systemAdditionalMessage = getSystemAdditionalMessages(this.flexUISystem, this.isCloud);
355+
return this.systemAdditionalMessage;
356+
}
357+
return undefined;
358+
}
345359
};
346360
}
347361

@@ -598,6 +612,7 @@ export class ConfigPrompter {
598612
try {
599613
this.targetApps = [];
600614
this.flexUISystem = undefined;
615+
this.isCloudProject = undefined;
601616
this.abapProvider = await getConfiguredProvider(options, this.logger);
602617
this.isAuthRequired = await this.systemLookup.getSystemRequiresAuth(system);
603618
if (!this.isAuthRequired) {

packages/generator-adp/test/unit/questions/configuration.test.ts

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import type { ConfigAnswers, SourceApplication, SystemLookup, UI5Version } from '@sap-ux/adp-tooling';
1+
import type {
2+
ConfigAnswers,
3+
FlexUISupportedSystem,
4+
SourceApplication,
5+
SystemLookup,
6+
UI5Version
7+
} from '@sap-ux/adp-tooling';
28
import {
39
FlexLayer,
410
SourceManifest,
@@ -20,6 +26,7 @@ import { ConfigPrompter } from '../../../src/app/questions/configuration';
2026
import { configPromptNames } from '../../../src/app/types';
2127
import { initI18n, t } from '../../../src/utils/i18n';
2228
import { getSystemAdditionalMessages } from '../../../src/app/questions/helper/additional-messages';
29+
import { type IMessageSeverity, Severity } from '@sap-devx/yeoman-ui-types';
2330

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

112123
beforeAll(async () => {
113124
await initI18n();
@@ -183,18 +194,21 @@ describe('ConfigPrompter Integration Tests', () => {
183194
...sourceSystems,
184195
getSystemRequiresAuth: jest.fn().mockResolvedValueOnce(false).mockResolvedValueOnce(true)
185196
} as unknown as SystemLookup;
197+
isAbapCloudMock.mockResolvedValue(true);
186198
configPrompter = new ConfigPrompter(systemLookup, layer, logger);
187199
const prompts = configPrompter.getPrompts();
188200
const systemPrompt = prompts.find((p) => p.name === configPromptNames.system);
189201
expect(systemPrompt).toBeDefined();
190202

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

194207
expect(result1).toEqual(true);
195208
expect(result2).toEqual(true);
196209
expect(configPrompter['flexUISystem']).toEqual(undefined);
197210
expect(configPrompter['isAuthRequired']).toEqual(true);
211+
expect(configPrompter['isCloudProject']).toBeUndefined();
198212
});
199213

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

254268
expect(result).toEqual(true);
255269
});
270+
271+
it('should set system additional messages when additionalMessages callback gets called', async () => {
272+
const prompts = configPrompter.getPrompts();
273+
const systemPrompt = prompts.find((p) => p.name === configPromptNames.system);
274+
getSystemAdditionalMessagesMock.mockReturnValue(systemAdditionalMessage);
275+
const flexUISystem: FlexUISupportedSystem = {
276+
isUIFlex: true,
277+
isOnPremise: false
278+
};
279+
configPrompter['flexUISystem'] = flexUISystem;
280+
configPrompter['isCloudProject'] = true;
281+
282+
const result = await systemPrompt?.additionalMessages?.();
283+
284+
expect(result).toEqual(systemAdditionalMessage);
285+
expect(getSystemAdditionalMessagesMock).toHaveBeenCalledWith(flexUISystem, true);
286+
expect(configPrompter['systemAdditionalMessage']).toEqual(systemAdditionalMessage);
287+
});
256288
});
257289

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

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

370-
const result = await passwordPrompt?.additionalMessages?.(dummyApps[0]);
401+
const additionalMessages = await passwordPrompt?.additionalMessages?.();
371402

372-
expect(result).toEqual(systemAdditionalMessage);
403+
expect(additionalMessages).toBeUndefined();
404+
expect(getSystemAdditionalMessagesMock).not.toHaveBeenCalled();
405+
});
406+
407+
it('password prompt additionalMessages callback should set the system additional messages if not set', async () => {
408+
const prompts = configPrompter.getPrompts();
409+
const passwordPrompt = prompts.find((p) => p.name === configPromptNames.password);
410+
expect(passwordPrompt).toBeDefined();
411+
getSystemAdditionalMessagesMock.mockReturnValue(systemAdditionalMessage);
412+
413+
const additionalMessages = await passwordPrompt?.additionalMessages?.();
414+
415+
expect(additionalMessages).toEqual(systemAdditionalMessage);
416+
expect(getSystemAdditionalMessagesMock).toHaveBeenCalled();
417+
expect(configPrompter['systemAdditionalMessage']).toEqual(systemAdditionalMessage);
373418
});
374419
});
375420

0 commit comments

Comments
 (0)