feat: user service

This commit is contained in:
Ilia Denisov
2026-04-10 19:05:02 +02:00
committed by GitHub
parent 710bad712e
commit 23ffcb7535
140 changed files with 33418 additions and 952 deletions
@@ -0,0 +1,147 @@
package gatewayuser_test
import (
"testing"
contractsuserv1 "galaxy/integration/internal/contracts/userv1"
"github.com/stretchr/testify/require"
)
func TestGatewayUserGetMyAccountAuthenticated(t *testing.T) {
h := newGatewayUserHarness(t)
const (
email = "pilot@example.com"
deviceSessionID = "device-session-get-account"
requestID = "request-get-account"
)
created := h.ensureUser(t, email, "en", gatewayUserTestTimeZone)
require.Equal(t, "created", created.Outcome)
clientPrivateKey := newClientPrivateKey("get-account")
h.seedGatewaySession(t, deviceSessionID, created.UserID, clientPrivateKey)
payload, err := contractsuserv1.EncodeGetMyAccountRequest()
require.NoError(t, err)
response := h.executeCommand(t, deviceSessionID, requestID, contractsuserv1.MessageTypeGetMyAccount, payload, clientPrivateKey)
require.Equal(t, contractsuserv1.ResultCodeOK, response.GetResultCode())
accountResponse, err := contractsuserv1.DecodeAccountResponse(response.GetPayloadBytes())
require.NoError(t, err)
require.Equal(t, created.UserID, accountResponse.Account.UserID)
require.Equal(t, email, accountResponse.Account.Email)
require.Equal(t, "en", accountResponse.Account.PreferredLanguage)
require.Equal(t, gatewayUserTestTimeZone, accountResponse.Account.TimeZone)
}
func TestGatewayUserUpdateMyProfileSuccess(t *testing.T) {
h := newGatewayUserHarness(t)
const (
email = "pilot-profile@example.com"
deviceSessionID = "device-session-update-profile"
requestID = "request-update-profile"
)
created := h.ensureUser(t, email, "en", gatewayUserTestTimeZone)
clientPrivateKey := newClientPrivateKey("update-profile")
h.seedGatewaySession(t, deviceSessionID, created.UserID, clientPrivateKey)
payload, err := contractsuserv1.EncodeUpdateMyProfileRequest("Nova Prime")
require.NoError(t, err)
response := h.executeCommand(t, deviceSessionID, requestID, contractsuserv1.MessageTypeUpdateMyProfile, payload, clientPrivateKey)
require.Equal(t, contractsuserv1.ResultCodeOK, response.GetResultCode())
accountResponse, err := contractsuserv1.DecodeAccountResponse(response.GetPayloadBytes())
require.NoError(t, err)
require.Equal(t, "Nova Prime", accountResponse.Account.RaceName)
lookup := h.lookupUserByEmail(t, email)
require.Equal(t, "Nova Prime", lookup.User.RaceName)
}
func TestGatewayUserUpdateMySettingsSuccess(t *testing.T) {
h := newGatewayUserHarness(t)
const (
email = "pilot-settings@example.com"
deviceSessionID = "device-session-update-settings"
requestID = "request-update-settings"
)
created := h.ensureUser(t, email, "en", gatewayUserTestTimeZone)
clientPrivateKey := newClientPrivateKey("update-settings")
h.seedGatewaySession(t, deviceSessionID, created.UserID, clientPrivateKey)
payload, err := contractsuserv1.EncodeUpdateMySettingsRequest("fr-FR", "Europe/Paris")
require.NoError(t, err)
response := h.executeCommand(t, deviceSessionID, requestID, contractsuserv1.MessageTypeUpdateMySettings, payload, clientPrivateKey)
require.Equal(t, contractsuserv1.ResultCodeOK, response.GetResultCode())
accountResponse, err := contractsuserv1.DecodeAccountResponse(response.GetPayloadBytes())
require.NoError(t, err)
require.Equal(t, "fr-FR", accountResponse.Account.PreferredLanguage)
require.Equal(t, "Europe/Paris", accountResponse.Account.TimeZone)
lookup := h.lookupUserByEmail(t, email)
require.Equal(t, "fr-FR", lookup.User.PreferredLanguage)
require.Equal(t, "Europe/Paris", lookup.User.TimeZone)
}
func TestGatewayUserUpdateMyProfileConflict(t *testing.T) {
h := newGatewayUserHarness(t)
const (
email = "pilot-conflict@example.com"
deviceSessionID = "device-session-profile-conflict"
requestID = "request-profile-conflict"
)
created := h.ensureUser(t, email, "en", gatewayUserTestTimeZone)
h.applyProfileUpdateBlock(t, created.UserID)
clientPrivateKey := newClientPrivateKey("profile-conflict")
h.seedGatewaySession(t, deviceSessionID, created.UserID, clientPrivateKey)
payload, err := contractsuserv1.EncodeUpdateMyProfileRequest("Blocked Nova")
require.NoError(t, err)
response := h.executeCommand(t, deviceSessionID, requestID, contractsuserv1.MessageTypeUpdateMyProfile, payload, clientPrivateKey)
require.Equal(t, "conflict", response.GetResultCode())
errorResponse, err := contractsuserv1.DecodeErrorResponse(response.GetPayloadBytes())
require.NoError(t, err)
require.Equal(t, "conflict", errorResponse.Error.Code)
require.Equal(t, "request conflicts with current state", errorResponse.Error.Message)
}
func TestGatewayUserUpdateMySettingsInvalidRequest(t *testing.T) {
h := newGatewayUserHarness(t)
const (
email = "pilot-invalid@example.com"
deviceSessionID = "device-session-settings-invalid"
requestID = "request-settings-invalid"
)
created := h.ensureUser(t, email, "en", gatewayUserTestTimeZone)
clientPrivateKey := newClientPrivateKey("settings-invalid")
h.seedGatewaySession(t, deviceSessionID, created.UserID, clientPrivateKey)
payload, err := contractsuserv1.EncodeUpdateMySettingsRequest("en", "Mars/Base")
require.NoError(t, err)
response := h.executeCommand(t, deviceSessionID, requestID, contractsuserv1.MessageTypeUpdateMySettings, payload, clientPrivateKey)
require.Equal(t, "invalid_request", response.GetResultCode())
errorResponse, err := contractsuserv1.DecodeErrorResponse(response.GetPayloadBytes())
require.NoError(t, err)
require.Equal(t, "invalid_request", errorResponse.Error.Code)
require.NotEmpty(t, errorResponse.Error.Message)
}