driftctl/enumeration/terraform/provider_downloader_test.go

111 lines
2.7 KiB
Go

package terraform
import (
"fmt"
"net/http"
"os"
"path"
"testing"
terraformError "github.com/snyk/driftctl/enumeration/terraform/error"
"github.com/aws/aws-sdk-go/aws"
"github.com/stretchr/testify/assert"
"github.com/jarcoal/httpmock"
)
func TestProviderDownloader_Download(t *testing.T) {
httpmock.Activate()
defer httpmock.DeactivateAndReset()
downloader := NewProviderDownloader()
url := "https://example.com/terraform-provider-aws_3.19.0_linux_amd64.zip"
cases := []struct {
name string
httpStatus *int
testFile *string
responder httpmock.Responder
assert func(assert *assert.Assertions, tmpDir string, err error)
}{
{
name: "TestBadResponse(404)",
responder: httpmock.NewBytesResponder(http.StatusNotFound, []byte{}),
assert: func(assert *assert.Assertions, tmpDir string, err error) {
assert.Equal(
fmt.Sprintf("unsuccessful request to %s: 404", url),
err.Error(),
)
},
},
{
name: "TestProviderNotFound(403)",
responder: httpmock.NewBytesResponder(http.StatusForbidden, []byte{}),
assert: func(assert *assert.Assertions, tmpDir string, err error) {
assert.IsType(
terraformError.ProviderNotFoundError{},
err,
)
},
},
{
name: "TestHttpError",
responder: httpmock.NewErrorResponder(fmt.Errorf("test error")),
assert: func(assert *assert.Assertions, tmpDir string, err error) {
assert.Contains(err.Error(), "test error")
},
},
{
name: "TestInvalidZip",
testFile: aws.String("invalid.zip"),
assert: func(assert *assert.Assertions, tmpDir string, err error) {
assert.NotNil(err)
infos, err := os.ReadDir(tmpDir)
assert.Nil(err)
assert.Len(infos, 0)
},
},
{
name: "TestValidZip",
testFile: aws.String("terraform-provider-aws_3.5.0_linux_amd64.zip"),
assert: func(assert *assert.Assertions, tmpDir string, err error) {
assert.Nil(err)
file, err := os.ReadFile(path.Join(tmpDir, "terraform-provider-aws_v3.5.0_x5"))
assert.Nil(err)
assert.Equal([]byte{0x74, 0x65, 0x73, 0x74, 0xa}, file)
},
},
}
for _, c := range cases {
t.Run(c.name, func(tt *testing.T) {
tmpDir := tt.TempDir()
httpmock.Reset()
assert := assert.New(tt)
if c.httpStatus == nil {
c.httpStatus = aws.Int(http.StatusOK)
}
if c.responder != nil {
httpmock.RegisterResponder("GET", url, c.responder)
} else {
if c.testFile != nil {
body, err := os.ReadFile("./testdata/" + *c.testFile)
if err != nil {
tt.Error(err)
}
httpmock.RegisterResponder("GET", url, httpmock.NewBytesResponder(*c.httpStatus, body))
}
}
err := downloader.Download(url, tmpDir)
c.assert(assert, tmpDir, err)
})
}
}