diff --git a/generators/ruby-v2/dynamic-snippets/src/DynamicSnippetsGenerator.ts b/generators/ruby-v2/dynamic-snippets/src/DynamicSnippetsGenerator.ts index 75e7e02b8d24..18a2bd259d19 100644 --- a/generators/ruby-v2/dynamic-snippets/src/DynamicSnippetsGenerator.ts +++ b/generators/ruby-v2/dynamic-snippets/src/DynamicSnippetsGenerator.ts @@ -37,8 +37,11 @@ export class DynamicSnippetsGenerator extends AbstractDynamicSnippetsGenerator< return super.generateSync(request); } - public async generateSnippetAst(request: FernIr.dynamic.EndpointSnippetRequest): Promise { - return super.generateSnippetAst(request); + public async generateSnippetAst( + request: FernIr.dynamic.EndpointSnippetRequest, + options?: { skipClientInstantiation?: boolean } + ): Promise { + return super.generateSnippetAst(request, options); } protected createSnippetGenerator(context: DynamicSnippetsGeneratorContext): EndpointSnippetGenerator { diff --git a/generators/ruby-v2/dynamic-snippets/src/EndpointSnippetGenerator.ts b/generators/ruby-v2/dynamic-snippets/src/EndpointSnippetGenerator.ts index e4d4695dc34e..e84319838fb3 100644 --- a/generators/ruby-v2/dynamic-snippets/src/EndpointSnippetGenerator.ts +++ b/generators/ruby-v2/dynamic-snippets/src/EndpointSnippetGenerator.ts @@ -6,6 +6,7 @@ import { ruby } from "@fern-api/ruby-ast"; import { DynamicSnippetsGeneratorContext } from "./context/DynamicSnippetsGeneratorContext"; const CLIENT_VAR_NAME = "client"; +const INSTANCE_CLIENT_VAR_NAME = "@client"; export class EndpointSnippetGenerator { private context: DynamicSnippetsGeneratorContext; @@ -53,6 +54,9 @@ export class EndpointSnippetGenerator { request: FernIr.dynamic.EndpointSnippetRequest; options?: Options; }): Promise { + if (options?.skipClientInstantiation) { + return this.buildCodeBlockWithoutClient({ endpoint, snippet: request }); + } return this.buildCodeBlock({ endpoint, snippet: request }); } @@ -71,6 +75,22 @@ export class EndpointSnippetGenerator { }); } + /** + * Builds a code block without client instantiation. + * Used for wire tests where the client is already instantiated in the test setup. + */ + private buildCodeBlockWithoutClient({ + endpoint, + snippet + }: { + endpoint: FernIr.dynamic.Endpoint; + snippet: FernIr.dynamic.EndpointSnippetRequest; + }): ruby.AstNode { + return ruby.codeblock((writer) => { + writer.writeNodeStatement(this.callMethodOnExistingClient({ endpoint, snippet })); + }); + } + private constructClient({ endpoint, snippet @@ -362,6 +382,50 @@ export class EndpointSnippetGenerator { return ruby.invokeMethod(invokeMethodArgs); } + /** + * Calls a method on an existing client instance variable (@client). + * Used for wire tests where the client is already instantiated in the test setup. + */ + private callMethodOnExistingClient({ + endpoint, + snippet + }: { + endpoint: FernIr.dynamic.Endpoint; + snippet: FernIr.dynamic.EndpointSnippetRequest; + }): ruby.MethodInvocation { + const invokeMethodArgs: ruby.MethodInvocation.Args = { + on: ruby.codeblock(INSTANCE_CLIENT_VAR_NAME), + method: this.getMethod({ endpoint }), + arguments_: [] + }; + + switch (endpoint.request.type) { + case "inlined": + invokeMethodArgs.keywordArguments = this.getMethodArgsForInlinedRequest({ + request: endpoint.request, + snippet + }); + break; + case "body": + invokeMethodArgs.keywordArguments = this.getMethodArgsForBodyRequest({ + request: endpoint.request, + snippet + }); + break; + default: + assertNever(endpoint.request); + } + + // Add request_options with additional_headers for unmapped headers (e.g., X-Test-Id) + const requestOptions = this.getRequestOptions({ endpoint, snippet }); + if (requestOptions != null) { + invokeMethodArgs.keywordArguments = invokeMethodArgs.keywordArguments ?? []; + invokeMethodArgs.keywordArguments.push(requestOptions); + } + + return ruby.invokeMethod(invokeMethodArgs); + } + /** * Builds request_options from snippet headers for per-request options. * This is used when generating snippets for wire tests where headers like X-Test-Id diff --git a/generators/ruby-v2/sdk/src/wire-tests/WireTestGenerator.ts b/generators/ruby-v2/sdk/src/wire-tests/WireTestGenerator.ts index 27f0d5110682..89001f270266 100644 --- a/generators/ruby-v2/sdk/src/wire-tests/WireTestGenerator.ts +++ b/generators/ruby-v2/sdk/src/wire-tests/WireTestGenerator.ts @@ -1,22 +1,16 @@ import { File } from "@fern-api/base-generator"; import { RelativeFilePath } from "@fern-api/fs-utils"; import { WireMockMapping } from "@fern-api/mock-utils"; +import { ruby } from "@fern-api/ruby-ast"; import { DynamicSnippetsGenerator } from "@fern-api/ruby-dynamic-snippets"; -import { - dynamic, - HttpEndpoint, - HttpService, - InferredAuthScheme, - IntermediateRepresentation, - Literal -} from "@fern-fern/ir-sdk/api"; +import { dynamic, HttpEndpoint, HttpService, IntermediateRepresentation, Literal } from "@fern-fern/ir-sdk/api"; import { SdkGeneratorContext } from "../SdkGeneratorContext"; import { convertDynamicEndpointSnippetRequest } from "../utils/convertEndpointSnippetRequest"; import { convertIr } from "../utils/convertIr"; import { WireTestSetupGenerator } from "./WireTestSetupGenerator"; interface EndpointTestCase { - snippet: string; + snippetAst: ruby.AstNode; endpoint: HttpEndpoint; service: HttpService; exampleIndex: number; @@ -96,14 +90,12 @@ export class WireTestGenerator { const testId = this.buildDeterministicTestId(service, endpoint, exampleIndex); try { - const snippet = await this.generateSnippetForExample({ + const snippetAst = await this.generateSnippetAstForExample({ example: firstExample, - service, endpoint, - exampleIndex, testId }); - endpointTestCases.set(endpoint.id, { snippet, endpoint, service, exampleIndex, testId }); + endpointTestCases.set(endpoint.id, { snippetAst, endpoint, service, exampleIndex, testId }); } catch (error) { this.context.logger.warn(`Failed to generate snippet for endpoint ${endpoint.id}: ${error}`); continue; @@ -111,7 +103,7 @@ export class WireTestGenerator { } } - const testFileContent = this.buildTestFileContent(serviceName, endpointTestCases); + const testFileContent = await this.buildTestFileContent(serviceName, endpointTestCases); return new File(`${serviceName}_test.rb`, RelativeFilePath.of("test/wire"), testFileContent); } @@ -130,41 +122,29 @@ export class WireTestGenerator { return segments.join("."); } - private buildTestFileContent(serviceName: string, endpointTestCases: Map): string { + private async buildTestFileContent( + serviceName: string, + endpointTestCases: Map + ): Promise { const lines: string[] = []; // File header lines.push("# frozen_string_literal: true"); lines.push(""); - lines.push('require "test_helper"'); - lines.push('require "net/http"'); - lines.push('require "json"'); - lines.push('require "uri"'); - lines.push(`require "${this.context.getRootFolderName()}"`); - lines.push(""); - - // Test class - lines.push(`class ${this.toPascalCase(serviceName)}WireTest < Minitest::Test`); - lines.push(' WIREMOCK_BASE_URL = "http://localhost:8080"'); - lines.push(' WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin"'); + lines.push('require_relative "wiremock_test_case"'); lines.push(""); - // Setup method to skip wire tests unless RUN_WIRE_TESTS=true - lines.push(" def setup"); - lines.push(" super"); - lines.push(' unless ENV["RUN_WIRE_TESTS"] == "true"'); - lines.push(' skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them."'); - lines.push(" end"); - lines.push(" end"); + // Test class inherits from WireMockTestCase which provides helper methods + lines.push(`class ${this.toPascalCase(serviceName)}WireTest < WireMockTestCase`); lines.push(""); - // Helper methods - lines.push(...this.generateHelperMethods()); + // Setup method that creates the client once (base class handles skip logic) + lines.push(...this.generateSetupMethod()); lines.push(""); // Test methods - for (const { snippet, endpoint, testId } of endpointTestCases.values()) { - const testMethod = this.generateEndpointTestMethod(endpoint, snippet, serviceName, testId); + for (const { snippetAst, endpoint, testId } of endpointTestCases.values()) { + const testMethod = await this.generateEndpointTestMethod(endpoint, snippetAst, serviceName, testId); if (testMethod) { lines.push(...testMethod); lines.push(""); @@ -176,336 +156,123 @@ export class WireTestGenerator { return lines.join("\n"); } - private generateHelperMethods(): string[] { + /** + * Generates the setup method that creates the client once with auth and base_url. + * This follows the PHP/Python pattern of client reuse for better performance. + * The base class (WireMockTestCase) handles the skip logic for wire tests. + */ + private generateSetupMethod(): string[] { const lines: string[] = []; - // verify_request_count method - filters by X-Test-Id header - lines.push(" def verify_request_count(test_id:, method:, url_path:, query_params: nil, expected:)"); - lines.push(' uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find")'); - lines.push(" http = Net::HTTP.new(uri.host, uri.port)"); - lines.push(' post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" })'); - lines.push(""); - lines.push(' request_body = { "method" => method, "urlPath" => url_path }'); - lines.push(' request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } }'); - lines.push(" if query_params"); - lines.push(' request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } }'); - lines.push(" end"); - lines.push(""); - lines.push(" post_request.body = request_body.to_json"); - lines.push(" response = http.request(post_request)"); - lines.push(" result = JSON.parse(response.body)"); - lines.push(' requests = result["requests"] || []'); + lines.push(" def setup"); + lines.push(" super"); lines.push(""); - lines.push( - ' assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}"' - ); - lines.push(" end"); - return lines; - } + // Build auth parameters for the client constructor + const authParams = this.buildAuthParamsForSetup(); + const clientClassName = `${this.context.getRootModuleName()}::Client`; - private generateEndpointTestMethod( - endpoint: HttpEndpoint, - snippet: string, - serviceName: string, - testId: string - ): string[] | null { - try { - const testName = this.getTestMethodName(endpoint, serviceName); - const basePath = this.buildBasePath(endpoint); - const queryParamsCode = this.buildQueryParamsCode(endpoint); - - const lines: string[] = []; - - lines.push(` def ${testName}`); - lines.push(` test_id = "${testId}"`); - lines.push(""); - - // Process the snippet to use WireMock base URL and inject auth - const processedSnippet = this.processSnippetForWireMock(snippet, endpoint); - const snippetLines = processedSnippet.split("\n"); - for (const line of snippetLines) { - if (line.trim()) { - lines.push(` ${line}`); - } + // Generate client instantiation with auth and base_url + if (authParams.length > 0) { + lines.push(` @client = ${clientClassName}.new(`); + for (const param of authParams) { + lines.push(` ${param},`); } - lines.push(""); - - // Verify request count using test_id header - lines.push(` verify_request_count(`); - lines.push(` test_id: test_id,`); - lines.push(` method: "${endpoint.method}",`); - lines.push(` url_path: "${basePath}",`); - lines.push(` query_params: ${queryParamsCode},`); - lines.push(` expected: 1`); - lines.push(` )`); - lines.push(" end"); - - return lines; - } catch (error) { - this.context.logger.warn(`Failed to generate test method for endpoint ${endpoint.id}: ${error}`); - return null; - } - } - - private processSnippetForWireMock(snippet: string, _endpoint: HttpEndpoint): string { - // Replace the base_url in the client constructor with WireMock URL - // Look for patterns like: base_url: "..." or environment: ... - let processed = snippet; - - // If there's a base_url argument, replace it - if (processed.includes("base_url:")) { - processed = processed.replace(/base_url:\s*["'][^"']*["']/, "base_url: WIREMOCK_BASE_URL"); - } else if (processed.includes("environment:")) { - // Replace environment with base_url - processed = processed.replace(/environment:\s*[^,)\n]+/, "base_url: WIREMOCK_BASE_URL"); + lines.push(" base_url: WIREMOCK_BASE_URL"); + lines.push(" )"); } else { - // Add base_url to the client constructor - // Find the Client.new( pattern and add base_url - processed = processed.replace(/(\w+::Client\.new\()/, "$1base_url: WIREMOCK_BASE_URL, "); - } - - // Inject global auth if available and not already present in the snippet - // Check if auth is already in the snippet to avoid duplicates - if (this.context.ir.auth.schemes.length > 0 && !this.snippetHasAuth(processed)) { - processed = this.injectAuthIntoSnippet(processed); + lines.push(` @client = ${clientClassName}.new(base_url: WIREMOCK_BASE_URL)`); } - // Inject base_url into request_options for the method call - // This ensures the endpoint uses WireMock URL even if the SDK falls back to a default environment - processed = this.injectBaseUrlIntoRequestOptions(processed); - - return processed; - } - - /** - * Injects base_url: WIREMOCK_BASE_URL into the request_options hash of the method call. - * This is necessary because the SDK endpoint code may fall back to a default environment - * if request_options[:base_url] is not provided. - */ - private injectBaseUrlIntoRequestOptions(snippet: string): string { - // Check if there's already a request_options in the method call - if (snippet.includes("request_options:")) { - // Add base_url to existing request_options hash - // Pattern: request_options: { ... } -> request_options: { base_url: WIREMOCK_BASE_URL, ... } - return snippet.replace(/request_options:\s*\{/, "request_options: { base_url: WIREMOCK_BASE_URL, "); - } - - // No request_options, need to add it to the method call - // Find the method call pattern: client.some.method(...) or client.some.method - // Look for the last method call (after client initialization) - - // Pattern for method call with arguments: .method_name(args) - const methodCallWithArgsPattern = /(\.\w+\()([^)]*)\)(\s*)$/; - const matchWithArgs = snippet.match(methodCallWithArgsPattern); - - if (matchWithArgs) { - const [, methodStart, existingArgs, trailingSpace] = matchWithArgs; - if (existingArgs && existingArgs.trim()) { - // There are existing arguments, add request_options at the end - return snippet.replace( - methodCallWithArgsPattern, - `${methodStart}${existingArgs}, request_options: { base_url: WIREMOCK_BASE_URL })${trailingSpace}` - ); - } else { - // Empty parentheses, add request_options - return snippet.replace( - methodCallWithArgsPattern, - `${methodStart}request_options: { base_url: WIREMOCK_BASE_URL })${trailingSpace}` - ); - } - } - - // Pattern for method call without parentheses: .method_name at end of line - const methodCallNoParensPattern = /(\.\w+)(\s*)$/; - const matchNoParens = snippet.match(methodCallNoParensPattern); - - if (matchNoParens) { - const [, methodName, trailingSpace] = matchNoParens; - return snippet.replace( - methodCallNoParensPattern, - `${methodName}(request_options: { base_url: WIREMOCK_BASE_URL })${trailingSpace}` - ); - } + lines.push(" end"); - return snippet; + return lines; } /** - * Checks if the snippet already contains auth parameters in the client constructor. - * Only checks within the Client.new(...) call, not in method calls. + * Builds auth parameters for the setup method based on global auth schemes. */ - private snippetHasAuth(snippet: string): boolean { - const scheme = this.context.ir.auth.schemes[0]; - if (!scheme) { - return true; // No auth scheme means "auth is satisfied" - } - - // Extract just the client constructor portion to avoid false positives - // from auth parameters that appear in method calls - const clientConstructorMatch = snippet.match(/::Client\.new\([^)]*\)/); - if (!clientConstructorMatch) { - return false; // No client constructor found, auth needs to be injected - } - const clientConstructor = clientConstructorMatch[0]; - - switch (scheme.type) { - case "bearer": - // Check for token parameter in client constructor - return clientConstructor.includes(`${scheme.token.snakeCase.safeName}:`); - case "header": - // Check for header auth parameter in client constructor - return clientConstructor.includes(`${scheme.name.name.snakeCase.safeName}:`); - case "basic": - // Check for username parameter in client constructor - return clientConstructor.includes(`${scheme.username.snakeCase.safeName}:`); - case "oauth": - // Check for client_id parameter in client constructor - return clientConstructor.includes("client_id:"); - case "inferred": { - // Check if the first inferred auth parameter is present in the client constructor - // The inferred auth params are extracted from the token endpoint - const inferredParams = this.getParametersForInferredAuth(scheme); - if (inferredParams.length === 0) { - return true; // No params to inject + private buildAuthParamsForSetup(): string[] { + const authParams: string[] = []; + + for (const scheme of this.context.ir.auth.schemes) { + switch (scheme.type) { + case "bearer": + authParams.push(`${scheme.token.snakeCase.safeName}: ""`); + break; + case "header": + authParams.push(`${scheme.name.name.snakeCase.safeName}: "test-api-key"`); + break; + case "basic": + authParams.push(`${scheme.username.snakeCase.safeName}: "test-username"`); + authParams.push(`${scheme.password.snakeCase.safeName}: "test-password"`); + break; + case "oauth": + authParams.push('client_id: "test-client-id"'); + authParams.push('client_secret: "test-client-secret"'); + break; + case "inferred": { + // Handle inferred auth by extracting parameters from the token endpoint + const inferredAuth = this.context.getInferredAuth(); + if (inferredAuth != null) { + const inferredParams = this.buildInferredAuthParamsForSetup(inferredAuth); + authParams.push(...inferredParams); + } + break; } - // Check if the first non-literal param is present - const firstParam = inferredParams.find((p) => p.literal == null); - return firstParam ? clientConstructor.includes(`${firstParam.snakeName}:`) : true; } - default: - return true; } - } - /** - * Injects auth parameters into the client constructor based on global auth schemes. - * This is necessary because the dynamic snippets generator only handles auth when - * endpoint.auth is set, but global auth is defined at the API level. - */ - private injectAuthIntoSnippet(snippet: string): string { - const scheme = this.context.ir.auth.schemes[0]; - if (!scheme) { - return snippet; - } - - let authArg: string | undefined; - - switch (scheme.type) { - case "bearer": - authArg = `${scheme.token.snakeCase.safeName}: ""`; - break; - case "header": - authArg = `${scheme.name.name.snakeCase.safeName}: "test-api-key"`; - break; - case "basic": - authArg = `${scheme.username.snakeCase.safeName}: "test-username", ${scheme.password.snakeCase.safeName}: "test-password"`; - break; - case "oauth": - // OAuth client credentials - authArg = `client_id: "test-client-id", client_secret: "test-client-secret"`; - break; - case "inferred": - // Build auth args from the inferred auth parameters - authArg = this.buildInferredAuthArgs(scheme); - break; - default: - return snippet; - } - - if (authArg) { - // Insert auth arg into the Client.new(...) call - // Handle case where there are already args (has comma after opening paren content) - if (snippet.match(/::Client\.new\([^)]+\)/)) { - // There are already arguments, add auth at the beginning - snippet = snippet.replace(/(\w+::Client\.new\()/, `$1${authArg}, `); - } else { - // Empty args, just add auth - snippet = snippet.replace(/(\w+::Client\.new\()(\))/, `$1${authArg}$2`); - } - } - - return snippet; + return authParams; } /** - * Builds the auth args string for inferred auth schemes. - * Extracts the required parameters from the token endpoint and creates test values. + * Builds inferred auth parameters for the setup method. */ - private buildInferredAuthArgs(scheme: InferredAuthScheme): string | undefined { - const params = this.getParametersForInferredAuth(scheme); - if (params.length === 0) { - return undefined; + private buildInferredAuthParamsForSetup(scheme: ReturnType): string[] { + if (scheme == null) { + return []; } - return params - .filter((p) => p.literal == null) // Only include non-literal parameters - .map((p) => `${p.snakeName}: "test-${p.snakeName.replace(/_/g, "-")}"`) - .join(", "); - } - - /** - * Extracts the required parameters from the inferred auth token endpoint. - * This mirrors the logic in InferredAuthProviderGenerator.getTokenEndpointRequestProperties. - */ - private getParametersForInferredAuth( - scheme: InferredAuthScheme - ): Array<{ snakeName: string; isOptional: boolean; literal?: Literal }> { - const parameters: Array<{ snakeName: string; isOptional: boolean; literal?: Literal }> = []; - - const tokenEndpointReference = scheme.tokenEndpoint.endpoint; - const service = this.context.ir.services[tokenEndpointReference.serviceId]; + const params: string[] = []; + const tokenEndpointRef = scheme.tokenEndpoint.endpoint; + const service = this.context.ir.services[tokenEndpointRef.serviceId]; if (service == null) { return []; } - const endpoint = service.endpoints.find((e) => e.id === tokenEndpointReference.endpointId); + const endpoint = service.endpoints.find((e) => e.id === tokenEndpointRef.endpointId); if (endpoint == null) { return []; } - // Add query parameters - // This matches InferredAuthProviderGenerator behavior - for (const query of endpoint.queryParameters) { - const literal = this.maybeLiteral(query.valueType); - parameters.push({ - snakeName: query.name.name.snakeCase.unsafeName, - isOptional: this.isOptional(query.valueType), - literal - }); - } - - // Get the request body properties (if inlined request body) + // Extract parameters from request body properties const requestBody = endpoint.requestBody; if (requestBody != null && requestBody.type === "inlinedRequestBody") { for (const property of requestBody.properties) { const literal = this.maybeLiteral(property.valueType); - parameters.push({ - snakeName: property.name.name.snakeCase.unsafeName, - isOptional: this.isOptional(property.valueType), - literal - }); + if (literal == null) { + const paramName = property.name.name.snakeCase.safeName; + params.push(`${paramName}: "test-${paramName.replace(/_/g, "-")}"`); + } } } - // Add headers (service-level and endpoint-level) - // This matches InferredAuthProviderGenerator behavior - for (const header of [...service.headers, ...endpoint.headers]) { + // Extract parameters from endpoint headers + for (const header of endpoint.headers) { const literal = this.maybeLiteral(header.valueType); - parameters.push({ - snakeName: header.name.name.snakeCase.unsafeName, - isOptional: this.isOptional(header.valueType), - literal - }); + if (literal == null) { + const paramName = header.name.name.snakeCase.safeName; + params.push(`${paramName}: "test-${paramName.replace(/_/g, "-")}"`); + } } - return parameters; - } - - private isOptional(typeReference: { type: string }): boolean { - return typeReference.type === "container" || typeReference.type === "unknown"; + return params; } + /** + * Checks if a type reference is a literal type and returns the literal value if so. + */ private maybeLiteral(typeReference: { type: string; container?: { type: string; literal?: Literal }; @@ -519,6 +286,52 @@ export class WireTestGenerator { return undefined; } + private async generateEndpointTestMethod( + endpoint: HttpEndpoint, + snippetAst: ruby.AstNode, + serviceName: string, + testId: string + ): Promise { + try { + const testName = this.getTestMethodName(endpoint, serviceName); + const basePath = this.buildBasePath(endpoint); + const queryParamsCode = this.buildQueryParamsCode(endpoint); + + const lines: string[] = []; + + lines.push(` def ${testName}`); + lines.push(` test_id = "${testId}"`); + lines.push(""); + + // Convert the snippet AST to string + const snippetCode = await (snippetAst as ruby.AstNode).toStringAsync({ + customConfig: this.context.customConfig ?? {} + }); + const snippetLines = snippetCode.split("\n"); + for (const line of snippetLines) { + if (line.trim()) { + lines.push(` ${line}`); + } + } + lines.push(""); + + // Verify request count using test_id header + lines.push(` verify_request_count(`); + lines.push(` test_id: test_id,`); + lines.push(` method: "${endpoint.method}",`); + lines.push(` url_path: "${basePath}",`); + lines.push(` query_params: ${queryParamsCode},`); + lines.push(` expected: 1`); + lines.push(` )`); + lines.push(" end"); + + return lines; + } catch (error) { + this.context.logger.warn(`Failed to generate test method for endpoint ${endpoint.id}: ${error}`); + return null; + } + } + private buildBasePath(endpoint: HttpEndpoint): string { let basePath = endpoint.fullPath.head + @@ -616,109 +429,35 @@ export class WireTestGenerator { return example.examples?.[0] ?? null; } - private async generateSnippetForExample({ + /** + * Generates a snippet AST for an example using skipClientInstantiation. + * This is the new approach that passes base_url and auth through the snippet request + * instead of post-processing the generated snippet string with regex. + */ + private async generateSnippetAstForExample({ example, endpoint, testId }: { example: dynamic.EndpointSnippetRequest; - service: HttpService; endpoint: HttpEndpoint; - exampleIndex: number; testId: string; - }): Promise { - // Inject the X-Test-Id header and test auth values into the example request + }): Promise { + // Inject the X-Test-Id header into the example request + // Auth is handled in the setup method, so we don't need to inject it here const exampleWithTestId: dynamic.EndpointSnippetRequest = { ...example, headers: { ...(example.headers ?? {}), "X-Test-Id": testId - }, - // Inject test auth values if the endpoint requires auth but example doesn't have them - auth: example.auth ?? this.getTestAuthValues(endpoint) + } }; const snippetRequest = convertDynamicEndpointSnippetRequest(exampleWithTestId); - const response = this.dynamicSnippetsGenerator.generateSync(snippetRequest); - if (!response.snippet) { - throw new Error("No snippet generated for example"); - } - return response.snippet; - } - - /** - * Generates test auth values for wire tests based on the endpoint's or global auth configuration. - * These are placeholder values that work with WireMock stubs. - */ - private getTestAuthValues(endpoint: HttpEndpoint): dynamic.AuthValues | undefined { - // First try to get auth from the dynamic endpoint - const dynamicEndpoint = this.dynamicIr.endpoints[endpoint.id]; - if (dynamicEndpoint?.auth) { - return this.createAuthValuesFromDynamicAuth(dynamicEndpoint.auth); - } - - // Fall back to global auth schemes if endpoint doesn't have specific auth - if (this.context.ir.auth.schemes.length > 0) { - return this.createAuthValuesFromGlobalSchemes(); - } - - return undefined; - } - - private createAuthValuesFromDynamicAuth(auth: dynamic.Auth): dynamic.AuthValues | undefined { - switch (auth.type) { - case "bearer": - return dynamic.AuthValues.bearer({ - token: "" - }); - case "basic": - return dynamic.AuthValues.basic({ - username: "test-username", - password: "test-password" - }); - case "header": - return dynamic.AuthValues.header({ - value: "test-api-key" - }); - case "oauth": - return dynamic.AuthValues.oauth({ - clientId: "test-client-id", - clientSecret: "test-client-secret" - }); - default: - return undefined; - } - } - - private createAuthValuesFromGlobalSchemes(): dynamic.AuthValues | undefined { - // Use the first auth scheme defined in the IR - const scheme = this.context.ir.auth.schemes[0]; - if (!scheme) { - return undefined; - } - - switch (scheme.type) { - case "bearer": - return dynamic.AuthValues.bearer({ - token: "" - }); - case "basic": - return dynamic.AuthValues.basic({ - username: "test-username", - password: "test-password" - }); - case "header": - return dynamic.AuthValues.header({ - value: "test-api-key" - }); - case "oauth": - return dynamic.AuthValues.oauth({ - clientId: "test-client-id", - clientSecret: "test-client-secret" - }); - default: - return undefined; - } + const snippetAst = await this.dynamicSnippetsGenerator.generateSnippetAst(snippetRequest, { + skipClientInstantiation: true + }); + return snippetAst as ruby.AstNode; } private groupEndpointsByService(): Map { diff --git a/generators/ruby-v2/sdk/src/wire-tests/WireTestSetupGenerator.ts b/generators/ruby-v2/sdk/src/wire-tests/WireTestSetupGenerator.ts index 7d2c934af692..e42f9e7a5050 100644 --- a/generators/ruby-v2/sdk/src/wire-tests/WireTestSetupGenerator.ts +++ b/generators/ruby-v2/sdk/src/wire-tests/WireTestSetupGenerator.ts @@ -19,10 +19,12 @@ export class WireTestSetupGenerator { /** * Generates docker-compose.test.yml file to spin up WireMock as a docker container + * and WireMockTestCase.rb for managing container lifecycle and helper methods */ public generate(): void { this.generateWireMockConfigFile(); this.generateDockerComposeFile(); + this.generateWireMockTestCaseFile(); } public static getWiremockConfigContent(ir: IntermediateRepresentation) { @@ -187,6 +189,74 @@ export class WireTestSetupGenerator { timeout: 5s retries: 15 start_period: 5s +`; + } + + /** + * Generates a WireMockTestCase.rb file that provides a base test case class + * with helper methods for WireMock-based wire tests. + */ + private generateWireMockTestCaseFile(): void { + const testCaseContent = this.buildWireMockTestCaseContent(); + const testCaseFile = new File("wiremock_test_case.rb", RelativeFilePath.of("test/wire"), testCaseContent); + this.context.project.addRawFiles(testCaseFile); + this.context.logger.debug("Generated wiremock_test_case.rb for WireMock helper methods"); + } + + /** + * Builds the content for the WireMockTestCase.rb file + */ + private buildWireMockTestCaseContent(): string { + const rootFolderName = this.context.getRootFolderName(); + return `# frozen_string_literal: true + +require "test_helper" +require "net/http" +require "json" +require "uri" +require "${rootFolderName}" + +# Base test case for WireMock-based wire tests. +# +# This class provides helper methods for verifying requests made to WireMock +# and manages the test lifecycle for integration tests. +class WireMockTestCase < Minitest::Test + WIREMOCK_BASE_URL = "http://localhost:8080" + WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" + + def setup + super + unless ENV["RUN_WIRE_TESTS"] == "true" + skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." + end + end + + # Verifies the number of requests made to WireMock filtered by test ID for concurrency safety. + # + # @param test_id [String] The test ID used to filter requests + # @param method [String] The HTTP method (GET, POST, etc.) + # @param url_path [String] The URL path to match + # @param query_params [Hash, nil] Query parameters to match + # @param expected [Integer] Expected number of requests + def verify_request_count(test_id:, method:, url_path:, query_params: nil, expected:) + uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") + http = Net::HTTP.new(uri.host, uri.port) + post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) + + request_body = { "method" => method, "urlPath" => url_path } + request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } + if query_params + request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } + end + + post_request.body = request_body.to_json + response = http.request(post_request) + result = JSON.parse(response.body) + requests = result["requests"] || [] + + assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + end +end `; } } diff --git a/generators/ruby-v2/sdk/versions.yml b/generators/ruby-v2/sdk/versions.yml index 0375c513b343..ebfd0dbe3514 100644 --- a/generators/ruby-v2/sdk/versions.yml +++ b/generators/ruby-v2/sdk/versions.yml @@ -1,5 +1,17 @@ # yaml-language-server: $schema=../../../fern-versions-yml.schema.json +- version: 1.0.0-rc65 + createdAt: "2025-12-11" + changelogEntry: + - type: chore + summary: | + Improve wire test generation with client reuse and AST-level snippet handling. + The client is now instantiated once in the setup method and reused across all tests, + following the PHP/Python pattern for better performance. Replaced fragile regex-based + snippet patching with AST-level code generation using skipClientInstantiation option. + Helper methods are now centralized in a WireMockTestCase base class. + irVersion: 61 + - version: 1.0.0-rc64 createdAt: "2025-12-10" changelogEntry: diff --git a/seed/ruby-sdk-v2/examples/wire-tests/test/wire/file_notification_service_test.rb b/seed/ruby-sdk-v2/examples/wire-tests/test/wire/file_notification_service_test.rb index d79a000e2da7..4ab1a484bb32 100644 --- a/seed/ruby-sdk-v2/examples/wire-tests/test/wire/file_notification_service_test.rb +++ b/seed/ruby-sdk-v2/examples/wire-tests/test/wire/file_notification_service_test.rb @@ -1,50 +1,27 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class FileNotificationServiceWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class FileNotificationServiceWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_file_notification_service_get_exception_with_wiremock test_id = "file.notification.service.get_exception.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.file.notification.service.get_exception( + @client.file.notification.service.get_exception( notification_id: "notification-hsy129x", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "file.notification.service.get_exception.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "file.notification.service.get_exception.0" + } + } ) verify_request_count( diff --git a/seed/ruby-sdk-v2/examples/wire-tests/test/wire/file_service_test.rb b/seed/ruby-sdk-v2/examples/wire-tests/test/wire/file_service_test.rb index e7789d87c213..f8e5a0869858 100644 --- a/seed/ruby-sdk-v2/examples/wire-tests/test/wire/file_service_test.rb +++ b/seed/ruby-sdk-v2/examples/wire-tests/test/wire/file_service_test.rb @@ -1,51 +1,28 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class FileServiceWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class FileServiceWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_file_service_get_file_with_wiremock test_id = "file.service.get_file.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.file.service.get_file( + @client.file.service.get_file( filename: "file.txt", x_file_api_version: "0.0.2", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "file.service.get_file.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "file.service.get_file.0" + } + } ) verify_request_count( diff --git a/seed/ruby-sdk-v2/examples/wire-tests/test/wire/health_service_test.rb b/seed/ruby-sdk-v2/examples/wire-tests/test/wire/health_service_test.rb index 36def2d302e2..a416b0e7074e 100644 --- a/seed/ruby-sdk-v2/examples/wire-tests/test/wire/health_service_test.rb +++ b/seed/ruby-sdk-v2/examples/wire-tests/test/wire/health_service_test.rb @@ -1,50 +1,27 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class HealthServiceWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class HealthServiceWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_health_service_check_with_wiremock test_id = "health.service.check.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.health.service.check( + @client.health.service.check( id: "id-2sdx82h", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "health.service.check.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "health.service.check.0" + } + } ) verify_request_count( @@ -59,12 +36,11 @@ def test_health_service_check_with_wiremock def test_health_service_ping_with_wiremock test_id = "health.service.ping.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.health.service.ping(request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "health.service.ping.0" - } }) + @client.health.service.ping(request_options: { + additional_headers: { + "X-Test-Id" => "health.service.ping.0" + } + }) verify_request_count( test_id: test_id, diff --git a/seed/ruby-sdk-v2/examples/wire-tests/test/wire/service_test.rb b/seed/ruby-sdk-v2/examples/wire-tests/test/wire/service_test.rb index 6df1d624e723..82ede9187051 100644 --- a/seed/ruby-sdk-v2/examples/wire-tests/test/wire/service_test.rb +++ b/seed/ruby-sdk-v2/examples/wire-tests/test/wire/service_test.rb @@ -1,50 +1,27 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class ServiceWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class ServiceWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_service_get_movie_with_wiremock test_id = "service.get_movie.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.service.get_movie( + @client.service.get_movie( movie_id: "movie-c06a4ad7", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "service.get_movie.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "service.get_movie.0" + } + } ) verify_request_count( @@ -59,9 +36,7 @@ def test_service_get_movie_with_wiremock def test_service_create_movie_with_wiremock test_id = "service.create_movie.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.service.create_movie( + @client.service.create_movie( id: "movie-c06a4ad7", prequel: "movie-cv9b914f", title: "The Boy and the Heron", @@ -71,10 +46,11 @@ def test_service_create_movie_with_wiremock tag: "tag-wf9as23d", metadata: {}, revenue: 1_000_000, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "service.create_movie.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "service.create_movie.0" + } + } ) verify_request_count( @@ -89,15 +65,14 @@ def test_service_create_movie_with_wiremock def test_service_get_metadata_with_wiremock test_id = "service.get_metadata.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.service.get_metadata( + @client.service.get_metadata( shallow: false, x_api_version: "0.0.1", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "service.get_metadata.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "service.get_metadata.0" + } + } ) verify_request_count( @@ -112,9 +87,7 @@ def test_service_get_metadata_with_wiremock def test_service_create_big_entity_with_wiremock test_id = "service.create_big_entity.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.service.create_big_entity( + @client.service.create_big_entity( cast_member: { name: "name", id: "id" @@ -259,10 +232,11 @@ def test_service_create_big_entity_with_wiremock date: "2023-01-15", datetime: "2024-01-15T09:30:00Z" }, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "service.create_big_entity.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "service.create_big_entity.0" + } + } ) verify_request_count( @@ -277,12 +251,11 @@ def test_service_create_big_entity_with_wiremock def test_service_refresh_token_with_wiremock test_id = "service.refresh_token.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.service.refresh_token(request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "service.refresh_token.0" - } }) + @client.service.refresh_token(request_options: { + additional_headers: { + "X-Test-Id" => "service.refresh_token.0" + } + }) verify_request_count( test_id: test_id, diff --git a/seed/ruby-sdk-v2/examples/wire-tests/test/wire/wiremock_test_case.rb b/seed/ruby-sdk-v2/examples/wire-tests/test/wire/wiremock_test_case.rb new file mode 100644 index 000000000000..f38232935156 --- /dev/null +++ b/seed/ruby-sdk-v2/examples/wire-tests/test/wire/wiremock_test_case.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require "test_helper" +require "net/http" +require "json" +require "uri" +require "seed" + +# Base test case for WireMock-based wire tests. +# +# This class provides helper methods for verifying requests made to WireMock +# and manages the test lifecycle for integration tests. +class WireMockTestCase < Minitest::Test + WIREMOCK_BASE_URL = "http://localhost:8080" + WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" + + def setup + super + return if ENV["RUN_WIRE_TESTS"] == "true" + + skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." + end + + # Verifies the number of requests made to WireMock filtered by test ID for concurrency safety. + # + # @param test_id [String] The test ID used to filter requests + # @param method [String] The HTTP method (GET, POST, etc.) + # @param url_path [String] The URL path to match + # @param query_params [Hash, nil] Query parameters to match + # @param expected [Integer] Expected number of requests + def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) + uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") + http = Net::HTTP.new(uri.host, uri.port) + post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) + + request_body = { "method" => method, "urlPath" => url_path } + request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } + request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params + + post_request.body = request_body.to_json + response = http.request(post_request) + result = JSON.parse(response.body) + requests = result["requests"] || [] + + assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + end +end diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_container_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_container_test.rb index 2c9379e40240..e48bc1963630 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_container_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_container_test.rb @@ -1,50 +1,27 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class EndpointsContainerWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class EndpointsContainerWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_endpoints_container_get_and_return_list_of_primitives_with_wiremock test_id = "endpoints.container.get_and_return_list_of_primitives.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.container.get_and_return_list_of_primitives( + @client.endpoints.container.get_and_return_list_of_primitives( request: %w[string string], - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.container.get_and_return_list_of_primitives.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.container.get_and_return_list_of_primitives.0" + } + } ) verify_request_count( @@ -59,18 +36,17 @@ def test_endpoints_container_get_and_return_list_of_primitives_with_wiremock def test_endpoints_container_get_and_return_list_of_objects_with_wiremock test_id = "endpoints.container.get_and_return_list_of_objects.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.container.get_and_return_list_of_objects( + @client.endpoints.container.get_and_return_list_of_objects( request: [{ string: "string" }, { string: "string" }], - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.container.get_and_return_list_of_objects.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.container.get_and_return_list_of_objects.0" + } + } ) verify_request_count( @@ -85,14 +61,13 @@ def test_endpoints_container_get_and_return_list_of_objects_with_wiremock def test_endpoints_container_get_and_return_set_of_primitives_with_wiremock test_id = "endpoints.container.get_and_return_set_of_primitives.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.container.get_and_return_set_of_primitives( + @client.endpoints.container.get_and_return_set_of_primitives( request: Set.new(["string"]), - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.container.get_and_return_set_of_primitives.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.container.get_and_return_set_of_primitives.0" + } + } ) verify_request_count( @@ -107,16 +82,15 @@ def test_endpoints_container_get_and_return_set_of_primitives_with_wiremock def test_endpoints_container_get_and_return_set_of_objects_with_wiremock test_id = "endpoints.container.get_and_return_set_of_objects.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.container.get_and_return_set_of_objects( + @client.endpoints.container.get_and_return_set_of_objects( request: Set.new([{ string: "string" }]), - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.container.get_and_return_set_of_objects.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.container.get_and_return_set_of_objects.0" + } + } ) verify_request_count( @@ -131,16 +105,15 @@ def test_endpoints_container_get_and_return_set_of_objects_with_wiremock def test_endpoints_container_get_and_return_map_prim_to_prim_with_wiremock test_id = "endpoints.container.get_and_return_map_prim_to_prim.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.container.get_and_return_map_prim_to_prim( + @client.endpoints.container.get_and_return_map_prim_to_prim( request: { string: "string" }, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.container.get_and_return_map_prim_to_prim.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.container.get_and_return_map_prim_to_prim.0" + } + } ) verify_request_count( @@ -155,18 +128,17 @@ def test_endpoints_container_get_and_return_map_prim_to_prim_with_wiremock def test_endpoints_container_get_and_return_map_of_prim_to_object_with_wiremock test_id = "endpoints.container.get_and_return_map_of_prim_to_object.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.container.get_and_return_map_of_prim_to_object( + @client.endpoints.container.get_and_return_map_of_prim_to_object( request: { string: { string: "string" } }, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.container.get_and_return_map_of_prim_to_object.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.container.get_and_return_map_of_prim_to_object.0" + } + } ) verify_request_count( @@ -181,16 +153,15 @@ def test_endpoints_container_get_and_return_map_of_prim_to_object_with_wiremock def test_endpoints_container_get_and_return_optional_with_wiremock test_id = "endpoints.container.get_and_return_optional.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.container.get_and_return_optional( + @client.endpoints.container.get_and_return_optional( request: { string: "string" }, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.container.get_and_return_optional.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.container.get_and_return_optional.0" + } + } ) verify_request_count( diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_content_type_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_content_type_test.rb index 444d3f5e9e46..0aeb4d791cc2 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_content_type_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_content_type_test.rb @@ -1,45 +1,21 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class EndpointsContentTypeWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class EndpointsContentTypeWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_endpoints_content_type_post_json_patch_content_type_with_wiremock test_id = "endpoints.content_type.post_json_patch_content_type.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.content_type.post_json_patch_content_type( + @client.endpoints.content_type.post_json_patch_content_type( string: "string", integer: 1, long: 1_000_000, @@ -55,10 +31,11 @@ def test_endpoints_content_type_post_json_patch_content_type_with_wiremock 1 => "map" }, bigint: "1000000", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.content_type.post_json_patch_content_type.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.content_type.post_json_patch_content_type.0" + } + } ) verify_request_count( @@ -73,9 +50,7 @@ def test_endpoints_content_type_post_json_patch_content_type_with_wiremock def test_endpoints_content_type_post_json_patch_content_with_charset_type_with_wiremock test_id = "endpoints.content_type.post_json_patch_content_with_charset_type.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.content_type.post_json_patch_content_with_charset_type( + @client.endpoints.content_type.post_json_patch_content_with_charset_type( string: "string", integer: 1, long: 1_000_000, @@ -91,10 +66,11 @@ def test_endpoints_content_type_post_json_patch_content_with_charset_type_with_w 1 => "map" }, bigint: "1000000", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.content_type.post_json_patch_content_with_charset_type.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.content_type.post_json_patch_content_with_charset_type.0" + } + } ) verify_request_count( diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_enum_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_enum_test.rb index 5c376b751189..f46ef84dcafd 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_enum_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_enum_test.rb @@ -1,50 +1,27 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class EndpointsEnumWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class EndpointsEnumWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_endpoints_enum_get_and_return_enum_with_wiremock test_id = "endpoints.enum.get_and_return_enum.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.enum.get_and_return_enum( + @client.endpoints.enum.get_and_return_enum( request: "SUNNY", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.enum.get_and_return_enum.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.enum.get_and_return_enum.0" + } + } ) verify_request_count( diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_http_methods_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_http_methods_test.rb index aea34683fd17..d25cd4769c52 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_http_methods_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_http_methods_test.rb @@ -1,50 +1,27 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class EndpointsHttpMethodsWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class EndpointsHttpMethodsWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_endpoints_http_methods_test_get_with_wiremock test_id = "endpoints.http_methods.test_get.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.http_methods.test_get( + @client.endpoints.http_methods.test_get( id: "id", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.http_methods.test_get.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.http_methods.test_get.0" + } + } ) verify_request_count( @@ -59,14 +36,13 @@ def test_endpoints_http_methods_test_get_with_wiremock def test_endpoints_http_methods_test_post_with_wiremock test_id = "endpoints.http_methods.test_post.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.http_methods.test_post( + @client.endpoints.http_methods.test_post( string: "string", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.http_methods.test_post.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.http_methods.test_post.0" + } + } ) verify_request_count( @@ -81,15 +57,14 @@ def test_endpoints_http_methods_test_post_with_wiremock def test_endpoints_http_methods_test_put_with_wiremock test_id = "endpoints.http_methods.test_put.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.http_methods.test_put( + @client.endpoints.http_methods.test_put( id: "id", string: "string", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.http_methods.test_put.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.http_methods.test_put.0" + } + } ) verify_request_count( @@ -104,9 +79,7 @@ def test_endpoints_http_methods_test_put_with_wiremock def test_endpoints_http_methods_test_patch_with_wiremock test_id = "endpoints.http_methods.test_patch.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.http_methods.test_patch( + @client.endpoints.http_methods.test_patch( id: "id", string: "string", integer: 1, @@ -123,10 +96,11 @@ def test_endpoints_http_methods_test_patch_with_wiremock 1 => "map" }, bigint: "1000000", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.http_methods.test_patch.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.http_methods.test_patch.0" + } + } ) verify_request_count( @@ -141,14 +115,13 @@ def test_endpoints_http_methods_test_patch_with_wiremock def test_endpoints_http_methods_test_delete_with_wiremock test_id = "endpoints.http_methods.test_delete.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.http_methods.test_delete( + @client.endpoints.http_methods.test_delete( id: "id", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.http_methods.test_delete.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.http_methods.test_delete.0" + } + } ) verify_request_count( diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_object_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_object_test.rb index 9b13f6718f6f..656b9564d529 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_object_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_object_test.rb @@ -1,45 +1,21 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class EndpointsObjectWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class EndpointsObjectWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_endpoints_object_get_and_return_with_optional_field_with_wiremock test_id = "endpoints.object.get_and_return_with_optional_field.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.object.get_and_return_with_optional_field( + @client.endpoints.object.get_and_return_with_optional_field( string: "string", integer: 1, long: 1_000_000, @@ -55,10 +31,11 @@ def test_endpoints_object_get_and_return_with_optional_field_with_wiremock 1 => "map" }, bigint: "1000000", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.object.get_and_return_with_optional_field.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.object.get_and_return_with_optional_field.0" + } + } ) verify_request_count( @@ -73,14 +50,13 @@ def test_endpoints_object_get_and_return_with_optional_field_with_wiremock def test_endpoints_object_get_and_return_with_required_field_with_wiremock test_id = "endpoints.object.get_and_return_with_required_field.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.object.get_and_return_with_required_field( + @client.endpoints.object.get_and_return_with_required_field( string: "string", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.object.get_and_return_with_required_field.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.object.get_and_return_with_required_field.0" + } + } ) verify_request_count( @@ -95,18 +71,17 @@ def test_endpoints_object_get_and_return_with_required_field_with_wiremock def test_endpoints_object_get_and_return_with_map_of_map_with_wiremock test_id = "endpoints.object.get_and_return_with_map_of_map.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.object.get_and_return_with_map_of_map( + @client.endpoints.object.get_and_return_with_map_of_map( map: { map: { map: "map" } }, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.object.get_and_return_with_map_of_map.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.object.get_and_return_with_map_of_map.0" + } + } ) verify_request_count( @@ -121,9 +96,7 @@ def test_endpoints_object_get_and_return_with_map_of_map_with_wiremock def test_endpoints_object_get_and_return_nested_with_optional_field_with_wiremock test_id = "endpoints.object.get_and_return_nested_with_optional_field.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.object.get_and_return_nested_with_optional_field( + @client.endpoints.object.get_and_return_nested_with_optional_field( string: "string", nested_object: { string: "string", @@ -142,10 +115,11 @@ def test_endpoints_object_get_and_return_nested_with_optional_field_with_wiremoc }, bigint: "1000000" }, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.object.get_and_return_nested_with_optional_field.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.object.get_and_return_nested_with_optional_field.0" + } + } ) verify_request_count( @@ -160,9 +134,7 @@ def test_endpoints_object_get_and_return_nested_with_optional_field_with_wiremoc def test_endpoints_object_get_and_return_nested_with_required_field_with_wiremock test_id = "endpoints.object.get_and_return_nested_with_required_field.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.object.get_and_return_nested_with_required_field( + @client.endpoints.object.get_and_return_nested_with_required_field( string: "string", string: "string", nested_object: { @@ -182,10 +154,11 @@ def test_endpoints_object_get_and_return_nested_with_required_field_with_wiremoc }, bigint: "1000000" }, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.object.get_and_return_nested_with_required_field.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.object.get_and_return_nested_with_required_field.0" + } + } ) verify_request_count( @@ -200,9 +173,7 @@ def test_endpoints_object_get_and_return_nested_with_required_field_with_wiremoc def test_endpoints_object_get_and_return_nested_with_required_field_as_list_with_wiremock test_id = "endpoints.object.get_and_return_nested_with_required_field_as_list.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.object.get_and_return_nested_with_required_field_as_list( + @client.endpoints.object.get_and_return_nested_with_required_field_as_list( request: [{ string: "string", nested_object: { @@ -242,10 +213,11 @@ def test_endpoints_object_get_and_return_nested_with_required_field_as_list_with bigint: "1000000" } }], - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.object.get_and_return_nested_with_required_field_as_list.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.object.get_and_return_nested_with_required_field_as_list.0" + } + } ) verify_request_count( diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_params_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_params_test.rb index 81ac1166e012..7c11455bb125 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_params_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_params_test.rb @@ -1,50 +1,27 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class EndpointsParamsWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class EndpointsParamsWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_endpoints_params_get_with_path_with_wiremock test_id = "endpoints.params.get_with_path.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.params.get_with_path( + @client.endpoints.params.get_with_path( param: "param", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.params.get_with_path.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.params.get_with_path.0" + } + } ) verify_request_count( @@ -59,14 +36,13 @@ def test_endpoints_params_get_with_path_with_wiremock def test_endpoints_params_get_with_inline_path_with_wiremock test_id = "endpoints.params.get_with_inline_path.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.params.get_with_path( + @client.endpoints.params.get_with_path( param: "param", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.params.get_with_inline_path.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.params.get_with_inline_path.0" + } + } ) verify_request_count( @@ -81,15 +57,14 @@ def test_endpoints_params_get_with_inline_path_with_wiremock def test_endpoints_params_get_with_query_with_wiremock test_id = "endpoints.params.get_with_query.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.params.get_with_query( + @client.endpoints.params.get_with_query( query: "query", number: 1, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.params.get_with_query.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.params.get_with_query.0" + } + } ) verify_request_count( @@ -104,15 +79,14 @@ def test_endpoints_params_get_with_query_with_wiremock def test_endpoints_params_get_with_allow_multiple_query_with_wiremock test_id = "endpoints.params.get_with_allow_multiple_query.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.params.get_with_query( + @client.endpoints.params.get_with_query( query: "query", number: 1, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.params.get_with_allow_multiple_query.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.params.get_with_allow_multiple_query.0" + } + } ) verify_request_count( @@ -127,15 +101,14 @@ def test_endpoints_params_get_with_allow_multiple_query_with_wiremock def test_endpoints_params_get_with_path_and_query_with_wiremock test_id = "endpoints.params.get_with_path_and_query.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.params.get_with_path_and_query( + @client.endpoints.params.get_with_path_and_query( param: "param", query: "query", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.params.get_with_path_and_query.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.params.get_with_path_and_query.0" + } + } ) verify_request_count( @@ -150,15 +123,14 @@ def test_endpoints_params_get_with_path_and_query_with_wiremock def test_endpoints_params_get_with_inline_path_and_query_with_wiremock test_id = "endpoints.params.get_with_inline_path_and_query.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.params.get_with_path_and_query( + @client.endpoints.params.get_with_path_and_query( param: "param", query: "query", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.params.get_with_inline_path_and_query.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.params.get_with_inline_path_and_query.0" + } + } ) verify_request_count( @@ -173,15 +145,14 @@ def test_endpoints_params_get_with_inline_path_and_query_with_wiremock def test_endpoints_params_modify_with_path_with_wiremock test_id = "endpoints.params.modify_with_path.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.params.modify_with_path( + @client.endpoints.params.modify_with_path( param: "param", request: "string", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.params.modify_with_path.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.params.modify_with_path.0" + } + } ) verify_request_count( @@ -196,15 +167,14 @@ def test_endpoints_params_modify_with_path_with_wiremock def test_endpoints_params_modify_with_inline_path_with_wiremock test_id = "endpoints.params.modify_with_inline_path.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.params.modify_with_path( + @client.endpoints.params.modify_with_path( param: "param", request: "string", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.params.modify_with_inline_path.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.params.modify_with_inline_path.0" + } + } ) verify_request_count( diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_primitive_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_primitive_test.rb index 1b305cd174ee..fd42967420b8 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_primitive_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_primitive_test.rb @@ -1,50 +1,27 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class EndpointsPrimitiveWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class EndpointsPrimitiveWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_endpoints_primitive_get_and_return_string_with_wiremock test_id = "endpoints.primitive.get_and_return_string.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.primitive.get_and_return_string( + @client.endpoints.primitive.get_and_return_string( request: "string", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.primitive.get_and_return_string.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.primitive.get_and_return_string.0" + } + } ) verify_request_count( @@ -59,14 +36,13 @@ def test_endpoints_primitive_get_and_return_string_with_wiremock def test_endpoints_primitive_get_and_return_int_with_wiremock test_id = "endpoints.primitive.get_and_return_int.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.primitive.get_and_return_int( + @client.endpoints.primitive.get_and_return_int( request: 1, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.primitive.get_and_return_int.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.primitive.get_and_return_int.0" + } + } ) verify_request_count( @@ -81,14 +57,13 @@ def test_endpoints_primitive_get_and_return_int_with_wiremock def test_endpoints_primitive_get_and_return_long_with_wiremock test_id = "endpoints.primitive.get_and_return_long.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.primitive.get_and_return_long( + @client.endpoints.primitive.get_and_return_long( request: 1_000_000, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.primitive.get_and_return_long.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.primitive.get_and_return_long.0" + } + } ) verify_request_count( @@ -103,14 +78,13 @@ def test_endpoints_primitive_get_and_return_long_with_wiremock def test_endpoints_primitive_get_and_return_double_with_wiremock test_id = "endpoints.primitive.get_and_return_double.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.primitive.get_and_return_double( + @client.endpoints.primitive.get_and_return_double( request: 1.1, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.primitive.get_and_return_double.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.primitive.get_and_return_double.0" + } + } ) verify_request_count( @@ -125,14 +99,13 @@ def test_endpoints_primitive_get_and_return_double_with_wiremock def test_endpoints_primitive_get_and_return_bool_with_wiremock test_id = "endpoints.primitive.get_and_return_bool.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.primitive.get_and_return_bool( + @client.endpoints.primitive.get_and_return_bool( request: true, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.primitive.get_and_return_bool.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.primitive.get_and_return_bool.0" + } + } ) verify_request_count( @@ -147,14 +120,13 @@ def test_endpoints_primitive_get_and_return_bool_with_wiremock def test_endpoints_primitive_get_and_return_datetime_with_wiremock test_id = "endpoints.primitive.get_and_return_datetime.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.primitive.get_and_return_datetime( + @client.endpoints.primitive.get_and_return_datetime( request: "2024-01-15T09:30:00Z", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.primitive.get_and_return_datetime.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.primitive.get_and_return_datetime.0" + } + } ) verify_request_count( @@ -169,14 +141,13 @@ def test_endpoints_primitive_get_and_return_datetime_with_wiremock def test_endpoints_primitive_get_and_return_date_with_wiremock test_id = "endpoints.primitive.get_and_return_date.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.primitive.get_and_return_date( + @client.endpoints.primitive.get_and_return_date( request: "2023-01-15", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.primitive.get_and_return_date.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.primitive.get_and_return_date.0" + } + } ) verify_request_count( @@ -191,14 +162,13 @@ def test_endpoints_primitive_get_and_return_date_with_wiremock def test_endpoints_primitive_get_and_return_uuid_with_wiremock test_id = "endpoints.primitive.get_and_return_uuid.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.primitive.get_and_return_uuid( + @client.endpoints.primitive.get_and_return_uuid( request: "d5e9c84f-c2b2-4bf4-b4b0-7ffd7a9ffc32", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.primitive.get_and_return_uuid.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.primitive.get_and_return_uuid.0" + } + } ) verify_request_count( @@ -213,14 +183,13 @@ def test_endpoints_primitive_get_and_return_uuid_with_wiremock def test_endpoints_primitive_get_and_return_base_64_with_wiremock test_id = "endpoints.primitive.get_and_return_base_64.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.primitive.get_and_return_base_64( + @client.endpoints.primitive.get_and_return_base_64( request: "SGVsbG8gd29ybGQh", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.primitive.get_and_return_base_64.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.primitive.get_and_return_base_64.0" + } + } ) verify_request_count( diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_put_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_put_test.rb index 41639ed3e981..dc7e750603b1 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_put_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_put_test.rb @@ -1,50 +1,27 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class EndpointsPutWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class EndpointsPutWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_endpoints_put_add_with_wiremock test_id = "endpoints.put.add.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.put.add( + @client.endpoints.put.add( id: "id", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.put.add.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.put.add.0" + } + } ) verify_request_count( diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_union_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_union_test.rb index 29482afe9e4b..0ca7c9819561 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_union_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_union_test.rb @@ -1,48 +1,25 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class EndpointsUnionWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class EndpointsUnionWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_endpoints_union_get_and_return_union_with_wiremock test_id = "endpoints.union.get_and_return_union.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.union.get_and_return_union(request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.union.get_and_return_union.0" - } }) + @client.endpoints.union.get_and_return_union(request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.union.get_and_return_union.0" + } + }) verify_request_count( test_id: test_id, diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_urls_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_urls_test.rb index 86ff62c17feb..ca6c4f6eb2a5 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_urls_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/endpoints_urls_test.rb @@ -1,48 +1,25 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class EndpointsUrlsWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class EndpointsUrlsWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_endpoints_urls_with_mixed_case_with_wiremock test_id = "endpoints.urls.with_mixed_case.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.urls.with_mixed_case(request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.urls.with_mixed_case.0" - } }) + @client.endpoints.urls.with_mixed_case(request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.urls.with_mixed_case.0" + } + }) verify_request_count( test_id: test_id, @@ -56,12 +33,11 @@ def test_endpoints_urls_with_mixed_case_with_wiremock def test_endpoints_urls_no_ending_slash_with_wiremock test_id = "endpoints.urls.no_ending_slash.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.urls.no_ending_slash(request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.urls.no_ending_slash.0" - } }) + @client.endpoints.urls.no_ending_slash(request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.urls.no_ending_slash.0" + } + }) verify_request_count( test_id: test_id, @@ -75,12 +51,11 @@ def test_endpoints_urls_no_ending_slash_with_wiremock def test_endpoints_urls_with_ending_slash_with_wiremock test_id = "endpoints.urls.with_ending_slash.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.urls.with_ending_slash(request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.urls.with_ending_slash.0" - } }) + @client.endpoints.urls.with_ending_slash(request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.urls.with_ending_slash.0" + } + }) verify_request_count( test_id: test_id, @@ -94,12 +69,11 @@ def test_endpoints_urls_with_ending_slash_with_wiremock def test_endpoints_urls_with_underscores_with_wiremock test_id = "endpoints.urls.with_underscores.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.endpoints.urls.with_underscores(request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "endpoints.urls.with_underscores.0" - } }) + @client.endpoints.urls.with_underscores(request_options: { + additional_headers: { + "X-Test-Id" => "endpoints.urls.with_underscores.0" + } + }) verify_request_count( test_id: test_id, diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/inlined_requests_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/inlined_requests_test.rb index 07b975d4f685..960c0a0a0e80 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/inlined_requests_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/inlined_requests_test.rb @@ -1,45 +1,21 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class InlinedRequestsWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class InlinedRequestsWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_inlined_requests_post_with_object_bodyand_response_with_wiremock test_id = "inlined_requests.post_with_object_bodyand_response.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.inlined_requests.post_with_object_bodyand_response( + @client.inlined_requests.post_with_object_bodyand_response( string: "string", integer: 1, nested_object: { @@ -59,10 +35,11 @@ def test_inlined_requests_post_with_object_bodyand_response_with_wiremock }, bigint: "1000000" }, - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "inlined_requests.post_with_object_bodyand_response.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "inlined_requests.post_with_object_bodyand_response.0" + } + } ) verify_request_count( diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/no_auth_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/no_auth_test.rb index 430b1de371a9..e74c65b654f8 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/no_auth_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/no_auth_test.rb @@ -1,48 +1,25 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class NoAuthWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class NoAuthWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_no_auth_post_with_no_auth_with_wiremock test_id = "no_auth.post_with_no_auth.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.no_auth.post_with_no_auth(request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "no_auth.post_with_no_auth.0" - } }) + @client.no_auth.post_with_no_auth(request_options: { + additional_headers: { + "X-Test-Id" => "no_auth.post_with_no_auth.0" + } + }) verify_request_count( test_id: test_id, diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/no_req_body_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/no_req_body_test.rb index 654fffe83ca2..2bdd09bd5e77 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/no_req_body_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/no_req_body_test.rb @@ -1,48 +1,25 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class NoReqBodyWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class NoReqBodyWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_no_req_body_get_with_no_request_body_with_wiremock test_id = "no_req_body.get_with_no_request_body.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.no_req_body.get_with_no_request_body(request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "no_req_body.get_with_no_request_body.0" - } }) + @client.no_req_body.get_with_no_request_body(request_options: { + additional_headers: { + "X-Test-Id" => "no_req_body.get_with_no_request_body.0" + } + }) verify_request_count( test_id: test_id, @@ -56,12 +33,11 @@ def test_no_req_body_get_with_no_request_body_with_wiremock def test_no_req_body_post_with_no_request_body_with_wiremock test_id = "no_req_body.post_with_no_request_body.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.no_req_body.post_with_no_request_body(request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "no_req_body.post_with_no_request_body.0" - } }) + @client.no_req_body.post_with_no_request_body(request_options: { + additional_headers: { + "X-Test-Id" => "no_req_body.post_with_no_request_body.0" + } + }) verify_request_count( test_id: test_id, diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/req_with_headers_test.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/req_with_headers_test.rb index 2bbd644f6e1f..6fc9cf6c31b2 100644 --- a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/req_with_headers_test.rb +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/req_with_headers_test.rb @@ -1,52 +1,29 @@ # frozen_string_literal: true -require "test_helper" -require "net/http" -require "json" -require "uri" -require "seed" - -class ReqWithHeadersWireTest < Minitest::Test - WIREMOCK_BASE_URL = "http://localhost:8080" - WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" +require_relative "wiremock_test_case" +class ReqWithHeadersWireTest < WireMockTestCase def setup super - return if ENV["RUN_WIRE_TESTS"] == "true" - - skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." - end - - def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) - uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") - http = Net::HTTP.new(uri.host, uri.port) - post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) - request_body = { "method" => method, "urlPath" => url_path } - request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } - request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params - - post_request.body = request_body.to_json - response = http.request(post_request) - result = JSON.parse(response.body) - requests = result["requests"] || [] - - assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + @client = Seed::Client.new( + token: "", + base_url: WIREMOCK_BASE_URL + ) end def test_req_with_headers_get_with_custom_header_with_wiremock test_id = "req_with_headers.get_with_custom_header.0" - require "seed" - client = Seed::Client.new(base_url: WIREMOCK_BASE_URL, token: "") - client.req_with_headers.get_with_custom_header( + @client.req_with_headers.get_with_custom_header( x_test_service_header: "X-TEST-SERVICE-HEADER", x_test_endpoint_header: "X-TEST-ENDPOINT-HEADER", body: "string", - request_options: { base_url: WIREMOCK_BASE_URL, - additional_headers: { - "X-Test-Id" => "req_with_headers.get_with_custom_header.0" - } } + request_options: { + additional_headers: { + "X-Test-Id" => "req_with_headers.get_with_custom_header.0" + } + } ) verify_request_count( diff --git a/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/wiremock_test_case.rb b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/wiremock_test_case.rb new file mode 100644 index 000000000000..f38232935156 --- /dev/null +++ b/seed/ruby-sdk-v2/exhaustive/wire-tests/test/wire/wiremock_test_case.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require "test_helper" +require "net/http" +require "json" +require "uri" +require "seed" + +# Base test case for WireMock-based wire tests. +# +# This class provides helper methods for verifying requests made to WireMock +# and manages the test lifecycle for integration tests. +class WireMockTestCase < Minitest::Test + WIREMOCK_BASE_URL = "http://localhost:8080" + WIREMOCK_ADMIN_URL = "http://localhost:8080/__admin" + + def setup + super + return if ENV["RUN_WIRE_TESTS"] == "true" + + skip "Wire tests are disabled by default. Set RUN_WIRE_TESTS=true to enable them." + end + + # Verifies the number of requests made to WireMock filtered by test ID for concurrency safety. + # + # @param test_id [String] The test ID used to filter requests + # @param method [String] The HTTP method (GET, POST, etc.) + # @param url_path [String] The URL path to match + # @param query_params [Hash, nil] Query parameters to match + # @param expected [Integer] Expected number of requests + def verify_request_count(test_id:, method:, url_path:, expected:, query_params: nil) + uri = URI("#{WIREMOCK_ADMIN_URL}/requests/find") + http = Net::HTTP.new(uri.host, uri.port) + post_request = Net::HTTP::Post.new(uri.path, { "Content-Type" => "application/json" }) + + request_body = { "method" => method, "urlPath" => url_path } + request_body["headers"] = { "X-Test-Id" => { "equalTo" => test_id } } + request_body["queryParameters"] = query_params.transform_values { |v| { "equalTo" => v } } if query_params + + post_request.body = request_body.to_json + response = http.request(post_request) + result = JSON.parse(response.body) + requests = result["requests"] || [] + + assert_equal expected, requests.length, "Expected #{expected} requests, found #{requests.length}" + end +end