corso/src/pkg/selectors/helpers_test.go
Keepers 306db14339
add itemref to details entry (#3160)
Adds an new details entry field: itemRef.
This holds a stable, semi-unique identifier to the item represented by that entry.

---

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

- [x]  No

#### Type of change

- [x] 🌻 Feature

#### Issue(s)

* #3027

#### Test Plan

- [x]  Unit test
- [x] 💚 E2E
2023-04-19 23:25:11 +00:00

213 lines
5.3 KiB
Go

package selectors
import (
"fmt"
"strings"
"testing"
"github.com/alcionai/clues"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/alcionai/corso/src/pkg/backup/details"
"github.com/alcionai/corso/src/pkg/filters"
"github.com/alcionai/corso/src/pkg/path"
)
// ---------------------------------------------------------------------------
// categorizers
// ---------------------------------------------------------------------------
// categorizer
type mockCategorizer string
const (
unknownCatStub mockCategorizer = ""
// wrap Exchange data here to get around path pkg assertions about path content.
rootCatStub mockCategorizer = mockCategorizer(ExchangeUser)
leafCatStub mockCategorizer = mockCategorizer(ExchangeEvent)
pathServiceStub = path.ExchangeService
pathCatStub = path.EmailCategory
)
var _ categorizer = unknownCatStub
func (mc mockCategorizer) String() string {
return string(mc)
}
func (mc mockCategorizer) leafCat() categorizer {
return mc
}
func (mc mockCategorizer) rootCat() categorizer {
return rootCatStub
}
func (mc mockCategorizer) unknownCat() categorizer {
return unknownCatStub
}
func (mc mockCategorizer) isUnion() bool {
return mc == rootCatStub
}
func (mc mockCategorizer) isLeaf() bool {
return mc == leafCatStub
}
func (mc mockCategorizer) pathValues(
repo path.Path,
ent details.DetailsEntry,
cfg Config,
) (map[categorizer][]string, error) {
return map[categorizer][]string{
rootCatStub: {"root"},
leafCatStub: {"leaf"},
}, nil
}
func (mc mockCategorizer) pathKeys() []categorizer {
return []categorizer{rootCatStub, leafCatStub}
}
func (mc mockCategorizer) PathType() path.CategoryType {
switch mc {
case leafCatStub:
return path.EventsCategory
default:
return path.UnknownCategory
}
}
func stubPathValues() map[categorizer][]string {
return map[categorizer][]string{
rootCatStub: {rootCatStub.String()},
leafCatStub: {leafCatStub.String()},
}
}
// ---------------------------------------------------------------------------
// scopers
// ---------------------------------------------------------------------------
// scoper
type mockScope scope
var _ scoper = &mockScope{}
func (s mockScope) categorizer() categorizer {
switch s[scopeKeyCategory].Identity {
case rootCatStub.String():
return rootCatStub
case leafCatStub.String():
return leafCatStub
}
return unknownCatStub
}
func (s mockScope) matchesInfo(dii details.ItemInfo) bool {
return s[shouldMatch].Target == "true"
}
func (s mockScope) setDefaults() {}
const (
shouldMatch = "should-match-entry"
)
// helper funcs
func stubScope(match string) mockScope {
sm := "true"
if len(match) > 0 {
sm = match
}
filt := passAny
if match == "none" {
filt = failAny
}
return mockScope{
rootCatStub.String(): filt,
leafCatStub.String(): filt,
scopeKeyCategory: filters.Identity(rootCatStub.String()),
scopeKeyDataType: filters.Identity(rootCatStub.String()),
shouldMatch: filters.Identity(sm),
}
}
func stubInfoScope(match string) mockScope {
sc := stubScope(match)
sc[scopeKeyInfoCategory] = filters.Identity("true")
return sc
}
// ---------------------------------------------------------------------------
// Stringers and Concealers
// ---------------------------------------------------------------------------
func (s mockScope) Conceal() string { return conceal(s) }
func (s mockScope) Format(fs fmt.State, r rune) { format(s, fs, r) }
func (s mockScope) String() string { return conceal(s) }
func (s mockScope) PlainString() string { return plainString(s) }
// ---------------------------------------------------------------------------
// selectors
// ---------------------------------------------------------------------------
type mockSel struct {
Selector
}
func stubSelector(resourceOwners []string) mockSel {
return mockSel{
Selector: Selector{
ResourceOwners: filterFor(scopeConfig{}, resourceOwners...),
Service: ServiceExchange,
Excludes: []scope{scope(stubScope(""))},
Filters: []scope{scope(stubScope(""))},
Includes: []scope{scope(stubScope(""))},
},
}
}
// ---------------------------------------------------------------------------
// helper funcs
// ---------------------------------------------------------------------------
func setScopesToDefault[T scopeT](ts []T) []T {
for _, s := range ts {
s.setDefaults()
}
return ts
}
// calls assert.Equal(t, v, getCatValue(sc, k)[0]) on each k:v pair in the map
func scopeMustHave[T scopeT](t *testing.T, sc T, m map[categorizer][]string) {
for k, vs := range m {
t.Run(k.String(), func(t *testing.T) {
assert.Equal(t, vs, getCatValue(sc, k), "Key: %s", k)
})
}
}
// stubPath ensures test path production matches that of fullPath design,
// stubbing out static values where necessary.
func stubPath(t *testing.T, user string, s []string, cat path.CategoryType) path.Path {
pth, err := path.Build("tid", user, path.ExchangeService, cat, true, s...)
require.NoError(t, err, clues.ToCore(err))
return pth
}
// stubRepoRef ensures test path production matches that of repoRef design,
// stubbing out static values where necessary.
func stubRepoRef(service path.ServiceType, data path.CategoryType, resourceOwner, folders, item string) string {
return strings.Join([]string{"tid", service.String(), resourceOwner, data.String(), folders, item}, "/")
}