package research import ( "context" "net/http" "net/http/httptest" "strings" "testing" "time" ) func TestExtractHTMLTextRemovesNavigationAndScripts(t *testing.T) { title, content := extractHTMLText(` VPN & Gateway
Menü

Gateway prüfen

Öffnen Sie die Konfiguration.

  1. Adresse prüfen
  2. Verbindung testen
`, 5000) if title != "VPN & Gateway" { t.Fatalf("unexpected title %q", title) } for _, forbidden := range []string{"alert(1)", "Menü", "Impressum", ".x{}"} { if strings.Contains(content, forbidden) { t.Fatalf("forbidden HTML block leaked into content: %q", forbidden) } } for _, expected := range []string{"Gateway prüfen", "Adresse prüfen", "Verbindung testen"} { if !strings.Contains(content, expected) { t.Fatalf("expected extracted text %q in %q", expected, content) } } } func TestFetchPageExtractsFullHTMLWhenPrivateAllowed(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html; charset=utf-8") _, _ = w.Write([]byte(`Herstelleranleitung

Audit Logging aktivieren

Aktivieren Sie das zentrale Audit Logging in der Administrationskonsole.

Prüfen Sie anschließend, ob ein Testereignis im zentralen Protokoll erscheint und die Aufbewahrungsrichtlinie greift.

`)) })) defer srv.Close() page, diagnostic, err := New("").FetchPage(context.Background(), srv.URL, FetchOptions{AllowPrivate: true, Timeout: time.Second, MaxBytes: 1 << 20, MaxChars: 5000}) if err != nil { t.Fatal(err) } if page.Title != "Herstelleranleitung" || !strings.Contains(page.Content, "Audit Logging aktivieren") || diagnostic.HTTPStatus != http.StatusOK { t.Fatalf("unexpected page=%+v diagnostic=%+v", page, diagnostic) } } func TestFetchPageBlocksPrivateAddressByDefault(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte("should not be fetched")) })) defer srv.Close() _, diagnostic, err := New("").FetchPage(context.Background(), srv.URL, FetchOptions{}) if err == nil || diagnostic.ErrorKind != "unsafe_url" { t.Fatalf("expected private URL rejection, err=%v diagnostic=%+v", err, diagnostic) } } func TestFetchPageReportsPDFAsUnsupported(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/pdf") _, _ = w.Write([]byte("%PDF-1.4")) })) defer srv.Close() _, diagnostic, err := New("").FetchPage(context.Background(), srv.URL+"/manual.pdf", FetchOptions{AllowPrivate: true}) if err == nil || diagnostic.ErrorKind != "pdf_unsupported" { t.Fatalf("expected PDF rejection, err=%v diagnostic=%+v", err, diagnostic) } }