mirror of
https://github.com/idanoo/autobrr
synced 2025-07-22 16:29:12 +00:00
feat(tests): verify external autobrr.com URLs (#1253)
* feat(tests): Verify autobrr.com URLs * test: drop body content check * feat: Improved URL Scanning * cleaned up comments * refactor: enhance URL checker for readability and flexibility - Introduce AutobrrURLChecker struct to group related variables and functions - Replace ioutil.ReadFile with os.ReadFile for reading files - Adjust HTTP client setup and request creation for better error handling - Trim trailing slashes from URLs and deduplicate URLs before making requests - Reduce sleep duration between requests to 500ms * fix: move test into test/docs
This commit is contained in:
parent
558bc045ab
commit
4f20b2b3f6
1 changed files with 117 additions and 0 deletions
117
test/docs/docs_test.go
Normal file
117
test/docs/docs_test.go
Normal file
|
@ -0,0 +1,117 @@
|
|||
package http
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AutobrrURLChecker struct {
|
||||
BasePath string
|
||||
AutobrrURLRegex []*regexp.Regexp
|
||||
ValidExtensions map[string]bool
|
||||
SleepDuration time.Duration
|
||||
}
|
||||
|
||||
func NewAutobrrURLChecker() *AutobrrURLChecker {
|
||||
return &AutobrrURLChecker{
|
||||
BasePath: "../..", // Base directory to start scanning from
|
||||
AutobrrURLRegex: []*regexp.Regexp{ // Regular expressions to match URLs for checking
|
||||
regexp.MustCompile(`https?://autobrr\.com/[^ \s"')]+`),
|
||||
},
|
||||
ValidExtensions: map[string]bool{ // File extensions to be checked
|
||||
".go": true,
|
||||
".tsx": true,
|
||||
".md": true,
|
||||
".yml": true,
|
||||
},
|
||||
SleepDuration: 500 * time.Millisecond, // Duration to wait between requests to avoid rate limiting
|
||||
// I could not find any information from Netlify about acceptable use here.
|
||||
}
|
||||
}
|
||||
|
||||
func processFile(filePath string, checker *AutobrrURLChecker) ([]string, error) {
|
||||
content, err := os.ReadFile(filePath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error reading file %s: %w", filePath, err)
|
||||
}
|
||||
|
||||
var allURLMatches []string
|
||||
for _, regex := range checker.AutobrrURLRegex {
|
||||
urlmatches := regex.FindAllString(string(content), -1)
|
||||
allURLMatches = append(allURLMatches, urlmatches...)
|
||||
}
|
||||
|
||||
return allURLMatches, nil
|
||||
}
|
||||
|
||||
func TestAutobrrURLsInRepository(t *testing.T) {
|
||||
checker := NewAutobrrURLChecker()
|
||||
uniqueURLSet := make(map[string]bool)
|
||||
|
||||
err := filepath.WalkDir(checker.BasePath, func(path string, entry fs.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if entry.IsDir() || !checker.ValidExtensions[filepath.Ext(path)] {
|
||||
return nil
|
||||
}
|
||||
|
||||
fileURLs, err := processFile(path, checker)
|
||||
if err != nil {
|
||||
t.Errorf("Error processing file %s: %v", path, err)
|
||||
return err
|
||||
}
|
||||
|
||||
for _, url := range fileURLs {
|
||||
normalizedURL := strings.TrimRight(strings.Split(url, "#")[0], "/") // Trim the URL by removing any trailing slashes and any URL fragments.
|
||||
uniqueURLSet[normalizedURL] = true
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("Error walking the repository directory tree: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
client := &http.Client{
|
||||
Timeout: time.Second * 10,
|
||||
}
|
||||
|
||||
// Use a slice to store the URLs after they are de-duplicated
|
||||
deduplicatedURLs := make([]string, 0, len(uniqueURLSet))
|
||||
for url := range uniqueURLSet {
|
||||
deduplicatedURLs = append(deduplicatedURLs, url)
|
||||
}
|
||||
|
||||
for _, url := range deduplicatedURLs {
|
||||
t.Run(url, func(t *testing.T) {
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
if err != nil {
|
||||
t.Errorf("Failed to create request for url %s: %v", url, err)
|
||||
return
|
||||
}
|
||||
req.Header.Set("User-Agent", "autobrr")
|
||||
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
t.Errorf("Failed to GET url %s: %v", url, err)
|
||||
return
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode == http.StatusNotFound {
|
||||
t.Errorf("URL %s returned 404 Not Found", url)
|
||||
}
|
||||
|
||||
time.Sleep(checker.SleepDuration)
|
||||
})
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue