corso/src/cli/utils/retention_test.go
ashmrtn 179edfc08e
Add hidden flags for setting retention during repo init (#3932)
Add, parse, and configure info about retention
when initializing a repo. These flags are
currently marked as hidden

Medium-term, they can be used in longevity
tests when making the repo for the first time
(we can configure this out of band if needed
though)

Long-term, they can be exposed to the user
for immutable backup support

---

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

- [ ]  Yes, it's included
- [x] 🕐 Yes, but in a later PR
- [ ]  No

#### Type of change

- [x] 🌻 Feature
- [ ] 🐛 Bugfix
- [ ] 🗺️ Documentation
- [x] 🤖 Supportability/Tests
- [ ] 💻 CI/Deployment
- [ ] 🧹 Tech Debt/Cleanup

#### Issue(s)

* #3799

#### Test Plan

- [x] 💪 Manual
- [x]  Unit test
- [ ] 💚 E2E
2023-08-04 19:08:04 +00:00

157 lines
3.6 KiB
Go

package utils_test
import (
"testing"
"time"
"github.com/alcionai/clues"
"github.com/spf13/cobra"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
"github.com/alcionai/corso/src/cli/flags"
"github.com/alcionai/corso/src/cli/utils"
"github.com/alcionai/corso/src/internal/common/ptr"
"github.com/alcionai/corso/src/internal/tester"
"github.com/alcionai/corso/src/pkg/control/repository"
)
type RetentionCfgUnitSuite struct {
tester.Suite
}
func TestRetentionCfgUnitSuite(t *testing.T) {
suite.Run(t, &RetentionCfgUnitSuite{Suite: tester.NewUnitSuite(t)})
}
func (suite *RetentionCfgUnitSuite) TestMakeRetentionOpts() {
table := []struct {
name string
flags map[string]string
expectErr assert.ErrorAssertionFunc
expect repository.Retention
}{
{
name: "Nothing Set",
expectErr: assert.NoError,
},
{
name: "Invalid Mode",
flags: map[string]string{
flags.RetentionModeFN: "foo",
},
expectErr: assert.Error,
},
{
name: "Negative Duration",
flags: map[string]string{
flags.RetentionDurationFN: "-5h",
},
expectErr: assert.Error,
},
{
name: "Only Governance Mode",
flags: map[string]string{
flags.RetentionModeFN: "governance",
},
expectErr: assert.NoError,
expect: repository.Retention{
Mode: ptr.To(repository.GovernanceRetention),
},
},
{
name: "Only Compliance Mode",
flags: map[string]string{
flags.RetentionModeFN: "compliance",
},
expectErr: assert.NoError,
expect: repository.Retention{
Mode: ptr.To(repository.ComplianceRetention),
},
},
{
name: "Only No Retention Mode",
flags: map[string]string{
flags.RetentionModeFN: "none",
},
expectErr: assert.NoError,
expect: repository.Retention{
Mode: ptr.To(repository.NoRetention),
},
},
{
name: "Mode And Duration",
flags: map[string]string{
flags.RetentionModeFN: "governance",
flags.RetentionDurationFN: "48h",
},
expectErr: assert.NoError,
expect: repository.Retention{
Mode: ptr.To(repository.GovernanceRetention),
Duration: ptr.To(time.Hour * 48),
},
},
{
name: "Mode And Extend",
flags: map[string]string{
flags.RetentionModeFN: "governance",
flags.ExtendRetentionFN: "false",
},
expectErr: assert.NoError,
expect: repository.Retention{
Mode: ptr.To(repository.GovernanceRetention),
Extend: ptr.To(false),
},
},
{
name: "Duration And Extend",
flags: map[string]string{
flags.RetentionDurationFN: "48h",
flags.ExtendRetentionFN: "true",
},
expectErr: assert.NoError,
expect: repository.Retention{
Duration: ptr.To(time.Hour * 48),
Extend: ptr.To(true),
},
},
{
name: "All Set",
flags: map[string]string{
flags.RetentionModeFN: "governance",
flags.RetentionDurationFN: "48h",
flags.ExtendRetentionFN: "true",
},
expectErr: assert.NoError,
expect: repository.Retention{
Mode: ptr.To(repository.GovernanceRetention),
Duration: ptr.To(time.Hour * 48),
Extend: ptr.To(true),
},
},
}
for _, test := range table {
suite.Run(test.name, func() {
t := suite.T()
cmd := &cobra.Command{}
flags.AddRetentionConfigFlags(cmd)
fs := cmd.Flags()
for fn, fv := range test.flags {
require.NoError(t, fs.Set(fn, fv), "setting flag values")
}
result, err := utils.MakeRetentionOpts(cmd)
test.expectErr(t, err, "parsing flags into struct: %v", clues.ToCore(err))
if err != nil {
return
}
assert.Equal(t, test.expect, result)
})
}
}