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
2 changes: 1 addition & 1 deletion .talismanrc
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ fileignoreconfig:
- filename: test/unit/commands/rollback.test.ts
checksum: d1f931f2d9a397131409399ad6463653e28b5a2224e870b641d9ba57c4418f18
- filename: package-lock.json
checksum: d24dfc90fb69ded83dfe4f6839cd17801e65a1f84be04244fb917e6bef6b5cc6
checksum: e8262e57f73252240a076fa99be712c4d1403c058378cc2bb23f897bb4e45648
version: "1.0"
1,398 changes: 716 additions & 682 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@contentstack/cli-launch",
"version": "1.10.0",
"version": "1.10.1",
"description": "Launch related operations",
"author": "Contentstack CLI",
"bin": {
Expand Down
148 changes: 131 additions & 17 deletions src/adapters/file-upload.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ describe('FileUpload Adapter', () => {
(cliux.inquire as jest.Mock).mockResolvedValueOnce('npm run build');
(cliux.inquire as jest.Mock).mockResolvedValueOnce('./dist');
(cliux.inquire as jest.Mock).mockResolvedValueOnce('npm start');
(cliux.inquire as jest.Mock).mockResolvedValueOnce(true);
(cliux.inquire as jest.Mock).mockResolvedValueOnce('streaming');

const createSignedUploadUrlMock = jest
.spyOn(FileUpload.prototype as any, 'createSignedUploadUrl')
Expand Down Expand Up @@ -340,12 +340,15 @@ describe('FileUpload Adapter', () => {

await fileUploadInstance.prepareAndUploadNewProjectFile();

expect(cliux.inquire).toHaveBeenCalledWith({
type: 'confirm',
name: 'enableStreamingResponse',
message: 'Enable Streaming Responses',
default: false,
});
expect(cliux.inquire).toHaveBeenCalledWith(
expect.objectContaining({
type: 'input',
name: 'responseMode',
message: 'Response Mode (s: streaming, b: buffered)',
default: 'buffered',
validate: expect.any(Function),
}),
);
expect(fileUploadInstance.config.isStreamingEnabled).toBe(true);

createSignedUploadUrlMock.mockRestore();
Expand Down Expand Up @@ -386,7 +389,7 @@ describe('FileUpload Adapter', () => {
await fileUploadInstance.prepareAndUploadNewProjectFile();

const enableStreamingCalls = (cliux.inquire as jest.Mock).mock.calls.filter(
(call) => call[0]?.name === 'enableStreamingResponse',
(call) => call[0]?.name === 'responseMode',
);
expect(enableStreamingCalls.length).toBe(0);
expect(fileUploadInstance.config.isStreamingEnabled).toBe(true);
Expand Down Expand Up @@ -429,7 +432,7 @@ describe('FileUpload Adapter', () => {
await fileUploadInstance.prepareAndUploadNewProjectFile();

const enableStreamingCalls = (cliux.inquire as jest.Mock).mock.calls.filter(
(call) => call[0]?.name === 'enableStreamingResponse',
(call) => call[0]?.name === 'responseMode',
);
expect(enableStreamingCalls.length).toBe(0);
expect(fileUploadInstance.config.isStreamingEnabled).toBe(false);
Expand All @@ -444,7 +447,7 @@ describe('FileUpload Adapter', () => {
(cliux.inquire as jest.Mock).mockResolvedValueOnce('Default');
(cliux.inquire as jest.Mock).mockResolvedValueOnce('npm run build');
(cliux.inquire as jest.Mock).mockResolvedValueOnce('./public');
(cliux.inquire as jest.Mock).mockResolvedValueOnce(true);
(cliux.inquire as jest.Mock).mockResolvedValueOnce('streaming');

const createSignedUploadUrlMock = jest
.spyOn(FileUpload.prototype as any, 'createSignedUploadUrl')
Expand Down Expand Up @@ -479,12 +482,15 @@ describe('FileUpload Adapter', () => {
(call) => call[0]?.name === 'serverCommand',
);
expect(serverCommandCalls.length).toBe(0);
expect(cliux.inquire).toHaveBeenCalledWith({
type: 'confirm',
name: 'enableStreamingResponse',
message: 'Enable Streaming Responses',
default: false,
});
expect(cliux.inquire).toHaveBeenCalledWith(
expect.objectContaining({
type: 'input',
name: 'responseMode',
message: 'Response Mode (s: streaming, b: buffered)',
default: 'buffered',
validate: expect.any(Function),
}),
);
expect(fileUploadInstance.config.isStreamingEnabled).toBe(true);

createSignedUploadUrlMock.mockRestore();
Expand Down Expand Up @@ -529,7 +535,7 @@ describe('FileUpload Adapter', () => {
await fileUploadInstance.prepareAndUploadNewProjectFile();

const enableStreamingCalls = (cliux.inquire as jest.Mock).mock.calls.filter(
(call) => call[0]?.name === 'enableStreamingResponse',
(call) => call[0]?.name === 'responseMode',
);
expect(enableStreamingCalls.length).toBe(0);
expect(fileUploadInstance.config.isStreamingEnabled).toBe(false);
Expand All @@ -539,6 +545,114 @@ describe('FileUpload Adapter', () => {
uploadFileMock.mockRestore();
handleEnvImportFlowMock.mockRestore();
});

it.each([
['s', true],
['streaming', true],
['STREAMING', true],
[' Streaming ', true],
['b', false],
['buffered', false],
['BUFFERED', false],
[' Buffered ', false],
])('should map Response Mode input "%s" to isStreamingEnabled %s', async (input, expected) => {
(cliux.inquire as jest.Mock).mockResolvedValueOnce('test-project');
(cliux.inquire as jest.Mock).mockResolvedValueOnce('Default');
(cliux.inquire as jest.Mock).mockResolvedValueOnce('npm run build');
(cliux.inquire as jest.Mock).mockResolvedValueOnce('./public');
(cliux.inquire as jest.Mock).mockResolvedValueOnce(input);

const createSignedUploadUrlMock = jest
.spyOn(FileUpload.prototype as any, 'createSignedUploadUrl')
.mockResolvedValue({ uploadUid: 'test-upload-uid' });
const archiveMock = jest
.spyOn(FileUpload.prototype as any, 'archive')
.mockResolvedValue({ zipName: 'test.zip', zipPath: '/path/to/test.zip', projectName: 'test-project' });
const uploadFileMock = jest
.spyOn(FileUpload.prototype as any, 'uploadFile')
.mockResolvedValue(undefined);

const fileUploadInstance = new FileUpload({
config: {
flags: {
'response-mode': undefined,
},
framework: 'GATSBY',
supportedFrameworksForServerCommands: ['ANGULAR', 'OTHER', 'REMIX', 'NUXT'],
outputDirectories: { GATSBY: './public' },
},
log: logMock,
exit: exitMock,
} as any);

const handleEnvImportFlowMock = jest
.spyOn(fileUploadInstance, 'handleEnvImportFlow' as any)
.mockResolvedValue(undefined);

await fileUploadInstance.prepareAndUploadNewProjectFile();

expect(fileUploadInstance.config.isStreamingEnabled).toBe(expected);

createSignedUploadUrlMock.mockRestore();
archiveMock.mockRestore();
uploadFileMock.mockRestore();
handleEnvImportFlowMock.mockRestore();
});

it('Response Mode validate should accept s/b/streaming/buffered and reject anything else', async () => {
(cliux.inquire as jest.Mock).mockResolvedValueOnce('test-project');
(cliux.inquire as jest.Mock).mockResolvedValueOnce('Default');
(cliux.inquire as jest.Mock).mockResolvedValueOnce('npm run build');
(cliux.inquire as jest.Mock).mockResolvedValueOnce('./public');
(cliux.inquire as jest.Mock).mockResolvedValueOnce('streaming');

const createSignedUploadUrlMock = jest
.spyOn(FileUpload.prototype as any, 'createSignedUploadUrl')
.mockResolvedValue({ uploadUid: 'test-upload-uid' });
const archiveMock = jest
.spyOn(FileUpload.prototype as any, 'archive')
.mockResolvedValue({ zipName: 'test.zip', zipPath: '/path/to/test.zip', projectName: 'test-project' });
const uploadFileMock = jest
.spyOn(FileUpload.prototype as any, 'uploadFile')
.mockResolvedValue(undefined);

const fileUploadInstance = new FileUpload({
config: {
flags: {
'response-mode': undefined,
},
framework: 'GATSBY',
supportedFrameworksForServerCommands: ['ANGULAR', 'OTHER', 'REMIX', 'NUXT'],
outputDirectories: { GATSBY: './public' },
},
log: logMock,
exit: exitMock,
} as any);

const handleEnvImportFlowMock = jest
.spyOn(fileUploadInstance, 'handleEnvImportFlow' as any)
.mockResolvedValue(undefined);

await fileUploadInstance.prepareAndUploadNewProjectFile();

const responseModeCall = (cliux.inquire as jest.Mock).mock.calls.find(
(call) => call[0]?.name === 'responseMode',
);
const { validate } = responseModeCall[0];

expect(validate('s')).toBe(true);
expect(validate('streaming')).toBe(true);
expect(validate('b')).toBe(true);
expect(validate('buffered')).toBe(true);
expect(validate(' STREAMING ')).toBe(true);
expect(validate('')).toBe('Please enter "s"/"streaming" or "b"/"buffered".');
expect(validate('yes')).toBe('Please enter "s"/"streaming" or "b"/"buffered".');

createSignedUploadUrlMock.mockRestore();
archiveMock.mockRestore();
uploadFileMock.mockRestore();
handleEnvImportFlowMock.mockRestore();
});
});
});

21 changes: 15 additions & 6 deletions src/adapters/file-upload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -250,12 +250,21 @@ export default class FileUpload extends BaseClass {
}
}
if (!responseMode) {
this.config.isStreamingEnabled = (await cliux.inquire({
type: 'confirm',
name: 'enableStreamingResponse',
message: 'Enable Streaming Responses',
default: false,
})) as boolean;
const responseModeInput = (await cliux.inquire({
type: 'input',
name: 'responseMode',
message: 'Response Mode (s: streaming, b: buffered)',
default: 'buffered',
validate: (input: string) => {
const value = String(input).trim().toLowerCase();
if (['s', 'streaming', 'b', 'buffered'].includes(value)) {
return true;
}
return 'Please enter "s"/"streaming" or "b"/"buffered".';
},
})) as string;
const normalizedResponseMode = String(responseModeInput ?? '').trim().toLowerCase();
this.config.isStreamingEnabled = normalizedResponseMode === 's' || normalizedResponseMode === 'streaming';
} else {
this.config.isStreamingEnabled = responseMode === 'streaming';
}
Expand Down
Loading
Loading