From 646d4823a99361b7163eee491181d5dfe380c07c Mon Sep 17 00:00:00 2001 From: Emil Rowland Date: Fri, 18 Nov 2022 19:25:48 +0000 Subject: [PATCH 1/7] Set routeResponseSelectionExpression if needed --- .../aws-apigatewayv2/lib/websocket/route.ts | 7 ++++ .../test/websocket/route.test.ts | 38 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts b/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts index 923311a2b524e..9ffab0fd03520 100644 --- a/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts +++ b/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts @@ -53,6 +53,12 @@ export interface WebSocketRouteProps extends WebSocketRouteOptions { */ readonly routeKey: string; + /** + * Should the route send a response to the client + * @default false + */ + readonly shouldReturnResponse?: boolean; + /** * Whether the route requires an API Key to be provided * @default false @@ -102,6 +108,7 @@ export class WebSocketRoute extends Resource implements IWebSocketRoute { target: `integrations/${config.integrationId}`, authorizerId: authBindResult.authorizerId, authorizationType: authBindResult.authorizationType, + routeResponseSelectionExpression: props.shouldReturnResponse ? '$default' : undefined, }); this.routeId = route.ref; } diff --git a/packages/@aws-cdk/aws-apigatewayv2/test/websocket/route.test.ts b/packages/@aws-cdk/aws-apigatewayv2/test/websocket/route.test.ts index 94c4e969a08b6..a29fbf37eb019 100644 --- a/packages/@aws-cdk/aws-apigatewayv2/test/websocket/route.test.ts +++ b/packages/@aws-cdk/aws-apigatewayv2/test/websocket/route.test.ts @@ -120,6 +120,44 @@ describe('WebSocketRoute', () => { Template.fromStack(stack).hasResource('AWS::ApiGatewayV2::Integration', 2); }); + + test('default RouteResponseSelectionExpression is set if route will return a response to the client', () => { + // GIVEN + const stack = new Stack(); + const webSocketApi = new WebSocketApi(stack, 'Api'); + + // WHEN + new WebSocketRoute(stack, 'Route', { + webSocketApi, + integration: new DummyIntegration(), + routeKey: 'message', + shouldReturnResponse: true, + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Route', { + ApiId: stack.resolve(webSocketApi.apiId), + RouteKey: 'message', + RouteResponseSelectionExpression: '$default', + Target: { + 'Fn::Join': [ + '', + [ + 'integrations/', + { + Ref: 'RouteDummyIntegrationE40E82B4', + }, + ], + ], + }, + }); + + Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Integration', { + ApiId: stack.resolve(webSocketApi.apiId), + IntegrationType: 'AWS_PROXY', + IntegrationUri: 'some-uri', + }); + }); }); From 303697592e2d0f28f17c8e58d4e6b332ed5fc467 Mon Sep 17 00:00:00 2001 From: Emil Rowland Date: Fri, 18 Nov 2022 19:47:02 +0000 Subject: [PATCH 2/7] Added property to WebSocketRouteOptions --- .../aws-apigatewayv2/lib/websocket/route.ts | 13 +++++++------ .../aws-apigatewayv2/test/websocket/api.test.ts | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts b/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts index 9ffab0fd03520..f149668890af3 100644 --- a/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts +++ b/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts @@ -37,6 +37,13 @@ export interface WebSocketRouteOptions { * @default - No Authorizer */ readonly authorizer?: IWebSocketRouteAuthorizer; + + /** + * Should the route send a response to the client + * @default false + */ + readonly shouldReturnResponse?: boolean; + } /** @@ -53,12 +60,6 @@ export interface WebSocketRouteProps extends WebSocketRouteOptions { */ readonly routeKey: string; - /** - * Should the route send a response to the client - * @default false - */ - readonly shouldReturnResponse?: boolean; - /** * Whether the route requires an API Key to be provided * @default false diff --git a/packages/@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts b/packages/@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts index f9fb740c0e190..993fae89cd469 100644 --- a/packages/@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts +++ b/packages/@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts @@ -65,6 +65,22 @@ describe('WebSocketApi', () => { }); }); + test('addRoute: adds a route with passed key and allows it to return a response', () => { + // GIVEN + const stack = new Stack(); + const api = new WebSocketApi(stack, 'api'); + + // WHEN + api.addRoute('myroute', { integration: new DummyIntegration(), shouldReturnResponse: true }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Route', { + ApiId: stack.resolve(api.apiId), + RouteKey: 'myroute', + RouteResponseSelectionExpression: '$default', + }); + }); + test('connectRouteOptions: adds a $connect route', () => { // GIVEN const stack = new Stack(); From ce40c5b69a96393a96e43f75334c5a558e8f1bf4 Mon Sep 17 00:00:00 2001 From: Emil Rowland Date: Fri, 18 Nov 2022 20:04:03 +0000 Subject: [PATCH 3/7] Added route response --- .../@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts | 9 ++++++++- .../@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts | 8 +++++++- .../aws-apigatewayv2/test/websocket/route.test.ts | 8 +++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts b/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts index f149668890af3..528a2cc04e7f5 100644 --- a/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts +++ b/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts @@ -1,6 +1,6 @@ import { Resource } from '@aws-cdk/core'; import { Construct } from 'constructs'; -import { CfnRoute } from '../apigatewayv2.generated'; +import { CfnRoute, CfnRouteResponse } from '../apigatewayv2.generated'; import { IRoute } from '../common'; import { IWebSocketApi } from './api'; import { IWebSocketRouteAuthorizer, WebSocketNoneAuthorizer } from './authorizer'; @@ -112,5 +112,12 @@ export class WebSocketRoute extends Resource implements IWebSocketRoute { routeResponseSelectionExpression: props.shouldReturnResponse ? '$default' : undefined, }); this.routeId = route.ref; + if (props.shouldReturnResponse) { + new CfnRouteResponse(this, 'Response', { + apiId: props.webSocketApi.apiId, + routeId: route.ref, + routeResponseKey: '$default', + }); + } } } diff --git a/packages/@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts b/packages/@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts index 993fae89cd469..295f4465ec557 100644 --- a/packages/@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts +++ b/packages/@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts @@ -71,7 +71,7 @@ describe('WebSocketApi', () => { const api = new WebSocketApi(stack, 'api'); // WHEN - api.addRoute('myroute', { integration: new DummyIntegration(), shouldReturnResponse: true }); + const route = api.addRoute('myroute', { integration: new DummyIntegration(), shouldReturnResponse: true }); // THEN Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Route', { @@ -79,6 +79,12 @@ describe('WebSocketApi', () => { RouteKey: 'myroute', RouteResponseSelectionExpression: '$default', }); + + Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::RouteResponse', { + ApiId: stack.resolve(api.apiId), + RouteId: stack.resolve(route.routeId), + RouteResponseKey: '$default', + }); }); test('connectRouteOptions: adds a $connect route', () => { diff --git a/packages/@aws-cdk/aws-apigatewayv2/test/websocket/route.test.ts b/packages/@aws-cdk/aws-apigatewayv2/test/websocket/route.test.ts index a29fbf37eb019..18faf40551270 100644 --- a/packages/@aws-cdk/aws-apigatewayv2/test/websocket/route.test.ts +++ b/packages/@aws-cdk/aws-apigatewayv2/test/websocket/route.test.ts @@ -127,7 +127,7 @@ describe('WebSocketRoute', () => { const webSocketApi = new WebSocketApi(stack, 'Api'); // WHEN - new WebSocketRoute(stack, 'Route', { + const route = new WebSocketRoute(stack, 'Route', { webSocketApi, integration: new DummyIntegration(), routeKey: 'message', @@ -152,6 +152,12 @@ describe('WebSocketRoute', () => { }, }); + Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::RouteResponse', { + ApiId: stack.resolve(webSocketApi.apiId), + RouteId: stack.resolve(route.routeId), + RouteResponseKey: '$default', + }); + Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Integration', { ApiId: stack.resolve(webSocketApi.apiId), IntegrationType: 'AWS_PROXY', From b7a83d9bb7bcf3eecd3fb91294694289b199384c Mon Sep 17 00:00:00 2001 From: Emil Rowland Date: Fri, 18 Nov 2022 20:29:02 +0000 Subject: [PATCH 4/7] Added documentation --- packages/@aws-cdk/aws-apigatewayv2/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/@aws-cdk/aws-apigatewayv2/README.md b/packages/@aws-cdk/aws-apigatewayv2/README.md index 040ee20d0bf6a..5ea0cc89b52fb 100644 --- a/packages/@aws-cdk/aws-apigatewayv2/README.md +++ b/packages/@aws-cdk/aws-apigatewayv2/README.md @@ -404,6 +404,19 @@ webSocketApi.addRoute('sendmessage', { }); ``` +To add a route that can return a result: + +```ts +import { WebSocketLambdaIntegration } from '@aws-cdk/aws-apigatewayv2-integrations'; + +declare const messageHandler: lambda.Function; +const webSocketApi = new apigwv2.WebSocketApi(this, 'mywsapi'); +webSocketApi.addRoute('sendmessage', { + integration: new WebSocketLambdaIntegration('SendMessageIntegration', messageHandler), + shouldReturnResponse: true, +}); +``` + To import an existing WebSocketApi: ```ts From 8c996cf2d5e5d1357cea925eda2b9d25e1e4c629 Mon Sep 17 00:00:00 2001 From: Emil Rowland Date: Fri, 18 Nov 2022 22:59:15 +0000 Subject: [PATCH 5/7] Added integration test --- .../package.json | 1 + ...efaultTestDeployAssert4E6713E1.assets.json | 19 ++ ...aultTestDeployAssert4E6713E1.template.json | 36 +++ ...dk-aws-apigatewayv2-websockets.assets.json | 19 ++ ...-aws-apigatewayv2-websockets.template.json | 90 ++++++++ .../integ.route-response.js.snapshot/cdk.out | 1 + .../integ.json | 12 + .../manifest.json | 129 +++++++++++ .../tree.json | 215 ++++++++++++++++++ .../test/websocket/integ.route-response.ts | 19 ++ 10 files changed, 541 insertions(+) create mode 100644 packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.assets.json create mode 100644 packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.template.json create mode 100644 packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/aws-cdk-aws-apigatewayv2-websockets.assets.json create mode 100644 packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/aws-cdk-aws-apigatewayv2-websockets.template.json create mode 100644 packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/cdk.out create mode 100644 packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/integ.json create mode 100644 packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/manifest.json create mode 100644 packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/tree.json create mode 100644 packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.ts diff --git a/packages/@aws-cdk/aws-apigatewayv2-integrations/package.json b/packages/@aws-cdk/aws-apigatewayv2-integrations/package.json index 3eae9be949a44..3b9a0665e8acb 100644 --- a/packages/@aws-cdk/aws-apigatewayv2-integrations/package.json +++ b/packages/@aws-cdk/aws-apigatewayv2-integrations/package.json @@ -81,6 +81,7 @@ "@aws-cdk/assertions": "0.0.0", "@aws-cdk/cdk-build-tools": "0.0.0", "@aws-cdk/integ-runner": "0.0.0", + "@aws-cdk/integ-tests": "0.0.0", "@aws-cdk/pkglint": "0.0.0", "@types/jest": "^27.5.2" }, diff --git a/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.assets.json b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.assets.json new file mode 100644 index 0000000000000..1c86a68a43509 --- /dev/null +++ b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.assets.json @@ -0,0 +1,19 @@ +{ + "version": "21.0.0", + "files": { + "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": { + "source": { + "path": "IntegDefaultTestDeployAssert4E6713E1.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.template.json b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.template.json new file mode 100644 index 0000000000000..ad9d0fb73d1dd --- /dev/null +++ b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/IntegDefaultTestDeployAssert4E6713E1.template.json @@ -0,0 +1,36 @@ +{ + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/aws-cdk-aws-apigatewayv2-websockets.assets.json b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/aws-cdk-aws-apigatewayv2-websockets.assets.json new file mode 100644 index 0000000000000..1b84d4a69430f --- /dev/null +++ b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/aws-cdk-aws-apigatewayv2-websockets.assets.json @@ -0,0 +1,19 @@ +{ + "version": "21.0.0", + "files": { + "536558280cda4b74d67fdcdc23a22d0fb7b7e175f5bb56b260d43680056a3718": { + "source": { + "path": "aws-cdk-aws-apigatewayv2-websockets.template.json", + "packaging": "file" + }, + "destinations": { + "current_account-current_region": { + "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", + "objectKey": "536558280cda4b74d67fdcdc23a22d0fb7b7e175f5bb56b260d43680056a3718.json", + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" + } + } + } + }, + "dockerImages": {} +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/aws-cdk-aws-apigatewayv2-websockets.template.json b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/aws-cdk-aws-apigatewayv2-websockets.template.json new file mode 100644 index 0000000000000..fc78860fb477a --- /dev/null +++ b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/aws-cdk-aws-apigatewayv2-websockets.template.json @@ -0,0 +1,90 @@ +{ + "Resources": { + "MyWebsocketApiEBAC53DF": { + "Type": "AWS::ApiGatewayV2::Api", + "Properties": { + "Name": "MyWebsocketApi", + "ProtocolType": "WEBSOCKET", + "RouteSelectionExpression": "$request.body.action" + } + }, + "MyWebsocketApitestRouteSendMessageIntegration526C7CB6": { + "Type": "AWS::ApiGatewayV2::Integration", + "Properties": { + "ApiId": { + "Ref": "MyWebsocketApiEBAC53DF" + }, + "IntegrationType": "MOCK", + "IntegrationUri": "" + } + }, + "MyWebsocketApitestRoute893E635A": { + "Type": "AWS::ApiGatewayV2::Route", + "Properties": { + "ApiId": { + "Ref": "MyWebsocketApiEBAC53DF" + }, + "RouteKey": "test", + "AuthorizationType": "NONE", + "RouteResponseSelectionExpression": "$default", + "Target": { + "Fn::Join": [ + "", + [ + "integrations/", + { + "Ref": "MyWebsocketApitestRouteSendMessageIntegration526C7CB6" + } + ] + ] + } + } + }, + "MyWebsocketApitestRouteResponse5A88D743": { + "Type": "AWS::ApiGatewayV2::RouteResponse", + "Properties": { + "ApiId": { + "Ref": "MyWebsocketApiEBAC53DF" + }, + "RouteId": { + "Ref": "MyWebsocketApitestRoute893E635A" + }, + "RouteResponseKey": "$default" + } + } + }, + "Parameters": { + "BootstrapVersion": { + "Type": "AWS::SSM::Parameter::Value", + "Default": "/cdk-bootstrap/hnb659fds/version", + "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]" + } + }, + "Rules": { + "CheckBootstrapVersion": { + "Assertions": [ + { + "Assert": { + "Fn::Not": [ + { + "Fn::Contains": [ + [ + "1", + "2", + "3", + "4", + "5" + ], + { + "Ref": "BootstrapVersion" + } + ] + } + ] + }, + "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI." + } + ] + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/cdk.out b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/cdk.out new file mode 100644 index 0000000000000..8ecc185e9dbee --- /dev/null +++ b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/cdk.out @@ -0,0 +1 @@ +{"version":"21.0.0"} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/integ.json b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/integ.json new file mode 100644 index 0000000000000..96c7a9ea56951 --- /dev/null +++ b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/integ.json @@ -0,0 +1,12 @@ +{ + "version": "21.0.0", + "testCases": { + "Integ/DefaultTest": { + "stacks": [ + "aws-cdk-aws-apigatewayv2-websockets" + ], + "assertionStack": "Integ/DefaultTest/DeployAssert", + "assertionStackName": "IntegDefaultTestDeployAssert4E6713E1" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/manifest.json b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/manifest.json new file mode 100644 index 0000000000000..394ee072dfc5a --- /dev/null +++ b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/manifest.json @@ -0,0 +1,129 @@ +{ + "version": "21.0.0", + "artifacts": { + "aws-cdk-aws-apigatewayv2-websockets.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "aws-cdk-aws-apigatewayv2-websockets.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "aws-cdk-aws-apigatewayv2-websockets": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "aws-cdk-aws-apigatewayv2-websockets.template.json", + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/536558280cda4b74d67fdcdc23a22d0fb7b7e175f5bb56b260d43680056a3718.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "aws-cdk-aws-apigatewayv2-websockets.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "aws-cdk-aws-apigatewayv2-websockets.assets" + ], + "metadata": { + "/aws-cdk-aws-apigatewayv2-websockets/MyWebsocketApi/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyWebsocketApiEBAC53DF" + } + ], + "/aws-cdk-aws-apigatewayv2-websockets/MyWebsocketApi/test-Route/SendMessageIntegration/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyWebsocketApitestRouteSendMessageIntegration526C7CB6" + } + ], + "/aws-cdk-aws-apigatewayv2-websockets/MyWebsocketApi/test-Route/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "MyWebsocketApitestRoute893E635A" + } + ], + "/aws-cdk-aws-apigatewayv2-websockets/MyWebsocketApi/test-Route/Response": [ + { + "type": "aws:cdk:logicalId", + "data": "MyWebsocketApitestRouteResponse5A88D743" + } + ], + "/aws-cdk-aws-apigatewayv2-websockets/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/aws-cdk-aws-apigatewayv2-websockets/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "aws-cdk-aws-apigatewayv2-websockets" + }, + "IntegDefaultTestDeployAssert4E6713E1.assets": { + "type": "cdk:asset-manifest", + "properties": { + "file": "IntegDefaultTestDeployAssert4E6713E1.assets.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "IntegDefaultTestDeployAssert4E6713E1": { + "type": "aws:cloudformation:stack", + "environment": "aws://unknown-account/unknown-region", + "properties": { + "templateFile": "IntegDefaultTestDeployAssert4E6713E1.template.json", + "validateOnSynth": false, + "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", + "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22.json", + "requiresBootstrapStackVersion": 6, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", + "additionalDependencies": [ + "IntegDefaultTestDeployAssert4E6713E1.assets" + ], + "lookupRole": { + "arn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-lookup-role-${AWS::AccountId}-${AWS::Region}", + "requiresBootstrapStackVersion": 8, + "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version" + } + }, + "dependencies": [ + "IntegDefaultTestDeployAssert4E6713E1.assets" + ], + "metadata": { + "/Integ/DefaultTest/DeployAssert/BootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "BootstrapVersion" + } + ], + "/Integ/DefaultTest/DeployAssert/CheckBootstrapVersion": [ + { + "type": "aws:cdk:logicalId", + "data": "CheckBootstrapVersion" + } + ] + }, + "displayName": "Integ/DefaultTest/DeployAssert" + }, + "Tree": { + "type": "cdk:tree", + "properties": { + "file": "tree.json" + } + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/tree.json b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/tree.json new file mode 100644 index 0000000000000..62f1b75e222d9 --- /dev/null +++ b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.js.snapshot/tree.json @@ -0,0 +1,215 @@ +{ + "version": "tree-0.1", + "tree": { + "id": "App", + "path": "", + "children": { + "aws-cdk-aws-apigatewayv2-websockets": { + "id": "aws-cdk-aws-apigatewayv2-websockets", + "path": "aws-cdk-aws-apigatewayv2-websockets", + "children": { + "MyWebsocketApi": { + "id": "MyWebsocketApi", + "path": "aws-cdk-aws-apigatewayv2-websockets/MyWebsocketApi", + "children": { + "Resource": { + "id": "Resource", + "path": "aws-cdk-aws-apigatewayv2-websockets/MyWebsocketApi/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::ApiGatewayV2::Api", + "aws:cdk:cloudformation:props": { + "name": "MyWebsocketApi", + "protocolType": "WEBSOCKET", + "routeSelectionExpression": "$request.body.action" + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-apigatewayv2.CfnApi", + "version": "0.0.0" + } + }, + "test-Route": { + "id": "test-Route", + "path": "aws-cdk-aws-apigatewayv2-websockets/MyWebsocketApi/test-Route", + "children": { + "SendMessageIntegration": { + "id": "SendMessageIntegration", + "path": "aws-cdk-aws-apigatewayv2-websockets/MyWebsocketApi/test-Route/SendMessageIntegration", + "children": { + "Resource": { + "id": "Resource", + "path": "aws-cdk-aws-apigatewayv2-websockets/MyWebsocketApi/test-Route/SendMessageIntegration/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::ApiGatewayV2::Integration", + "aws:cdk:cloudformation:props": { + "apiId": { + "Ref": "MyWebsocketApiEBAC53DF" + }, + "integrationType": "MOCK", + "integrationUri": "" + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-apigatewayv2.CfnIntegration", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-apigatewayv2.WebSocketIntegration", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "aws-cdk-aws-apigatewayv2-websockets/MyWebsocketApi/test-Route/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::ApiGatewayV2::Route", + "aws:cdk:cloudformation:props": { + "apiId": { + "Ref": "MyWebsocketApiEBAC53DF" + }, + "routeKey": "test", + "authorizationType": "NONE", + "routeResponseSelectionExpression": "$default", + "target": { + "Fn::Join": [ + "", + [ + "integrations/", + { + "Ref": "MyWebsocketApitestRouteSendMessageIntegration526C7CB6" + } + ] + ] + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-apigatewayv2.CfnRoute", + "version": "0.0.0" + } + }, + "Response": { + "id": "Response", + "path": "aws-cdk-aws-apigatewayv2-websockets/MyWebsocketApi/test-Route/Response", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::ApiGatewayV2::RouteResponse", + "aws:cdk:cloudformation:props": { + "apiId": { + "Ref": "MyWebsocketApiEBAC53DF" + }, + "routeId": { + "Ref": "MyWebsocketApitestRoute893E635A" + }, + "routeResponseKey": "$default" + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-apigatewayv2.CfnRouteResponse", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-apigatewayv2.WebSocketRoute", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-apigatewayv2.WebSocketApi", + "version": "0.0.0" + } + }, + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "aws-cdk-aws-apigatewayv2-websockets/BootstrapVersion", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "aws-cdk-aws-apigatewayv2-websockets/CheckBootstrapVersion", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/core.Stack", + "version": "0.0.0" + } + }, + "Integ": { + "id": "Integ", + "path": "Integ", + "children": { + "DefaultTest": { + "id": "DefaultTest", + "path": "Integ/DefaultTest", + "children": { + "Default": { + "id": "Default", + "path": "Integ/DefaultTest/Default", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.161" + } + }, + "DeployAssert": { + "id": "DeployAssert", + "path": "Integ/DefaultTest/DeployAssert", + "children": { + "BootstrapVersion": { + "id": "BootstrapVersion", + "path": "Integ/DefaultTest/DeployAssert/BootstrapVersion", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnParameter", + "version": "0.0.0" + } + }, + "CheckBootstrapVersion": { + "id": "CheckBootstrapVersion", + "path": "Integ/DefaultTest/DeployAssert/CheckBootstrapVersion", + "constructInfo": { + "fqn": "@aws-cdk/core.CfnRule", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/core.Stack", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests.IntegTestCase", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/integ-tests.IntegTest", + "version": "0.0.0" + } + }, + "Tree": { + "id": "Tree", + "path": "Tree", + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.1.161" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/core.App", + "version": "0.0.0" + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.ts b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.ts new file mode 100644 index 0000000000000..17c16344b9c69 --- /dev/null +++ b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.ts @@ -0,0 +1,19 @@ +#!/usr/bin/env node +import { WebSocketApi } from '@aws-cdk/aws-apigatewayv2'; +import * as cdk from '@aws-cdk/core'; +import { IntegTest } from '@aws-cdk/integ-tests'; +import { WebSocketMockIntegration } from '../../lib'; + +const app = new cdk.App(); + +const stack = new cdk.Stack(app, 'aws-cdk-aws-apigatewayv2-websockets'); + +const api = new WebSocketApi(stack, 'MyWebsocketApi'); +api.addRoute('test', { + integration: new WebSocketMockIntegration('SendMessageIntegration'), + shouldReturnResponse: true, +}); + +new IntegTest(app, 'Integ', { testCases: [stack] }); + +app.synth(); \ No newline at end of file From 6e333a5baff29c85977c209095254955135f1eb0 Mon Sep 17 00:00:00 2001 From: Emil Rowland Date: Thu, 1 Dec 2022 16:59:13 +0000 Subject: [PATCH 6/7] Changed shouldReturnResponse to returnResponse --- .../test/websocket/integ.route-response.ts | 2 +- packages/@aws-cdk/aws-apigatewayv2/README.md | 2 +- packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts | 6 +++--- .../@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts | 2 +- .../@aws-cdk/aws-apigatewayv2/test/websocket/route.test.ts | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.ts b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.ts index 17c16344b9c69..e7ff6430c4181 100644 --- a/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.ts +++ b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.ts @@ -11,7 +11,7 @@ const stack = new cdk.Stack(app, 'aws-cdk-aws-apigatewayv2-websockets'); const api = new WebSocketApi(stack, 'MyWebsocketApi'); api.addRoute('test', { integration: new WebSocketMockIntegration('SendMessageIntegration'), - shouldReturnResponse: true, + returnResponse: true, }); new IntegTest(app, 'Integ', { testCases: [stack] }); diff --git a/packages/@aws-cdk/aws-apigatewayv2/README.md b/packages/@aws-cdk/aws-apigatewayv2/README.md index 5ea0cc89b52fb..502a816efdeea 100644 --- a/packages/@aws-cdk/aws-apigatewayv2/README.md +++ b/packages/@aws-cdk/aws-apigatewayv2/README.md @@ -413,7 +413,7 @@ declare const messageHandler: lambda.Function; const webSocketApi = new apigwv2.WebSocketApi(this, 'mywsapi'); webSocketApi.addRoute('sendmessage', { integration: new WebSocketLambdaIntegration('SendMessageIntegration', messageHandler), - shouldReturnResponse: true, + returnResponse: true, }); ``` diff --git a/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts b/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts index 528a2cc04e7f5..84328d18e795d 100644 --- a/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts +++ b/packages/@aws-cdk/aws-apigatewayv2/lib/websocket/route.ts @@ -42,7 +42,7 @@ export interface WebSocketRouteOptions { * Should the route send a response to the client * @default false */ - readonly shouldReturnResponse?: boolean; + readonly returnResponse?: boolean; } @@ -109,10 +109,10 @@ export class WebSocketRoute extends Resource implements IWebSocketRoute { target: `integrations/${config.integrationId}`, authorizerId: authBindResult.authorizerId, authorizationType: authBindResult.authorizationType, - routeResponseSelectionExpression: props.shouldReturnResponse ? '$default' : undefined, + routeResponseSelectionExpression: props.returnResponse ? '$default' : undefined, }); this.routeId = route.ref; - if (props.shouldReturnResponse) { + if (props.returnResponse) { new CfnRouteResponse(this, 'Response', { apiId: props.webSocketApi.apiId, routeId: route.ref, diff --git a/packages/@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts b/packages/@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts index 295f4465ec557..fd7839b4b7657 100644 --- a/packages/@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts +++ b/packages/@aws-cdk/aws-apigatewayv2/test/websocket/api.test.ts @@ -71,7 +71,7 @@ describe('WebSocketApi', () => { const api = new WebSocketApi(stack, 'api'); // WHEN - const route = api.addRoute('myroute', { integration: new DummyIntegration(), shouldReturnResponse: true }); + const route = api.addRoute('myroute', { integration: new DummyIntegration(), returnResponse: true }); // THEN Template.fromStack(stack).hasResourceProperties('AWS::ApiGatewayV2::Route', { diff --git a/packages/@aws-cdk/aws-apigatewayv2/test/websocket/route.test.ts b/packages/@aws-cdk/aws-apigatewayv2/test/websocket/route.test.ts index 18faf40551270..63bc3e6e969c7 100644 --- a/packages/@aws-cdk/aws-apigatewayv2/test/websocket/route.test.ts +++ b/packages/@aws-cdk/aws-apigatewayv2/test/websocket/route.test.ts @@ -131,7 +131,7 @@ describe('WebSocketRoute', () => { webSocketApi, integration: new DummyIntegration(), routeKey: 'message', - shouldReturnResponse: true, + returnResponse: true, }); // THEN From a40c63925c41be79f3bc1b7140eec537f76ac4e8 Mon Sep 17 00:00:00 2001 From: Emil Rowland Date: Fri, 27 Jan 2023 18:18:46 +0100 Subject: [PATCH 7/7] Removed unnecessary Shebang line --- .../test/websocket/integ.route-response.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.ts b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.ts index e7ff6430c4181..063b1d20d962e 100644 --- a/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.ts +++ b/packages/@aws-cdk/aws-apigatewayv2-integrations/test/websocket/integ.route-response.ts @@ -1,4 +1,3 @@ -#!/usr/bin/env node import { WebSocketApi } from '@aws-cdk/aws-apigatewayv2'; import * as cdk from '@aws-cdk/core'; import { IntegTest } from '@aws-cdk/integ-tests'; @@ -16,4 +15,4 @@ api.addRoute('test', { new IntegTest(app, 'Integ', { testCases: [stack] }); -app.synth(); \ No newline at end of file +app.synth();