Skip to content

Commit d697ecf

Browse files
committed
test: add e2e test for queue rate limit UI actions
Add a test suite to verify that queue concurrency and rate limits can be correctly overridden and removed via the web application interface. This ensures that the queue management actions correctly persist state changes to the database.
1 parent cd9fb85 commit d697ecf

1 file changed

Lines changed: 101 additions & 0 deletions

File tree

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import { describe, expect, it } from "vitest";
2+
import { getTestServer } from "./helpers/sharedTestServer";
3+
import { seedTestSession } from "./helpers/seedTestSession";
4+
import { seedTestUserProject } from "./helpers/seedTestUserProject";
5+
6+
describe("Rate Limiting UI", () => {
7+
it("should override and remove queue limits via the UI action", async () => {
8+
const server = getTestServer();
9+
const { user, organization, project, environment } = await seedTestUserProject(server.prisma);
10+
await server.prisma.user.update({
11+
where: { id: user.id },
12+
data: { confirmedBasicDetails: true },
13+
});
14+
const cookie = await seedTestSession({ userId: user.id });
15+
16+
// Get the org member
17+
const orgMember = await server.prisma.orgMember.findFirst({
18+
where: { userId: user.id, organizationId: organization.id },
19+
});
20+
21+
// Update environment to have a high maximumConcurrencyLimit and link to orgMember
22+
await server.prisma.runtimeEnvironment.update({
23+
where: { id: environment.id },
24+
data: {
25+
maximumConcurrencyLimit: 100,
26+
orgMemberId: orgMember?.id,
27+
},
28+
});
29+
30+
// Create a queue
31+
const queue = await server.prisma.taskQueue.create({
32+
data: {
33+
name: "test-queue",
34+
friendlyId: "queue_12345",
35+
type: "NAMED",
36+
runtimeEnvironmentId: environment.id,
37+
projectId: project.id,
38+
concurrencyLimit: 5,
39+
},
40+
});
41+
42+
const path = `/orgs/${organization.slug}/projects/${project.slug}/env/${environment.slug}/queues`;
43+
44+
// 1. Override limits
45+
const overrideFormData = new URLSearchParams();
46+
overrideFormData.append("action", "queue-override");
47+
overrideFormData.append("friendlyId", queue.friendlyId);
48+
overrideFormData.append("concurrencyLimit", "5");
49+
overrideFormData.append("rateLimits", JSON.stringify([{ limit: 10, window: 60 }]));
50+
51+
const overrideRes = await server.webapp.fetch(path, {
52+
method: "POST",
53+
body: overrideFormData.toString(),
54+
headers: {
55+
"Content-Type": "application/x-www-form-urlencoded",
56+
Cookie: cookie,
57+
},
58+
redirect: "manual",
59+
});
60+
61+
expect(overrideRes.status).toBe(302);
62+
const location = overrideRes.headers.get("location");
63+
if (location?.includes("error")) {
64+
throw new Error(`Redirected with error: ${location}`);
65+
}
66+
67+
// Verify database
68+
const updatedQueue = await server.prisma.taskQueue.findUnique({
69+
where: { id: queue.id },
70+
});
71+
72+
expect(updatedQueue?.concurrencyLimit).toBe(5);
73+
expect(updatedQueue?.rateLimit).toEqual([{ limit: 10, window: 60 }]);
74+
75+
// 2. Remove override
76+
const removeFormData = new URLSearchParams();
77+
removeFormData.append("action", "queue-remove-override");
78+
removeFormData.append("friendlyId", queue.friendlyId);
79+
80+
const removeRes = await server.webapp.fetch(path, {
81+
method: "POST",
82+
body: removeFormData.toString(),
83+
headers: {
84+
"Content-Type": "application/x-www-form-urlencoded",
85+
Cookie: cookie,
86+
},
87+
redirect: "manual",
88+
});
89+
90+
expect(removeRes.status).toBe(302);
91+
92+
// Verify database
93+
const resetQueue = await server.prisma.taskQueue.findUnique({
94+
where: { id: queue.id },
95+
});
96+
97+
// Concurrency limit is reset to base (which was 5)
98+
expect(resetQueue?.concurrencyLimit).toBe(5);
99+
expect(resetQueue?.rateLimit).toBe(null);
100+
});
101+
});

0 commit comments

Comments
 (0)