package handler import ( "net/http/httptest" "net/url" "strings" "testing" "vidarchive/internal/models" ) func TestApplyPresetFormClearsDependentCommentSettings(t *testing.T) { tests := []struct { name string writeInfo string writeComments string wantCleared bool }{ {"info JSON disabled", "", "1", true}, {"comments disabled", "1", "", true}, {"both enabled", "1", "1", false}, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { form := url.Values{ "name": {"Preset"}, "format_mode": {"default"}, "write_info_json": {tc.writeInfo}, "write_comments": {tc.writeComments}, "comment_sort": {"top"}, "max_comments": {"25"}, "comment_extractor_args": {"youtube:player_client=web"}, } r := httptest.NewRequest("POST", "/settings/presets", strings.NewReader(form.Encode())) r.Header.Set("Content-Type", "application/x-www-form-urlencoded") preset := &models.Preset{} if err := applyPresetForm(preset, r); err != nil { t.Fatalf("applyPresetForm: %v", err) } if tc.wantCleared { if preset.WriteComments || preset.CommentSort != "" || preset.MaxComments != 0 || preset.CommentExtractorArgs != "" { t.Fatalf("dependent settings were not cleared: %+v", preset) } return } if !preset.WriteComments || preset.CommentSort != "top" || preset.MaxComments != 25 || preset.CommentExtractorArgs == "" { t.Fatalf("comment settings not retained: %+v", preset) } }) } } // The Referer header is attacker-controlled, so the theme form must never // redirect to the host it names — only back to a path on this site. func TestLocalRefererKeepsPathOnly(t *testing.T) { tests := []struct { referer string want string }{ {"", "/"}, {"https://evil.example/phish", "/phish"}, {"//evil.example/phish", "/phish"}, {"https://vidarchive.local/library?path=music", "/library?path=music"}, {"/queue?sort=status", "/queue?sort=status"}, {"not a url", "/"}, } for _, tc := range tests { r := httptest.NewRequest("POST", "/theme", nil) if tc.referer != "" { r.Header.Set("Referer", tc.referer) } if got := localReferer(r); got != tc.want { t.Errorf("localReferer(%q) = %q, want %q", tc.referer, got, tc.want) } } }