fix(plugin-center): renew coalesced load intent
This commit is contained in:
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user