mirror of
https://github.com/nais/wonderwall.git
synced 2026-02-14 17:49:54 +00:00
121 lines
3.1 KiB
Go
121 lines
3.1 KiB
Go
package client_test
|
|
|
|
import (
|
|
"net/url"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/nais/wonderwall/pkg/mock"
|
|
"github.com/nais/wonderwall/pkg/openid/client"
|
|
)
|
|
|
|
const (
|
|
LogoutCallbackURI = mock.Ingress + "/oauth2/logout/callback"
|
|
PostLogoutRedirectURI = "http://some-other-url"
|
|
EndSessionEndpoint = "http://provider/endsession"
|
|
)
|
|
|
|
func TestLogout_SingleLogoutURL(t *testing.T) {
|
|
t.Run("with id_token", func(t *testing.T) {
|
|
logout := newLogout(t)
|
|
idToken := "some-id-token"
|
|
state := logout.Cookie.State
|
|
|
|
raw := logout.SingleLogoutURL(idToken)
|
|
assert.NotEmpty(t, raw)
|
|
|
|
logoutUrl, err := url.Parse(raw)
|
|
assert.NoError(t, err)
|
|
|
|
query := logoutUrl.Query()
|
|
assert.Len(t, query, 3)
|
|
|
|
assert.Contains(t, query, "id_token_hint")
|
|
assert.Equal(t, idToken, query.Get("id_token_hint"))
|
|
|
|
assert.Contains(t, query, "post_logout_redirect_uri")
|
|
assert.Equal(t, LogoutCallbackURI, query.Get("post_logout_redirect_uri"))
|
|
|
|
assert.Contains(t, query, "state")
|
|
assert.Equal(t, state, query.Get("state"))
|
|
|
|
logoutUrl.RawQuery = ""
|
|
assert.Equal(t, EndSessionEndpoint, logoutUrl.String())
|
|
})
|
|
|
|
t.Run("without id_token", func(t *testing.T) {
|
|
logout := newLogout(t)
|
|
idToken := ""
|
|
state := logout.Cookie.State
|
|
|
|
raw := logout.SingleLogoutURL(idToken)
|
|
assert.NotEmpty(t, raw)
|
|
|
|
logoutUrl, err := url.Parse(raw)
|
|
assert.NoError(t, err)
|
|
|
|
query := logoutUrl.Query()
|
|
assert.Len(t, query, 2)
|
|
|
|
assert.NotContains(t, query, "id_token_hint")
|
|
assert.Equal(t, idToken, query.Get("id_token_hint"))
|
|
|
|
assert.Contains(t, query, "post_logout_redirect_uri")
|
|
assert.Equal(t, LogoutCallbackURI, query.Get("post_logout_redirect_uri"))
|
|
|
|
assert.Contains(t, query, "state")
|
|
assert.Equal(t, state, query.Get("state"))
|
|
|
|
logoutUrl.RawQuery = ""
|
|
assert.Equal(t, EndSessionEndpoint, logoutUrl.String())
|
|
})
|
|
|
|
t.Run("with logout_hint claim", func(t *testing.T) {
|
|
logout := newLogout(t)
|
|
logout.LogoutHint = "some-logout-hint"
|
|
idToken := ""
|
|
state := logout.Cookie.State
|
|
|
|
raw := logout.SingleLogoutURL(idToken)
|
|
assert.NotEmpty(t, raw)
|
|
|
|
logoutUrl, err := url.Parse(raw)
|
|
assert.NoError(t, err)
|
|
|
|
query := logoutUrl.Query()
|
|
assert.Len(t, query, 3)
|
|
|
|
assert.Contains(t, query, "logout_hint")
|
|
assert.Equal(t, logout.LogoutHint, query.Get("logout_hint"))
|
|
|
|
assert.NotContains(t, query, "id_token_hint")
|
|
assert.Equal(t, idToken, query.Get("id_token_hint"))
|
|
|
|
assert.Contains(t, query, "post_logout_redirect_uri")
|
|
assert.Equal(t, LogoutCallbackURI, query.Get("post_logout_redirect_uri"))
|
|
|
|
assert.Contains(t, query, "state")
|
|
assert.Equal(t, state, query.Get("state"))
|
|
|
|
logoutUrl.RawQuery = ""
|
|
assert.Equal(t, EndSessionEndpoint, logoutUrl.String())
|
|
})
|
|
}
|
|
|
|
func newLogout(t *testing.T) *client.Logout {
|
|
cfg := mock.Config()
|
|
|
|
openidCfg := mock.NewTestConfiguration(cfg)
|
|
openidCfg.TestClient.SetPostLogoutRedirectURI(PostLogoutRedirectURI)
|
|
openidCfg.TestProvider.SetEndSessionEndpoint(EndSessionEndpoint)
|
|
ingresses := mock.Ingresses(cfg)
|
|
|
|
req := mock.NewGetRequest(mock.Ingress+"/oauth2/logout", ingresses)
|
|
|
|
logout, err := newTestClientWithConfig(openidCfg).Logout(req)
|
|
assert.NoError(t, err)
|
|
|
|
return logout
|
|
}
|