Pulse/internal/license/code_standards_test.go
2026-03-18 16:06:30 +00:00

55 lines
1.6 KiB
Go

package license
// Code standards tests: these act as linter rules that run in CI.
// They scan source files for hardcoded grace period values.
import (
"os"
"regexp"
"strings"
"testing"
)
// TestNoHardcodedGracePeriod ensures no file in the license package hardcodes
// the 7-day grace period duration instead of using DefaultGracePeriod.
func TestNoHardcodedGracePeriod(t *testing.T) {
entries, err := os.ReadDir(".")
if err != nil {
t.Fatalf("failed to read license directory: %v", err)
}
// Match "7 * 24 * time.Hour" or "168 * time.Hour" (7*24=168)
hardcoded := regexp.MustCompile(`(?:7\s*\*\s*24\s*\*\s*time\.Hour|168\s*\*\s*time\.Hour)`)
for _, entry := range entries {
name := entry.Name()
if !strings.HasSuffix(name, ".go") || strings.HasSuffix(name, "_test.go") {
continue
}
data, err := os.ReadFile(name)
if err != nil {
t.Fatalf("failed to read %s: %v", name, err)
}
content := string(data)
matches := hardcoded.FindAllStringIndex(content, -1)
for _, m := range matches {
line := 1 + strings.Count(content[:m[0]], "\n")
// Get the full line containing the match
lineStart := strings.LastIndex(content[:m[0]], "\n") + 1
lineEnd := strings.Index(content[m[0]:], "\n")
var fullLine string
if lineEnd >= 0 {
fullLine = content[lineStart : m[0]+lineEnd]
} else {
fullLine = content[lineStart:]
}
// Allow the constant definition itself
if strings.Contains(fullLine, "DefaultGracePeriod") {
continue
}
t.Errorf("%s:%d: hardcoded grace period duration — use DefaultGracePeriod constant instead", name, line)
}
}
}