Repository: awslabs/aws-ddk (language: python)

Issue:
typescript: test coverage

*P.S. Please Don't attach files. Add code snippets directly in the message body instead.*


Discussion / hints:

Fix patch:
diff --git a/API.md b/API.md
index 55ef4992..6ee26449 100644
--- a/API.md
+++ b/API.md
@@ -5530,6 +5530,7 @@ const sqsToLambdaStageFunctionProps: SqsToLambdaStageFunctionProps = { ... }
 | <code><a href="#aws-ddk-core.SqsToLambdaStageFunctionProps.property.code">code</a></code> | <code>aws-cdk-lib.aws_lambda.Code</code> | *No description.* |
 | <code><a href="#aws-ddk-core.SqsToLambdaStageFunctionProps.property.handler">handler</a></code> | <code>string</code> | *No description.* |
 | <code><a href="#aws-ddk-core.SqsToLambdaStageFunctionProps.property.errorsAlarmThreshold">errorsAlarmThreshold</a></code> | <code>number</code> | *No description.* |
+| <code><a href="#aws-ddk-core.SqsToLambdaStageFunctionProps.property.errorsComparisonOperator">errorsComparisonOperator</a></code> | <code>aws-cdk-lib.aws_cloudwatch.ComparisonOperator</code> | *No description.* |
 | <code><a href="#aws-ddk-core.SqsToLambdaStageFunctionProps.property.errorsEvaluationPeriods">errorsEvaluationPeriods</a></code> | <code>number</code> | *No description.* |
 | <code><a href="#aws-ddk-core.SqsToLambdaStageFunctionProps.property.layers">layers</a></code> | <code>aws-cdk-lib.aws_lambda.ILayerVersion[]</code> | *No description.* |
 | <code><a href="#aws-ddk-core.SqsToLambdaStageFunctionProps.property.memorySize">memorySize</a></code> | <code>aws-cdk-lib.Size</code> | *No description.* |
@@ -5569,6 +5570,16 @@ public readonly errorsAlarmThreshold: number;
 
 ---
 
+##### `errorsComparisonOperator`<sup>Optional</sup> <a name="errorsComparisonOperator" id="aws-ddk-core.SqsToLambdaStageFunctionProps.property.errorsComparisonOperator"></a>
+
+```typescript
+public readonly errorsComparisonOperator: ComparisonOperator;
+```
+
+- *Type:* aws-cdk-lib.aws_cloudwatch.ComparisonOperator
+
+---
+
 ##### `errorsEvaluationPeriods`<sup>Optional</sup> <a name="errorsEvaluationPeriods" id="aws-ddk-core.SqsToLambdaStageFunctionProps.property.errorsEvaluationPeriods"></a>
 
 ```typescript
@@ -5792,10 +5803,21 @@ const sqsToLambdaStageQueueProps: SqsToLambdaStageQueueProps = { ... }
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
+| <code><a href="#aws-ddk-core.SqsToLambdaStageQueueProps.property.fifo">fifo</a></code> | <code>boolean</code> | *No description.* |
 | <code><a href="#aws-ddk-core.SqsToLambdaStageQueueProps.property.visibilityTimeout">visibilityTimeout</a></code> | <code>aws-cdk-lib.Duration</code> | *No description.* |
 
 ---
 
+##### `fifo`<sup>Optional</sup> <a name="fifo" id="aws-ddk-core.SqsToLambdaStageQueueProps.property.fifo"></a>
+
+```typescript
+public readonly fifo: boolean;
+```
+
+- *Type:* boolean
+
+---
+
 ##### `visibilityTimeout`<sup>Optional</sup> <a name="visibilityTimeout" id="aws-ddk-core.SqsToLambdaStageQueueProps.property.visibilityTimeout"></a>
 
 ```typescript
diff --git a/src/cicd/pipelines.ts b/src/cicd/pipelines.ts
index eb3f362e..6f4285a6 100644
--- a/src/cicd/pipelines.ts
+++ b/src/cicd/pipelines.ts
@@ -163,7 +163,7 @@ export class CICDPipelineStack extends cdk.Stack {
     if (this.pipeline === undefined) {
       throw new Error("`.buildPipeline()` needs to be called first before adding application stages to the pipeline.");
     }
-    var manualApprovals = props.manualApprovals ?? false; // || this._config.get_env_config(stage_id).get('manual_approvals');
+    var manualApprovals = props.manualApprovals ?? false;
 
     if (manualApprovals) {
       this.pipeline?.addStage(props.stage, {
diff --git a/src/stages/sqs-lambda.ts b/src/stages/sqs-lambda.ts
index 57f8e4f6..33559266 100644
--- a/src/stages/sqs-lambda.ts
+++ b/src/stages/sqs-lambda.ts
@@ -1,4 +1,5 @@
 import * as cdk from "aws-cdk-lib";
+import * as cloudwatch from "aws-cdk-lib/aws-cloudwatch";
 import * as events from "aws-cdk-lib/aws-events";
 import * as events_targets from "aws-cdk-lib/aws-events-targets";
 import * as iam from "aws-cdk-lib/aws-iam";
@@ -19,10 +20,12 @@ export interface SqsToLambdaStageFunctionProps {
 
   readonly errorsAlarmThreshold?: number;
   readonly errorsEvaluationPeriods?: number;
+  readonly errorsComparisonOperator?: cloudwatch.ComparisonOperator;
 }
 
 export interface SqsToLambdaStageQueueProps {
   readonly visibilityTimeout?: cdk.Duration;
+  readonly fifo?: boolean;
 }
 
 export interface SqsToLambdaStageProps extends DataStageProps {
@@ -98,6 +101,7 @@ export class SqsToLambdaStage extends DataStage {
               maxReceiveCount: props.maxReceiveCount ?? 1,
             }
           : undefined,
+        fifo: props.sqsQueueProps?.fifo ?? false,
       });
     }
 
@@ -112,6 +116,8 @@ export class SqsToLambdaStage extends DataStage {
       metric: this.function.metricErrors(),
       threshold: props.lambdaFunctionProps?.errorsAlarmThreshold ?? 5,
       evaluationPeriods: props.lambdaFunctionProps?.errorsEvaluationPeriods ?? 1,
+      comparisonOperator:
+        props.lambdaFunctionProps?.errorsComparisonOperator ?? cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
     });
 
     this.eventPattern = {


Test patch:
diff --git a/test/athena-sql-stage.test.ts b/test/athena-sql-stage.test.ts
index 780bd4e9..38c5fddc 100644
--- a/test/athena-sql-stage.test.ts
+++ b/test/athena-sql-stage.test.ts
@@ -1,5 +1,7 @@
 import * as cdk from "aws-cdk-lib";
 import { Match, Template } from "aws-cdk-lib/assertions";
+import * as iam from "aws-cdk-lib/aws-iam";
+import * as tasks from "aws-cdk-lib/aws-stepfunctions-tasks";
 
 import { AthenaSQLStage } from "../src";
 
@@ -18,3 +20,27 @@ test("AthenaToSQL stage creates State Machine", () => {
     },
   });
 });
+
+test("AthenaToSQL stage with additional properties", () => {
+  const stack = new cdk.Stack();
+
+  new AthenaSQLStage(stack, "athena-sql", {
+    queryString: "SELECT 1",
+    workGroup: "primary",
+    encryptionOption: tasks.EncryptionOption.KMS,
+    additionalRolePolicyStatements: [
+      new iam.PolicyStatement({
+        actions: ["s3:*"],
+        resources: ["*"],
+      }),
+    ],
+    stateMachineInput: { foo: "bar" },
+  });
+
+  const template = Template.fromStack(stack);
+  template.hasResourceProperties("AWS::StepFunctions::StateMachine", {
+    DefinitionString: {
+      "Fn::Join": ["", Match.arrayWith([Match.stringLikeRegexp("Start Query Exec")])],
+    },
+  });
+});
diff --git a/test/cicd-pipeline-stack.test.ts b/test/cicd-pipeline-stack.test.ts
index 1cdf76c1..8a06fc03 100644
--- a/test/cicd-pipeline-stack.test.ts
+++ b/test/cicd-pipeline-stack.test.ts
@@ -1,16 +1,50 @@
+import path from "path";
 import * as cdk from "aws-cdk-lib";
 import { Match, Template } from "aws-cdk-lib/assertions";
+import * as iam from "aws-cdk-lib/aws-iam";
+import * as lambda from "aws-cdk-lib/aws-lambda";
+import * as s3 from "aws-cdk-lib/aws-s3";
 import { ShellStep } from "aws-cdk-lib/pipelines";
-import { CICDPipelineStack, getCodeArtifactPublishAction } from "../src";
+import {
+  CICDPipelineStack,
+  DataPipeline,
+  FirehoseToS3Stage,
+  getCodeArtifactPublishAction,
+  SqsToLambdaStage,
+} from "../src";
 
 test("Basic CICDPipeline", () => {
   const app = new cdk.App();
-  //const baseStack = new cdk.Stack(app, "my-base-stack"); will add when base stack is implemented
+  const devStage = new cdk.Stage(app, "dev", { env: { account: "000000000000" } });
+  const devStack = new cdk.Stack(devStage, "application-stack");
+
+  const bucket = new s3.Bucket(devStack, "Bucket");
+  const firehoseToS3Stage = new FirehoseToS3Stage(devStack, "Firehose To S3 Stage", { s3Bucket: bucket });
+
+  const sqsToLambdaStage = new SqsToLambdaStage(devStack, "SQS To Lambda Stage 2", {
+    lambdaFunctionProps: {
+      code: lambda.Code.fromAsset(path.join(__dirname, "/../src/")),
+      handler: "commons.handlers.lambda_handler",
+      memorySize: cdk.Size.mebibytes(512),
+      layers: [
+        lambda.LayerVersion.fromLayerVersionArn(
+          devStack,
+          "Layer",
+          "arn:aws:lambda:us-east-1:222222222222:layer:dummy:1",
+        ),
+      ],
+    },
+  });
+
+  const pipeline = new DataPipeline(devStack, "Pipeline", {});
+
+  pipeline.addStage({ stage: firehoseToS3Stage }).addStage({ stage: sqsToLambdaStage });
+
   const stack = new CICDPipelineStack(app, "dummy-pipeline", { environmentId: "dev", pipelineName: "dummy-pipeline" })
     .addSourceAction({ repositoryName: "dummy-repository" })
     .addSynthAction()
     .buildPipeline()
-    //.addStage({ stageId: 'dev', stage: new cdk.Stage(baseStack, 'my-stack')}) will add when base stack is implemented
+    .addStage({ stageId: "dev", stage: devStage })
     .synth();
 
   const template = Template.fromStack(stack);
@@ -57,9 +91,9 @@ test("Basic CICDPipeline", () => {
           }),
         ]),
       }),
-      // Match.objectLike({
-      //   Name: 'dev',
-      // }),
+      Match.objectLike({
+        Name: "dev",
+      }),
     ]),
   });
   template.hasResourceProperties("AWS::IAM::Role", {
@@ -80,6 +114,64 @@ test("Basic CICDPipeline", () => {
   });
 });
 
+test("CICDPipeline with manual approval set", () => {
+  const app = new cdk.App();
+  const devStage = new cdk.Stage(app, "dev", { env: { account: "000000000000" } });
+  const devStack = new cdk.Stack(devStage, "application-stack");
+
+  const bucket = new s3.Bucket(devStack, "Bucket");
+  const firehoseToS3Stage = new FirehoseToS3Stage(devStack, "Firehose To S3 Stage", { s3Bucket: bucket });
+
+  const sqsToLambdaStage = new SqsToLambdaStage(devStack, "SQS To Lambda Stage 2", {
+    lambdaFunctionProps: {
+      code: lambda.Code.fromAsset(path.join(__dirname, "/../src/")),
+      handler: "commons.handlers.lambda_handler",
+      memorySize: cdk.Size.mebibytes(512),
+      layers: [
+        lambda.LayerVersion.fromLayerVersionArn(
+          devStack,
+          "Layer",
+          "arn:aws:lambda:us-east-1:222222222222:layer:dummy:1",
+        ),
+      ],
+    },
+  });
+
+  const pipeline = new DataPipeline(devStack, "Pipeline", {});
+
+  pipeline.addStage({ stage: firehoseToS3Stage }).addStage({ stage: sqsToLambdaStage });
+
+  const stack = new CICDPipelineStack(app, "dummy-pipeline", { environmentId: "dev", pipelineName: "dummy-pipeline" })
+    .addSourceAction({ repositoryName: "dummy-repository" })
+    .addSynthAction()
+    .buildPipeline()
+    .addStage({ stageId: "dev", stage: devStage, manualApprovals: true })
+    .synth();
+
+  const template = Template.fromStack(stack);
+  template.resourceCountIs("AWS::CodePipeline::Pipeline", 1);
+});
+
+test("CICDPipeline with wave", () => {
+  const app = new cdk.App();
+  const devStage = new cdk.Stage(app, "dev", { env: { account: "000000000000" } });
+  const devStack = new cdk.Stack(devStage, "dev-application-stack");
+  const prodStage = new cdk.Stage(app, "prod", { env: { account: "000000000000" } });
+  const prodStack = new cdk.Stack(prodStage, "prod-application-stack");
+  new s3.Bucket(devStack, "Bucket");
+  new s3.Bucket(prodStack, "Bucket");
+
+  const stack = new CICDPipelineStack(app, "dummy-pipeline", { environmentId: "dev", pipelineName: "dummy-pipeline" })
+    .addSourceAction({ repositoryName: "dummy-repository" })
+    .addSynthAction()
+    .buildPipeline()
+    .addWave({ stageId: "applications", stages: [devStage, prodStage] })
+    .synth();
+
+  const template = Template.fromStack(stack);
+  template.resourceCountIs("AWS::CodePipeline::Pipeline", 1);
+});
+
 test("CICD Pipeline with Security Checks", () => {
   const app = new cdk.App();
   const stack = new CICDPipelineStack(app, "dummy-pipeline", { environmentId: "dev", pipelineName: "dummy-pipeline" })
@@ -311,3 +403,83 @@ test("Add notifications without building pipeline", () => {
     Error("`.buildPipeline()` needs to be called first before adding application stages to the pipeline."),
   );
 });
+
+test("CICDPipeline additional properties", () => {
+  const app = new cdk.App();
+  const stack = new CICDPipelineStack(app, "dummy-pipeline", { environmentId: "dev", pipelineName: "dummy-pipeline" })
+    .addSourceAction({ repositoryName: "dummy-repository" })
+    .addSynthAction({
+      additionalInstallCommands: ["echo 'foobar'"],
+      cdkVersion: "2.61.0",
+    })
+    .buildPipeline()
+    .addTestStage({
+      commands: ["./my-test.sh"],
+    })
+    //.addStage({ stageId: 'dev', stage: new cdk.Stage(baseStack, 'my-stack')}) will add when base stack is implemented
+    .synth();
+
+  Template.fromStack(stack);
+});
+
+test("Error when running build pipeline before adding synth action", () => {
+  const app = new cdk.App();
+  const stack = () =>
+    new CICDPipelineStack(app, "dummy-pipeline", {
+      environmentId: "dev",
+      pipelineName: "dummy-pipeline",
+    }).buildPipeline();
+  expect(stack).toThrow(Error("Pipeline cannot be built without a synth action."));
+});
+
+test("Test Pipeline with Artifact Upload", () => {
+  const app = new cdk.App();
+  const stack = new CICDPipelineStack(app, "dummy-pipeline", { environmentId: "dev", pipelineName: "dummy-pipeline" })
+    .addSourceAction({ repositoryName: "dummy-repository" })
+    .addSynthAction()
+    .buildPipeline()
+    .addCustomStage({
+      stageName: "PublishToCodeArtifact",
+      steps: [
+        getCodeArtifactPublishAction(
+          "aws",
+          app.region ?? "us-east-1",
+          app.account ?? "111111111111",
+          "dummy",
+          "dummy",
+          "dummy",
+          undefined,
+          [
+            new iam.PolicyStatement({
+              effect: iam.Effect.ALLOW,
+              actions: [
+                "codeartifact:DescribeDomain",
+                "codeartifact:GetAuthorizationToken",
+                "codeartifact:ListRepositoriesInDomain",
+              ],
+              resources: ["arn:aws:codeartifact:us-east-1:222222222222:domain/dummy"],
+            }),
+            new iam.PolicyStatement({
+              effect: iam.Effect.ALLOW,
+              actions: ["codeartifact:GetRepositoryEndpoint", "codeartifact:ReadFromRepository"],
+              resources: ["arn:aws:codeartifact:us-east-1:222222222222:repository/dummy/dummy-repo"],
+            }),
+            new iam.PolicyStatement({
+              effect: iam.Effect.ALLOW,
+              actions: ["sts:GetServiceBearerToken"],
+              resources: ["*"],
+              conditions: {
+                StringEquals: {
+                  "sts:AWSServiceName": "codeartifact.amazonaws.com",
+                },
+              },
+            }),
+          ],
+        ),
+      ],
+    })
+    .synth()
+    .addNotifications();
+
+  Template.fromStack(stack);
+});
diff --git a/test/data-pipelines.test.ts b/test/data-pipelines.test.ts
index e43c512f..bad75e86 100644
--- a/test/data-pipelines.test.ts
+++ b/test/data-pipelines.test.ts
@@ -10,6 +10,7 @@ import { DataPipeline, FirehoseToS3Stage, GlueTransformStage, S3EventStage, SqsT
 
 test("Basic DataPipeline", () => {
   const stack = new cdk.Stack();
+
   const bucket = new s3.Bucket(stack, "Bucket");
 
   const firehoseToS3Stage = new FirehoseToS3Stage(stack, "Firehose To S3 Stage", { s3Bucket: bucket });
@@ -119,3 +120,59 @@ test("DataPipeline with Scheduled stage", () => {
     ScheduleExpression: "rate(5 minutes)",
   });
 });
+
+test("DataPipeline with override rule", () => {
+  const stack = new cdk.Stack();
+  const bucket = new s3.Bucket(stack, "Bucket");
+
+  const firehoseToS3Stage = new FirehoseToS3Stage(stack, "Firehose To S3 Stage", { s3Bucket: bucket });
+
+  const sqsToLambdaStage = new SqsToLambdaStage(stack, "SQS To Lambda Stage 2", {
+    lambdaFunctionProps: {
+      code: lambda.Code.fromAsset(path.join(__dirname, "/../src/")),
+      handler: "commons.handlers.lambda_handler",
+      memorySize: cdk.Size.mebibytes(512),
+      layers: [
+        lambda.LayerVersion.fromLayerVersionArn(stack, "Layer", "arn:aws:lambda:us-east-1:222222222222:layer:dummy:1"),
+      ],
+    },
+  });
+
+  const pipeline = new DataPipeline(stack, "Pipeline", {});
+  pipeline.addStage({ stage: firehoseToS3Stage }).addStage({
+    stage: sqsToLambdaStage,
+    overrideRule: new events.Rule(stack, "rule", {
+      eventPattern: {
+        source: ["aws.ec2"],
+      },
+    }),
+  });
+
+  Template.fromStack(stack);
+});
+
+test("DataPipeline with skip rule", () => {
+  const stack = new cdk.Stack();
+  const bucket = new s3.Bucket(stack, "Bucket");
+
+  const firehoseToS3Stage = new FirehoseToS3Stage(stack, "Firehose To S3 Stage", { s3Bucket: bucket });
+
+  const sqsToLambdaStage = new SqsToLambdaStage(stack, "SQS To Lambda Stage 2", {
+    lambdaFunctionProps: {
+      code: lambda.Code.fromAsset(path.join(__dirname, "/../src/")),
+      handler: "commons.handlers.lambda_handler",
+      memorySize: cdk.Size.mebibytes(512),
+      layers: [
+        lambda.LayerVersion.fromLayerVersionArn(stack, "Layer", "arn:aws:lambda:us-east-1:222222222222:layer:dummy:1"),
+      ],
+    },
+  });
+
+  const pipeline = new DataPipeline(stack, "Pipeline", {});
+  pipeline.addStage({ stage: firehoseToS3Stage }).addStage({
+    stage: sqsToLambdaStage,
+    skipRule: true,
+  });
+  const template = Template.fromStack(stack);
+  template.resourceCountIs("AWS::Events::Rule", 0);
+});
diff --git a/test/glue-transform-stage.test.ts b/test/glue-transform-stage.test.ts
index 1964b79b..6a55010a 100644
--- a/test/glue-transform-stage.test.ts
+++ b/test/glue-transform-stage.test.ts
@@ -38,6 +38,9 @@ test("GlueTransformStage stage creates Glue Job", () => {
       }),
       jobName: "myJob",
     },
+    jobRunArgs: {
+      foo: "bar",
+    },
     crawlerName: "myCrawler",
   });
 
@@ -71,3 +74,19 @@ test("GlueTransformStage stage creates Glue Crawler", () => {
     Role: "role",
   });
 });
+
+test("GlueTranformStage must have 'jobName' or 'jobProps' set", () => {
+  const stack = new cdk.Stack();
+  expect(() => {
+    new GlueTransformStage(stack, "Stage", {});
+  }).toThrowError("'jobName' or 'jobProps' must be set to instantiate this stage");
+});
+
+test("GlueTranformStage must have 'crawlerName' or 'crawlerProps' set", () => {
+  const stack = new cdk.Stack();
+  expect(() => {
+    new GlueTransformStage(stack, "Stage", {
+      jobName: "myJob",
+    });
+  }).toThrowError("'crawlerName' or 'crawlerProps' must be set to instantiate this stage");
+});
diff --git a/test/sqs-lambda-stage.test.ts b/test/sqs-lambda-stage.test.ts
index a486f344..2fbe4e22 100644
--- a/test/sqs-lambda-stage.test.ts
+++ b/test/sqs-lambda-stage.test.ts
@@ -1,6 +1,7 @@
 import path from "path";
 import * as cdk from "aws-cdk-lib";
 import { Match, Template } from "aws-cdk-lib/assertions";
+import * as cloudwatch from "aws-cdk-lib/aws-cloudwatch";
 import * as lambda from "aws-cdk-lib/aws-lambda";
 import * as sqs from "aws-cdk-lib/aws-sqs";
 
@@ -142,6 +143,7 @@ test("SQSToLambdaStage is able to create a CloudWatch alarm", () => {
       handler: "commons.handlers.lambda_handler",
       errorsAlarmThreshold: 10,
       errorsEvaluationPeriods: 3,
+      errorsComparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
     },
   });
 
@@ -160,3 +162,62 @@ test("SQSToLambdaStage is able to create a CloudWatch alarm", () => {
     ]),
   });
 });
+
+test("SQSToLambda must have 'lambdaFunction' or 'lambdaFunctionProps' set", () => {
+  const stack = new cdk.Stack();
+  expect(() => {
+    new SqsToLambdaStage(stack, "Stage", {});
+  }).toThrowError("'lambdaFunction' or 'lambdaFunctionProps' must be set to instantiate this stage");
+});
+
+test("SQSToLambda must have 'messageGroupId' when using a fifo queue", () => {
+  const stack = new cdk.Stack();
+  expect(() => {
+    new SqsToLambdaStage(stack, "Stage", {
+      lambdaFunctionProps: {
+        code: lambda.Code.fromAsset(path.join(__dirname, "/../src/")),
+        handler: "commons.handlers.lambda_handler",
+        memorySize: cdk.Size.mebibytes(512),
+        layers: [
+          lambda.LayerVersion.fromLayerVersionArn(
+            stack,
+            "Layer",
+            "arn:aws:lambda:us-east-1:222222222222:layer:dummy:1",
+          ),
+        ],
+      },
+      sqsQueueProps: {
+        fifo: true,
+      },
+    });
+  }).toThrowError("'messageGroupId' must be set to when target is a fifo queue");
+});
+
+test("SQSToLambdaStage additional properties", () => {
+  const stack = new cdk.Stack();
+
+  new SqsToLambdaStage(stack, "Stage", {
+    lambdaFunctionProps: {
+      code: lambda.Code.fromAsset(path.join(__dirname, "/../src/")),
+      handler: "commons.handlers.lambda_handler",
+      runtime: lambda.Runtime.PYTHON_3_8,
+    },
+    messageGroupId: "dummy-group",
+    maxReceiveCount: 2,
+    dlqEnabled: true,
+    sqsQueueProps: {
+      fifo: true,
+      visibilityTimeout: cdk.Duration.minutes(5),
+    },
+  });
+
+  const template = Template.fromStack(stack);
+
+  template.hasResourceProperties("AWS::Lambda::Function", {
+    Runtime: "python3.8",
+  });
+  template.resourceCountIs("AWS::SQS::Queue", 2);
+  template.hasResourceProperties("AWS::SQS::Queue", {
+    VisibilityTimeout: 300,
+  });
+});