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  }