feat(api): v2 response shape - absolute rank, ad/organic split, slimmer fields

This commit is contained in:
Rustem Kamalov
2026-05-13 01:30:54 +03:00
parent 00630a5d31
commit b3ca4e0803
36 changed files with 972 additions and 279 deletions

View File

@@ -68,3 +68,53 @@ func TestParseHTMLNoResults(t *testing.T) {
t.Fatalf("expected zero results, got %d", len(results))
}
}
func TestParseHTMLAdsDoNotConsumeOrganicRank(t *testing.T) {
t.Parallel()
html := `
<div>
<div data-hveid="1" data-ved="ad" data-text-ad="1">
<a href="https://ads.example.com"><h3>Sponsored Result</h3></a>
<div data-sncf="1"><div>Paid snippet</div></div>
</div>
<div data-hveid="2" data-ved="organic1">
<a href="https://organic.example.com/one"><h3>Organic One</h3></a>
<div data-sncf="1"><div>Organic snippet one</div></div>
</div>
<div data-hveid="3" data-ved="organic2">
<a href="https://organic.example.com/two"><h3>Organic Two</h3></a>
<div data-sncf="1"><div>Organic snippet two</div></div>
</div>
</div>`
results, err := ParseHTML(bytes.NewReader([]byte(html)))
if err != nil {
t.Fatalf("ParseHTML() error = %v", err)
}
if len(results) != 3 {
t.Fatalf("expected 3 results, got %d", len(results))
}
organicRank := 0
adRank := 0
for _, r := range results {
if r.Ad {
adRank++
if r.Rank != adRank {
t.Fatalf("ad rank = %d, want %d", r.Rank, adRank)
}
continue
}
organicRank++
if r.Rank != organicRank {
t.Fatalf("organic rank = %d, want %d", r.Rank, organicRank)
}
}
if organicRank != 2 {
t.Fatalf("organic count = %d, want 2", organicRank)
}
if results[0].AbsoluteRank != 1 || results[1].AbsoluteRank != 2 || results[2].AbsoluteRank != 3 {
t.Fatalf("unexpected absolute ranks: %d, %d, %d", results[0].AbsoluteRank, results[1].AbsoluteRank, results[2].AbsoluteRank)
}
}