Files
galaxy-game/integration/gatewayauthsessionuser/gateway_authsession_user_test.go
T
2026-04-17 18:39:16 +02:00

111 lines
4.5 KiB
Go

package gatewayauthsessionuser_test
import (
"net/http"
"strings"
"testing"
"github.com/stretchr/testify/require"
)
func TestGatewayAuthsessionUserFirstRegistrationCreatesUserAndAllowsAccountRead(t *testing.T) {
h := newGatewayAuthsessionUserHarness(t)
const email = "created@example.com"
challengeID := h.sendChallenge(t, email)
code := lastMailCodeFor(t, h.mailStub, email)
clientPrivateKey := newClientPrivateKey("first-registration")
confirmResponse := h.confirmCode(t, challengeID, code, clientPrivateKey)
var confirmBody struct {
DeviceSessionID string `json:"device_session_id"`
}
requireJSONStatus(t, confirmResponse, http.StatusOK, &confirmBody)
require.True(t, strings.HasPrefix(confirmBody.DeviceSessionID, "device-session-"))
sessionRecord := h.waitForGatewaySession(t, confirmBody.DeviceSessionID)
accountResponse := h.executeGetMyAccount(t, confirmBody.DeviceSessionID, "request-first-registration", clientPrivateKey)
require.Equal(t, sessionRecord.UserID, accountResponse.Account.UserID)
require.Equal(t, email, accountResponse.Account.Email)
require.Equal(t, "en", accountResponse.Account.PreferredLanguage)
require.Equal(t, gatewayAuthsessionUserTestTimeZone, accountResponse.Account.TimeZone)
lookupResponse, lookup := h.lookupUserByEmail(t, email)
require.Equalf(t, http.StatusOK, lookupResponse.StatusCode, "status=%d body=%s", lookupResponse.StatusCode, lookupResponse.Body)
require.Equal(t, accountResponse.Account.UserID, lookup.User.UserID)
}
func TestGatewayAuthsessionUserExistingAccountKeepsCreateOnlySettings(t *testing.T) {
h := newGatewayAuthsessionUserHarness(t)
const email = "existing@example.com"
created := h.ensureUser(t, email, "fr-FR", "Europe/Paris")
require.Equal(t, "created", created.Outcome)
challengeID := h.sendChallenge(t, email)
code := lastMailCodeFor(t, h.mailStub, email)
clientPrivateKey := newClientPrivateKey("existing-account")
confirmResponse := h.confirmCode(t, challengeID, code, clientPrivateKey)
var confirmBody struct {
DeviceSessionID string `json:"device_session_id"`
}
requireJSONStatus(t, confirmResponse, http.StatusOK, &confirmBody)
accountResponse := h.executeGetMyAccount(t, confirmBody.DeviceSessionID, "request-existing-account", clientPrivateKey)
require.Equal(t, created.UserID, accountResponse.Account.UserID)
require.Equal(t, "fr-FR", accountResponse.Account.PreferredLanguage)
require.Equal(t, "Europe/Paris", accountResponse.Account.TimeZone)
}
func TestGatewayAuthsessionUserAcceptLanguageSetsLocalizedPreferredLanguage(t *testing.T) {
h := newGatewayAuthsessionUserHarness(t)
const email = "localized@example.com"
challengeID := h.sendChallengeWithAcceptLanguage(t, email, "fr-FR, en;q=0.8")
deliveries := h.mailStub.RecordedDeliveries()
require.NotEmpty(t, deliveries)
require.Equal(t, "fr-FR", deliveries[len(deliveries)-1].Locale)
code := lastMailCodeFor(t, h.mailStub, email)
clientPrivateKey := newClientPrivateKey("localized-account")
confirmResponse := h.confirmCode(t, challengeID, code, clientPrivateKey)
var confirmBody struct {
DeviceSessionID string `json:"device_session_id"`
}
requireJSONStatus(t, confirmResponse, http.StatusOK, &confirmBody)
accountResponse := h.executeGetMyAccount(t, confirmBody.DeviceSessionID, "request-localized-account", clientPrivateKey)
require.Equal(t, "fr-FR", accountResponse.Account.PreferredLanguage)
require.Equal(t, gatewayAuthsessionUserTestTimeZone, accountResponse.Account.TimeZone)
}
func TestGatewayAuthsessionUserBlockedEmailAndUserBehavior(t *testing.T) {
h := newGatewayAuthsessionUserHarness(t)
blockedAtSendEmail := "blocked-send@example.com"
h.blockByEmail(t, blockedAtSendEmail)
beforeBlockedSendDeliveries := len(h.mailStub.RecordedDeliveries())
blockedChallengeID := h.sendChallenge(t, blockedAtSendEmail)
require.NotEmpty(t, blockedChallengeID)
require.Len(t, h.mailStub.RecordedDeliveries(), beforeBlockedSendDeliveries)
blockedAtConfirmEmail := "blocked-confirm@example.com"
challengeID := h.sendChallenge(t, blockedAtConfirmEmail)
code := lastMailCodeFor(t, h.mailStub, blockedAtConfirmEmail)
h.blockByEmail(t, blockedAtConfirmEmail)
confirmResponse := h.confirmCode(t, challengeID, code, newClientPrivateKey("blocked-confirm"))
require.Equal(t, http.StatusForbidden, confirmResponse.StatusCode)
require.JSONEq(t, `{"error":{"code":"blocked_by_policy","message":"authentication is blocked by policy"}}`, confirmResponse.Body)
lookupResponse, _ := h.lookupUserByEmail(t, blockedAtConfirmEmail)
requireLookupNotFound(t, lookupResponse)
}