package httpapi import ( "net/http" "net/http/httptest" "strings" "testing" ) // getWith — GET с заголовками (за обратным прокси мету считает не Host). func getWith(t *testing.T, h http.Handler, path string, hdr map[string]string) *httptest.ResponseRecorder { t.Helper() req := httptest.NewRequest(http.MethodGet, path, nil) for k, v := range hdr { req.Header.Set(k, v) } rr := httptest.NewRecorder() h.ServeHTTP(rr, req) return rr } // TestPageMetaAbsolute — превью ссылки: адреса картинки и страницы абсолютные, // иначе краулер мессенджера картинку не заберёт. func TestPageMetaAbsolute(t *testing.T) { h := testRouter(t, stubReader{}, stubReviewer{}) body := get(t, h, "/").Body.String() if !strings.Contains(body, ``) { t.Errorf("og:url не абсолютный: %s", metaLine(body, "og:url")) } if !strings.Contains(body, ``) { t.Errorf("og:title не заголовок страницы: %s", metaLine(body, "og:title")) } if !strings.Contains(body, `jellybit — загрузки`) { t.Error("заголовок вкладки потерян") } } // TestPageMetaBehindProxy — за прокси схему и хост несут X-Forwarded-*; // из списка значений берётся первое (ближнее к клиенту). func TestPageMetaBehindProxy(t *testing.T) { h := testRouter(t, stubReader{}, stubReviewer{}) body := getWith(t, h, "/", map[string]string{ "X-Forwarded-Proto": "https, http", "X-Forwarded-Host": "jellybit.example.org, internal", }).Body.String() if !strings.Contains(body, `content="https://jellybit.example.org/static/og-cover.jpg?v=`) { t.Errorf("og:image мимо прокси: %s", metaLine(body, "og:image")) } if !strings.Contains(body, ``) { t.Errorf("og:url мимо прокси: %s", metaLine(body, "og:url")) } } // TestPageMetaBadHost — хост непохожей формы отбрасывается целиком: в мете // остаётся относительный адрес, чужой хост в превью не подставляется. func TestPageMetaBadHost(t *testing.T) { h := testRouter(t, stubReader{}, stubReviewer{}) body := getWith(t, h, "/", map[string]string{ "X-Forwarded-Host": `evil.example.org">