brave_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package websearch
  2. import (
  3. "context"
  4. "encoding/json"
  5. "net/http"
  6. "net/http/httptest"
  7. "testing"
  8. "github.com/stretchr/testify/require"
  9. )
  10. func TestBraveProvider_Name(t *testing.T) {
  11. p := NewBraveProvider("key", nil)
  12. require.Equal(t, "brave", p.Name())
  13. }
  14. func TestBraveProvider_Search_Success(t *testing.T) {
  15. srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  16. require.Equal(t, "test-key", r.Header.Get("X-Subscription-Token"))
  17. require.Equal(t, "application/json", r.Header.Get("Accept"))
  18. require.Equal(t, "golang", r.URL.Query().Get("q"))
  19. require.Equal(t, "3", r.URL.Query().Get("count"))
  20. resp := braveResponse{}
  21. resp.Web.Results = []braveResult{
  22. {URL: "https://go.dev", Title: "Go", Description: "Go lang", Age: "1 day"},
  23. {URL: "https://pkg.go.dev", Title: "Pkg", Description: "Packages"},
  24. {URL: "https://tour.go.dev", Title: "Tour", Description: "A Tour of Go", Age: "3 days"},
  25. }
  26. w.Header().Set("Content-Type", "application/json")
  27. _ = json.NewEncoder(w).Encode(resp)
  28. }))
  29. defer srv.Close()
  30. p := NewBraveProvider("test-key", srv.Client())
  31. // Override the endpoint for testing
  32. origURL := *braveSearchURL
  33. u, _ := http.NewRequest("GET", srv.URL, nil)
  34. *braveSearchURL = *u.URL
  35. defer func() { *braveSearchURL = origURL }()
  36. resp, err := p.Search(context.Background(), SearchRequest{Query: "golang", MaxResults: 3})
  37. require.NoError(t, err)
  38. require.Len(t, resp.Results, 3)
  39. require.Equal(t, "https://go.dev", resp.Results[0].URL)
  40. require.Equal(t, "Go lang", resp.Results[0].Snippet)
  41. require.Equal(t, "1 day", resp.Results[0].PageAge)
  42. }
  43. func TestBraveProvider_Search_DefaultMaxResults(t *testing.T) {
  44. var receivedCount string
  45. srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  46. receivedCount = r.URL.Query().Get("count")
  47. resp := braveResponse{}
  48. _ = json.NewEncoder(w).Encode(resp)
  49. }))
  50. defer srv.Close()
  51. p := NewBraveProvider("key", srv.Client())
  52. origURL := *braveSearchURL
  53. u, _ := http.NewRequest("GET", srv.URL, nil)
  54. *braveSearchURL = *u.URL
  55. defer func() { *braveSearchURL = origURL }()
  56. _, _ = p.Search(context.Background(), SearchRequest{Query: "test", MaxResults: 0})
  57. require.Equal(t, "5", receivedCount)
  58. }
  59. func TestBraveProvider_Search_HTTPError(t *testing.T) {
  60. srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
  61. w.WriteHeader(429)
  62. _, _ = w.Write([]byte("rate limited"))
  63. }))
  64. defer srv.Close()
  65. p := NewBraveProvider("key", srv.Client())
  66. origURL := *braveSearchURL
  67. u, _ := http.NewRequest("GET", srv.URL, nil)
  68. *braveSearchURL = *u.URL
  69. defer func() { *braveSearchURL = origURL }()
  70. _, err := p.Search(context.Background(), SearchRequest{Query: "test"})
  71. require.ErrorContains(t, err, "brave: status 429")
  72. }
  73. func TestBraveProvider_Search_InvalidJSON(t *testing.T) {
  74. srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
  75. _, _ = w.Write([]byte("not json"))
  76. }))
  77. defer srv.Close()
  78. p := NewBraveProvider("key", srv.Client())
  79. origURL := *braveSearchURL
  80. u, _ := http.NewRequest("GET", srv.URL, nil)
  81. *braveSearchURL = *u.URL
  82. defer func() { *braveSearchURL = origURL }()
  83. _, err := p.Search(context.Background(), SearchRequest{Query: "test"})
  84. require.ErrorContains(t, err, "brave: decode response")
  85. }
  86. func TestBraveProvider_Search_EmptyResults(t *testing.T) {
  87. srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
  88. resp := braveResponse{}
  89. _ = json.NewEncoder(w).Encode(resp)
  90. }))
  91. defer srv.Close()
  92. p := NewBraveProvider("key", srv.Client())
  93. origURL := *braveSearchURL
  94. u, _ := http.NewRequest("GET", srv.URL, nil)
  95. *braveSearchURL = *u.URL
  96. defer func() { *braveSearchURL = origURL }()
  97. resp, err := p.Search(context.Background(), SearchRequest{Query: "test"})
  98. require.NoError(t, err)
  99. require.Empty(t, resp.Results)
  100. }