History

Register rate limiter component in convex tests

Rhys Sullivan committed 8 months ago

Commit 8536cf21 parent eac4b6c6 files · +106 −4Browse files

Unified · Split

6 files
  1. executor/packages/database/convex/access-controls.test.ts +5 −1
  2. executor/packages/database/convex/database.test.ts +5 −1
  3. executor/packages/database/convex/executorNode.github-profile.e2e.test.ts +5 −1
  4. executor/packages/database/convex/openApiSpecCache.test.ts +5 −1
  5. executor/packages/database/convex/testHelpers.ts +14 −0
  6. executor/packages/database/src/testing/rate_limiter_component.ts +72 −0
executor/packages/database/convex/access-controls.test.ts+5−1
@@ -3,13 +3,14 @@ import { convexTest } from "convex-test"; · 2 unmodified lines
3import { api } from "./_generated/api";3import { api } from "./_generated/api";
4import type { Id } from "./_generated/dataModel.d.ts";4import type { Id } from "./_generated/dataModel.d.ts";
5import schema from "./schema";5import schema from "./schema";
6import { registerRateLimiterComponent } from "./testHelpers";
6 7
7// ---------------------------------------------------------------------------8// ---------------------------------------------------------------------------
8// Helpers9// Helpers
9// ---------------------------------------------------------------------------10// ---------------------------------------------------------------------------
10 11
11function setup() {12function setup() {
12 return convexTest(schema, {13 const t = convexTest(schema, {
13 "./workspace.ts": () => import("./workspace"),14 "./workspace.ts": () => import("./workspace"),
14 "./workspaces.ts": () => import("./workspaces"),15 "./workspaces.ts": () => import("./workspaces"),
15 "./organizations.ts": () => import("./organizations"),16 "./organizations.ts": () => import("./organizations"),
@@ -25,6 +26,9 @@ function setup() { · 9 unmodified lines
25 "./toolRegistry.ts": () => import("./toolRegistry"),26 "./toolRegistry.ts": () => import("./toolRegistry"),
26 "./_generated/api.js": () => import("./_generated/api.js"),27 "./_generated/api.js": () => import("./_generated/api.js"),
27 });28 });
29
30 registerRateLimiterComponent(t);
31 return t;
28}32}
29 33
30/**34/**
executor/packages/database/convex/database.test.ts+5−1
@@ -3,13 +3,17 @@ import { convexTest } from "convex-test"; · 2 unmodified lines
3import { internal } from "./_generated/api";3import { internal } from "./_generated/api";
4import type { Id } from "./_generated/dataModel.d.ts";4import type { Id } from "./_generated/dataModel.d.ts";
5import schema from "./schema";5import schema from "./schema";
6import { registerRateLimiterComponent } from "./testHelpers";
6 7
7function setup() {8function setup() {
8 return convexTest(schema, {9 const t = convexTest(schema, {
9 "./database.ts": () => import("./database"),10 "./database.ts": () => import("./database"),
10 "./toolRegistry.ts": () => import("./toolRegistry"),11 "./toolRegistry.ts": () => import("./toolRegistry"),
11 "./_generated/api.js": () => import("./_generated/api.js"),12 "./_generated/api.js": () => import("./_generated/api.js"),
12 });13 });
14
15 registerRateLimiterComponent(t);
16 return t;
13}17}
14 18
15/** Insert a minimal workspace row and return its Id. */19/** Insert a minimal workspace row and return its Id. */
executor/packages/database/convex/executorNode.github-profile.e2e.test.ts+5−1
@@ -2,12 +2,13 @@ import { expect, test } from "bun:test"; · 1 unmodified line
2import { convexTest } from "convex-test";2import { convexTest } from "convex-test";
3import { internal } from "./_generated/api";3import { internal } from "./_generated/api";
4import schema from "./schema";4import schema from "./schema";
5import { registerRateLimiterComponent } from "./testHelpers";
5 6
6const GITHUB_OPENAPI_SPEC_URL =7const GITHUB_OPENAPI_SPEC_URL =
7 "https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json?convex_test_profile=github";8 "https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json?convex_test_profile=github";
8 9
9function setup() {10function setup() {
10 return convexTest(schema, {11 const t = convexTest(schema, {
11 "./database.ts": () => import("./database"),12 "./database.ts": () => import("./database"),
12 "./executorNode.ts": () => import("./executorNode"),13 "./executorNode.ts": () => import("./executorNode"),
13 "./workspaceAuthInternal.ts": () => import("./workspaceAuthInternal"),14 "./workspaceAuthInternal.ts": () => import("./workspaceAuthInternal"),
@@ -16,6 +17,9 @@ function setup() { · 2 unmodified lines
16 "./runtimeNode.ts": () => import("./runtimeNode"),17 "./runtimeNode.ts": () => import("./runtimeNode"),
17 "./_generated/api.js": () => import("./_generated/api.js"),18 "./_generated/api.js": () => import("./_generated/api.js"),
18 });19 });
20
21 registerRateLimiterComponent(t);
22 return t;
19}23}
20 24
21test("convex-test keeps GitHub inventory build warm-cache fast", async () => {25test("convex-test keeps GitHub inventory build warm-cache fast", async () => {
executor/packages/database/convex/openApiSpecCache.test.ts+5−1
@@ -2,13 +2,17 @@ import { expect, test, describe } from "bun:test"; · 1 unmodified line
2import { convexTest } from "convex-test";2import { convexTest } from "convex-test";
3import { internal } from "./_generated/api";3import { internal } from "./_generated/api";
4import schema from "./schema";4import schema from "./schema";
5import { registerRateLimiterComponent } from "./testHelpers";
5 6
6function setup() {7function setup() {
7 return convexTest(schema, {8 const t = convexTest(schema, {
8 "./openApiSpecCache.ts": () => import("./openApiSpecCache"),9 "./openApiSpecCache.ts": () => import("./openApiSpecCache"),
9 "./toolRegistry.ts": () => import("./toolRegistry"),10 "./toolRegistry.ts": () => import("./toolRegistry"),
10 "./_generated/api.js": () => import("./_generated/api.js"),11 "./_generated/api.js": () => import("./_generated/api.js"),
11 });12 });
13
14 registerRateLimiterComponent(t);
15 return t;
12}16}
13 17
14describe("openApiSpecCache table operations", () => {18describe("openApiSpecCache table operations", () => {
executor/packages/database/convex/testHelpers.ts+14−0
@@ -0,0 +1,14 @@
1import type { TestConvex } from "convex-test";
2import { defineSchema } from "convex/server";
3import type { GenericSchema, SchemaDefinition } from "convex/server";
4
5const rateLimiterSchema = defineSchema({});
6
7const rateLimiterModules = {
8 "./lib.ts": () => import("../src/testing/rate_limiter_component"),
9 "./_generated/api.js": () => import("./_generated/api.js"),
10};
11
12export function registerRateLimiterComponent(t: TestConvex<SchemaDefinition<GenericSchema, boolean>>): void {
13 t.registerComponent("rateLimiter", rateLimiterSchema, rateLimiterModules);
14}
executor/packages/database/src/testing/rate_limiter_component.ts+72−0
@@ -0,0 +1,72 @@
1import { mutationGeneric, queryGeneric } from "convex/server";
2import { v } from "convex/values";
3
4const limitArgs = {
5 name: v.string(),
6 config: v.any(),
7 key: v.optional(v.string()),
8 count: v.optional(v.number()),
9 reserve: v.optional(v.boolean()),
10 throws: v.optional(v.boolean()),
11};
12
13const limitResult = v.object({
14 ok: v.boolean(),
15 retryAfter: v.optional(v.number()),
16});
17
18export const rateLimit = mutationGeneric({
19 args: limitArgs,
20 returns: limitResult,
21 handler: async () => ({ ok: true }),
22});
23
24export const checkRateLimit = queryGeneric({
25 args: limitArgs,
26 returns: limitResult,
27 handler: async () => ({ ok: true }),
28});
29
30export const resetRateLimit = mutationGeneric({
31 args: {
32 name: v.string(),
33 key: v.optional(v.string()),
34 },
35 returns: v.null(),
36 handler: async () => null,
37});
38
39export const getValue = queryGeneric({
40 args: {
41 name: v.string(),
42 config: v.any(),
43 key: v.optional(v.string()),
44 sampleShards: v.optional(v.number()),
45 },
46 returns: v.object({
47 config: v.any(),
48 shard: v.number(),
49 ts: v.number(),
50 value: v.number(),
51 }),
52 handler: async (_ctx, args) => ({
53 config: args.config,
54 shard: 0,
55 ts: Date.now(),
56 value: 0,
57 }),
58});
59
60export const clearAll = mutationGeneric({
61 args: {
62 before: v.optional(v.number()),
63 },
64 returns: v.null(),
65 handler: async () => null,
66});
67
68export const getServerTime = mutationGeneric({
69 args: {},
70 returns: v.number(),
71 handler: async () => Date.now(),
72});