Skip to content

Commit 2bdaf6b

Browse files
tomasdembellidylanratcliffe
authored andcommitted
add apigateway stage integration tests
1 parent 9754ffa commit 2bdaf6b

File tree

5 files changed

+152
-15
lines changed

5 files changed

+152
-15
lines changed

adapters/apigateway-stage.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,18 @@ func NewAPIGatewayStageAdapter(client *apigateway.Client, accountID string, regi
100100
DisableList: true,
101101
SearchFunc: func(ctx context.Context, client *apigateway.Client, scope string, query string) ([]*types.Stage, error) {
102102
f := strings.Split(query, "/")
103-
var restAPIID string
104-
var deploymentID string
103+
var input *apigateway.GetStagesInput
105104

106105
switch len(f) {
107106
case 1:
108-
restAPIID = f[0]
107+
input = &apigateway.GetStagesInput{
108+
RestApiId: &f[0],
109+
}
109110
case 2:
110-
restAPIID = f[0]
111-
deploymentID = f[1]
111+
input = &apigateway.GetStagesInput{
112+
RestApiId: &f[0],
113+
DeploymentId: &f[1],
114+
}
112115
default:
113116
return nil, &sdp.QueryError{
114117
ErrorType: sdp.QueryError_NOTFOUND,
@@ -119,10 +122,7 @@ func NewAPIGatewayStageAdapter(client *apigateway.Client, accountID string, regi
119122
}
120123
}
121124

122-
out, err := client.GetStages(ctx, &apigateway.GetStagesInput{
123-
RestApiId: &restAPIID,
124-
DeploymentId: &deploymentID,
125-
})
125+
out, err := client.GetStages(ctx, input)
126126
if err != nil {
127127
return nil, err
128128
}
@@ -148,7 +148,7 @@ var stageAdapterMetadata = Metadata.Register(&sdp.AdapterMetadata{
148148
Get: true,
149149
Search: true,
150150
GetDescription: "Get an API Gateway Stage by its rest API ID and stage name: rest-api-id/stage-name",
151-
SearchDescription: "Search for API Gateway Stages by their rest API ID or with rest API ID and their stage name: rest-api-id/stage-name",
151+
SearchDescription: "Search for API Gateway Stages by their rest API ID or with rest API ID and deployment-id: rest-api-id/deployment-id",
152152
},
153153
PotentialLinks: []string{"wafv2-web-acl"},
154154
})

adapters/integration/apigateway/apigateway_test.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,13 @@ func APIGateway(t *testing.T) {
8787
t.Fatalf("failed to validate APIGateway deployment adapter: %v", err)
8888
}
8989

90+
stageSource := adapters.NewAPIGatewayStageAdapter(testClient, accountID, testAWSConfig.Region)
91+
92+
err = stageSource.Validate()
93+
if err != nil {
94+
t.Fatalf("failed to validate APIGateway stage adapter: %v", err)
95+
}
96+
9097
// Tests ----------------------------------------------------------------------------------------------------------
9198

9299
scope := adapterhelpers.FormatScope(accountID, testAWSConfig.Region)
@@ -458,5 +465,76 @@ func APIGateway(t *testing.T) {
458465
t.Fatalf("expected deployment ID %s, got %s", deploymentID, deploymentIDFromSearch)
459466
}
460467

468+
// Search stages by restApiID
469+
stages, err := stageSource.Search(ctx, scope, restApiID, true)
470+
if err != nil {
471+
t.Fatalf("failed to search APIGateway stages: %v", err)
472+
}
473+
474+
if len(stages) == 0 {
475+
t.Fatalf("no stages found")
476+
}
477+
478+
stageUniqueAttribute := stages[0].GetUniqueAttribute()
479+
480+
stageID, err := integration.GetUniqueAttributeValueBySignificantAttribute(
481+
stageUniqueAttribute,
482+
"StageName",
483+
"dev",
484+
stages,
485+
true,
486+
)
487+
if err != nil {
488+
t.Fatalf("failed to get stage ID: %v", err)
489+
}
490+
491+
// Get stage
492+
query = fmt.Sprintf("%s/dev", restApiID)
493+
stage, err := stageSource.Get(ctx, scope, query, true)
494+
if err != nil {
495+
t.Fatalf("failed to get APIGateway stage: %v", err)
496+
}
497+
498+
stageIDFromGet, err := integration.GetUniqueAttributeValueBySignificantAttribute(
499+
stageUniqueAttribute,
500+
"StageName",
501+
"dev",
502+
[]*sdp.Item{stage},
503+
true,
504+
)
505+
if err != nil {
506+
t.Fatalf("failed to get stage ID from get: %v", err)
507+
}
508+
509+
if stageID != stageIDFromGet {
510+
t.Fatalf("expected stage ID %s, got %s", stageID, stageIDFromGet)
511+
}
512+
513+
// Search stage by restApiID/deploymentID
514+
query = fmt.Sprintf("%s/%s", restApiID, deploymentID)
515+
stagesFromSearch, err := stageSource.Search(ctx, scope, query, true)
516+
if err != nil {
517+
t.Fatalf("failed to search APIGateway stages: %v", err)
518+
}
519+
520+
if len(stagesFromSearch) == 0 {
521+
t.Fatalf("no stages found")
522+
}
523+
524+
stageIDFromSearch, err := integration.GetUniqueAttributeValueBySignificantAttribute(
525+
stageUniqueAttribute,
526+
"StageName",
527+
"dev",
528+
stagesFromSearch,
529+
true,
530+
)
531+
if err != nil {
532+
t.Fatalf("failed to get stage ID from search: %v", err)
533+
}
534+
535+
if stageID != stageIDFromSearch {
536+
t.Fatalf("expected stage ID %s, got %s", stageID, stageIDFromSearch)
537+
}
538+
461539
t.Log("APIGateway integration test completed")
462540
}

adapters/integration/apigateway/create.go

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -229,26 +229,55 @@ func createAuthorizer(ctx context.Context, logger *slog.Logger, client *apigatew
229229
return nil
230230
}
231231

232-
func createDeployment(ctx context.Context, logger *slog.Logger, client *apigateway.Client, restAPIID string) error {
232+
func createDeployment(ctx context.Context, logger *slog.Logger, client *apigateway.Client, restAPIID string) (*string, error) {
233233
// check if a deployment with the same name already exists
234234
id, err := findDeploymentByDescription(ctx, client, restAPIID, "test-deployment")
235235
if err != nil {
236236
if errors.As(err, new(integration.NotFoundError)) {
237237
logger.InfoContext(ctx, "Creating deployment")
238238
} else {
239-
return err
239+
return nil, err
240240
}
241241
}
242242

243243
if id != nil {
244244
logger.InfoContext(ctx, "Deployment already exists")
245-
return nil
245+
return id, nil
246246
}
247247

248-
_, err = client.CreateDeployment(ctx, &apigateway.CreateDeploymentInput{
248+
resp, err := client.CreateDeployment(ctx, &apigateway.CreateDeploymentInput{
249249
RestApiId: &restAPIID,
250250
Description: adapterhelpers.PtrString("test-deployment"),
251251
})
252+
if err != nil {
253+
return nil, err
254+
}
255+
256+
return resp.Id, nil
257+
}
258+
259+
func createStage(ctx context.Context, logger *slog.Logger, client *apigateway.Client, restAPIID, deploymentID string) error {
260+
// check if a stage with the same name already exists
261+
stgName := "dev"
262+
err := findStageByName(ctx, client, restAPIID, stgName)
263+
if err != nil {
264+
if errors.As(err, new(integration.NotFoundError)) {
265+
logger.InfoContext(ctx, "Creating stage")
266+
} else {
267+
return err
268+
}
269+
}
270+
271+
if err == nil {
272+
logger.InfoContext(ctx, "Stage already exists")
273+
return nil
274+
}
275+
276+
_, err = client.CreateStage(ctx, &apigateway.CreateStageInput{
277+
RestApiId: &restAPIID,
278+
DeploymentId: &deploymentID,
279+
StageName: &stgName,
280+
})
252281
if err != nil {
253282
return err
254283
}

adapters/integration/apigateway/find.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,26 @@ func findDeploymentByDescription(ctx context.Context, client *apigateway.Client,
169169

170170
return nil, integration.NewNotFoundError(integration.ResourceName(integration.APIGateway, deploymentSrc, description))
171171
}
172+
173+
func findStageByName(ctx context.Context, client *apigateway.Client, restAPIID, name string) error {
174+
result, err := client.GetStage(ctx, &apigateway.GetStageInput{
175+
RestApiId: &restAPIID,
176+
StageName: &name,
177+
})
178+
if err != nil {
179+
var notFoundErr *types.NotFoundException
180+
if errors.As(err, &notFoundErr) {
181+
return integration.NewNotFoundError(integration.ResourceName(
182+
integration.APIGateway,
183+
stageSrc,
184+
name,
185+
))
186+
}
187+
}
188+
189+
if result == nil {
190+
return integration.NewNotFoundError(name)
191+
}
192+
193+
return nil
194+
}

adapters/integration/apigateway/setup.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const (
1717
apiKeySrc = "api-key"
1818
authorizerSrc = "authorizer"
1919
deploymentSrc = "deployment"
20+
stageSrc = "stage"
2021
)
2122

2223
func setup(ctx context.Context, logger *slog.Logger, client *apigateway.Client) error {
@@ -71,7 +72,13 @@ func setup(ctx context.Context, logger *slog.Logger, client *apigateway.Client)
7172
}
7273

7374
// Create Deployment
74-
err = createDeployment(ctx, logger, client, *restApiID)
75+
deploymentID, err := createDeployment(ctx, logger, client, *restApiID)
76+
if err != nil {
77+
return err
78+
}
79+
80+
// Create Stage
81+
err = createStage(ctx, logger, client, *restApiID, *deploymentID)
7582
if err != nil {
7683
return err
7784
}

0 commit comments

Comments
 (0)