fix(plugin-center): renew coalesced load intent

This commit is contained in:
2026-08-27 22:06:33 +08:00
parent 07ea9da858
commit 7fab721907
3 changed files with 114 additions and 5 deletions

View File

@@ -118,6 +118,48 @@ describe('coding plugins store', () => {
});
});
it.each(['project-b first', 'project-a first'] as const)(
'renews a coalesced project load as the latest intent when %s completes',
async (completionOrder) => {
const pending = new Map<string, ReturnType<typeof deferred<ReturnType<typeof projection>>>>();
const list = vi.fn((projectId: string) => {
const request = deferred<ReturnType<typeof projection>>();
pending.set(projectId, request);
return request.promise;
});
const store = createCodingPluginsStore({ list });
store.setState({ projectId: 'project-a', projection: projection(false, 'project-a') });
const firstProjectA = store.getState().load('project-a');
const projectB = store.getState().load('project-b');
const renewedProjectA = store.getState().load('project-a');
expect(renewedProjectA).toBe(firstProjectA);
expect(list).toHaveBeenCalledTimes(2);
expect(Object.keys(store.getState().pending).sort()).toEqual([
'load:project-a', 'load:project-b',
]);
if (completionOrder === 'project-b first') {
pending.get('project-b')?.resolve(projection(false, 'project-b'));
await projectB;
expect(store.getState().projectId).toBe('project-a');
pending.get('project-a')?.resolve(projection(true, 'project-a'));
} else {
pending.get('project-a')?.resolve(projection(true, 'project-a'));
await firstProjectA;
pending.get('project-b')?.resolve(projection(false, 'project-b'));
}
await Promise.all([firstProjectA, projectB, renewedProjectA]);
expect(store.getState()).toMatchObject({
projectId: 'project-a', loadState: 'ready', error: null,
});
expect(store.getState().projection?.items[0].enabled).toBe(true);
expect(store.getState().pending).toEqual({});
},
);
it('does not let an older same-project load overwrite a completed enable mutation', async () => {
const staleLoad = deferred<ReturnType<typeof projection>>();
const store = createCodingPluginsStore({