Skip to content

Commit 7358425

Browse files
- Added handler unit tests.
1 parent 1278a2a commit 7358425

File tree

5 files changed

+14156
-1
lines changed

5 files changed

+14156
-1
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package handler_test
2+
3+
import (
4+
"context"
5+
"io"
6+
"net"
7+
"net/http"
8+
"net/http/httptest"
9+
"os"
10+
"testing"
11+
12+
"github.com/sirupsen/logrus"
13+
"github.com/stackql/any-sdk/anysdk"
14+
"github.com/stackql/any-sdk/pkg/dto"
15+
"github.com/stretchr/testify/assert"
16+
)
17+
18+
func TestAwsS3BucketAclsGet(t *testing.T) {
19+
20+
vr := "v0.1.0"
21+
pb, err := os.ReadFile("./testdata/registry/src/aws/" + vr + "/provider.yaml")
22+
if err != nil {
23+
t.Fatalf("Test failed: could not read provider doc, error: %v", err)
24+
}
25+
prov, provErr := anysdk.LoadProviderDocFromBytes(pb)
26+
if provErr != nil {
27+
t.Fatalf("Test failed: could not load provider doc, error: %v", provErr)
28+
}
29+
svc, err := anysdk.LoadProviderAndServiceFromPaths(
30+
"./testdata/registry/src/aws/"+vr+"/provider.yaml",
31+
"./testdata/registry/src/aws/"+vr+"/services/s3.yaml",
32+
)
33+
if err != nil {
34+
t.Fatalf("Test failed: %v", err)
35+
}
36+
rsc, rscErr := svc.GetResource("bucket_acls")
37+
if rscErr != nil {
38+
t.Fatalf("Test failed: could not locate resource bucket_acls, error: %v", rscErr)
39+
}
40+
method, methodErr := rsc.FindMethod("get_bucket_acl")
41+
if methodErr != nil {
42+
t.Fatalf("Test failed: could not locate method get_bucket_acl, error: %v", methodErr)
43+
}
44+
45+
assert.Equal(t, svc.GetName(), "s3")
46+
47+
expectedHost := "my-test-bucket.s3-ap-southeast-2.amazonaws.com"
48+
49+
tlsServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
50+
defer r.Body.Close()
51+
io.Copy(io.Discard, r.Body)
52+
assert.Equal(t, r.Host, expectedHost, "expected host does not match actual host")
53+
w.WriteHeader(http.StatusOK)
54+
}))
55+
t.Cleanup(tlsServer.Close)
56+
57+
baseTransport := tlsServer.Client().Transport.(*http.Transport)
58+
dummyClient := &http.Client{
59+
Transport: &http.Transport{
60+
TLSClientConfig: baseTransport.TLSClientConfig,
61+
DisableKeepAlives: true,
62+
DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
63+
return net.Dial("tcp", tlsServer.Listener.Addr().String())
64+
},
65+
},
66+
}
67+
68+
authCtx := dto.GetAuthCtx([]string{}, "./testdata/dummy_credentials/dummy-sa-key.json", "null_auth")
69+
70+
configurator := anysdk.NewAnySdkClientConfigurator(
71+
dto.RuntimeCtx{
72+
AllowInsecure: true,
73+
},
74+
"aws",
75+
dummyClient,
76+
)
77+
httpPreparator := anysdk.NewHTTPPreparator(
78+
prov,
79+
svc,
80+
method,
81+
map[int]map[string]interface{}{
82+
0: {
83+
"Bucket": "my-test-bucket",
84+
"created_date": "2024-01-01T00:00:00Z",
85+
"region": "ap-southeast-2",
86+
},
87+
},
88+
nil,
89+
nil,
90+
logrus.StandardLogger(),
91+
)
92+
armoury, armouryErr := httpPreparator.BuildHTTPRequestCtx(anysdk.NewHTTPPreparatorConfig(false))
93+
if armouryErr != nil {
94+
t.Fatalf("Test failed: could not build HTTP preparator armoury, error: %v", armouryErr)
95+
}
96+
reqParams := armoury.GetRequestParams()
97+
if len(reqParams) < 1 {
98+
t.Fatalf("Test failed: no request parameters found")
99+
}
100+
101+
for _, v := range reqParams {
102+
103+
argList := v.GetArgList()
104+
105+
response, apiErr := anysdk.CallFromSignature(
106+
configurator,
107+
dto.RuntimeCtx{
108+
AllowInsecure: true,
109+
},
110+
authCtx,
111+
authCtx.Type,
112+
false,
113+
nil,
114+
prov,
115+
anysdk.NewAnySdkOpStoreDesignation(method),
116+
argList, // TODO: abstract
117+
)
118+
if apiErr != nil {
119+
t.Fatalf("Test failed: API call error: %v", apiErr)
120+
}
121+
if response.IsErroneous() {
122+
t.Fatalf("Test failed: API call returned erroneous response")
123+
}
124+
t.Logf("Test passed: received response: %+v", response)
125+
}
126+
127+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"type": "service_account",
3+
"project_id": "silly-project-01",
4+
"private_key_id": "silly-key-id",
5+
"private_key": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAKCAQEAsTfIs92qRg+srgviU9EHJfcgjn/38QFJTa0xYPSNSLSj4hXw\niyPyZ4ih6nIfW2NP4tvwK3piQrmHx/pQesrp5exKF3b97tf+Cvf9gM+i/3wJGhEb\nE24Py91+/5aXf6TfkuhNutZ3v5qzHYRtWcr3AXcD2WAThF6hxmvQTFTYqcyUb6vl\nt7evG6OleifU5rAKmD8Odk8Hs1skwAmlWjWT1uouWVegFv53a8eUilNiBSnYy/PA\nYchL2fGI8Os+CFyju+ns6dG9H7bAOywvZZaTzlVNvJ42gop03l5xzEwHkUKlcukg\nhyDtP5FTeD5liYUJ/Xqq6Xn6Rjck/AgTwqYePwIDAQABAoIBAQCdS08X3oJ4hwcU\nwDWVgW1f1DYQZSLzxdmDWVr/nHAefT8Mt752MWTBYnOcfMi6O663Q9GrNYgrgzMy\nW0m9g4cRbaXhp9sBeLLil3RpNWKOc1A807v9he39W86SGt7DC9rpMMl1MVC+PxgF\n9fl8/no40aMX+H+6OKhMTntmlNRt+E1WUIGBk9cScb37e+oAStfS0Z6c8kQ9CkOZ\nHwydCtq8gQDpkRYMM3m7j3j9mr2Rma1o8xcBbgbomYn6y2xPQf1B4rs9fb8txngv\nGxA+QSRSXNMQmQFLmoc6d3XHFZQ5LX7atRhHsnt4blb8GNqJg8FsTFED68cWKoNp\n0Lk7c/9xAoGBAOLplpGdg3ezAMtFR5gAi8pV9vGJairJsuBij22uK0rItNkaff4G\nYyciybCKJZfXTcOzYq/CGh8KwxhN6RECmHm+bHfnxFDdHXS8e0bs8oTlR7w3yHs4\nhrplBMCwyAgSsma7s8aNBfdkDlPMxYmvytWdHf3T4mj6C5LGlFzpTLmpAoGBAMfv\naHNPLCoJjvQmNlzboN0sLZYhRl2YgW86mM0MoW7pO4cY4On5twbdFD7AtHIKF4j5\nomsMVfTDvKZ+jbHoJFuvvhozq0T/LpEx5b6d27A4pfacmG0zNaLaopoDYQ6wBvYD\n4L9OScFRrtf/X3ZgLzsmNpEVlqyUU2tbCAJVa5mnAoGBAI7ODVmVNPD3Mc+7ySPr\nbA6p7WDzZ2KIT9ARl0yiqVJGYDKmDpb5NBukNCSrvJ8D/EfmtHwCf2f74O6B0eVH\nqegspJ0NuqpdjjUyja8EXliu52eX/880su3Jt6UBXNJf2fD3vlt90zxvtuicXdGa\nVd/8IqzlVX9VpkT4PtT+arAJAoGAZkmknYG+7Y7QVTaLj3xJ0327oNhLQK06YyaO\ncDFrEew/KUHgJ7Q7IEbRCb3bU5C4M7rLjorUGxJdHK0YXxGOMF48GvmeQQFw2JW3\nnYrzjzecKQw6q3uMkFHc6ICcEkCafxjCzf0GnOHmWtlrBIv2/gLx3c42tPp5py3+\nbfs3vncCgYEA0x6tF67q3zt+daUMUox6LimkkDJLsfqnmKjvHFAhKQaqOObWaody\nfGOzlf/KLX15uicYWeCwRrs03OjBfk6LEtVddsZOrjJEp8+6gA8KEf58MJhNuRVj\no3qSe9po1TMj0/hvzd32klXslpqQjXFjm9U3lAxfcRdgWsG7SciOAAs=\n-----END RSA PRIVATE KEY-----\n",
6+
"client_email": "[email protected]",
7+
"client_id": "11",
8+
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
9+
"token_uri": "https://oauth2.googleapis.com/token",
10+
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
11+
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/silly-sa%40silly-project-01.iam.gserviceaccount.com"
12+
}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
id: aws
2+
name: aws
3+
version: v0.1.0
4+
providerServices:
5+
acmpca:
6+
description: acmpca
7+
id: acmpca:v0.1.0
8+
name: acmpca
9+
preferred: true
10+
service:
11+
$ref: aws/v0.1.0/services/acmpca.yaml
12+
title: acmpca API
13+
version: v0.1.0
14+
cloud_control:
15+
description: cloud_control
16+
id: cloud_control:v0.1.0
17+
name: cloud_control
18+
preferred: true
19+
service:
20+
$ref: aws/v0.1.0/services/cloud_control.yaml
21+
title: Cloud Control API
22+
version: v0.1.0
23+
ce_native:
24+
description: ce_native
25+
id: ce_native:v0.1.0
26+
name: ce_native
27+
preferred: true
28+
service:
29+
$ref: aws/v0.1.0/services/ce_native.yaml
30+
title: ce_native API
31+
version: v0.1.0
32+
cloud_control_legacy:
33+
description: cloud_control_legacy
34+
id: cloud_control_legacy:v0.1.0
35+
name: cloud_control_legacy
36+
preferred: true
37+
service:
38+
$ref: aws/v0.1.0/services/cloud_control_legacy.yaml
39+
title: Cloud Control Legacy API
40+
version: v0.1.0
41+
cloudhsm:
42+
description: cloud_hsm
43+
id: cloud_hsm:v2.0.0
44+
name: cloudhsm
45+
preferred: true
46+
service:
47+
$ref: aws/v0.1.0/services/cloudhsm.yaml
48+
title: Cloud HSM API
49+
version: v2.0.0
50+
cloud_watch:
51+
description: cloud_watch
52+
id: cloud_watch:v0.1.0
53+
name: cloud_watch
54+
preferred: true
55+
service:
56+
$ref: aws/v0.1.0/services/cloudwatch.yaml
57+
title: Cloud Control API
58+
version: v0.1.0
59+
ec2:
60+
description: ec2
61+
id: ec2:v0.1.0
62+
name: ec2
63+
preferred: true
64+
service:
65+
$ref: aws/v0.1.0/services/ec2.yaml
66+
title: EC2
67+
version: v0.1.0
68+
ec2_nextgen:
69+
description: ec2_nextgen
70+
id: ec2_nextgen:v0.1.0
71+
name: ec2_nextgen
72+
preferred: true
73+
service:
74+
$ref: aws/v0.1.0/services/ec2_nextgen.yaml
75+
title: EC2 NextGen
76+
iam:
77+
description: iam
78+
id: iam:v0.1.0
79+
name: ec2
80+
preferred: true
81+
service:
82+
$ref: aws/v0.1.0/services/iam.yaml
83+
title: IAM
84+
version: v0.1.0
85+
pseudo_s3:
86+
description: pseudo_s3
87+
id: pseudo_s3:v0.1.0
88+
name: pseudo_s3
89+
preferred: true
90+
service:
91+
$ref: aws/v0.1.0/services/pseudo_s3.yaml
92+
title: Pseudo S3 API
93+
version: v0.1.0
94+
route53:
95+
description: route53
96+
id: route53:v0.1.0
97+
name: route53
98+
preferred: true
99+
service:
100+
$ref: aws/v0.1.0/services/route53.yaml
101+
title: Route 53 API
102+
version: v0.1.0
103+
s3:
104+
description: s3
105+
id: s3:v0.1.0
106+
name: s3
107+
preferred: true
108+
service:
109+
$ref: aws/v0.1.0/services/s3.yaml
110+
title: S3
111+
version: v0.1.0
112+
transfer:
113+
description: transfer
114+
id: transfer:v0.1.0
115+
name: transfer
116+
preferred: true
117+
service:
118+
$ref: aws/v0.1.0/services/transfer.yaml
119+
title: Transfer
120+
version: v0.1.0
121+
openapi: 3.0.0
122+
config:
123+
auth:
124+
type: "aws_signing_v4"
125+
credentialsenvvar: "AWS_SECRET_ACCESS_KEY"
126+
keyIDenvvar: "AWS_ACCESS_KEY_ID"

0 commit comments

Comments
 (0)