Skip to content

Commit ece64dc

Browse files
committed
shifted for limitations
1 parent c3e318f commit ece64dc

File tree

3 files changed

+285
-1
lines changed

3 files changed

+285
-1
lines changed

apps/vs-code-react/src/app/designer/DesignerCommandBar/__test__/indexV2.test.tsx

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,5 +294,95 @@ describe('DesignerCommandBar (V2)', () => {
294294
fireEvent.click(screen.getByLabelText('More actions'));
295295
expect(screen.getByText('File a bug')).toBeDefined();
296296
});
297+
298+
it('should show "Create unit test from run" when isLocal', () => {
299+
renderCommandBar({ isLocal: true });
300+
fireEvent.click(screen.getByLabelText('More actions'));
301+
expect(screen.getByText('Create unit test from run')).toBeDefined();
302+
});
303+
304+
it('should show unit test items when isUnitTest', () => {
305+
renderCommandBar({ isUnitTest: true });
306+
fireEvent.click(screen.getByLabelText('More actions'));
307+
expect(screen.getByText('Save unit test')).toBeDefined();
308+
expect(screen.getByText('Create unit test')).toBeDefined();
309+
expect(screen.getByText('Assertions')).toBeDefined();
310+
});
311+
312+
it('should show panel items (Parameters, Connections, Errors)', () => {
313+
renderCommandBar();
314+
fireEvent.click(screen.getByLabelText('More actions'));
315+
expect(screen.getByText('Parameters')).toBeDefined();
316+
expect(screen.getByText('Connections')).toBeDefined();
317+
expect(screen.getByText('Errors')).toBeDefined();
318+
});
319+
});
320+
321+
describe('Save button click handlers', () => {
322+
it('should trigger save when Publish is clicked in designer view', () => {
323+
mockDesignerIsDirty.current = true;
324+
renderCommandBar({ isDraftMode: true, hasDraft: true, isDesignerView: true });
325+
const publishBtn = screen.getByText('Publish').closest('button')!;
326+
fireEvent.click(publishBtn);
327+
// The mutation should have been called (useMutation mock calls the fn)
328+
});
329+
330+
it('should trigger code save when Publish is clicked in code view', () => {
331+
mockDesignerIsDirty.current = true;
332+
renderCommandBar({ isDraftMode: true, hasDraft: true, isDesignerView: false, isCodeView: true });
333+
const publishBtn = screen.getByText('Publish').closest('button')!;
334+
fireEvent.click(publishBtn);
335+
// The code save mutation should have been called
336+
});
337+
});
338+
339+
describe('Discard button in non-draft mode', () => {
340+
it('should disable simple discard when not dirty', () => {
341+
mockDesignerIsDirty.current = false;
342+
renderCommandBar({ hasDraft: false });
343+
const discardBtn = screen.getByLabelText('Discard');
344+
expect(discardBtn.closest('button')?.disabled).toBe(true);
345+
});
346+
347+
it('should disable simple discard in monitoring view', () => {
348+
renderCommandBar({ hasDraft: false, isMonitoringView: true });
349+
const discardBtn = screen.getByLabelText('Discard');
350+
expect(discardBtn.closest('button')?.disabled).toBe(true);
351+
});
352+
353+
it('should call discard when simple discard button is clicked', () => {
354+
mockDesignerIsDirty.current = true;
355+
const discard = vi.fn();
356+
renderCommandBar({ hasDraft: false, discard });
357+
fireEvent.click(screen.getByLabelText('Discard'));
358+
expect(discard).toHaveBeenCalled();
359+
});
360+
});
361+
362+
describe('Draft save notification with saved time', () => {
363+
it('should show autosaved time when lastDraftSaveTime is set', () => {
364+
const recentTime = Date.now() - 5000; // 5 seconds ago
365+
renderCommandBar({ isDraftMode: true, lastDraftSaveTime: recentTime, isDesignerView: true });
366+
expect(screen.getByText('Autosaved seconds ago')).toBeDefined();
367+
});
368+
369+
it('should show notification in code view too', () => {
370+
renderCommandBar({ isDraftMode: true, isDraftSaving: true, isDesignerView: false, isCodeView: true });
371+
expect(screen.getByText('Saving...')).toBeDefined();
372+
});
373+
374+
it('should not show notification in monitoring view', () => {
375+
renderCommandBar({ isDraftMode: true, lastDraftSaveTime: Date.now(), isMonitoringView: true, isDesignerView: false });
376+
expect(screen.queryByText('Autosaved seconds ago')).toBeNull();
377+
});
378+
});
379+
380+
describe('View mode tab active states', () => {
381+
it('should call switchToDesignerView when Workflow tab is clicked', () => {
382+
const switchToDesignerView = vi.fn();
383+
renderCommandBar({ switchToDesignerView, isDesignerView: false, isCodeView: true });
384+
fireEvent.click(screen.getByText('Workflow'));
385+
expect(switchToDesignerView).toHaveBeenCalled();
386+
});
297387
});
298388
});

apps/vs-code-react/src/app/designer/__test__/appV2.test.tsx

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,4 +332,198 @@ describe('DesignerApp (V2)', () => {
332332

333333
expect(mockPostMessage).toHaveBeenCalledWith({ command: 'discardDraft' });
334334
});
335+
336+
it('should dispatch setDraftSaving and update draft artifacts when saveDraftWorkflow is called', () => {
337+
const store = createTestStore({ isDraftMode: true });
338+
render(
339+
<Provider store={store}>
340+
<DesignerApp />
341+
</Provider>
342+
);
343+
344+
const definition = { triggers: {}, actions: { a1: { type: 'Http' } } };
345+
const params = { p: { type: 'String' } };
346+
const conns = { c: { api: { id: '/test' } } };
347+
capturedCommandBarProps.saveDraftWorkflow(definition, params, conns);
348+
349+
// Verify Redux state was updated
350+
const state = store.getState().designer;
351+
expect(state.isDraftSaving).toBe(true);
352+
expect(state.draftWorkflow).toEqual(definition);
353+
expect(state.draftConnections).toEqual(conns);
354+
expect(state.draftParameters).toEqual(params);
355+
});
356+
357+
it('should clear draft state after discardDraft', () => {
358+
const store = createTestStore({
359+
isDraftMode: true,
360+
hasDraft: true,
361+
draftWorkflow: mockWorkflowDefinition,
362+
});
363+
render(
364+
<Provider store={store}>
365+
<DesignerApp />
366+
</Provider>
367+
);
368+
369+
capturedCommandBarProps.discardDraft();
370+
371+
const state = store.getState().designer;
372+
expect(state.hasDraft).toBe(false);
373+
expect(state.draftWorkflow).toBeNull();
374+
expect(state.draftConnections).toBeNull();
375+
expect(state.draftParameters).toBeNull();
376+
});
377+
378+
it('should dispatch setDraftMode when switchWorkflowMode is called with false', () => {
379+
const store = createTestStore({
380+
isDraftMode: true,
381+
hasDraft: true,
382+
draftWorkflow: mockDraftDefinition,
383+
});
384+
render(
385+
<Provider store={store}>
386+
<DesignerApp />
387+
</Provider>
388+
);
389+
390+
capturedCommandBarProps.switchWorkflowMode(false);
391+
392+
const state = store.getState().designer;
393+
expect(state.isDraftMode).toBe(false);
394+
});
395+
396+
it('should dispatch setDraftMode when switchWorkflowMode is called with true', () => {
397+
const store = createTestStore({
398+
isDraftMode: false,
399+
hasDraft: true,
400+
draftWorkflow: mockDraftDefinition,
401+
});
402+
render(
403+
<Provider store={store}>
404+
<DesignerApp />
405+
</Provider>
406+
);
407+
408+
capturedCommandBarProps.switchWorkflowMode(true);
409+
410+
const state = store.getState().designer;
411+
expect(state.isDraftMode).toBe(true);
412+
});
413+
414+
it('should pass isMonitoringView to DesignerCommandBar', () => {
415+
const store = createTestStore({ isMonitoringView: true });
416+
render(
417+
<Provider store={store}>
418+
<DesignerApp />
419+
</Provider>
420+
);
421+
422+
expect(capturedCommandBarProps.isMonitoringView).toBe(true);
423+
});
424+
425+
it('should pass isUnitTest and isLocal to DesignerCommandBar', () => {
426+
const store = createTestStore({ isUnitTest: true, isLocal: false });
427+
render(
428+
<Provider store={store}>
429+
<DesignerApp />
430+
</Provider>
431+
);
432+
433+
expect(capturedCommandBarProps.isUnitTest).toBe(true);
434+
expect(capturedCommandBarProps.isLocal).toBe(false);
435+
});
436+
437+
it('should render floating run button', () => {
438+
const store = createTestStore();
439+
render(
440+
<Provider store={store}>
441+
<DesignerApp />
442+
</Provider>
443+
);
444+
expect(screen.getByTestId('floating-run-button')).toBeDefined();
445+
});
446+
447+
it('should use published connections when hasDraft but draftConnections is null', () => {
448+
const store = createTestStore({
449+
isDraftMode: true,
450+
hasDraft: true,
451+
draftConnections: null,
452+
});
453+
render(
454+
<Provider store={store}>
455+
<DesignerApp />
456+
</Provider>
457+
);
458+
459+
// Falls through to published since draftConnections is null
460+
expect(mockConvertConnectionsDataToReferences).toHaveBeenCalled();
461+
});
462+
463+
it('should use published parameters when hasDraft but draftParameters is null', () => {
464+
const store = createTestStore({
465+
isDraftMode: true,
466+
hasDraft: true,
467+
draftParameters: null,
468+
});
469+
render(
470+
<Provider store={store}>
471+
<DesignerApp />
472+
</Provider>
473+
);
474+
475+
const provider = screen.getByTestId('bjs-workflow-provider');
476+
const workflowData = JSON.parse(provider.getAttribute('data-workflow') || '{}');
477+
expect(workflowData.parameters).toEqual({ publishedParam: { type: 'String', value: 'pub' } });
478+
});
479+
480+
it('should pass saveWorkflow and discard callbacks to command bar', () => {
481+
const store = createTestStore();
482+
render(
483+
<Provider store={store}>
484+
<DesignerApp />
485+
</Provider>
486+
);
487+
488+
expect(typeof capturedCommandBarProps.saveWorkflow).toBe('function');
489+
expect(typeof capturedCommandBarProps.saveWorkflowFromCode).toBe('function');
490+
expect(typeof capturedCommandBarProps.discard).toBe('function');
491+
expect(typeof capturedCommandBarProps.switchToDesignerView).toBe('function');
492+
expect(typeof capturedCommandBarProps.switchToCodeView).toBe('function');
493+
expect(typeof capturedCommandBarProps.switchToMonitoringView).toBe('function');
494+
});
495+
496+
it('should post save command and clear draft when saveWorkflow is called', async () => {
497+
const store = createTestStore({
498+
isDraftMode: true,
499+
hasDraft: true,
500+
draftWorkflow: mockWorkflowDefinition,
501+
});
502+
render(
503+
<Provider store={store}>
504+
<DesignerApp />
505+
</Provider>
506+
);
507+
508+
const workflow = {
509+
definition: { triggers: {}, actions: {} },
510+
parameters: { p: { type: 'String' } },
511+
connectionReferences: { c: { api: { id: '/test' } } },
512+
};
513+
const clearDirtyState = vi.fn();
514+
await capturedCommandBarProps.saveWorkflow(workflow, undefined, clearDirtyState);
515+
516+
expect(mockPostMessage).toHaveBeenCalledWith({
517+
command: 'save',
518+
definition: workflow.definition,
519+
parameters: workflow.parameters,
520+
connectionReferences: workflow.connectionReferences,
521+
customCodeData: undefined,
522+
});
523+
expect(clearDirtyState).toHaveBeenCalled();
524+
// Draft state should be cleared
525+
const state = store.getState().designer;
526+
expect(state.hasDraft).toBe(false);
527+
expect(state.draftWorkflow).toBeNull();
528+
});
335529
});

apps/vs-code-react/vitest.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export default defineProject({
1111
coverage: {
1212
enabled: true,
1313
provider: 'istanbul',
14-
include: ['src/app/**/*', 'src/state/**/*'],
14+
include: ['src/app/**/*', 'src/state/**/*', 'src/intl/**/*'],
1515
reporter: ['html', 'cobertura', 'lcov'],
1616
},
1717
restoreMocks: true,

0 commit comments

Comments
 (0)