Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: add tests for grpc operations #6870

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Binary file modified packages/insomnia-smoke-test/fixtures/route_guide.bin
Binary file not shown.
12 changes: 12 additions & 0 deletions packages/insomnia-smoke-test/server/grpc.ts
Expand Up @@ -59,6 +59,11 @@ const getFeature: HandleCall<any, any> = (call: any, callback: any) => {
callback(null, checkFeature(call.request));
};

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const echoMetadata: HandleCall<any, any> = (call: any, callback: any) => {
callback(null, { metadata: call.metadata.getMap() });
};

/**
* listFeatures request handler.
*/
Expand Down Expand Up @@ -192,6 +197,12 @@ export const startGRPCServer = (port: number) => {
const server = new grpc.Server();

// Enable reflection
// use this to generate .bin file:
// protoc \
// --descriptor_set_out=packages/insomnia-smoke-test/fixtures/route_guide.bin \
// --include_imports packages/insomnia/src/network/grpc/__fixtures__/library/route_guide.proto \
// -I <insomnia folder> \
// -I <protoc 'include' folder>
const descriptorSet = '../../packages/insomnia-smoke-test/fixtures/route_guide.bin';
addReflection(server, descriptorSet);

Expand All @@ -201,6 +212,7 @@ export const startGRPCServer = (port: number) => {
listFeatures: listFeatures,
recordRoute: recordRoute,
routeChat: routeChat,
echoMetadata,
});
server.bindAsync(`localhost:${port}`, grpc.ServerCredentials.createInsecure(), error => {
if (error) {
Expand Down
124 changes: 100 additions & 24 deletions packages/insomnia-smoke-test/tests/smoke/grpc.test.ts
Expand Up @@ -3,36 +3,112 @@ import { expect } from '@playwright/test';
import { loadFixture } from '../../playwright/paths';
import { test } from '../../playwright/test';

test('can send gRPC requests with reflection', async ({ app, page }) => {
test.slow(process.platform === 'darwin' || process.platform === 'win32', 'Slow app start on these platforms');
const statusTag = page.locator('[data-testid="response-status-tag"]:visible');
const responseBody = page.locator('[data-testid="response-pane"] >> [data-testid="CodeEditor"]:visible', {
has: page.locator('.CodeMirror-activeline'),
test.describe('test grpc requests', async () => {
test('test unary request', async ({ app, page }) => {
test.slow(process.platform === 'darwin' || process.platform === 'win32', 'Slow app start on these platforms');

const statusTag = page.locator('[data-testid="response-status-tag"]:visible');
const responseBody = page.locator('[data-testid="response-pane"] >> [data-testid="CodeEditor"]:visible', {
has: page.locator('.CodeMirror-activeline'),
});

await page.getByRole('button', { name: 'Create in project' }).click();

const text = await loadFixture('grpc.yaml');
await app.evaluate(async ({ clipboard }, text) => clipboard.writeText(text), text);

await page.getByRole('menuitemradio', { name: 'Import' }).click();
await page.locator('[data-test-id="import-from-clipboard"]').click();
await page.getByRole('button', { name: 'Scan' }).click();
await page.getByRole('dialog').getByRole('button', { name: 'Import' }).click();
await page.getByLabel('PreRelease gRPC').click();

// choose request
await page.getByLabel('Request Collection').getByTestId('UnaryWithOutProtoFile').press('Enter');
await expect(page.getByRole('button', { name: 'Select Method' })).toBeDisabled();
await page.getByTestId('button-server-reflection').click();

// choose method
await page.getByRole('button', { name: 'Select Method' }).click();
await page.getByLabel('/RouteGuide/GetFeature', { exact: true }).click();

// start
await page.getByRole('button', { name: 'Send' }).click();

// verify
await page.getByRole('tab', { name: 'Response 1' }).click();
await expect(statusTag).toContainText('0 OK');
await expect(responseBody).toContainText('Berkshire Valley Management Area Trail');
});

await page.getByRole('button', { name: 'Create in project' }).click();
test('test client side stream', async ({ app, page }) => {
test.slow(process.platform === 'darwin' || process.platform === 'win32', 'Slow app start on these platforms');

const text = await loadFixture('grpc.yaml');
await app.evaluate(async ({ clipboard }, text) => clipboard.writeText(text), text);
const statusTag = page.locator('[data-testid="response-status-tag"]:visible');
const responseBody = page.locator('[data-testid="response-pane"] >> [data-testid="CodeEditor"]:visible', {
has: page.locator('.CodeMirror-activeline'),
});

await page.getByRole('menuitemradio', { name: 'Import' }).click();
await page.locator('[data-test-id="import-from-clipboard"]').click();
await page.getByRole('button', { name: 'Scan' }).click();
await page.getByRole('dialog').getByRole('button', { name: 'Import' }).click();
await page.getByLabel('PreRelease gRPC').click();
await page.getByRole('button', { name: 'Create in project' }).click();

await page.getByLabel('Request Collection').getByTestId('UnaryWithOutProtoFile').press('Enter');
await expect(page.getByRole('button', { name: 'Select Method' })).toBeDisabled();
await page.getByTestId('button-server-reflection').click();
// import collection
const text = await loadFixture('grpc.yaml');
await app.evaluate(async ({ clipboard }, text) => clipboard.writeText(text), text);
await page.getByRole('menuitemradio', { name: 'Import' }).click();
await page.locator('[data-test-id="import-from-clipboard"]').click();
await page.getByRole('button', { name: 'Scan' }).click();
await page.getByRole('dialog').getByRole('button', { name: 'Import' }).click();
await page.getByLabel('PreRelease gRPC').click();

await page.getByRole('button', { name: 'Select Method' }).click();
await page.getByRole('option', { name: 'RouteGuide/GetFeature' }).click();
// choose request
await page.getByLabel('Request Collection').getByTestId('UnaryWithOutProtoFile').press('Enter');
await expect(page.getByRole('button', { name: 'Select Method' })).toBeDisabled();
await page.getByTestId('button-server-reflection').click();

await page.getByRole('tab', { name: 'Unary' }).click();
await page.getByRole('button', { name: 'Send' }).click();
// choose method
await page.getByRole('button', { name: 'Select Method' }).click();
await page.getByLabel('/RouteGuide/RecordRoute', { exact: true }).click();

// Check for the single Unary response
await page.getByRole('tab', { name: 'Response 1' }).click();
await expect(statusTag).toContainText('0 OK');
await expect(responseBody).toContainText('Berkshire Valley Management Area Trail');
// start
await page.getByRole('button', { name: 'Send' }).click();
await page.getByRole('button', { name: 'Commit' }).click();

// verify
await page.getByRole('tab', { name: 'Response 1' }).click();
await expect(statusTag).toContainText('0 OK');
await expect(responseBody).toContainText('point_count": 0');
});

test('test bidirectional stream', async ({ app, page }) => {
test.slow(process.platform === 'darwin' || process.platform === 'win32', 'Slow app start on these platforms');

const statusTag = page.locator('[data-testid="response-status-tag"]:visible');

await page.getByRole('button', { name: 'Create in project' }).click();

// import collection
const text = await loadFixture('grpc.yaml');
await app.evaluate(async ({ clipboard }, text) => clipboard.writeText(text), text);
await page.getByRole('menuitemradio', { name: 'Import' }).click();
await page.locator('[data-test-id="import-from-clipboard"]').click();
await page.getByRole('button', { name: 'Scan' }).click();
await page.getByRole('dialog').getByRole('button', { name: 'Import' }).click();
await page.getByText('CollectionPreRelease gRPCjust now').click();

// choose request
await page.getByLabel('Request Collection').getByTestId('UnaryWithOutProtoFile').press('Enter');
await expect(page.getByRole('button', { name: 'Select Method' })).toBeDisabled();
await page.getByTestId('button-server-reflection').click();

// choose method
await page.getByRole('button', { name: 'Select Method' }).click();
await page.getByLabel('/RouteGuide/RouteChat', { exact: true }).click();

// start
await page.getByRole('button', { name: 'Start' }).click();
await page.getByRole('button', { name: 'Commit' }).click();

// verify
await expect(statusTag).toContainText('0 OK');
});
});
Expand Up @@ -21,6 +21,8 @@ option objc_class_prefix = "RTG";

package routeguide;

import "google/protobuf/empty.proto";

// Interface exported by the server.
service RouteGuide {
// A simple RPC.
Expand Down Expand Up @@ -50,6 +52,9 @@ service RouteGuide {
// Accepts a stream of RouteNotes sent while a route is being traversed,
// while receiving other RouteNotes (e.g. from other users).
rpc RouteChat(stream RouteNote) returns (stream RouteNote) {}


rpc EchoMetadata(google.protobuf.Empty) returns (Metadata) {}
}

// Points are represented as latitude-longitude pairs in the E7 representation
Expand Down Expand Up @@ -109,3 +114,7 @@ message RouteSummary {
// The duration of the traversal in seconds.
int32 elapsed_time = 4;
}

message Metadata {
map<string, string> metadata = 1;
}