93 lines
2.5 KiB
JavaScript
93 lines
2.5 KiB
JavaScript
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
import {
|
|
__configureRequestQueueForTests,
|
|
__resetRequestQueueForTests,
|
|
enqueueRequest,
|
|
requestQueueState,
|
|
} from "@/services/requestQueue.js";
|
|
|
|
const flushManyMicrotasks = async (rounds = 10) => {
|
|
for (let index = 0; index < rounds; index += 1) {
|
|
await Promise.resolve();
|
|
}
|
|
};
|
|
|
|
const createDeferred = () => {
|
|
let resolve;
|
|
let reject;
|
|
const promise = new Promise((res, rej) => {
|
|
resolve = res;
|
|
reject = rej;
|
|
});
|
|
|
|
return { promise, resolve, reject };
|
|
};
|
|
|
|
describe("request queue concurrency limits", () => {
|
|
beforeEach(() => {
|
|
__resetRequestQueueForTests();
|
|
__configureRequestQueueForTests({ maxConcurrentGet: 10, maxConcurrentOther: 1, spacingMs: 0 });
|
|
});
|
|
|
|
afterEach(() => {
|
|
__resetRequestQueueForTests();
|
|
});
|
|
|
|
it("keeps attachment GET preloads from filling the shared GET pool", async () => {
|
|
const attachmentDeferreds = Array.from({ length: 10 }, () => createDeferred());
|
|
const ordinaryGet = createDeferred();
|
|
const startedAttachments = [];
|
|
let ordinaryStarted = false;
|
|
|
|
const attachmentRequests = attachmentDeferreds.map((deferred, index) =>
|
|
enqueueRequest(
|
|
() => {
|
|
startedAttachments.push(index);
|
|
return deferred.promise;
|
|
},
|
|
{
|
|
method: "GET",
|
|
url: "/orders/attachments",
|
|
requestData: { params: { id: index + 1 } },
|
|
concurrencyLimit: 5,
|
|
}
|
|
)
|
|
);
|
|
|
|
const ordinaryRequest = enqueueRequest(
|
|
() => {
|
|
ordinaryStarted = true;
|
|
return ordinaryGet.promise;
|
|
},
|
|
{
|
|
method: "GET",
|
|
url: "/departments",
|
|
}
|
|
);
|
|
|
|
await flushManyMicrotasks();
|
|
|
|
expect(startedAttachments).toEqual([0, 1, 2, 3, 4]);
|
|
expect(ordinaryStarted).toBe(true);
|
|
expect(requestQueueState.active).toBe(6);
|
|
expect(requestQueueState.pending).toBe(5);
|
|
|
|
for (let index = 0; index < 5; index += 1) {
|
|
attachmentDeferreds[index].resolve({ status: 200, data: { id: index + 1 } });
|
|
}
|
|
ordinaryGet.resolve({ status: 200, data: { ok: true } });
|
|
|
|
await flushManyMicrotasks();
|
|
|
|
expect(startedAttachments).toEqual([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
|
expect(requestQueueState.active).toBe(5);
|
|
expect(requestQueueState.pending).toBe(0);
|
|
|
|
for (let index = 5; index < 10; index += 1) {
|
|
attachmentDeferreds[index].resolve({ status: 200, data: { id: index + 1 } });
|
|
}
|
|
|
|
await expect(Promise.all([...attachmentRequests, ordinaryRequest])).resolves.toHaveLength(11);
|
|
});
|
|
});
|