go-ssb-room/web/handlers/set_language_test.go

80 lines
2.3 KiB
Go

package handlers
import (
"net/http"
"net/url"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/ssb-ngi-pointer/go-ssb-room/v2/web/i18n"
"github.com/ssb-ngi-pointer/go-ssb-room/v2/web/router"
)
func TestLanguageDefaultNoCookie(t *testing.T) {
ts := setup(t)
a := assert.New(t)
route := ts.URLTo(router.CompleteIndex)
html, res := ts.Client.GetHTML(route)
a.Equal(http.StatusOK, res.Code, "wrong HTTP status code")
languageForms := html.Find("#visitor-set-language form")
// two languages: english, deutsch => two <form> elements
a.Equal(2, languageForms.Length())
// verify there is no language cookie to set yet
cookieHeader := res.Header()["Set-Cookie"]
for _, cookie := range cookieHeader {
cookieName := strings.Split(cookie, "=")[0]
a.NotEqual(cookieName, i18n.LanguageCookieName)
}
}
func TestLanguageChooseGerman(t *testing.T) {
ts := setup(t)
a := assert.New(t)
route := ts.URLTo(router.CompleteIndex)
postEndpoint := ts.URLTo(router.CompleteSetLanguage)
html, res := ts.Client.GetHTML(route)
a.Equal(http.StatusOK, res.Code, "wrong HTTP status code")
csrfTokenElem := html.Find(`#visitor-set-language input[name="gorilla.csrf.Token"]`)
a.Equal(2, csrfTokenElem.Length())
csrfName, has := csrfTokenElem.First().Attr("name")
a.True(has, "should have a name attribute")
csrfValue, has := csrfTokenElem.First().Attr("value")
a.True(has, "should have value attribute")
// construct the post request fields, simulating picking a language
setLanguageFields := url.Values{
"lang": []string{"de"},
"page": []string{"/"},
csrfName: []string{csrfValue},
}
// set the referer header (important! otherwise our nicely crafted request yields a 500 :'()
var refererHeader = make(http.Header)
refererHeader.Set("Referer", "https://localhost")
ts.Client.SetHeaders(refererHeader)
// send the post request
postRes := ts.Client.PostForm(postEndpoint, setLanguageFields)
a.Equal(http.StatusSeeOther, postRes.Code, "wrong HTTP status code for sign in")
// verify there is one language cookie to set
cookieHeader := postRes.Header()["Set-Cookie"]
var languageCookies int
for _, cookie := range cookieHeader {
cookieName := strings.Split(cookie, "=")[0]
if cookieName == i18n.LanguageCookieName {
languageCookies += 1
}
}
a.Equal(1, languageCookies, "should have one language cookie set after posting")
}