mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-03-16 09:01:17 -07:00
[feat]: Add /extensions restart command (#12739)
This commit is contained in:
75
packages/cli/src/ui/state/extensions.test.ts
Normal file
75
packages/cli/src/ui/state/extensions.test.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright 2025 Google LLC
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import {
|
||||
extensionUpdatesReducer,
|
||||
type ExtensionUpdatesState,
|
||||
ExtensionUpdateState,
|
||||
} from './extensions.js';
|
||||
|
||||
describe('extensionUpdatesReducer', () => {
|
||||
it('should handle RESTARTED action', () => {
|
||||
const initialState: ExtensionUpdatesState = {
|
||||
extensionStatuses: new Map([
|
||||
[
|
||||
'ext1',
|
||||
{
|
||||
status: ExtensionUpdateState.UPDATED_NEEDS_RESTART,
|
||||
lastUpdateTime: 0,
|
||||
lastUpdateCheck: 0,
|
||||
notified: true,
|
||||
},
|
||||
],
|
||||
]),
|
||||
batchChecksInProgress: 0,
|
||||
scheduledUpdate: null,
|
||||
};
|
||||
|
||||
const action = {
|
||||
type: 'RESTARTED' as const,
|
||||
payload: { name: 'ext1' },
|
||||
};
|
||||
|
||||
const newState = extensionUpdatesReducer(initialState, action);
|
||||
|
||||
const expectedStatus = {
|
||||
status: ExtensionUpdateState.UPDATED,
|
||||
lastUpdateTime: 0,
|
||||
lastUpdateCheck: 0,
|
||||
notified: true,
|
||||
};
|
||||
|
||||
expect(newState.extensionStatuses.get('ext1')).toEqual(expectedStatus);
|
||||
});
|
||||
|
||||
it('should not change state for RESTARTED action if status is not UPDATED_NEEDS_RESTART', () => {
|
||||
const initialState: ExtensionUpdatesState = {
|
||||
extensionStatuses: new Map([
|
||||
[
|
||||
'ext1',
|
||||
{
|
||||
status: ExtensionUpdateState.UPDATED,
|
||||
lastUpdateTime: 0,
|
||||
lastUpdateCheck: 0,
|
||||
notified: true,
|
||||
},
|
||||
],
|
||||
]),
|
||||
batchChecksInProgress: 0,
|
||||
scheduledUpdate: null,
|
||||
};
|
||||
|
||||
const action = {
|
||||
type: 'RESTARTED' as const,
|
||||
payload: { name: 'ext1' },
|
||||
};
|
||||
|
||||
const newState = extensionUpdatesReducer(initialState, action);
|
||||
|
||||
expect(newState).toEqual(initialState);
|
||||
});
|
||||
});
|
||||
@@ -63,7 +63,8 @@ export type ExtensionUpdateAction =
|
||||
| { type: 'BATCH_CHECK_START' }
|
||||
| { type: 'BATCH_CHECK_END' }
|
||||
| { type: 'SCHEDULE_UPDATE'; payload: ScheduleUpdateArgs }
|
||||
| { type: 'CLEAR_SCHEDULED_UPDATE' };
|
||||
| { type: 'CLEAR_SCHEDULED_UPDATE' }
|
||||
| { type: 'RESTARTED'; payload: { name: string } };
|
||||
|
||||
export function extensionUpdatesReducer(
|
||||
state: ExtensionUpdatesState,
|
||||
@@ -125,6 +126,20 @@ export function extensionUpdatesReducer(
|
||||
...state,
|
||||
scheduledUpdate: null,
|
||||
};
|
||||
case 'RESTARTED': {
|
||||
const existing = state.extensionStatuses.get(action.payload.name);
|
||||
if (existing?.status !== ExtensionUpdateState.UPDATED_NEEDS_RESTART) {
|
||||
return state;
|
||||
}
|
||||
|
||||
const newStatuses = new Map(state.extensionStatuses);
|
||||
newStatuses.set(action.payload.name, {
|
||||
...existing,
|
||||
status: ExtensionUpdateState.UPDATED,
|
||||
});
|
||||
|
||||
return { ...state, extensionStatuses: newStatuses };
|
||||
}
|
||||
default:
|
||||
checkExhaustive(action);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user