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">