dnscontrol/pkg/normalize/capabilities_test.go
Tom Limoncelli 7ab7d147fb
CHORE: Move non-provider code out of /providers (#3916)
# Issue

Fixes https://github.com/StackExchange/dnscontrol/issues/3912

# Resolution

```
#!/bin/sh

# Reset

git fetch origin main
git reset --hard origin/main
git checkout main
git branch -D tlim_moveproviders
git checkout -b tlim_moveproviders
find . -name \*.bak -delete

# Move the *.go files out of providers/

mkdir -p pkg/providers
git mv providers/*.go pkg/providers

# move the _all file out of providers/

git mv providers/_all pkg/providers/_all

# Update the imports (in go.* and the affected files)

sed -i.bak -e 's@"github.com/StackExchange/dnscontrol/v4/providers"@"github.com/StackExchange/dnscontrol/v4/pkg/providers"@g' go.* $(fgrep -lr --include '*.go' '"github.com/StackExchange/dnscontrol/v4/providers"' *)
sed -i.bak -e 's@"../../providers"@"../../pkg/providers"@g' pkg/normalize/capabilities_test.go
sed -i.bak -e 's@"github.com/StackExchange/dnscontrol/v4/providers/_all"@"github.com/StackExchange/dnscontrol/v4/pkg/providers/_all"@g' go.* $(fgrep -lr --include '*.go' '"github.com/StackExchange/dnscontrol/v4/providers/_all"' *)

# Fix the docs

sed -i.bak -e 's@StackExchange/dnscontrol/blob/main/providers/_all/all.go@StackExchange/dnscontrol/blob/main/pkg/providers/_all/all.go@g' documentation/advanced-features/writing-providers.md
sed -i.bak -e 's@StackExchange/dnscontrol/providers@StackExchange/dnscontrol/pkg/providers@g' documentation/advanced-features/writing-providers.md
sed -i.bak -e 's@StackExchange/dnscontrol/v4/providers@StackExchange/dnscontrol/v4/pkg/providers@g' documentation/advanced-features/writing-providers.md
sed -i.bak -e 's@dnscontrol/providers/providers.go@dnscontrol/pkg/providers/providers.go@g' documentation/advanced-features/writing-providers.md
sed -i.bak -e 's@providers/_all/all.go@pkg/providers/_all/all.go@g' documentation/advanced-features/writing-providers.md
#sed -i.bak -e 's@@@g' documentation/advanced-features/writing-providers.md
#sed -i.bak -e 's@@@g' documentation/advanced-features/writing-providers.md

find . -name \*.bak -delete

go fmt ./...

git status

echo git commit -a -m'CHORE: Move Non-provider files in providers to pkg/providers'



```
2025-12-15 12:53:52 -05:00

75 lines
2.1 KiB
Go

package normalize
import (
"go/ast"
"go/parser"
"go/token"
"sort"
"strings"
"testing"
)
const (
providersImportDir = "../../pkg/providers"
providersPackageName = "providers"
)
func TestCapabilitiesAreFiltered(t *testing.T) {
// Any capabilities which we wish to whitelist because it's not directly
// something we can test against.
skipCheckCapabilities := make(map[string]struct{})
// skipCheckCapabilities["CanUseBlahBlahBlah"] = struct{}{}
fset := token.NewFileSet()
pkgs, err := parser.ParseDir(fset, providersImportDir, nil, 0)
if err != nil {
t.Fatalf("unable to load Go code from providers: %s", err)
}
providers, ok := pkgs[providersPackageName]
if !ok {
t.Fatalf("did not find package %q in %q", providersPackageName, providersImportDir)
}
constantNames := make([]string, 0, 50)
capabilityInts := make(map[string]int, 50)
// providers.Scope was nil in my testing
for fileName := range providers.Files {
scope := providers.Files[fileName].Scope
for itemName, obj := range scope.Objects {
if obj.Kind != ast.Con {
continue
}
// In practice, the object.Type is nil here so we can't filter for
// capabilities so easily.
if !strings.HasPrefix(itemName, "CanUse") {
continue
}
constantNames = append(constantNames, itemName)
capabilityInts[itemName] = obj.Data.(int)
}
}
sort.Strings(constantNames)
if len(providerCapabilityChecks) == 0 {
t.Fatal("missing entries in providerCapabilityChecks")
}
capIntsToNames := make(map[int]string, len(providerCapabilityChecks))
for _, pair := range providerCapabilityChecks {
for _, cap := range pair.caps {
capIntsToNames[int(cap)] = pair.rType
}
}
for _, capName := range constantNames {
capInt := capabilityInts[capName]
if _, ok := skipCheckCapabilities[capName]; ok {
t.Logf("ok: providers.%s (%d) is exempt from checkProviderCapabilities", capName, capInt)
} else if rType, ok := capIntsToNames[capInt]; ok {
t.Logf("ok: providers.%s (%d) is checked for with %q", capName, capInt, rType)
} else {
t.Errorf("MISSING: providers.%s (%d) is not checked by checkProviderCapabilities", capName, capInt)
}
}
}