Skip to content

Commit d3eb480

Browse files
authored
Merge pull request #4 from cloudnc/feat/request-context-for-response
2 parents c9cfe9a + c911c90 commit d3eb480

File tree

2 files changed

+24
-18
lines changed

2 files changed

+24
-18
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: 18 additions & 16 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> {
@@ -38,10 +34,15 @@ function unframeRequest(requestBody: Uint8Array): Uint8Array {
3834
return new Uint8Array(requestBody).slice(5);
3935
}
4036

37+
export function readGrpcRequest(request: Request): Uint8Array | null {
38+
const requestBody = request.postDataBuffer();
39+
return !requestBody ? null : unframeRequest(requestBody);
40+
}
41+
4142
export function mockGrpcUnary(
4243
page: Page,
4344
rpc: UnaryMethodDefinitionish,
44-
response: GrpcSuccessResponse | GrpcErrorResponse
45+
response: GrpcResponse | ((request: Uint8Array|null) => GrpcResponse)
4546
): MockedGrpcCall {
4647
const url = `/${rpc.service.serviceName}/${rpc.methodName}`;
4748

@@ -52,11 +53,14 @@ export function mockGrpcUnary(
5253
'ALL gRPC requests should be a POST request'
5354
).toBe('POST');
5455

55-
// error messages need to have a zero length message field to be considered valid
56-
const grpcResponse = grpcResponseToBuffer(response);
56+
const grpcResponse = typeof response === 'function'
57+
? response(readGrpcRequest(route.request()))
58+
: response;
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': '*',
@@ -72,8 +76,7 @@ export function mockGrpcUnary(
7276
}
7377

7478
if (requestPredicate) {
75-
const messageBody = req.postDataBuffer();
76-
const unframed = !messageBody ? null : unframeRequest(messageBody);
79+
const unframed = readGrpcRequest(req);
7780
return requestPredicate(unframed, req);
7881
}
7982

@@ -82,8 +85,7 @@ export function mockGrpcUnary(
8285

8386
await page.waitForResponse((resp) => resp.url().includes(url));
8487

85-
const messageBody = request.postDataBuffer();
86-
const requestMessage = !messageBody ? null : unframeRequest(messageBody);
88+
const requestMessage = readGrpcRequest(request);
8789

8890
return { requestMessage };
8991
},

0 commit comments

Comments
 (0)