Skip to content

Commit b50df75

Browse files
committed
feat(mockGrpcUnary): Add functionality to make the mocked response affected by the request data
1 parent c9cfe9a commit b50df75

File tree

2 files changed

+22
-14
lines changed

2 files changed

+22
-14
lines changed

src/base/index.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { status as Status } from 'grpc';
1+
import {status as Status} from 'grpc';
22

33
export interface GrpcErrorResponse {
44
status: Status;
@@ -9,6 +9,8 @@ export interface GrpcSuccessResponse {
99
message: Uint8Array;
1010
}
1111

12+
export type GrpcResponse = GrpcSuccessResponse | GrpcErrorResponse
13+
1214
function fourBytesLength(sized: { length: number }): Uint8Array {
1315
const arr = new Uint8Array(4); // an Int32 takes 4 bytes
1416
const view = new DataView(arr.buffer);
@@ -23,8 +25,10 @@ export class GrpcUnknownStatus extends Error {
2325
}
2426

2527
export function grpcResponseToBuffer(
26-
response: GrpcSuccessResponse | GrpcErrorResponse
28+
response: GrpcResponse
2729
): Buffer {
30+
31+
// error messages need to have a zero length message field to be considered valid
2832
const message = 'message' in response ? response.message : new Uint8Array();
2933

3034
// all success responses have status OK

src/playwright/index.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
import { expect, Page } from '@playwright/test';
2-
import { grpc } from '@improbable-eng/grpc-web';
3-
import {
4-
GrpcErrorResponse,
5-
grpcResponseToBuffer,
6-
GrpcSuccessResponse,
7-
} from '../base';
8-
import { Request } from 'playwright-core';
1+
import {expect, Page} from '@playwright/test';
2+
import {grpc} from '@improbable-eng/grpc-web';
3+
import {GrpcResponse, grpcResponseToBuffer,} from '../base';
4+
import {Request} from 'playwright-core';
95

106
export interface UnaryMethodDefinitionish
117
extends grpc.UnaryMethodDefinition<any, any> {
@@ -41,7 +37,7 @@ function unframeRequest(requestBody: Uint8Array): Uint8Array {
4137
export function mockGrpcUnary(
4238
page: Page,
4339
rpc: UnaryMethodDefinitionish,
44-
response: GrpcSuccessResponse | GrpcErrorResponse
40+
response: GrpcResponse | ((request: Uint8Array|null) => GrpcResponse)
4541
): MockedGrpcCall {
4642
const url = `/${rpc.service.serviceName}/${rpc.methodName}`;
4743

@@ -52,11 +48,19 @@ export function mockGrpcUnary(
5248
'ALL gRPC requests should be a POST request'
5349
).toBe('POST');
5450

55-
// error messages need to have a zero length message field to be considered valid
56-
const grpcResponse = grpcResponseToBuffer(response);
51+
let grpcResponse: GrpcResponse
52+
53+
if (typeof response === 'function') {
54+
const requestBody = route.request().postDataBuffer();
55+
grpcResponse = response(!requestBody ? null : unframeRequest(requestBody));
56+
} else {
57+
grpcResponse = response;
58+
}
59+
60+
const grpcResponseBody = grpcResponseToBuffer(grpcResponse)
5761

5862
return route.fulfill({
59-
body: grpcResponse,
63+
body: grpcResponseBody,
6064
contentType: 'application/grpc-web+proto',
6165
headers: {
6266
'Access-Control-Allow-Origin': '*',

0 commit comments

Comments
 (0)