queue.test.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { Queue } from "../src/queue";
  2. describe("Queue", () => {
  3. const calls: any[] = [];
  4. const createJobFactory =
  5. <T>(
  6. // for purpose of this test, Error object will become a rejection value
  7. resolutionOrRejectionValue: T,
  8. ms = 1,
  9. ) =>
  10. () => {
  11. return new Promise<T>((resolve, reject) => {
  12. setTimeout(() => {
  13. if (resolutionOrRejectionValue instanceof Error) {
  14. reject(resolutionOrRejectionValue);
  15. } else {
  16. resolve(resolutionOrRejectionValue);
  17. }
  18. }, ms);
  19. }).then((x) => {
  20. calls.push(x);
  21. return x;
  22. });
  23. };
  24. beforeEach(() => {
  25. calls.length = 0;
  26. });
  27. it("should await and resolve values in order of enqueueing", async () => {
  28. const queue = new Queue();
  29. const p1 = queue.push(createJobFactory("A", 50));
  30. const p2 = queue.push(createJobFactory("B"));
  31. const p3 = queue.push(createJobFactory("C"));
  32. expect(await p3).toBe("C");
  33. expect(await p2).toBe("B");
  34. expect(await p1).toBe("A");
  35. expect(calls).toEqual(["A", "B", "C"]);
  36. });
  37. it("should reject a job if it throws, and not affect other jobs", async () => {
  38. const queue = new Queue();
  39. const err = new Error("B");
  40. queue.push(createJobFactory("A", 50));
  41. const p2 = queue.push(createJobFactory(err));
  42. const p3 = queue.push(createJobFactory("C"));
  43. const p2err = p2.catch((err) => err);
  44. await p3;
  45. expect(await p2err).toBe(err);
  46. expect(calls).toEqual(["A", "C"]);
  47. });
  48. });