fix(prefs): persist favicon choice and apply to HTML results
- Save favicon cookie on POST /preferences; reflect selection in template - Add getFaviconService helper; pass favicon service into FromResponse - Compute ResultView.FaviconIconURL (none/google/duckduckgo/self proxy) - Update result_item and video_item templates; add httpapi/views tests Made-with: Cursor
This commit is contained in:
parent
518215f62e
commit
90ea4c9f56
7 changed files with 171 additions and 43 deletions
|
|
@ -32,17 +32,17 @@ import (
|
|||
// mockUpstreamHandler returns controlled JSON responses.
|
||||
func mockUpstreamJSON(query string) contracts.SearchResponse {
|
||||
return contracts.SearchResponse{
|
||||
Query: query,
|
||||
NumberOfResults: 2,
|
||||
Query: query,
|
||||
NumberOfResults: 2,
|
||||
Results: []contracts.MainResult{
|
||||
{Title: "Upstream Result 1", URL: ptr("https://upstream.example/1"), Content: "From upstream", Engine: "upstream"},
|
||||
{Title: "Upstream Result 2", URL: ptr("https://upstream.example/2"), Content: "From upstream", Engine: "upstream"},
|
||||
},
|
||||
Answers: []map[string]any{},
|
||||
Corrections: []string{},
|
||||
Infoboxes: []map[string]any{},
|
||||
Suggestions: []string{"upstream suggestion"},
|
||||
UnresponsiveEngines: [][2]string{},
|
||||
Answers: []map[string]any{},
|
||||
Corrections: []string{},
|
||||
Infoboxes: []map[string]any{},
|
||||
Suggestions: []string{"upstream suggestion"},
|
||||
UnresponsiveEngines: [][2]string{},
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -74,6 +74,7 @@ func newTestServer(t *testing.T) (*httptest.Server, *httpapi.Handler) {
|
|||
mux.HandleFunc("/", h.Index)
|
||||
mux.HandleFunc("/search", h.Search)
|
||||
mux.HandleFunc("/autocompleter", h.Autocompleter)
|
||||
mux.HandleFunc("/preferences", h.Preferences)
|
||||
|
||||
server := httptest.NewServer(mux)
|
||||
t.Cleanup(server.Close)
|
||||
|
|
@ -228,3 +229,50 @@ func TestSearch_SourceURLInFooter(t *testing.T) {
|
|||
t.Error("expected AGPLv3 link in footer")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPreferences_PostSetsFaviconCookie(t *testing.T) {
|
||||
server, _ := newTestServer(t)
|
||||
client := &http.Client{CheckRedirect: func(*http.Request, []*http.Request) error {
|
||||
return http.ErrUseLastResponse
|
||||
}}
|
||||
req, _ := http.NewRequest(http.MethodPost, server.URL+"/preferences", strings.NewReader("favicon=google&theme=dark"))
|
||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
t.Fatalf("request failed: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusFound {
|
||||
t.Fatalf("expected redirect 302, got %d", resp.StatusCode)
|
||||
}
|
||||
found := false
|
||||
for _, c := range resp.Cookies() {
|
||||
if c.Name == "favicon" {
|
||||
found = true
|
||||
if c.Value != "google" {
|
||||
t.Fatalf("expected favicon cookie google, got %q", c.Value)
|
||||
}
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
t.Fatal("expected favicon cookie to be set")
|
||||
}
|
||||
}
|
||||
|
||||
func TestPreferences_GetReflectsFaviconCookie(t *testing.T) {
|
||||
server, _ := newTestServer(t)
|
||||
req, _ := http.NewRequest(http.MethodGet, server.URL+"/preferences", nil)
|
||||
req.AddCookie(&http.Cookie{Name: "favicon", Value: "duckduckgo"})
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
t.Fatalf("request failed: %v", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
body, _ := io.ReadAll(resp.Body)
|
||||
html := string(body)
|
||||
if !strings.Contains(html, `option value="duckduckgo" selected`) {
|
||||
t.Fatalf("expected duckduckgo option selected, body: %s", html)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue