package reactdocs import ( "strings" "testing" "github.com/PuerkitoBio/goquery" ) const testReferencePageHTML = `
useState is a React Hook that lets you add a state variable to your component.
const [state, setState] = useState(initialState)
useEffect is a React Hook that lets you synchronize a component with an external system.
useEffect(setup, dependencies?)
Suspense lets you display a fallback until its children have finished loading.
createContext lets you create a Context that components can provide or read.
createContext(initialValue)
`
func TestParseReferencePage(t *testing.T) {
parser := NewParser()
ref, err := parser.ParseReferencePage(testReferencePageHTML, "https://react.dev/reference/react")
if err != nil {
t.Fatalf("ParseReferencePage failed: %v", err)
}
if len(ref.Hooks) == 0 {
t.Error("Expected at least one hook")
}
if len(ref.Components) == 0 {
t.Error("Expected at least one component")
}
if len(ref.APIs) == 0 {
t.Error("Expected at least one API")
}
}
func TestExtractHooks(t *testing.T) {
parser := NewParser()
doc, err := goquery.NewDocumentFromReader(strings.NewReader(testReferencePageHTML))
if err != nil {
t.Fatalf("Failed to parse HTML: %v", err)
}
hooks := parser.extractHooks(doc, "https://react.dev/reference/react")
if len(hooks) == 0 {
t.Fatal("Expected at least one hook")
}
found := false
for _, h := range hooks {
if h.Name == "useState" {
found = true
if h.Doc == "" {
t.Error("Expected useState to have documentation")
}
break
}
}
if !found {
t.Error("Expected to find useState hook")
}
}
func TestExtractComponents(t *testing.T) {
parser := NewParser()
doc, err := goquery.NewDocumentFromReader(strings.NewReader(testReferencePageHTML))
if err != nil {
t.Fatalf("Failed to parse HTML: %v", err)
}
components := parser.extractComponents(doc, "https://react.dev/reference/react")
found := false
for _, c := range components {
if c.Name == "Suspense" {
found = true
break
}
}
if !found {
t.Error("Expected to find Suspense component")
}
}
func TestResolveURL(t *testing.T) {
tests := []struct {
base string
href string
expected string
}{
{"https://react.dev", "/reference/react", "https://react.dev/reference/react"},
{"https://react.dev", "https://example.com/page", "https://example.com/page"},
}
for _, tt := range tests {
t.Run(tt.href, func(t *testing.T) {
got := resolveURL(tt.base, tt.href)
if got != tt.expected {
t.Errorf("resolveURL(%q, %q) = %q, want %q", tt.base, tt.href, got, tt.expected)
}
})
}
}