Files
code-utils/scanner_test.go
2026-08-11 19:07:05 +08:00

80 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"context"
"os"
"path/filepath"
"testing"
)
func TestScannerCountsAndExcludes(t *testing.T) {
root := t.TempDir()
if err := os.WriteFile(filepath.Join(root, "main.go"), []byte("package main\n\n// note\nfunc main() {}\n"), 0644); err != nil {
t.Fatal(err)
}
if err := os.Mkdir(filepath.Join(root, "node_modules"), 0755); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(root, "node_modules", "bad.js"), []byte("alert(1)\n"), 0644); err != nil {
t.Fatal(err)
}
langs, files, err := (Scanner{}).Analyze(context.Background(), root, []ExclusionRule{{Pattern: "node_modules"}}, func(int, string) {})
if err != nil {
t.Fatal(err)
}
if len(langs) != 1 || langs[0].Name != "Go" {
t.Fatalf("unexpected languages: %#v", langs)
}
if langs[0].Code != 2 || langs[0].Comments != 1 || langs[0].Blanks != 1 {
t.Fatalf("unexpected count: %#v", langs[0])
}
for _, f := range files {
if f.Name == "bad.js" {
t.Fatal("excluded file was scanned")
}
}
}
func TestWildcardMatch(t *testing.T) {
cases := []struct {
p, s string
want bool
}{{"*.log", "storage/app.log", true}, {"vendor", "vendor/a.php", true}, {"dist", "src/main.js", false}}
for _, c := range cases {
if got := wildcardMatch(c.p, c.s); got != c.want {
t.Errorf("%s %s = %v", c.p, c.s, got)
}
}
}
func TestNestedGitignoreDoesNotExcludeSiblingSource(t *testing.T) {
root := t.TempDir()
dependency := filepath.Join(root, "vendor", "package")
if err := os.MkdirAll(dependency, 0755); err != nil {
t.Fatal(err)
}
// 依赖包中的局部规则只应作用于 vendor/package不能过滤项目根目录。
if err := os.WriteFile(filepath.Join(dependency, ".gitignore"), []byte("*\n"), 0644); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(dependency, "ignored.go"), []byte("package ignored\n"), 0644); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(filepath.Join(root, "main.go"), []byte("package main\nfunc main() {}\n"), 0644); err != nil {
t.Fatal(err)
}
langs, files, err := (Scanner{}).Analyze(context.Background(), root, nil, func(int, string) {})
if err != nil {
t.Fatal(err)
}
if len(langs) != 1 || langs[0].Name != "Go" || langs[0].Files != 1 {
t.Fatalf("嵌套 .gitignore 错误影响了同级源码: %#v", langs)
}
for _, file := range files {
if file.Name == "ignored.go" {
t.Fatal("嵌套 .gitignore 未排除自身目录中的文件")
}
}
}