github.com/PDOK/gokoala@v0.50.6/internal/engine/contentnegotiation_test.go (about) 1 package engine 2 3 import ( 4 "context" 5 "net/http" 6 "net/http/httptest" 7 "testing" 8 9 "github.com/PDOK/gokoala/config" 10 "golang.org/x/text/language" 11 ) 12 13 func TestContentNegotiation_NegotiateFormat(t *testing.T) { 14 // given 15 cn := newContentNegotiation([]config.Language{{Tag: language.Dutch}, {Tag: language.English}}) 16 chromeAcceptHeader := "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" 17 18 // when/then 19 testFormat(t, cn, "application/json", "http://pdok.example/ogc/api", "json") 20 testFormat(t, cn, "application/json", "http://pdok.example/ogc/api/", "json") 21 testFormat(t, cn, chromeAcceptHeader, "http://pdok.example/ogc/api", "html") 22 testFormat(t, cn, chromeAcceptHeader, "http://pdok.example/ogc/api/", "html") 23 testFormat(t, cn, "application/json", "http://pdok.example/ogc/api.json", "json") 24 testFormat(t, cn, "application/json", "http://pdok.example/ogc/api?f=json", "json") 25 testFormat(t, cn, "", "http://pdok.example/ogc/api?f=json", "json") 26 testFormat(t, cn, "application/xml, application/json, text/css, text/html", "http://pdok.example/ogc/api/", "json") 27 testLanguage(t, cn, "nl;q=1", "http://pdok.example/ogc/api", language.Dutch) 28 testLanguage(t, cn, "fr;q=0.8, de;q=0.5", "http://pdok.example/ogc/api", language.Dutch) 29 testLanguage(t, cn, "en;q=1", "http://pdok.example/ogc/api", language.English) 30 testLanguage(t, cn, "", "http://pdok.example/ogc/api", language.Dutch) 31 testLanguage(t, cn, "", "http://pdok.example/ogc/api?lang=fr", language.Dutch) 32 testLanguage(t, cn, "", "http://pdok.example/ogc/api?lang=en", language.English) 33 testLanguageWithCookie(t, cn, "en", "http://pdok.example/ogc/api", language.English) 34 } 35 36 func testFormat(t *testing.T, cn *ContentNegotiation, acceptHeader string, givenURL string, expectedFormat string) { 37 req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, givenURL, nil) 38 req.Header.Set(HeaderAccept, acceptHeader) 39 if err != nil { 40 t.Fatal(err) 41 } 42 format := cn.NegotiateFormat(req) 43 if format != expectedFormat { 44 t.Fatalf("Expected %s for input %s, got %s", expectedFormat, givenURL, format) 45 } 46 } 47 48 func testLanguage(t *testing.T, cn *ContentNegotiation, acceptLanguageHeader string, givenURL string, expectedLanguage language.Tag) { 49 req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, givenURL, nil) 50 req.Header.Set(HeaderAcceptLanguage, acceptLanguageHeader) 51 if err != nil { 52 t.Fatal(err) 53 } 54 lang := cn.NegotiateLanguage(httptest.NewRecorder(), req) 55 if lang != expectedLanguage { 56 t.Fatalf("Expected %v for input %s, got %v", expectedLanguage, givenURL, lang) 57 } 58 } 59 60 func testLanguageWithCookie(t *testing.T, cn *ContentNegotiation, cookieLanguage string, givenURL string, expectedLanguage language.Tag) { 61 req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, givenURL, nil) 62 req.AddCookie(&http.Cookie{ 63 Name: languageParam, 64 Value: cookieLanguage, 65 Path: "/", 66 MaxAge: config.CookieMaxAge, 67 SameSite: http.SameSiteStrictMode, 68 Secure: true, 69 }) 70 if err != nil { 71 t.Fatal(err) 72 } 73 lang := cn.NegotiateLanguage(httptest.NewRecorder(), req) 74 if lang != expectedLanguage { 75 t.Fatalf("Expected %v for input %s, got %v", expectedLanguage, givenURL, lang) 76 } 77 }