corso/src/pkg/store/backup_test.go
Keepers f4f0c8c02f
wrap repo backup data.notfound errors (#3004)
Adds a backupNotFound sentinel error that sdk
consumers can use to easily identify when a backup did not produce any backup data.

Also adds extra testing and mocks to support
testing inside the repo package.

---

#### Does this PR need a docs update or release note?

- [x]  No

#### Type of change

- [x] 🌻 Feature
- [x] 🤖 Supportability/Tests

#### Test Plan

- [x] 💪 Manual
- [x]  Unit test
2023-04-03 18:11:21 +00:00

150 lines
3.2 KiB
Go

package store_test
import (
"testing"
"time"
"github.com/alcionai/clues"
"github.com/google/uuid"
"github.com/kopia/kopia/repo/manifest"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
"github.com/alcionai/corso/src/internal/model"
"github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/pkg/backup"
"github.com/alcionai/corso/src/pkg/store"
"github.com/alcionai/corso/src/pkg/store/mock"
)
// ------------------------------------------------------------
// unit tests
// ------------------------------------------------------------
var (
detailsID = uuid.NewString()
bu = backup.Backup{
BaseModel: model.BaseModel{
ID: model.StableID(uuid.NewString()),
ModelStoreID: manifest.ID(uuid.NewString()),
},
CreationTime: time.Now(),
SnapshotID: uuid.NewString(),
DetailsID: detailsID,
}
)
type StoreBackupUnitSuite struct {
tester.Suite
}
func TestStoreBackupUnitSuite(t *testing.T) {
suite.Run(t, &StoreBackupUnitSuite{Suite: tester.NewUnitSuite(t)})
}
func (suite *StoreBackupUnitSuite) TestGetBackup() {
ctx, flush := tester.NewContext()
defer flush()
table := []struct {
name string
mock *mock.ModelStore
expect assert.ErrorAssertionFunc
}{
{
name: "gets backup",
mock: mock.NewModelStoreMock(&bu, nil),
expect: assert.NoError,
},
{
name: "errors",
mock: mock.NewModelStoreMock(&bu, assert.AnError),
expect: assert.Error,
},
}
for _, test := range table {
suite.Run(test.name, func() {
t := suite.T()
sm := &store.Wrapper{Storer: test.mock}
result, err := sm.GetBackup(ctx, model.StableID(uuid.NewString()))
test.expect(t, err, clues.ToCore(err))
if err != nil {
return
}
assert.Equal(t, bu.ID, result.ID)
})
}
}
func (suite *StoreBackupUnitSuite) TestGetBackups() {
ctx, flush := tester.NewContext()
defer flush()
table := []struct {
name string
mock *mock.ModelStore
expect assert.ErrorAssertionFunc
}{
{
name: "gets backups",
mock: mock.NewModelStoreMock(&bu, nil),
expect: assert.NoError,
},
{
name: "errors",
mock: mock.NewModelStoreMock(&bu, assert.AnError),
expect: assert.Error,
},
}
for _, test := range table {
suite.Run(test.name, func() {
t := suite.T()
sm := &store.Wrapper{Storer: test.mock}
result, err := sm.GetBackups(ctx)
test.expect(t, err, clues.ToCore(err))
if err != nil {
return
}
assert.Equal(t, 1, len(result))
assert.Equal(t, bu.ID, result[0].ID)
})
}
}
func (suite *StoreBackupUnitSuite) TestDeleteBackup() {
ctx, flush := tester.NewContext()
defer flush()
table := []struct {
name string
mock *mock.ModelStore
expect assert.ErrorAssertionFunc
}{
{
name: "deletes backup",
mock: mock.NewModelStoreMock(&bu, nil),
expect: assert.NoError,
},
{
name: "errors",
mock: mock.NewModelStoreMock(&bu, assert.AnError),
expect: assert.Error,
},
}
for _, test := range table {
suite.Run(test.name, func() {
t := suite.T()
sm := &store.Wrapper{Storer: test.mock}
err := sm.DeleteBackup(ctx, model.StableID(uuid.NewString()))
test.expect(t, err, clues.ToCore(err))
})
}
}