UNPKG

9.36 kBPlain TextView Raw
1import * as path from "path";
2import { Process, task, api, specHelper } from "actionhero";
3
4const sleep = (zzz = 100) => {
5 return new Promise((resolve) => {
6 setTimeout(resolve, zzz);
7 });
8};
9
10const app = new Process();
11
12describe("ah-resque-ui", () => {
13 beforeAll(async () => {
14 // jest.setTimeout(10000);
15
16 await app.initialize();
17 await api.redis.clients.client.flushdb();
18 await app.start();
19
20 api.tasks.tasks.testTask = {
21 name: "testTask",
22 description: "testTask",
23 queue: "testQueue",
24 frequency: 0,
25 run: async (params) => {
26 if (params.fail === true) {
27 throw new Error("broken");
28 }
29 },
30 };
31
32 // api.resque.multiWorker.start();
33 api.tasks.jobs.testTask = api.tasks.jobWrapper("testTask");
34 await sleep(100); // for the workers to start
35 });
36
37 afterAll(async () => {
38 // await api.resque.multiWorker.stop();
39 delete api.tasks.tasks.testTask;
40 delete api.tasks.jobs.testTask;
41 await app.stop();
42 });
43
44 it("resque:redisInfo", async () => {
45 const response = await specHelper.runAction("resque:redisInfo");
46 const info = response.redisInfo.join("\n");
47 expect(info).toMatch(/redis_version/);
48 expect(info).toMatch(/used_memory/);
49 expect(info).toMatch(/used_memory_human/);
50 });
51
52 it("resque:forceCleanWorker", () => {}); // TODO
53
54 describe("with locks", () => {
55 beforeEach(async () => {
56 await api.resque.queue.connection.redis.set(
57 api.resque.queue.connection.key("lock:lists:queueName:jobName:[{}]"),
58 123
59 );
60 });
61 beforeEach(async () => {
62 await api.resque.queue.connection.redis.set(
63 api.resque.queue.connection.key(
64 "workerslock:lists:queueName:jobName:[{}]"
65 ),
66 456
67 );
68 });
69
70 afterEach(async () => {
71 await api.resque.queue.connection.redis.del(
72 api.resque.queue.connection.key("lock:lists:queueName:jobName:[{}]")
73 );
74 });
75 afterEach(async () => {
76 await api.resque.queue.connection.redis.del(
77 api.resque.queue.connection.key(
78 "workerslock:lists:queueName:jobName:[{}]"
79 )
80 );
81 });
82
83 it("resque:locks", async () => {
84 const response = await specHelper.runAction("resque:locks");
85 expect(Object.keys(response.locks).length).toEqual(2);
86 expect(response.locks["lock:lists:queueName:jobName:[{}]"]).toEqual(
87 "123"
88 );
89 expect(
90 response.locks["workerslock:lists:queueName:jobName:[{}]"]
91 ).toEqual("456");
92 });
93
94 it("resque:delLock", async () => {
95 let response = await specHelper.runAction("resque:delLock", {
96 lock: "workerslock:lists:queueName:jobName:[{}]",
97 });
98 expect(response.count).toEqual(1);
99 response = await specHelper.runAction("resque:locks");
100 expect(Object.keys(response.locks).length).toEqual(1);
101 expect(response.locks["lock:lists:queueName:jobName:[{}]"]).toEqual(
102 "123"
103 );
104 });
105 });
106
107 describe("with jobs", () => {
108 beforeEach(async () => {
109 await specHelper.runAction("resque:delQueue", { queue: "testQueue" });
110 await task.enqueue("testTask", { a: 1 }, "testQueue");
111 await task.enqueue("testTask", { b: 2 }, "testQueue");
112 await task.enqueue("testTask", { c: 3 }, "testQueue");
113 });
114
115 it("resque:resqueDetails", async () => {
116 const response = await specHelper.runAction("resque:resqueDetails");
117 expect(response.resqueDetails.queues.testQueue.length).toEqual(3);
118 expect(Object.keys(response.resqueDetails.workers).length).toEqual(1);
119 });
120
121 it("resque:loadWorkerQueues", async () => {
122 const response = await specHelper.runAction("resque:loadWorkerQueues");
123 const workerNames = Object.keys(response.workerQueues);
124 expect(workerNames.length).toBe(1);
125 expect(response.workerQueues[workerNames[0]]).toContain("*");
126 });
127
128 it("resque:queued (good)", async () => {
129 const response = await specHelper.runAction("resque:queued", {
130 queue: "testQueue",
131 });
132 expect(response.jobs.length).toBe(3);
133 });
134
135 it("resque:queued (bad)", async () => {
136 const response = await specHelper.runAction("resque:queued", {
137 queue: "xxx",
138 });
139 expect(response.jobs.length).toBe(0);
140 });
141
142 it("resque:delQueue", async () => {
143 await specHelper.runAction("resque:delQueue", { queue: "testQueue" });
144 const response = await specHelper.runAction("resque:queued", {
145 queue: "testQueue",
146 });
147 expect(response.jobs.length).toBe(0);
148 });
149 });
150
151 describe("with delayed jobs", () => {
152 beforeAll(async () => {
153 await task.enqueueAt(1000, "testTask", { a: 1 }, "testQueue");
154 await task.enqueueAt(2000, "testTask", { b: 2 }, "testQueue");
155 await task.enqueueAt(3000, "testTask", { c: 3 }, "testQueue");
156 });
157
158 it("resque:delayedjobs (defaults)", async () => {
159 const response = await specHelper.runAction("resque:delayedjobs");
160 expect(response.timestampsCount).toBe(3);
161 expect(Object.keys(response.delayedjobs).length).toBe(3);
162 expect(response.delayedjobs["1000"].tasks[0].args[0].a).toBe(1);
163 expect(response.delayedjobs["2000"].tasks[0].args[0].b).toBe(2);
164 expect(response.delayedjobs["3000"].tasks[0].args[0].c).toBe(3);
165 });
166
167 it("resque:delayedjobs (pagination)", async () => {
168 let response;
169 response = await specHelper.runAction("resque:delayedjobs", {
170 start: 0,
171 stop: 1,
172 });
173 expect(response.timestampsCount).toBe(3);
174 expect(Object.keys(response.delayedjobs).length).toBe(2);
175 expect(response.delayedjobs["1000"].tasks[0].args[0].a).toBe(1);
176 expect(response.delayedjobs["2000"].tasks[0].args[0].b).toBe(2);
177
178 response = await specHelper.runAction("resque:delayedjobs", {
179 start: 2,
180 stop: 999,
181 });
182 expect(response.timestampsCount).toBe(3);
183 expect(Object.keys(response.delayedjobs).length).toBe(1);
184 expect(response.delayedjobs["3000"].tasks[0].args[0].c).toBe(3);
185 });
186
187 it("resque:delDelayed", () => {}); //TODO
188 it("resque:runDelayed", () => {}); //TODO
189 });
190
191 describe("with failed jobs", () => {
192 beforeEach(async () => {
193 await specHelper.runAction("resque:delQueue", { queue: "testQueue" });
194 await specHelper.runAction("resque:removeAllFailed");
195 await task.enqueue("testTask", { a: 1, fail: true }, "testQueue");
196 await task.enqueue("testTask", { b: 2, fail: true }, "testQueue");
197 await task.enqueue("testTask", { c: 3, fail: true }, "testQueue");
198
199 // should allow time to work the bad jobs
200 await sleep(1000);
201 });
202
203 it("resque:resqueFailedCount", async () => {
204 const response = await specHelper.runAction("resque:resqueFailedCount");
205 expect(response.failedCount).toBe(3);
206 });
207
208 it("resque:resqueFailed (defaults)", async () => {
209 const response = await specHelper.runAction("resque:resqueFailed");
210 expect(response.failed.length).toBe(3);
211 response.failed.forEach((j) => {
212 expect(j.queue).toBe("testQueue");
213 expect(j.error).toMatch("broken");
214 expect(j.payload.args[0].fail).toBe(true);
215 });
216 });
217
218 it("resque:resqueFailed (pagination)", async () => {
219 let response;
220 response = await specHelper.runAction("resque:resqueFailed", {
221 start: 0,
222 stop: 1,
223 });
224 expect(response.failed.length).toBe(2);
225 expect(response.failed[0].payload.args[0].a).toBe(1);
226 expect(response.failed[1].payload.args[0].b).toBe(2);
227
228 response = await specHelper.runAction("resque:resqueFailed", {
229 start: 2,
230 stop: 99,
231 });
232 expect(response.failed.length).toBe(1);
233 expect(response.failed[0].payload.args[0].c).toBe(3);
234 });
235
236 it("resque:removeFailed", async () => {
237 await specHelper.runAction("resque:removeFailed", { id: 1 });
238 const response = await specHelper.runAction("resque:resqueFailed");
239 expect(response.failed.length).toBe(2);
240 expect(response.failed[0].payload.args[0].a).toBe(1);
241 expect(response.failed[1].payload.args[0].c).toBe(3);
242 });
243
244 it("resque:removeAllFailed", async () => {
245 await specHelper.runAction("resque:removeAllFailed");
246 const response = await specHelper.runAction("resque:resqueFailed");
247 expect(response.failed.length).toBe(0);
248 });
249
250 it("resque:retryAndRemoveFailed", async () => {
251 await specHelper.runAction("resque:retryAndRemoveFailed", { id: 1 });
252 const response = await specHelper.runAction("resque:resqueFailed");
253 expect(response.failed.length).toBe(2);
254 expect(response.failed[0].payload.args[0].a).toBe(1);
255 expect(response.failed[1].payload.args[0].c).toBe(3);
256
257 const details = await specHelper.runAction("resque:resqueDetails");
258 expect(details.resqueDetails.queues.testQueue.length).toBe(1);
259 });
260
261 it("resque:retryAndRemoveAllFailed", async () => {
262 await specHelper.runAction("resque:retryAndRemoveAllFailed");
263 const response = await specHelper.runAction("resque:resqueFailed");
264 expect(response.failed.length).toBe(0);
265
266 const details = await specHelper.runAction("resque:resqueDetails");
267 expect(details.resqueDetails.queues.testQueue.length).toBe(3);
268 });
269 });
270});