History

Make the test suite parallel-safe and speed up CI (#1273)

* Make self-host tests CI-safe * Await cloud db teardown * Give local e2e boots more headroom * Keep main CI runs alive * Cache CI dependencies and image layers * Wait for recorded introspection requests in graphql plugin tests * Size self-host test budget for loaded runners * Probe test http servers for readiness before use * Die on recorder wait timeout instead of typing a string error * Type the recorder wait timeout as a tagged error * Update e2e locators for the integration copy renames * Keep stale data rendered while a refresh is waiting * Guard create-org input against hydration clobbering * Match the new sign-in heading in the selfhost callback test

Rhys Sullivan committed 4 months ago

Commit 8652c991 parent 9c7e4a627 files · +252 −102Browse files

Showing the changes to packages/plugins/graphql/src/testing (1 of 27 files). Show all

Unified · Split

packages/plugins/graphql/src/testing/index.ts+23−0
@@ -5,6 +5,7 @@ import { · 4 unmodified lines
5 Layer,5 Layer,
6 Predicate,6 Predicate,
7 Ref,7 Ref,
8 Schedule,
8 Schema as EffectSchema,9 Schema as EffectSchema,
9 Scope,10 Scope,
10} from "effect";11} from "effect";
@@ -54,6 +55,28 @@ export interface GraphqlTestServerShape { · 43 unmodified lines
54 readonly clearRequests: Effect.Effect<void>;55 readonly clearRequests: Effect.Effect<void>;
55}56}
56 57
58export class GraphqlTestRecorderTimeoutError extends Data.TaggedError(
59 "GraphqlTestRecorderTimeoutError",
60)<{
61 readonly message: string;
62}> {}
63
64/** Poll the request recorder until `predicate` matches. Yoga captures requests
65 * asynchronously (`captureRequest` runs via `Effect.runPromise` in the handler
66 * context), so connect/invoke can resolve before the ref updates under load. */
67export const waitForRecordedRequests = (
68 requests: Effect.Effect<readonly GraphqlTestRequest[]>,
69 predicate: (requests: readonly GraphqlTestRequest[]) => boolean,
70 message = "timed out waiting for matching recorded GraphQL requests",
71): Effect.Effect<readonly GraphqlTestRequest[], GraphqlTestRecorderTimeoutError> =>
72 requests.pipe(
73 Effect.filterOrFail(
74 (all) => predicate(all),
75 () => new GraphqlTestRecorderTimeoutError({ message }),
76 ),
77 Effect.retry(Schedule.both(Schedule.spaced("50 millis"), Schedule.recurs(100))),
78 );
79
57class GraphqlTestServerAddressError extends Data.TaggedError("GraphqlTestServerAddressError")<{80class GraphqlTestServerAddressError extends Data.TaggedError("GraphqlTestServerAddressError")<{
58 readonly address: unknown;81 readonly address: unknown;
59}> {}82}> {}