@cloudnc/grpc-web-testing-toolbox
Version:
Utility functions to help you stub and assert on grpc calls.
79 lines (56 loc) • 3.27 kB
Markdown
# grpc web testing toolbox
Utility functions to help you stub and assert on grpc calls.
For example, if you use [-eng/grpc-web](https://github.com/improbable-eng/grpc-web) to have grpc calls made directly from your browser and you want to cover this in your e2e tests, this toolbox will be helpful.
# Installation
```
yarn add --dev /grpc-web-testing-toolbox
```
# API
This repository contains 2 folders that you can import from:
- `base`: :arrow_right: `import {} from '@cloudnc/grpc-web-testing-toolbox/base'`
- `playwright`: :arrow_right: `import {} from '@cloudnc/grpc-web-testing-toolbox/playwright'`
## `base`
The base folder is **framework agnostic** and contains only 1 function: `grpcResponseToBuffer`.
The signature of the function is the following:
```ts
export function grpcResponseToBuffer(
response: GrpcSuccessResponse | GrpcErrorResponse
): Buffer;
```
As the name and signature suggest, it's a small helper to convert a grpc response to a buffer.
## `playwright`
[Playwright](https://playwright.dev) is an e2e testing framework. It's open source and available on [Github](https://github.com/microsoft/playwright).
On top of the `base` we've built a dedicated Playwright helper that'll let you easily mock a grpc call but also assert on the params passed during the request and assert on the response.
Feel free to have a look at the code in that repo as it's quite short here: [`src/playwright/index.ts`](https://github.com/cloudnc/grpc-web-testing-toolbox/blob/master/src/playwright/index.ts) but basically we call [`page.route`](https://playwright.dev/docs/network#handle-requests) for you and use the function `grpcResponseToBuffer` defined into `@cloudnc/grpc-web-testing-toolbox/base` to correctly wrap the message.
Here's a complete example with Playwright:
```ts
import { expect, test } from '/test';
test.describe('Some test wrapper', () => {
test('Make sure a grpc call is made and is successful', async ({ page }) => {
// start by building a mock for the unary call that will be done
// for example as soon as a given page is loaded
const mock = await mockGrpcUnary(page, YourUnaryCall, {
message: YourUnaryCallResponse.encode({
// all the content of the response goes here as a classic JS object
// this is the mock data that will be passed in the response
}).finish(),
});
const [, mockRequest] = await Promise.all([
// go to the page that will trigger the grpc call
// but really this could be anything else like a
// click on button triggering the grpc call instead
page.goto('/some-page-where-a-grpc-call-will-be-made'),
// make sure that the grpc call is made, if not this will fail
mock.waitForMock(),
]);
// at this stage we know the grpc call was made and on top
// of that we can assert that the request had a given body
expect(
YourUnaryCallRequest.decode(mockRequest.requestMessage).someProperty
).toBe('what you expect');
// from there, you can make assertions directly in the DOM to make sure that
// whatever was passed in the body of the grpc call is now correctly displayed
// in your app where it should be, using regular Playwright API
});
});
```