package reactdocs import ( "strings" "testing" "github.com/PuerkitoBio/goquery" ) const testReferencePageHTML = `

React Reference

useState

useState is a React Hook that lets you add a state variable to your component.

const [state, setState] = useState(initialState)

useEffect

useEffect is a React Hook that lets you synchronize a component with an external system.

useEffect(setup, dependencies?)

Suspense

Suspense lets you display a fallback until its children have finished loading.

createContext

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) } }) } }