Files
pleno-vue/tests/unit/request-queue-concurrency.spec.js
T

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);
});
});