driftctl/pkg/remote/azurerm/repository/storage_test.go

374 lines
10 KiB
Go

package repository
import (
"reflect"
"testing"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage"
"github.com/pkg/errors"
"github.com/snyk/driftctl/pkg/remote/cache"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
)
func Test_ListAllStorageAccount_MultiplesResults(t *testing.T) {
expected := []*armstorage.StorageAccount{
{
TrackedResource: armstorage.TrackedResource{
Resource: armstorage.Resource{
ID: func(s string) *string { return &s }("account1"),
},
},
},
{
TrackedResource: armstorage.TrackedResource{
Resource: armstorage.Resource{
ID: func(s string) *string { return &s }("account2"),
},
},
},
{
TrackedResource: armstorage.TrackedResource{
Resource: armstorage.Resource{
ID: func(s string) *string { return &s }("account3"),
},
},
},
{
TrackedResource: armstorage.TrackedResource{
Resource: armstorage.Resource{
ID: func(s string) *string { return &s }("account4"),
},
},
},
}
fakeClient := &mockStorageAccountClient{}
mockPager := &mockStorageAccountListPager{}
mockPager.On("Err").Return(nil).Times(3)
mockPager.On("NextPage", mock.Anything).Return(true).Times(2)
mockPager.On("NextPage", mock.Anything).Return(false).Times(1)
mockPager.On("PageResponse").Return(armstorage.StorageAccountsListResponse{
StorageAccountsListResult: armstorage.StorageAccountsListResult{
StorageAccountListResult: armstorage.StorageAccountListResult{
Value: []*armstorage.StorageAccount{
{
TrackedResource: armstorage.TrackedResource{
Resource: armstorage.Resource{
ID: func(s string) *string { return &s }("account1"),
},
},
},
{
TrackedResource: armstorage.TrackedResource{
Resource: armstorage.Resource{
ID: func(s string) *string { return &s }("account2"),
},
},
},
},
},
},
}).Times(1)
mockPager.On("PageResponse").Return(armstorage.StorageAccountsListResponse{
StorageAccountsListResult: armstorage.StorageAccountsListResult{
StorageAccountListResult: armstorage.StorageAccountListResult{
Value: []*armstorage.StorageAccount{
{
TrackedResource: armstorage.TrackedResource{
Resource: armstorage.Resource{
ID: func(s string) *string { return &s }("account3"),
},
},
},
{
TrackedResource: armstorage.TrackedResource{
Resource: armstorage.Resource{
ID: func(s string) *string { return &s }("account4"),
},
},
},
},
},
},
}).Times(1)
fakeClient.On("List", mock.Anything).Return(mockPager)
c := &cache.MockCache{}
c.On("GetAndLock", "ListAllStorageAccount").Return(nil).Times(1)
c.On("Unlock", "ListAllStorageAccount").Times(1)
c.On("Put", "ListAllStorageAccount", expected).Return(true).Times(1)
s := &storageRepository{
storageAccountsClient: fakeClient,
cache: c,
}
got, err := s.ListAllStorageAccount()
if err != nil {
t.Errorf("ListAllStorageAccount() error = %v", err)
return
}
mockPager.AssertExpectations(t)
fakeClient.AssertExpectations(t)
c.AssertExpectations(t)
if !reflect.DeepEqual(got, expected) {
t.Errorf("ListAllStorageAccount() got = %v, want %v", got, expected)
}
}
func Test_ListAllStorageAccount_MultiplesResults_WithCache(t *testing.T) {
expected := []*armstorage.StorageAccount{
{
TrackedResource: armstorage.TrackedResource{
Resource: armstorage.Resource{
ID: func(s string) *string { return &s }("account1"),
},
},
},
}
fakeClient := &mockStorageAccountClient{}
c := &cache.MockCache{}
c.On("GetAndLock", "ListAllStorageAccount").Return(expected).Times(1)
c.On("Unlock", "ListAllStorageAccount").Times(1)
s := &storageRepository{
storageAccountsClient: fakeClient,
cache: c,
}
got, err := s.ListAllStorageAccount()
if err != nil {
t.Errorf("ListAllStorageAccount() error = %v", err)
return
}
fakeClient.AssertExpectations(t)
c.AssertExpectations(t)
if !reflect.DeepEqual(got, expected) {
t.Errorf("ListAllStorageAccount() got = %v, want %v", got, expected)
}
}
func Test_ListAllStorageAccount_Error(t *testing.T) {
fakeClient := &mockStorageAccountClient{}
expectedErr := errors.New("unexpected error")
mockPager := &mockStorageAccountListPager{}
mockPager.On("Err").Return(expectedErr).Times(1)
mockPager.On("NextPage", mock.Anything).Return(true).Times(1)
mockPager.On("PageResponse").Return(armstorage.StorageAccountsListResponse{}).Times(1)
fakeClient.On("List", mock.Anything).Return(mockPager)
s := &storageRepository{
storageAccountsClient: fakeClient,
cache: cache.New(0),
}
got, err := s.ListAllStorageAccount()
mockPager.AssertExpectations(t)
fakeClient.AssertExpectations(t)
assert.Equal(t, expectedErr, err)
assert.Nil(t, got)
}
func Test_ListAllStorageContainer_MultiplesResults(t *testing.T) {
account := armstorage.StorageAccount{
Properties: &armstorage.StorageAccountProperties{
PrimaryEndpoints: &armstorage.Endpoints{
Blob: to.StringPtr("https://testeliedriftctl.blob.core.windows.net/"),
},
},
TrackedResource: armstorage.TrackedResource{
Resource: armstorage.Resource{
ID: to.StringPtr("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foobar/providers/Microsoft.Storage/storageAccounts/testeliedriftctl"),
Name: to.StringPtr("testeliedriftctl"),
},
},
}
expected := []string{
"https://testeliedriftctl.blob.core.windows.net/container1",
"https://testeliedriftctl.blob.core.windows.net/container2",
"https://testeliedriftctl.blob.core.windows.net/container3",
"https://testeliedriftctl.blob.core.windows.net/container4",
}
fakeClient := &mockBlobContainerClient{}
mockPager := &mockBlobContainerListPager{}
mockPager.On("Err").Return(nil).Times(3)
mockPager.On("NextPage", mock.Anything).Return(true).Times(2)
mockPager.On("NextPage", mock.Anything).Return(false).Times(1)
mockPager.On("PageResponse").Return(armstorage.BlobContainersListResponse{
BlobContainersListResult: armstorage.BlobContainersListResult{
ListContainerItems: armstorage.ListContainerItems{
Value: []*armstorage.ListContainerItem{
{
AzureEntityResource: armstorage.AzureEntityResource{
Resource: armstorage.Resource{
Name: to.StringPtr("container1"),
},
},
},
{
AzureEntityResource: armstorage.AzureEntityResource{
Resource: armstorage.Resource{
Name: to.StringPtr("container2"),
},
},
},
},
},
},
}).Times(1)
mockPager.On("PageResponse").Return(armstorage.BlobContainersListResponse{
BlobContainersListResult: armstorage.BlobContainersListResult{
ListContainerItems: armstorage.ListContainerItems{
Value: []*armstorage.ListContainerItem{
{
AzureEntityResource: armstorage.AzureEntityResource{
Resource: armstorage.Resource{
Name: to.StringPtr("container3"),
},
},
},
{
AzureEntityResource: armstorage.AzureEntityResource{
Resource: armstorage.Resource{
Name: to.StringPtr("container4"),
},
},
},
},
},
},
}).Times(1)
fakeClient.On("List", "foobar", "testeliedriftctl", (*armstorage.BlobContainersListOptions)(nil)).Return(mockPager)
c := &cache.MockCache{}
c.On("Get", "ListAllStorageContainer_testeliedriftctl").Return(nil).Times(1)
c.On("Put", "ListAllStorageContainer_testeliedriftctl", expected).Return(true).Times(1)
s := &storageRepository{
blobContainerClient: fakeClient,
cache: c,
}
got, err := s.ListAllStorageContainer(&account)
if err != nil {
t.Errorf("ListAllStorageAccount() error = %v", err)
return
}
mockPager.AssertExpectations(t)
fakeClient.AssertExpectations(t)
c.AssertExpectations(t)
assert.Equal(t, expected, got)
}
func Test_ListAllStorageContainer_MultiplesResults_WithCache(t *testing.T) {
account := armstorage.StorageAccount{
TrackedResource: armstorage.TrackedResource{
Resource: armstorage.Resource{
ID: to.StringPtr("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foobar/providers/Microsoft.Storage/storageAccounts/testeliedriftctl"),
Name: to.StringPtr("testeliedriftctl"),
},
},
}
expected := []string{
"https://testeliedriftctl.blob.core.windows.net/container1",
}
fakeClient := &mockBlobContainerClient{}
c := &cache.MockCache{}
c.On("Get", "ListAllStorageContainer_testeliedriftctl").Return(expected).Times(1)
s := &storageRepository{
blobContainerClient: fakeClient,
cache: c,
}
got, err := s.ListAllStorageContainer(&account)
if err != nil {
t.Errorf("ListAllStorageAccount() error = %v", err)
return
}
fakeClient.AssertExpectations(t)
c.AssertExpectations(t)
assert.Equal(t, expected, got)
}
func Test_ListAllStorageContainer_InvalidStorageAccountResourceID(t *testing.T) {
account := armstorage.StorageAccount{
TrackedResource: armstorage.TrackedResource{
Resource: armstorage.Resource{
ID: to.StringPtr("foobar"),
Name: to.StringPtr(""),
},
},
}
fakeClient := &mockBlobContainerClient{}
s := &storageRepository{
blobContainerClient: fakeClient,
cache: cache.New(0),
}
got, err := s.ListAllStorageContainer(&account)
fakeClient.AssertExpectations(t)
assert.Nil(t, got)
assert.Equal(t, "parsing failed for foobar. Invalid resource Id format", err.Error())
}
func Test_ListAllStorageContainer_Error(t *testing.T) {
account := armstorage.StorageAccount{
TrackedResource: armstorage.TrackedResource{
Resource: armstorage.Resource{
ID: to.StringPtr("/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foobar/providers/Microsoft.Storage/storageAccounts/testeliedriftctl"),
Name: to.StringPtr("testeliedriftctl"),
},
},
}
expectedErr := errors.New("sample error")
fakeClient := &mockBlobContainerClient{}
mockPager := &mockBlobContainerListPager{}
mockPager.On("NextPage", mock.Anything).Return(true).Times(1)
mockPager.On("Err").Return(expectedErr).Times(1)
mockPager.On("PageResponse").Return(armstorage.BlobContainersListResponse{}).Times(1)
fakeClient.On("List", "foobar", "testeliedriftctl", (*armstorage.BlobContainersListOptions)(nil)).Return(mockPager)
s := &storageRepository{
blobContainerClient: fakeClient,
cache: cache.New(0),
}
got, err := s.ListAllStorageContainer(&account)
fakeClient.AssertExpectations(t)
mockPager.AssertExpectations(t)
assert.Nil(t, got)
assert.Equal(t, expectedErr, err)
}