#### Does this PR need a docs update or release note? - [x] ⛔ No #### Type of change - [x] 🐛 Bugfix - [x] 🤖 Supportability/Tests #### Test Plan - [x] 💚 E2E
197 lines
4.3 KiB
Go
197 lines
4.3 KiB
Go
package storage
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/alcionai/clues"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/stretchr/testify/suite"
|
|
|
|
"github.com/alcionai/corso/src/internal/tester"
|
|
"github.com/alcionai/corso/src/pkg/credentials"
|
|
)
|
|
|
|
type S3CfgUnitSuite struct {
|
|
tester.Suite
|
|
}
|
|
|
|
func TestS3CfgUnitSuite(t *testing.T) {
|
|
suite.Run(t, &S3CfgUnitSuite{Suite: tester.NewUnitSuite(t)})
|
|
}
|
|
|
|
var (
|
|
goodS3Config = S3Config{
|
|
Bucket: "bkt",
|
|
Endpoint: "end",
|
|
Prefix: "pre/",
|
|
DoNotUseTLS: false,
|
|
DoNotVerifyTLS: false,
|
|
AWS: credentials.AWS{AccessKey: "access", SecretKey: "secret", SessionToken: "token"},
|
|
}
|
|
|
|
goodS3Map = map[string]string{
|
|
keyS3Bucket: "bkt",
|
|
keyS3Endpoint: "end",
|
|
keyS3Prefix: "pre/",
|
|
keyS3DoNotUseTLS: "false",
|
|
keyS3DoNotVerifyTLS: "false",
|
|
keyS3AccessKey: "access",
|
|
keyS3SecretKey: "secret",
|
|
keyS3SessionToken: "token",
|
|
}
|
|
)
|
|
|
|
func (suite *S3CfgUnitSuite) TestS3Config_Config() {
|
|
s3 := goodS3Config
|
|
|
|
c, err := s3.StringConfig()
|
|
assert.NoError(suite.T(), err, clues.ToCore(err))
|
|
|
|
table := []struct {
|
|
key string
|
|
expect string
|
|
}{
|
|
{"s3_bucket", s3.Bucket},
|
|
{"s3_endpoint", s3.Endpoint},
|
|
{"s3_prefix", s3.Prefix},
|
|
}
|
|
for _, test := range table {
|
|
assert.Equal(suite.T(), test.expect, c[test.key])
|
|
}
|
|
}
|
|
|
|
func (suite *S3CfgUnitSuite) TestStorage_S3Config() {
|
|
t := suite.T()
|
|
in := goodS3Config
|
|
|
|
s, err := NewStorage(ProviderS3, &in)
|
|
assert.NoError(t, err, clues.ToCore(err))
|
|
|
|
out, err := s.ToS3Config()
|
|
assert.NoError(t, err, clues.ToCore(err))
|
|
|
|
assert.Equal(t, in.Bucket, out.Bucket)
|
|
assert.Equal(t, in.Endpoint, out.Endpoint)
|
|
assert.Equal(t, in.Prefix, out.Prefix)
|
|
}
|
|
|
|
func makeTestS3Cfg(bkt, end, pre, access, secret, session string) S3Config {
|
|
return S3Config{
|
|
Bucket: bkt,
|
|
Endpoint: end,
|
|
Prefix: pre,
|
|
AWS: credentials.AWS{AccessKey: access, SecretKey: secret, SessionToken: session},
|
|
}
|
|
}
|
|
|
|
func (suite *S3CfgUnitSuite) TestStorage_S3Config_invalidCases() {
|
|
// missing required properties
|
|
table := []struct {
|
|
name string
|
|
cfg S3Config
|
|
}{
|
|
{"missing bucket", makeTestS3Cfg("", "end", "pre/", "", "", "")},
|
|
}
|
|
for _, test := range table {
|
|
suite.Run(test.name, func() {
|
|
_, err := NewStorage(ProviderUnknown, &test.cfg)
|
|
assert.Error(suite.T(), err)
|
|
})
|
|
}
|
|
|
|
// required property not populated in storage
|
|
table2 := []struct {
|
|
name string
|
|
amend func(Storage)
|
|
}{
|
|
{
|
|
"missing bucket",
|
|
func(s Storage) {
|
|
s.Config["s3_bucket"] = ""
|
|
},
|
|
},
|
|
}
|
|
for _, test := range table2 {
|
|
suite.Run(test.name, func() {
|
|
t := suite.T()
|
|
|
|
st, err := NewStorage(ProviderUnknown, &goodS3Config)
|
|
assert.NoError(t, err, clues.ToCore(err))
|
|
test.amend(st)
|
|
|
|
_, err = st.ToS3Config()
|
|
assert.Error(t, err, clues.ToCore(err))
|
|
})
|
|
}
|
|
}
|
|
|
|
func (suite *S3CfgUnitSuite) TestStorage_S3Config_StringConfig() {
|
|
table := []struct {
|
|
name string
|
|
input S3Config
|
|
expect map[string]string
|
|
}{
|
|
{
|
|
name: "standard",
|
|
input: goodS3Config,
|
|
expect: goodS3Map,
|
|
},
|
|
{
|
|
name: "normalized bucket name",
|
|
input: makeTestS3Cfg(
|
|
"s3://"+goodS3Config.Bucket,
|
|
goodS3Config.Endpoint,
|
|
goodS3Config.Prefix,
|
|
goodS3Config.AccessKey,
|
|
goodS3Config.SecretKey,
|
|
goodS3Config.SessionToken),
|
|
expect: goodS3Map,
|
|
},
|
|
{
|
|
name: "disabletls",
|
|
input: S3Config{
|
|
Bucket: "bkt",
|
|
Endpoint: "end",
|
|
Prefix: "pre/",
|
|
DoNotUseTLS: true,
|
|
DoNotVerifyTLS: true,
|
|
},
|
|
expect: map[string]string{
|
|
keyS3Bucket: "bkt",
|
|
keyS3Endpoint: "end",
|
|
keyS3Prefix: "pre/",
|
|
keyS3DoNotUseTLS: "true",
|
|
keyS3DoNotVerifyTLS: "true",
|
|
keyS3AccessKey: "",
|
|
keyS3SecretKey: "",
|
|
keyS3SessionToken: "",
|
|
},
|
|
},
|
|
}
|
|
for _, test := range table {
|
|
suite.Run(test.name, func() {
|
|
t := suite.T()
|
|
|
|
result, err := test.input.StringConfig()
|
|
require.NoError(t, err, clues.ToCore(err))
|
|
assert.Equal(t, test.expect, result)
|
|
})
|
|
}
|
|
}
|
|
|
|
func (suite *S3CfgUnitSuite) TestStorage_S3Config_Normalize() {
|
|
const (
|
|
prefixedBkt = "s3://bkt"
|
|
normalBkt = "bkt"
|
|
)
|
|
|
|
st := S3Config{
|
|
Bucket: prefixedBkt,
|
|
}
|
|
|
|
result := st.normalize()
|
|
assert.Equal(suite.T(), normalBkt, result.Bucket)
|
|
assert.NotEqual(suite.T(), st.Bucket, result.Bucket)
|
|
}
|